From 44ceccff12123e5e8afe832cd80c78facba4066a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 7 Jun 2023 21:44:01 +0200 Subject: [PATCH 001/109] Fix some newlines printed or not --- client/command/generate/implants.go | 2 +- client/console/console.go | 3 +-- client/console/log.go | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 3cdc0afc5a..5553188b0a 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -120,7 +120,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl } con.Println(tw.Render()) - con.Println() + con.Println("\n") } // ImplantBuildNameCompleter - Completer for implant build names diff --git a/client/console/console.go b/client/console/console.go index 02f4923f31..fde4a37587 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -408,7 +408,7 @@ func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { if con.Settings.BeaconAutoResults { if beacon != nil { - con.PrintEventSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) + con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) } task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ ID: task.ID, @@ -419,7 +419,6 @@ func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { } else { con.PrintErrorf("Could not get beacon task content: %s", err) } - con.Println() } delete(con.BeaconTaskCallbacks, task.ID) } diff --git a/client/console/log.go b/client/console/log.go index 71807efac0..cb2d0d35c3 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -148,7 +148,7 @@ func (con *SliverConsoleClient) PrintAsyncResponse(resp *commonpb.Response) { con.PrintWarnf(err.Error()) return } - con.PrintInfof("Tasked beacon %s (%s)", beacon.Name, strings.Split(resp.TaskID, "-")[0]) + con.PrintInfof("Tasked beacon %s (%s)\n", beacon.Name, strings.Split(resp.TaskID, "-")[0]) } func (con *SliverConsoleClient) Printf(format string, args ...any) { From bce0c8de0617032885a5781bccee6e9459af2fbd Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 7 Jun 2023 22:24:19 +0200 Subject: [PATCH 002/109] Add a flags package, in which we store some command utility functions to bind flags, completions, apply command filters, etc. --- client/command/flags/flags.go | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 client/command/flags/flags.go diff --git a/client/command/flags/flags.go b/client/command/flags/flags.go new file mode 100644 index 0000000000..7f55a0784d --- /dev/null +++ b/client/command/flags/flags.go @@ -0,0 +1,71 @@ +package flags + +import ( + "strings" + + "github.com/reeflective/console" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Bind is a convenience function to bind flags to a command, through newly created +// pflag.Flagset type. This function can be called any number of times for any command. +// desc - An optional name for the flag set (can be empty, but might end up useful). +// persistent - If true, the flags bound will apply to all subcommands of this command. +// cmd - The pointer to the command the flags should be bound to. +// flags - A function using this flag set as parameter, for you to register flags. +func Bind(desc string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { + flagSet := pflag.NewFlagSet(desc, pflag.ContinueOnError) + flags(flagSet) + + if persistent { + cmd.PersistentFlags().AddFlagSet(flagSet) + } else { + cmd.Flags().AddFlagSet(flagSet) + } +} + +// RestrictTargets generates a cobra annotation map with a single console.CommandHiddenFilter key +// to a comma-separated list of filters to use in order to expose/hide commands based on requirements. +// Ex: cmd.Annotations = RestrictTargets("windows") will only show the command if the target is Windows. +// Ex: cmd.Annotations = RestrictTargets("windows", "beacon") show the command if target is a beacon on Windows. +func RestrictTargets(filters ...string) map[string]string { + if len(filters) == 0 { + return nil + } + + if len(filters) == 1 { + return map[string]string{ + console.CommandFilterKey: filters[0], + } + } + + filts := strings.Join(filters, ",") + + return map[string]string{ + console.CommandFilterKey: filts, + } +} + +// NewCompletions registers the command to the application completion engine and returns +// you a type through which you can register all sorts of completions for this command, +// from flag arguments, positional ones, per index or remaining, etc. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func NewCompletions(cmd *cobra.Command) *carapace.Carapace { + return carapace.Gen(cmd) +} + +// BindFlagCompletions is a convenience function for binding completers to flags requiring arguments. +// (It wraps a few steps to be used through the *carapace.Carapace type so you don't have to bother). +// cmd - The target command/subcommand which flags to be completed. +// bind - A function using a map "flag-name":carapace.Action for you to bind completions to the flag. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { + comps := make(carapace.ActionMap) + bind(&comps) + + carapace.Gen(cmd).FlagCompletion(comps) +} From ec88f9bd02eda7d9348d7fe1b47e01bb3ad5330e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 7 Jun 2023 23:00:29 +0200 Subject: [PATCH 003/109] Start splitting commands declarations --- client/cli/implant.go | 2 +- client/command/alias/commands.go | 62 ++++++++++ client/command/armory/commands.go | 69 +++++++++++ client/command/exit/exit.go | 13 +++ client/command/flags/flags.go | 4 + client/command/jobs/commands.go | 169 +++++++++++++++++++++++++++ client/command/operators/commands.go | 29 +++++ client/command/update/commands.go | 46 ++++++++ server/console/console.go | 8 +- 9 files changed, 397 insertions(+), 5 deletions(-) create mode 100644 client/command/alias/commands.go create mode 100644 client/command/armory/commands.go create mode 100644 client/command/jobs/commands.go create mode 100644 client/command/operators/commands.go create mode 100644 client/command/update/commands.go diff --git a/client/cli/implant.go b/client/cli/implant.go index 5c1251f79c..1f24db8ba8 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -67,7 +67,7 @@ func makeCompleters(cmd *cobra.Command, con *console.SliverConsoleClient) { }) // Bind completers to flags (wrap them to use the same pre-runners) - command.FlagComps(cmd, func(comp *carapace.ActionMap) { + command.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { cmd.PersistentPreRunE(cmd, c.Args) return use.SessionIDCompleter(con) diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go new file mode 100644 index 0000000000..5b7bff8727 --- /dev/null +++ b/client/command/alias/commands.go @@ -0,0 +1,62 @@ +package alias + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `alias` command and its child commands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + aliasCmd := &cobra.Command{ + Use: consts.AliasesStr, + Short: "List current aliases", + Long: help.GetHelpFor([]string{consts.AliasesStr}), + Run: func(cmd *cobra.Command, args []string) { + AliasesCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + + aliasLoadCmd := &cobra.Command{ + Use: consts.LoadStr + " [ALIAS]", + Short: "Load a command alias", + Long: help.GetHelpFor([]string{consts.AliasesStr, consts.LoadStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + AliasesLoadCmd(cmd, con, args) + }, + } + aliasCmd.AddCommand(aliasLoadCmd) + flags.NewCompletions(aliasLoadCmd).PositionalCompletion(carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) + + aliasInstallCmd := &cobra.Command{ + Use: consts.InstallStr + " [ALIAS]", + Short: "Install a command alias", + Long: help.GetHelpFor([]string{consts.AliasesStr, consts.InstallStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + AliasesInstallCmd(cmd, con, args) + }, + } + aliasCmd.AddCommand(aliasInstallCmd) + flags.NewCompletions(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) + + aliasRemove := &cobra.Command{ + Use: consts.RmStr + " [ALIAS]", + Short: "Remove an alias", + Long: help.GetHelpFor([]string{consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + AliasesRemoveCmd(cmd, con, args) + }, + } + flags.NewCompletions(aliasRemove).PositionalCompletion(AliasCompleter()) + aliasCmd.AddCommand(aliasRemove) + + return []*cobra.Command{aliasCmd} +} diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go new file mode 100644 index 0000000000..27e41c8735 --- /dev/null +++ b/client/command/armory/commands.go @@ -0,0 +1,69 @@ +package armory + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `armory` command and its subcommands. +func Commands(con *console.SliverConsoleClient) *cobra.Command { + armoryCmd := &cobra.Command{ + Use: consts.ArmoryStr, + Short: "Automatically download and install extensions/aliases", + Long: help.GetHelpFor([]string{consts.ArmoryStr}), + Run: func(cmd *cobra.Command, args []string) { + ArmoryCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("connection", true, armoryCmd, func(f *pflag.FlagSet) { + f.BoolP("insecure", "I", false, "skip tls certificate validation") + f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") + f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") + f.StringP("timeout", "t", "15m", "download timeout") + }) + + armoryInstallCmd := &cobra.Command{ + Use: consts.InstallStr, + Short: "Install an alias or extension", + Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.InstallStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ArmoryInstallCmd(cmd, con, args) + }, + } + armoryCmd.AddCommand(armoryInstallCmd) + flags.NewCompletions(armoryInstallCmd).PositionalCompletion( + AliasExtensionOrBundleCompleter().Usage("name of the extension or alias to install"), + ) + + armoryUpdateCmd := &cobra.Command{ + Use: consts.UpdateStr, + Short: "Update installed an aliases and extensions", + Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.UpdateStr}), + Run: func(cmd *cobra.Command, args []string) { + ArmoryUpdateCmd(cmd, con, args) + }, + } + armoryCmd.AddCommand(armoryUpdateCmd) + + armorySearchCmd := &cobra.Command{ + Use: consts.SearchStr, + Short: "Search for aliases and extensions by name (regex)", + Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.SearchStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ArmorySearchCmd(cmd, con, args) + }, + } + armoryCmd.AddCommand(armorySearchCmd) + flags.NewCompletions(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) + + return armoryCmd +} diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index b94e11ee33..951a25c4cb 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -25,6 +25,7 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/spf13/cobra" ) @@ -53,3 +54,15 @@ func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } os.Exit(0) } + +// Commands returns the `exit` command. +func Command(con *console.SliverConsoleClient) *cobra.Command { + return &cobra.Command{ + Use: "exit", + Short: "Exit the program", + Run: func(cmd *cobra.Command, args []string) { + ExitCmd(cmd, con, args) + }, + GroupID: constants.GenericHelpGroup, + } +} diff --git a/client/command/flags/flags.go b/client/command/flags/flags.go index 7f55a0784d..ea679082fe 100644 --- a/client/command/flags/flags.go +++ b/client/command/flags/flags.go @@ -9,6 +9,10 @@ import ( "github.com/spf13/pflag" ) +const ( + DefaultTimeout = 60 +) + // Bind is a convenience function to bind flags to a command, through newly created // pflag.Flagset type. This function can be called any number of times for any command. // desc - An optional name for the flag set (can be empty, but might end up useful). diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go new file mode 100644 index 0000000000..d3564d2a2a --- /dev/null +++ b/client/command/jobs/commands.go @@ -0,0 +1,169 @@ +package jobs + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + // Job control + jobsCmd := &cobra.Command{ + Use: consts.JobsStr, + Short: "Job control", + Long: help.GetHelpFor([]string{consts.JobsStr}), + Run: func(cmd *cobra.Command, args []string) { + JobsCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("jobs", true, jobsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("jobs", false, jobsCmd, func(f *pflag.FlagSet) { + f.Int32P("kill", "k", -1, "kill a background job") + f.BoolP("kill-all", "K", false, "kill all jobs") + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(jobsCmd, func(comp *carapace.ActionMap) { + (*comp)["kill"] = JobsIDCompleter(con) + }) + + // Mutual TLS + mtlsCmd := &cobra.Command{ + Use: consts.MtlsStr, + Short: "Start an mTLS listener", + Long: help.GetHelpFor([]string{consts.MtlsStr}), + Run: func(cmd *cobra.Command, args []string) { + MTLSListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("mTLS listener", false, mtlsCmd, func(f *pflag.FlagSet) { + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultMTLSLPort, "tcp listen port") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // Wireguard + wgCmd := &cobra.Command{ + Use: consts.WGStr, + Short: "Start a WireGuard listener", + Long: help.GetHelpFor([]string{consts.WGStr}), + Run: func(cmd *cobra.Command, args []string) { + WGListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("WireGuard listener", false, wgCmd, func(f *pflag.FlagSet) { + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultWGLPort, "udp listen port") + f.Uint32P("nport", "n", generate.DefaultWGNPort, "virtual tun interface listen port") + f.Uint32P("key-port", "x", generate.DefaultWGKeyExPort, "virtual tun interface key exchange port") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // DNS + dnsCmd := &cobra.Command{ + Use: consts.DnsStr, + Short: "Start a DNS listener", + Long: help.GetHelpFor([]string{consts.DnsStr}), + Run: func(cmd *cobra.Command, args []string) { + DNSListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("DNS listener", false, dnsCmd, func(f *pflag.FlagSet) { + f.StringP("domains", "d", "", "parent domain(s) to use for DNS c2") + f.BoolP("no-canaries", "c", false, "disable dns canary detection") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultDNSLPort, "udp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // HTTP + httpCmd := &cobra.Command{ + Use: consts.HttpStr, + Short: "Start an HTTP listener", + Long: help.GetHelpFor([]string{consts.HttpStr}), + Run: func(cmd *cobra.Command, args []string) { + HTTPListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("HTTP listener", false, httpCmd, func(f *pflag.FlagSet) { + f.StringP("domain", "d", "", "limit responses to specific domain") + f.StringP("website", "w", "", "website name (see websites cmd)") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultHTTPLPort, "tcp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") + f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // HTTPS + httpsCmd := &cobra.Command{ + Use: consts.HttpsStr, + Short: "Start an HTTPS listener", + Long: help.GetHelpFor([]string{consts.HttpsStr}), + Run: func(cmd *cobra.Command, args []string) { + HTTPSListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("HTTPS listener", false, httpsCmd, func(f *pflag.FlagSet) { + f.StringP("domain", "d", "", "limit responses to specific domain") + f.StringP("website", "w", "", "website name (see websites cmd)") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultHTTPSLPort, "tcp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") + f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + + f.StringP("cert", "c", "", "PEM encoded certificate file") + f.StringP("key", "k", "", "PEM encoded private key file") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate") + f.BoolP("disable-randomized-jarm", "E", false, "disable randomized jarm fingerprints") + + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // Staging listeners + stageCmd := &cobra.Command{ + Use: consts.StageListenerStr, + Short: "Start a stager listener", + Long: help.GetHelpFor([]string{consts.StageListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + StageListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("stage listener", false, stageCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "implant profile name to link with the listener") + f.StringP("url", "u", "", "URL to which the stager will call back to") + f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") + f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") + f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") + f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") + f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") + f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") + }) + flags.BindFlagCompletions(stageCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") + }) + + return []*cobra.Command{jobsCmd, mtlsCmd, wgCmd, httpCmd, httpsCmd, stageCmd} +} diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go new file mode 100644 index 0000000000..03edb8b160 --- /dev/null +++ b/client/command/operators/commands.go @@ -0,0 +1,29 @@ +package operators + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) *cobra.Command { + operatorsCmd := &cobra.Command{ + Use: consts.OperatorsStr, + Short: "Manage operators", + Long: help.GetHelpFor([]string{consts.OperatorsStr}), + Run: func(cmd *cobra.Command, args []string) { + OperatorsCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("operators", false, operatorsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return operatorsCmd +} diff --git a/client/command/update/commands.go b/client/command/update/commands.go new file mode 100644 index 0000000000..251d2c41f3 --- /dev/null +++ b/client/command/update/commands.go @@ -0,0 +1,46 @@ +package update + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + updateCmd := &cobra.Command{ + Use: consts.UpdateStr, + Short: "Check for updates", + Long: help.GetHelpFor([]string{consts.UpdateStr}), + Run: func(cmd *cobra.Command, args []string) { + UpdateCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("update", false, updateCmd, func(f *pflag.FlagSet) { + f.BoolP("prereleases", "P", false, "include pre-released (unstable) versions") + f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") + f.StringP("save", "s", "", "save downloaded files to specific directory (default user home dir)") + f.BoolP("insecure", "I", false, "skip tls certificate validation") + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + versionCmd := &cobra.Command{ + Use: consts.VersionStr, + Short: "Display version information", + Long: help.GetHelpFor([]string{consts.VersionStr}), + Run: func(cmd *cobra.Command, args []string) { + VerboseVersionsCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("update", false, versionCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{updateCmd, versionCmd} +} diff --git a/server/console/console.go b/server/console/console.go index 8bef5a82d9..92a5807c9a 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -78,7 +78,7 @@ func serverOnlyCmds() (commands []*cobra.Command) { Run: startMultiplayerModeCmd, GroupID: consts.MultiplayerHelpGroup, } - command.Flags("multiplayer", false, startMultiplayer, func(f *pflag.FlagSet) { + command.Bind("multiplayer", false, startMultiplayer, func(f *pflag.FlagSet) { f.StringP("lhost", "L", "", "interface to bind server to") f.Uint16P("lport", "l", 31337, "tcp listen port") f.BoolP("persistent", "p", false, "make persistent across restarts") @@ -93,13 +93,13 @@ func serverOnlyCmds() (commands []*cobra.Command) { Run: newOperatorCmd, GroupID: consts.MultiplayerHelpGroup, } - command.Flags("operator", false, newOperator, func(f *pflag.FlagSet) { + command.Bind("operator", false, newOperator, func(f *pflag.FlagSet) { f.StringP("lhost", "l", "", "listen host") f.Uint16P("lport", "p", 31337, "listen port") f.StringP("save", "s", "", "directory/file in which to save config") f.StringP("name", "n", "", "operator name") }) - command.FlagComps(newOperator, func(comp *carapace.ActionMap) { + command.BindFlagCompletions(newOperator, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionDirectories() }) commands = append(commands, newOperator) @@ -112,7 +112,7 @@ func serverOnlyCmds() (commands []*cobra.Command) { GroupID: consts.MultiplayerHelpGroup, } - command.Flags("operator", false, kickOperator, func(f *pflag.FlagSet) { + command.Bind("operator", false, kickOperator, func(f *pflag.FlagSet) { f.StringP("name", "n", "", "operator name") }) commands = append(commands, kickOperator) From f370e96058aab0787796e9f9ff975a6ad1b855d5 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 20 Jun 2023 13:28:03 +0200 Subject: [PATCH 004/109] Finish splitting server commands in their files --- client/command/armory/commands.go | 4 +- client/command/beacons/commands.go | 75 + client/command/builders/commands.go | 29 + client/command/command.go | 74 +- client/command/crack/commands.go | 143 ++ client/command/creds/commands.go | 83 + client/command/exit/commands.go | 17 + client/command/exit/exit.go | 6 +- client/command/generate/commands.go | 352 ++++ client/command/hosts/commands.go | 59 + client/command/info/commands.go | 32 + client/command/licenses/commands.go | 25 + client/command/loot/commands.go | 116 ++ client/command/monitor/commands.go | 33 + client/command/operators/commands.go | 4 +- client/command/prelude-operator/commands.go | 45 + client/command/reaction/commands.go | 87 + client/command/server.go | 1725 +------------------ client/command/sessions/commands.go | 85 + client/command/settings/commands.go | 92 + client/command/shikata-ga-nai/commands.go | 40 + client/command/use/commands.go | 53 + client/command/websites/commands.go | 99 ++ client/command/wireguard/commands.go | 37 + client/console/console.go | 11 + 25 files changed, 1635 insertions(+), 1691 deletions(-) create mode 100644 client/command/beacons/commands.go create mode 100644 client/command/builders/commands.go create mode 100644 client/command/crack/commands.go create mode 100644 client/command/creds/commands.go create mode 100644 client/command/exit/commands.go create mode 100644 client/command/generate/commands.go create mode 100644 client/command/hosts/commands.go create mode 100644 client/command/info/commands.go create mode 100644 client/command/licenses/commands.go create mode 100644 client/command/loot/commands.go create mode 100644 client/command/monitor/commands.go create mode 100644 client/command/prelude-operator/commands.go create mode 100644 client/command/reaction/commands.go create mode 100644 client/command/sessions/commands.go create mode 100644 client/command/settings/commands.go create mode 100644 client/command/shikata-ga-nai/commands.go create mode 100644 client/command/use/commands.go create mode 100644 client/command/websites/commands.go create mode 100644 client/command/wireguard/commands.go diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 27e41c8735..5e59ef2a44 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the `armory` command and its subcommands. -func Commands(con *console.SliverConsoleClient) *cobra.Command { +func Commands(con *console.SliverConsoleClient) []*cobra.Command { armoryCmd := &cobra.Command{ Use: consts.ArmoryStr, Short: "Automatically download and install extensions/aliases", @@ -65,5 +65,5 @@ func Commands(con *console.SliverConsoleClient) *cobra.Command { armoryCmd.AddCommand(armorySearchCmd) flags.NewCompletions(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) - return armoryCmd + return []*cobra.Command{armoryCmd} } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go new file mode 100644 index 0000000000..433e204f2d --- /dev/null +++ b/client/command/beacons/commands.go @@ -0,0 +1,75 @@ +package beacons + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/use" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + beaconsCmd := &cobra.Command{ + Use: consts.BeaconsStr, + Short: "Manage beacons", + Long: help.GetHelpFor([]string{consts.BeaconsStr}), + GroupID: consts.SliverHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + BeaconsCmd(cmd, con, args) + }, + } + flags.Bind("beacons", true, beaconsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("beacons", false, beaconsCmd, func(f *pflag.FlagSet) { + f.StringP("kill", "k", "", "kill the designated beacon") + f.BoolP("kill-all", "K", false, "kill all beacons") + f.BoolP("force", "F", false, "force killing the beacon") + + f.StringP("filter", "f", "", "filter beacons by substring") + f.StringP("filter-re", "e", "", "filter beacons by regular expression") + }) + flags.BindFlagCompletions(beaconsCmd, func(comp *carapace.ActionMap) { + (*comp)["kill"] = use.BeaconIDCompleter(con) + }) + beaconsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a beacon", + Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + BeaconsRmCmd(cmd, con, args) + }, + } + carapace.Gen(beaconsRmCmd).PositionalCompletion(use.BeaconIDCompleter(con)) + beaconsCmd.AddCommand(beaconsRmCmd) + + beaconsWatchCmd := &cobra.Command{ + Use: consts.WatchStr, + Short: "Watch your beacons", + Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.WatchStr}), + Run: func(cmd *cobra.Command, args []string) { + BeaconsWatchCmd(cmd, con, args) + }, + } + beaconsCmd.AddCommand(beaconsWatchCmd) + + beaconsPruneCmd := &cobra.Command{ + Use: consts.PruneStr, + Short: "Prune stale beacons automatically", + Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.PruneStr}), + Run: func(cmd *cobra.Command, args []string) { + BeaconsPruneCmd(cmd, con, args) + }, + } + flags.Bind("beacons", false, beaconsPruneCmd, func(f *pflag.FlagSet) { + f.StringP("duration", "d", "1h", "duration to prune beacons that have missed their last checkin") + }) + beaconsCmd.AddCommand(beaconsPruneCmd) + + return []*cobra.Command{beaconsCmd} +} diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go new file mode 100644 index 0000000000..882cb50952 --- /dev/null +++ b/client/command/builders/commands.go @@ -0,0 +1,29 @@ +package builders + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + buildersCmd := &cobra.Command{ + Use: consts.BuildersStr, + Short: "List external builders", + Long: help.GetHelpFor([]string{consts.BuildersStr}), + Run: func(cmd *cobra.Command, args []string) { + BuildersCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("builders", false, buildersCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{buildersCmd} +} diff --git a/client/command/command.go b/client/command/command.go index 840be14e43..9ba69ab42f 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -25,15 +25,17 @@ import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + + client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 -// Flags is a convenience function to bind flags to a given command. +// Bind is a convenience function to bind flags to a given command. // name - The name of the flag set (can be empty). // cmd - The command to which the flags should be bound. // flags - A function exposing the flag set through which flags are declared. -func Flags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { +func Bind(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { flagSet := pflag.NewFlagSet(name, pflag.ContinueOnError) // Create the flag set. flags(flagSet) // Let the user bind any number of flags to it. @@ -44,22 +46,21 @@ func Flags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag } } -// FlagComps is a convenience function for adding completions to a command's flags. +// BindFlagCompletions is a convenience function for adding completions to a command's flags. // cmd - The command owning the flags to complete. // bind - A function exposing a map["flag-name"]carapace.Action. -func FlagComps(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { +func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { comps := make(carapace.ActionMap) bind(&comps) carapace.Gen(cmd).FlagCompletion(comps) } -// hideCommand generates a cobra annotation map with a single -// console.CommandHiddenFilter key, which value is a comma-separated list -// of filters to use in order to expose/hide commands based on requirements. -// Ex: cmd.Annotations = hideCommand("windows") will hide the cmd -// if the target session/beacon is not a Windows host. -func hideCommand(filters ...string) map[string]string { +// RestrictTargets generates a cobra annotation map with a single console.CommandHiddenFilter key +// to a comma-separated list of filters to use in order to expose/hide commands based on requirements. +// Ex: cmd.Annotations = RestrictTargets("windows") will only show the command if the target is Windows. +// Ex: cmd.Annotations = RestrictTargets("windows", "beacon") show the command if target is a beacon on Windows. +func RestrictTargets(filters ...string) map[string]string { if len(filters) == 0 { return nil } @@ -76,3 +77,56 @@ func hideCommand(filters ...string) map[string]string { console.CommandFilterKey: filts, } } + +// [ Core ] +// [ Sessions ] +// [ Execution ] +// [ Filesystem ] +// [ Info ] +// [ Network (C2)] +// [ Network tools ] +// [ Payloads ] +// [ Privileges ] +// [ Processes ] +// [ Aliases ] +// [ Extensions ] + +// Commands not to bind in CLI: +// - portforwarders +// - Socks (and wg-socks ?) +// - shell ? + +// Take care of: +// - double bind help command +// - double bind session commands +// - don't bind readline command in CLI. + +// bindCommands is a helper used to bind a list of root commands to a given menu, for a given "command help group". +// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. +// @menu - The command menu to which the commands should be bound (either server or implant menu). +// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. +func bindCommands(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { + found := false + + // Ensure the given command group is available in the menu. + if group != "" { + for _, grp := range menu.Groups() { + if grp.Title == group { + found = true + break + } + } + + if !found { + menu.AddGroup(&cobra.Group{ + ID: group, + Title: group, + }) + } + } + + // Bind the command to the root + for _, command := range cmds { + menu.AddCommand(command(con)...) + } +} diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go new file mode 100644 index 0000000000..44b0982c0c --- /dev/null +++ b/client/command/crack/commands.go @@ -0,0 +1,143 @@ +package crack + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + crackCmd := &cobra.Command{ + Use: consts.CrackStr, + Short: "Crack: GPU password cracking", + Long: help.GetHelpFor([]string{consts.CrackStr}), + GroupID: consts.GenericHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + CrackCmd(cmd, con, args) + }, + } + flags.Bind("", true, crackCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + crackStationsCmd := &cobra.Command{ + Use: consts.StationsStr, + Short: "Manage crackstations", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.StationsStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackStationsCmd(cmd, con, args) + }, + } + crackCmd.AddCommand(crackStationsCmd) + + wordlistsCmd := &cobra.Command{ + Use: consts.WordlistsStr, + Short: "Manage wordlists", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.WordlistsStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackWordlistsCmd(cmd, con, args) + }, + } + crackCmd.AddCommand(wordlistsCmd) + + wordlistsAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a wordlist", + Run: func(cmd *cobra.Command, args []string) { + CrackWordlistsAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, wordlistsAddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "wordlist name (blank = filename)") + }) + carapace.Gen(wordlistsAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local wordlist file")) + wordlistsCmd.AddCommand(wordlistsAddCmd) + + wordlistsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a wordlist", + Run: func(cmd *cobra.Command, args []string) { + CrackWordlistsRmCmd(cmd, con, args) + }, + } + wordlistsCmd.AddCommand(wordlistsRmCmd) + carapace.Gen(wordlistsRmCmd).PositionalCompletion(CrackWordlistCompleter(con).Usage("wordlist to remove")) + + rulesCmd := &cobra.Command{ + Use: consts.RulesStr, + Short: "Manage rule files", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackRulesCmd(cmd, con, args) + }, + } + crackCmd.AddCommand(rulesCmd) + + rulesAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a rules file", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackRulesAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, rulesAddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "rules name (blank = filename)") + }) + carapace.Gen(rulesAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local rules file")) + rulesCmd.AddCommand(rulesAddCmd) + + rulesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove rules", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackRulesRmCmd(cmd, con, args) + }, + } + carapace.Gen(rulesRmCmd).PositionalCompletion(CrackRulesCompleter(con).Usage("rules to remove")) + rulesCmd.AddCommand(rulesRmCmd) + + hcstat2Cmd := &cobra.Command{ + Use: consts.Hcstat2Str, + Short: "Manage markov hcstat2 files", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str}), + Run: func(cmd *cobra.Command, args []string) { + CrackHcstat2Cmd(cmd, con, args) + }, + } + crackCmd.AddCommand(hcstat2Cmd) + + hcstat2AddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a hcstat2 file", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackHcstat2AddCmd(cmd, con, args) + }, + } + flags.Bind("", false, hcstat2AddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "hcstat2 name (blank = filename)") + }) + carapace.Gen(hcstat2AddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local hcstat2 file")) + hcstat2Cmd.AddCommand(hcstat2AddCmd) + + hcstat2RmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove hcstat2 file", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackHcstat2RmCmd(cmd, con, args) + }, + } + carapace.Gen(hcstat2RmCmd).PositionalCompletion(CrackHcstat2Completer(con).Usage("hcstat2 to remove")) + hcstat2Cmd.AddCommand(hcstat2RmCmd) + + return []*cobra.Command{crackCmd} +} diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go new file mode 100644 index 0000000000..4ec0bfec49 --- /dev/null +++ b/client/command/creds/commands.go @@ -0,0 +1,83 @@ +package creds + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + credsCmd := &cobra.Command{ + Use: consts.CredsStr, + Short: "Manage the database of credentials", + Long: help.GetHelpFor([]string{consts.CredsStr}), + GroupID: consts.GenericHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + CredsCmd(cmd, con, args) + }, + } + flags.Bind("creds", true, credsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + credsAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a credential to the database", + Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + CredsAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, credsAddCmd, func(f *pflag.FlagSet) { + f.StringP("collection", "c", "", "name of collection") + f.StringP("username", "u", "", "username for the credential") + f.StringP("plaintext", "p", "", "plaintext for the credential") + f.StringP("hash", "P", "", "hash of the credential") + f.StringP("hash-type", "H", "", "hash type of the credential") + }) + flags.BindFlagCompletions(credsAddCmd, func(comp *carapace.ActionMap) { + (*comp)["hash-type"] = CredsHashTypeCompleter(con) + }) + credsCmd.AddCommand(credsAddCmd) + + credsAddFileCmd := &cobra.Command{ + Use: consts.FileStr, + Short: "Add a credential to the database", + Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr, consts.FileStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + CredsAddHashFileCmd(cmd, con, args) + }, + } + flags.Bind("", false, credsAddFileCmd, func(f *pflag.FlagSet) { + f.StringP("collection", "c", "", "name of collection") + f.StringP("file-format", "F", HashNewlineFormat, "file format of the credential file") + f.StringP("hash-type", "H", "", "hash type of the credential") + }) + flags.BindFlagCompletions(credsAddFileCmd, func(comp *carapace.ActionMap) { + (*comp)["collection"] = CredsCollectionCompleter(con) + (*comp)["file-format"] = CredsHashFileFormatCompleter(con) + (*comp)["hash-type"] = CredsHashTypeCompleter(con) + }) + carapace.Gen(credsAddFileCmd).PositionalCompletion(carapace.ActionFiles().Tag("credential file")) + credsAddCmd.AddCommand(credsAddFileCmd) + + credsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a credential to the database", + Long: help.GetHelpFor([]string{consts.CredsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + CredsRmCmd(cmd, con, args) + }, + } + carapace.Gen(credsRmCmd).PositionalCompletion(CredsCredentialIDCompleter(con).Usage("id of credential to remove (leave empty to select)")) + credsCmd.AddCommand(credsRmCmd) + + return []*cobra.Command{credsCmd} +} diff --git a/client/command/exit/commands.go b/client/command/exit/commands.go new file mode 100644 index 0000000000..75b67ea3a6 --- /dev/null +++ b/client/command/exit/commands.go @@ -0,0 +1,17 @@ +package exit + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + return nil +} diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index 951a25c4cb..ba0f1ee79b 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -56,13 +56,13 @@ func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // Commands returns the `exit` command. -func Command(con *console.SliverConsoleClient) *cobra.Command { - return &cobra.Command{ +func Command(con *console.SliverConsoleClient) []*cobra.Command { + return []*cobra.Command{{ Use: "exit", Short: "Exit the program", Run: func(cmd *cobra.Command, args []string) { ExitCmd(cmd, con, args) }, GroupID: constants.GenericHelpGroup, - } + }} } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go new file mode 100644 index 0000000000..c30db8c28e --- /dev/null +++ b/client/command/generate/commands.go @@ -0,0 +1,352 @@ +package generate + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + // [ Generate ] -------------------------------------------------------------- + generateCmd := &cobra.Command{ + Use: consts.GenerateStr, + Short: "Generate an implant binary", + Long: help.GetHelpFor([]string{consts.GenerateStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("generate", true, generateCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + // Session flags and completions. + coreImplantFlags("session", generateCmd) + compileImplantFlags("session", generateCmd) + coreImplantFlagCompletions(generateCmd, con) + + generateBeaconCmd := &cobra.Command{ + Use: consts.BeaconStr, + Short: "Generate a beacon binary", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.BeaconStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateBeaconCmd(cmd, con, args) + }, + } + + // Beacon flags and completions. + coreImplantFlags("beacon", generateBeaconCmd) + compileImplantFlags("beacon", generateBeaconCmd) + coreImplantFlagCompletions(generateBeaconCmd, con) + + generateCmd.AddCommand(generateBeaconCmd) + + generateStagerCmd := &cobra.Command{ + Use: consts.MsfStagerStr, + Short: "Generate a stager using Metasploit (requires local Metasploit installation)", + Long: help.GetHelpFor([]string{consts.MsfStagerStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateStagerCmd(cmd, con, args) + }, + } + flags.Bind("stager", false, generateStagerCmd, func(f *pflag.FlagSet) { + f.StringP("os", "o", "windows", "operating system") + f.StringP("arch", "a", "amd64", "cpu architecture") + f.StringP("lhost", "L", "", "Listening host") + f.Uint32P("lport", "l", 8443, "Listening port") + f.StringP("protocol", "r", "tcp", "Staging protocol (tcp/http/https)") + f.StringP("format", "f", "raw", "Output format (msfvenom formats, see help generate msf-stager for the list)") + f.StringP("badchars", "b", "", "bytes to exclude from stage shellcode") + f.StringP("save", "s", "", "directory to save the generated stager to") + f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") + }) + generateCmd.AddCommand(generateStagerCmd) + + generateInfoCmd := &cobra.Command{ + Use: consts.CompilerInfoStr, + Short: "Get information about the server's compiler", + Long: help.GetHelpFor([]string{consts.CompilerInfoStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateInfoCmd(cmd, con, args) + }, + } + generateCmd.AddCommand(generateInfoCmd) + + // Traffic Encoder SubCommands + trafficEncodersCmd := &cobra.Command{ + Use: consts.TrafficEncodersStr, + Short: "Manage implant traffic encoders", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr}), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersCmd(cmd, con, args) + }, + } + generateCmd.AddCommand(trafficEncodersCmd) + + trafficEncodersAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a new traffic encoder to the server from the local file system", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.AddStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, trafficEncodersAddCmd, func(f *pflag.FlagSet) { + f.BoolP("skip-tests", "s", false, "skip testing the traffic encoder (not recommended)") + }) + carapace.Gen(trafficEncodersAddCmd).PositionalCompletion(carapace.ActionFiles("wasm").Tag("wasm files").Usage("local file path (expects .wasm)")) + trafficEncodersCmd.AddCommand(trafficEncodersAddCmd) + + trafficEncodersRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a traffic encoder from the server", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersRemoveCmd(cmd, con, args) + }, + } + carapace.Gen(trafficEncodersRmCmd).PositionalCompletion(TrafficEncodersCompleter(con).Usage("traffic encoder to remove")) + trafficEncodersCmd.AddCommand(trafficEncodersRmCmd) + + // [ Regenerate ] -------------------------------------------------------------- + + regenerateCmd := &cobra.Command{ + Use: consts.RegenerateStr, + Short: "Regenerate an implant", + Long: help.GetHelpFor([]string{consts.RegenerateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegenerateCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("regenerate", false, regenerateCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "directory/file to the binary to") + }) + flags.BindFlagCompletions(regenerateCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) + carapace.Gen(regenerateCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) + + // [ Profiles ] -------------------------------------------------------------- + + profilesCmd := &cobra.Command{ + Use: consts.ProfilesStr, + Short: "List existing profiles", + Long: help.GetHelpFor([]string{consts.ProfilesStr}), + Run: func(cmd *cobra.Command, args []string) { + ProfilesCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("profiles", true, profilesCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + profilesGenerateCmd := &cobra.Command{ + Use: consts.GenerateStr, + Short: "Generate implant from a profile", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.GenerateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ProfilesGenerateCmd(cmd, con, args) + }, + } + flags.Bind("profiles", false, profilesGenerateCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "directory/file to the binary to") + f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") + }) + flags.BindFlagCompletions(profilesGenerateCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) + carapace.Gen(profilesGenerateCmd).PositionalCompletion(ProfileNameCompleter(con)) + profilesCmd.AddCommand(profilesGenerateCmd) + + profilesNewCmd := &cobra.Command{ + Use: consts.NewStr, + Short: "Create a new implant profile (interactive session)", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr}), + Run: func(cmd *cobra.Command, args []string) { + ProfilesNewCmd(cmd, con, args) + }, + } + profilesCmd.AddCommand(profilesNewCmd) + + // Session flags and completions. + coreImplantFlags("session", profilesNewCmd) + compileImplantFlags("session", profilesNewCmd) + coreImplantFlagCompletions(profilesNewCmd, con) + + profilesNewBeaconCmd := &cobra.Command{ + Use: consts.BeaconStr, + Short: "Create a new implant profile (beacon)", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr, consts.BeaconStr}), + Run: func(cmd *cobra.Command, args []string) { + ProfilesNewBeaconCmd(cmd, con, args) + }, + } + profilesNewCmd.AddCommand(profilesNewBeaconCmd) + + // Beacon flags and completions. + coreImplantFlags("beacon", profilesNewBeaconCmd) + compileImplantFlags("beacon", profilesNewBeaconCmd) + coreImplantFlagCompletions(profilesNewBeaconCmd, con) + + profilesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a profile", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ProfilesRmCmd(cmd, con, args) + }, + } + carapace.Gen(profilesRmCmd).PositionalCompletion(ProfileNameCompleter(con)) + profilesCmd.AddCommand(profilesRmCmd) + + // [ Implants ] -------------------------------------------------------------- + + implantBuildsCmd := &cobra.Command{ + Use: consts.ImplantBuildsStr, + Short: "List implant builds", + Long: help.GetHelpFor([]string{consts.ImplantBuildsStr}), + Run: func(cmd *cobra.Command, args []string) { + ImplantsCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("implants", true, implantBuildsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("implants", false, implantBuildsCmd, func(f *pflag.FlagSet) { + f.StringP("os", "o", "", "filter builds by operating system") + f.StringP("arch", "a", "", "filter builds by cpu architecture") + f.StringP("format", "f", "", "filter builds by artifact format") + f.BoolP("only-sessions", "s", false, "filter interactive sessions") + f.BoolP("only-beacons", "b", false, "filter beacons") + f.BoolP("no-debug", "d", false, "filter builds by debug flag") + }) + flags.BindFlagCompletions(implantBuildsCmd, func(comp *carapace.ActionMap) { + (*comp)["os"] = OSCompleter(con) + (*comp)["arch"] = ArchCompleter(con) + (*comp)["format"] = FormatCompleter() + }) + + implantsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove implant build", + Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ImplantsRmCmd(cmd, con, args) + }, + } + carapace.Gen(implantsRmCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) + implantBuildsCmd.AddCommand(implantsRmCmd) + + canariesCmd := &cobra.Command{ + Use: consts.CanariesStr, + Short: "List previously generated canaries", + Long: help.GetHelpFor([]string{consts.CanariesStr}), + Run: func(cmd *cobra.Command, args []string) { + CanariesCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("canaries", false, canariesCmd, func(f *pflag.FlagSet) { + f.BoolP("burned", "b", false, "show only triggered/burned canaries") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{generateCmd, regenerateCmd, profilesCmd, implantBuildsCmd} +} + +// coreImplantFlags binds all flags common to all sliver implant types. +// This is used by all sliver compilation and profiles generation commands. +func coreImplantFlags(name string, cmd *cobra.Command) { + flags.Bind(name, false, cmd, func(f *pflag.FlagSet) { + // Core compile + f.StringP("os", "o", "windows", "operating system") + f.StringP("arch", "a", "amd64", "cpu architecture") + f.StringP("name", "N", "", "agent name") // + f.BoolP("debug", "d", false, "enable debug features") + f.StringP("debug-file", "O", "", "path to debug output") + f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") + f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") + f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") + + f.StringP("canary", "c", "", "canary domain(s)") + + // C2 channels + f.StringP("mtls", "m", "", "mtls connection strings") + f.StringP("wg", "g", "", "wg connection strings") + f.StringP("http", "b", "", "http(s) connection strings") + f.StringP("dns", "n", "", "dns connection strings") + f.StringP("named-pipe", "p", "", "named-pipe connection strings") + f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") + + f.Uint32P("key-exchange", "X", DefaultWGKeyExPort, "wg key-exchange port") + f.Uint32P("tcp-comms", "T", DefaultWGNPort, "wg c2 comms port") + + f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") + f.BoolP("netgo", "q", false, "force the use of netgo") + f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") + + f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") + f.Int64P("reconnect", "j", DefaultReconnect, "attempt to reconnect every n second(s)") + f.Int64P("poll-timeout", "P", DefaultPollTimeout, "long poll request timeout") + f.Uint32P("max-errors", "k", DefaultMaxErrors, "max number of connection errors") + + // Limits + f.StringP("limit-datetime", "w", "", "limit execution to before datetime") + f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") + f.StringP("limit-username", "y", "", "limit execution to specified username") + f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") + f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") + f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") + + f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") + }) +} + +// coreImplantFlagCompletions binds completions to flags registered in coreImplantFlags. +func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverConsoleClient) { + flags.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { + (*comp)["debug-file"] = carapace.ActionFiles() + (*comp)["os"] = OSCompleter(con) + (*comp)["arch"] = ArchCompleter(con) + (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") + (*comp)["format"] = FormatCompleter() + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) +} + +// coreBeaconFlags binds all flags specific to beacon implants (profiles or compiled). +func coreBeaconFlags(name string, cmd *cobra.Command) { + flags.Bind(name, false, cmd, func(f *pflag.FlagSet) { + f.Int64P("days", "D", 0, "beacon interval days") + f.Int64P("hours", "H", 0, "beacon interval hours") + f.Int64P("minutes", "M", 0, "beacon interval minutes") + f.Int64P("seconds", "S", 60, "beacon interval seconds") + f.Int64P("jitter", "J", 30, "beacon interval jitter in seconds") + }) +} + +// compileImplantFlags binds all flags used when actually compiling an implant (not when creating a profile). +func compileImplantFlags(name string, cmd *cobra.Command) { + flags.Bind(name, false, cmd, func(f *pflag.FlagSet) { + f.StringP("name", "N", "", "agent name") + f.StringP("template", "I", "sliver", "implant code template") + f.BoolP("external-builder", "E", false, "use an external builder") + f.StringP("save", "s", "", "directory/file to the binary to") + }) +} diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go new file mode 100644 index 0000000000..ca6573d325 --- /dev/null +++ b/client/command/hosts/commands.go @@ -0,0 +1,59 @@ +package hosts + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + hostsCmd := &cobra.Command{ + Use: consts.HostsStr, + Short: "Manage the database of hosts", + Long: help.GetHelpFor([]string{consts.HostsStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("hosts", true, hostsCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + hostsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a host from the database", + Long: help.GetHelpFor([]string{consts.HostsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsRmCmd(cmd, con, args) + }, + } + hostsCmd.AddCommand(hostsRmCmd) + + hostsIOCCmd := &cobra.Command{ + Use: consts.IOCStr, + Short: "Manage tracked IOCs on a given host", + Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsIOCCmd(cmd, con, args) + }, + } + hostsCmd.AddCommand(hostsIOCCmd) + + hostsIOCRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Delete IOCs from the database", + Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsIOCRmCmd(cmd, con, args) + }, + } + hostsIOCCmd.AddCommand(hostsIOCRmCmd) + + return []*cobra.Command{hostsCmd, hostsIOCCmd} +} diff --git a/client/command/info/commands.go b/client/command/info/commands.go new file mode 100644 index 0000000000..90472999d3 --- /dev/null +++ b/client/command/info/commands.go @@ -0,0 +1,32 @@ +package info + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/use" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + infoCmd := &cobra.Command{ + Use: consts.InfoStr, + Short: "Get info about session", + Long: help.GetHelpFor([]string{consts.InfoStr}), + Run: func(cmd *cobra.Command, args []string) { + InfoCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("use", false, infoCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) + + return []*cobra.Command{infoCmd} +} diff --git a/client/command/licenses/commands.go b/client/command/licenses/commands.go new file mode 100644 index 0000000000..d0a9b18396 --- /dev/null +++ b/client/command/licenses/commands.go @@ -0,0 +1,25 @@ +package licenses + +import ( + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/licenses" +) + +// Commands returns the `licences` command. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + licensesCmd := &cobra.Command{ + Use: consts.LicensesStr, + Short: "Open source licenses", + Long: help.GetHelpFor([]string{consts.LicensesStr}), + Run: func(cmd *cobra.Command, args []string) { + con.Println(licenses.All) + }, + GroupID: consts.GenericHelpGroup, + } + + return []*cobra.Command{licensesCmd} +} diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go new file mode 100644 index 0000000000..4087ce6ed4 --- /dev/null +++ b/client/command/loot/commands.go @@ -0,0 +1,116 @@ +package loot + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + lootCmd := &cobra.Command{ + Use: consts.LootStr, + Short: "Manage the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr}), + Run: func(cmd *cobra.Command, args []string) { + LootCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("loot", true, lootCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("loot", false, lootCmd, func(f *pflag.FlagSet) { + f.StringP("filter", "f", "", "filter based on loot type") + }) + + lootAddCmd := &cobra.Command{ + Use: consts.LootLocalStr, + Short: "Add a local file to the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.LootLocalStr}), + Run: func(cmd *cobra.Command, args []string) { + LootAddLocalCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + lootCmd.AddCommand(lootAddCmd) + flags.Bind("loot", false, lootAddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "name of this piece of loot") + f.StringP("type", "T", "", "force a specific loot type (file/cred)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text)") + }) + flags.BindFlagCompletions(lootAddCmd, func(comp *carapace.ActionMap) { + (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") + (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + }) + carapace.Gen(lootAddCmd).PositionalCompletion( + carapace.ActionFiles().Tag("local loot file").Usage("The local file path to the loot")) + + lootRemoteCmd := &cobra.Command{ + Use: consts.LootRemoteStr, + Short: "Add a remote file from the current session to the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.LootRemoteStr}), + Run: func(cmd *cobra.Command, args []string) { + LootAddRemoteCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + lootCmd.AddCommand(lootRemoteCmd) + flags.Bind("loot", false, lootRemoteCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "name of this piece of loot") + f.StringP("type", "T", "", "force a specific loot type (file/cred)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text)") + }) + flags.BindFlagCompletions(lootRemoteCmd, func(comp *carapace.ActionMap) { + (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") + (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + }) + carapace.Gen(lootRemoteCmd).PositionalCompletion(carapace.ActionValues().Usage("The file path on the remote host to the loot")) + + lootRenameCmd := &cobra.Command{ + Use: consts.RenameStr, + Short: "Re-name a piece of existing loot", + Long: help.GetHelpFor([]string{consts.LootStr, consts.RenameStr}), + Run: func(cmd *cobra.Command, args []string) { + LootRenameCmd(cmd, con, args) + }, + } + lootCmd.AddCommand(lootRenameCmd) + + lootFetchCmd := &cobra.Command{ + Use: consts.FetchStr, + Short: "Fetch a piece of loot from the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.FetchStr}), + Run: func(cmd *cobra.Command, args []string) { + LootFetchCmd(cmd, con, args) + }, + } + lootCmd.AddCommand(lootFetchCmd) + flags.Bind("loot", false, lootFetchCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save loot to a local file") + f.StringP("filter", "f", "", "filter based on loot type") + }) + flags.BindFlagCompletions(lootFetchCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") + }) + + lootRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a piece of loot from the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + LootRmCmd(cmd, con, args) + }, + } + lootCmd.AddCommand(lootRmCmd) + flags.Bind("loot", false, lootRmCmd, func(f *pflag.FlagSet) { + f.StringP("filter", "f", "", "filter based on loot type") + }) + + return []*cobra.Command{lootCmd} +} diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go new file mode 100644 index 0000000000..3a3080ee5d --- /dev/null +++ b/client/command/monitor/commands.go @@ -0,0 +1,33 @@ +package monitor + +import ( + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + monitorCmd := &cobra.Command{ + Use: consts.MonitorStr, + Short: "Monitor threat intel platforms for Sliver implants", + GroupID: consts.SliverHelpGroup, + } + monitorCmd.AddCommand(&cobra.Command{ + Use: "start", + Short: "Start the monitoring loops", + Run: func(cmd *cobra.Command, args []string) { + MonitorStartCmd(cmd, con, args) + }, + }) + monitorCmd.AddCommand(&cobra.Command{ + Use: "stop", + Short: "Stop the monitoring loops", + Run: func(cmd *cobra.Command, args []string) { + MonitorStopCmd(cmd, con, args) + }, + }) + + return []*cobra.Command{monitorCmd} +} diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go index 03edb8b160..2713a124b3 100644 --- a/client/command/operators/commands.go +++ b/client/command/operators/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) *cobra.Command { +func Commands(con *console.SliverConsoleClient) []*cobra.Command { operatorsCmd := &cobra.Command{ Use: consts.OperatorsStr, Short: "Manage operators", @@ -25,5 +25,5 @@ func Commands(con *console.SliverConsoleClient) *cobra.Command { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - return operatorsCmd + return []*cobra.Command{operatorsCmd} } diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go new file mode 100644 index 0000000000..9167d3037b --- /dev/null +++ b/client/command/prelude-operator/commands.go @@ -0,0 +1,45 @@ +package operator + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + operatorCmd := &cobra.Command{ + Use: consts.PreludeOperatorStr, + Short: "Manage connection to Prelude's Operator", + Long: help.GetHelpFor([]string{consts.PreludeOperatorStr}), + GroupID: consts.GenericHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + OperatorCmd(cmd, con, args) + }, + } + + operatorConnectCmd := &cobra.Command{ + Use: consts.ConnectStr, + Short: "Connect with Prelude's Operator", + Long: help.GetHelpFor([]string{consts.PreludeOperatorStr, consts.ConnectStr}), + Run: func(cmd *cobra.Command, args []string) { + ConnectCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + operatorCmd.AddCommand(operatorConnectCmd) + flags.Bind("operator", false, operatorConnectCmd, func(f *pflag.FlagSet) { + f.BoolP("skip-existing", "s", false, "Do not add existing sessions as Operator Agents") + f.StringP("aes-key", "a", "abcdefghijklmnopqrstuvwxyz012345", "AES key for communication encryption") + f.StringP("range", "r", "sliver", "Agents range") + }) + carapace.Gen(operatorConnectCmd).PositionalCompletion( + carapace.ActionValues().Usage("connection string to the Operator Host (e.g. 127.0.0.1:1234)")) + + return []*cobra.Command{operatorCmd} +} diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go new file mode 100644 index 0000000000..5c8d215a30 --- /dev/null +++ b/client/command/reaction/commands.go @@ -0,0 +1,87 @@ +package reaction + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + reactionCmd := &cobra.Command{ + Use: consts.ReactionStr, + Short: "Manage automatic reactions to events", + Long: help.GetHelpFor([]string{consts.ReactionStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + + reactionSetCmd := &cobra.Command{ + Use: consts.SetStr, + Short: "Set a reaction to an event", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SetStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionSetCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionSetCmd) + flags.Bind("reactions", false, reactionSetCmd, func(f *pflag.FlagSet) { + f.StringP("event", "e", "", "specify the event type to react to") + }) + + flags.BindFlagCompletions(reactionSetCmd, func(comp *carapace.ActionMap) { + (*comp)["event"] = carapace.ActionValues( + consts.SessionOpenedEvent, + consts.SessionClosedEvent, + consts.SessionUpdateEvent, + consts.BeaconRegisteredEvent, + consts.CanaryEvent, + consts.WatchtowerEvent, + ) + }) + + reactionUnsetCmd := &cobra.Command{ + Use: consts.UnsetStr, + Short: "Unset an existing reaction", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.UnsetStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionUnsetCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionUnsetCmd) + flags.Bind("reactions", false, reactionUnsetCmd, func(f *pflag.FlagSet) { + f.IntP("id", "i", 0, "the id of the reaction to remove") + }) + flags.BindFlagCompletions(reactionUnsetCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = ReactionIDCompleter(con) + }) + + reactionSaveCmd := &cobra.Command{ + Use: consts.SaveStr, + Short: "Save current reactions to disk", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SaveStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionSaveCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionSaveCmd) + + reactionReloadCmd := &cobra.Command{ + Use: consts.ReloadStr, + Short: "Reload reactions from disk, replaces the running configuration", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.ReloadStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionReloadCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionReloadCmd) + + return []*cobra.Command{reactionCmd} +} diff --git a/client/command/server.go b/client/command/server.go index 399e9a4c73..5ff9306a07 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,13 +19,8 @@ package command */ import ( - "os" - "github.com/reeflective/console" - "github.com/reeflective/console/commands/readline" - "github.com/rsteube/carapace" "github.com/spf13/cobra" - "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" @@ -35,10 +30,10 @@ import ( "github.com/bishopfox/sliver/client/command/creds" "github.com/bishopfox/sliver/client/command/exit" "github.com/bishopfox/sliver/client/command/generate" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/hosts" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/jobs" + "github.com/bishopfox/sliver/client/command/licenses" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/command/monitor" "github.com/bishopfox/sliver/client/command/operators" @@ -53,7 +48,6 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/licenses" ) // ServerCommands returns all commands bound to the server menu, optionally @@ -67,1686 +61,69 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. }, } - // Load Reactions - n, err := reaction.LoadReactions() - if err != nil && !os.IsNotExist(err) { - con.PrintErrorf("Failed to load reactions: %s\n", err) - } else if n > 0 { - con.PrintInfof("Loaded %d reaction(s) from disk\n", n) - } - - // [ Groups ] ---------------------------------------------- - groups := []*cobra.Group{ - {ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}, - {ID: consts.NetworkHelpGroup, Title: consts.NetworkHelpGroup}, - {ID: consts.PayloadsHelpGroup, Title: consts.PayloadsHelpGroup}, - {ID: consts.SliverHelpGroup, Title: consts.SliverHelpGroup}, - } - server.AddGroup(groups...) - - // [ Exit ] --------------------------------------------------------------- - exitCmd := &cobra.Command{ - Use: "exit", - Short: "Exit the program", - Run: func(cmd *cobra.Command, args []string) { - exit.ExitCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - server.AddCommand(exitCmd) - - // [ Aliases ] --------------------------------------------- - - aliasCmd := &cobra.Command{ - Use: consts.AliasesStr, - Short: "List current aliases", - Long: help.GetHelpFor([]string{consts.AliasesStr}), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - server.AddCommand(aliasCmd) - - aliasLoadCmd := &cobra.Command{ - Use: consts.LoadStr + " [ALIAS]", - Short: "Load a command alias", - Long: help.GetHelpFor([]string{consts.AliasesStr, consts.LoadStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesLoadCmd(cmd, con, args) - }, - } - carapace.Gen(aliasLoadCmd).PositionalCompletion( - carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) - aliasCmd.AddCommand(aliasLoadCmd) - - aliasInstallCmd := &cobra.Command{ - Use: consts.InstallStr + " [ALIAS]", - Short: "Install a command alias", - Long: help.GetHelpFor([]string{consts.AliasesStr, consts.InstallStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesInstallCmd(cmd, con, args) - }, - } - carapace.Gen(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) - aliasCmd.AddCommand(aliasInstallCmd) - - aliasRemove := &cobra.Command{ - Use: consts.RmStr + " [ALIAS]", - Short: "Remove an alias", - Long: help.GetHelpFor([]string{consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesRemoveCmd(cmd, con, args) - }, - } - carapace.Gen(aliasRemove).PositionalCompletion(alias.AliasCompleter()) - aliasCmd.AddCommand(aliasRemove) - - // [ Armory ] --------------------------------------------- - - armoryCmd := &cobra.Command{ - Use: consts.ArmoryStr, - Short: "Automatically download and install extensions/aliases", - Long: help.GetHelpFor([]string{consts.ArmoryStr}), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmoryCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("armory", true, armoryCmd, func(f *pflag.FlagSet) { - f.BoolP("insecure", "I", false, "skip tls certificate validation") - f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") - f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") - f.StringP("timeout", "t", "15m", "download timeout") - }) - server.AddCommand(armoryCmd) - - armoryInstallCmd := &cobra.Command{ - Use: consts.InstallStr, - Short: "Install an alias or extension", - Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.InstallStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmoryInstallCmd(cmd, con, args) - }, - } - carapace.Gen(armoryInstallCmd).PositionalCompletion( - armory.AliasExtensionOrBundleCompleter().Usage("name of the extension or alias to install")) - armoryCmd.AddCommand(armoryInstallCmd) - - armoryUpdateCmd := &cobra.Command{ - Use: consts.UpdateStr, - Short: "Update installed an aliases and extensions", - Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.UpdateStr}), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmoryUpdateCmd(cmd, con, args) - }, - } - armoryCmd.AddCommand(armoryUpdateCmd) - - armorySearchCmd := &cobra.Command{ - Use: consts.SearchStr, - Short: "Search for aliases and extensions by name (regex)", - Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.SearchStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmorySearchCmd(cmd, con, args) - }, - } - carapace.Gen(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) - armoryCmd.AddCommand(armorySearchCmd) - - // [ Update ] -------------------------------------------------------------- - - updateCmd := &cobra.Command{ - Use: consts.UpdateStr, - Short: "Check for updates", - Long: help.GetHelpFor([]string{consts.UpdateStr}), - Run: func(cmd *cobra.Command, args []string) { - update.UpdateCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("update", false, updateCmd, func(f *pflag.FlagSet) { - f.BoolP("prereleases", "P", false, "include pre-released (unstable) versions") - f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") - f.StringP("save", "s", "", "save downloaded files to specific directory (default user home dir)") - f.BoolP("insecure", "I", false, "skip tls certificate validation") - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(updateCmd) - - versionCmd := &cobra.Command{ - Use: consts.VersionStr, - Short: "Display version information", - Long: help.GetHelpFor([]string{consts.VersionStr}), - Run: func(cmd *cobra.Command, args []string) { - update.VerboseVersionsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("update", false, versionCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(versionCmd) - - // [ Jobs ] ----------------------------------------------------------------- - - jobsCmd := &cobra.Command{ - Use: consts.JobsStr, - Short: "Job control", - Long: help.GetHelpFor([]string{consts.JobsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.JobsCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("jobs", true, jobsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("jobs", false, jobsCmd, func(f *pflag.FlagSet) { - f.Int32P("kill", "k", -1, "kill a background job") - f.BoolP("kill-all", "K", false, "kill all jobs") - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(jobsCmd, func(comp *carapace.ActionMap) { - (*comp)["kill"] = jobs.JobsIDCompleter(con) - }) - server.AddCommand(jobsCmd) - - mtlsCmd := &cobra.Command{ - Use: consts.MtlsStr, - Short: "Start an mTLS listener", - Long: help.GetHelpFor([]string{consts.MtlsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.MTLSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("mTLS listener", false, mtlsCmd, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultMTLSLPort, "tcp listen port") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(mtlsCmd) - - wgCmd := &cobra.Command{ - Use: consts.WGStr, - Short: "Start a WireGuard listener", - Long: help.GetHelpFor([]string{consts.WGStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.WGListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("WireGuard listener", false, wgCmd, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultWGLPort, "udp listen port") - f.Uint32P("nport", "n", generate.DefaultWGNPort, "virtual tun interface listen port") - f.Uint32P("key-port", "x", generate.DefaultWGKeyExPort, "virtual tun interface key exchange port") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(wgCmd) - - dnsCmd := &cobra.Command{ - Use: consts.DnsStr, - Short: "Start a DNS listener", - Long: help.GetHelpFor([]string{consts.DnsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.DNSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("DNS listener", false, dnsCmd, func(f *pflag.FlagSet) { - f.StringP("domains", "d", "", "parent domain(s) to use for DNS c2") - f.BoolP("no-canaries", "c", false, "disable dns canary detection") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultDNSLPort, "udp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(dnsCmd) - - httpCmd := &cobra.Command{ - Use: consts.HttpStr, - Short: "Start an HTTP listener", - Long: help.GetHelpFor([]string{consts.HttpStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.HTTPListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("HTTP listener", false, httpCmd, func(f *pflag.FlagSet) { - f.StringP("domain", "d", "", "limit responses to specific domain") - f.StringP("website", "w", "", "website name (see websites cmd)") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultHTTPLPort, "tcp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") - f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(httpCmd) - - httpsCmd := &cobra.Command{ - Use: consts.HttpsStr, - Short: "Start an HTTPS listener", - Long: help.GetHelpFor([]string{consts.HttpsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.HTTPSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("HTTPS listener", false, httpsCmd, func(f *pflag.FlagSet) { - f.StringP("domain", "d", "", "limit responses to specific domain") - f.StringP("website", "w", "", "website name (see websites cmd)") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultHTTPSLPort, "tcp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") - f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") - - f.StringP("cert", "c", "", "PEM encoded certificate file") - f.StringP("key", "k", "", "PEM encoded private key file") - f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate") - f.BoolP("disable-randomized-jarm", "E", false, "disable randomized jarm fingerprints") - - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(httpsCmd) - - stageCmd := &cobra.Command{ - Use: consts.StageListenerStr, - Short: "Start a stager listener", - Long: help.GetHelpFor([]string{consts.StageListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.StageListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("stage listener", false, stageCmd, func(f *pflag.FlagSet) { - f.StringP("profile", "p", "", "implant profile name to link with the listener") - f.StringP("url", "u", "", "URL to which the stager will call back to") - f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") - f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") - f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") - f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") - f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") - f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") - f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") - }) - FlagComps(stageCmd, func(comp *carapace.ActionMap) { - (*comp)["profile"] = generate.ProfileNameCompleter(con) - (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") - (*comp)["key"] = carapace.ActionFiles().Tag("key file") - (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") - }) - server.AddCommand(stageCmd) - - // [ Operators ] -------------------------------------------------------------- - - operatorsCmd := &cobra.Command{ - Use: consts.OperatorsStr, - Short: "Manage operators", - Long: help.GetHelpFor([]string{consts.OperatorsStr}), - Run: func(cmd *cobra.Command, args []string) { - operators.OperatorsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("operators", false, operatorsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(operatorsCmd) - - // Server-only commands. + // [ Server-only ] if serverCmds != nil { server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) server.AddCommand(serverCmds()...) } - // [ Sessions ] -------------------------------------------------------------- - - sessionsCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Session management", - Long: help.GetHelpFor([]string{consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("sessions", true, sessionsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("sessions", false, sessionsCmd, func(f *pflag.FlagSet) { - f.StringP("interact", "i", "", "interact with a session") - f.StringP("kill", "k", "", "kill the designated session") - f.BoolP("kill-all", "K", false, "kill all the sessions") - f.BoolP("clean", "C", false, "clean out any sessions marked as [DEAD]") - f.BoolP("force", "F", false, "force session action without waiting for results") - - f.StringP("filter", "f", "", "filter sessions by substring") - f.StringP("filter-re", "e", "", "filter sessions by regular expression") - }) - FlagComps(sessionsCmd, func(comp *carapace.ActionMap) { - (*comp)["interact"] = use.BeaconAndSessionIDCompleter(con) - (*comp)["kill"] = use.BeaconAndSessionIDCompleter(con) - }) - server.AddCommand(sessionsCmd) - - sessionsPruneCmd := &cobra.Command{ - Use: consts.PruneStr, - Short: "Kill all stale/dead sessions", - Long: help.GetHelpFor([]string{consts.SessionsStr, consts.PruneStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsPruneCmd(cmd, con, args) - }, - } - Flags("prune", false, sessionsPruneCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "Force the killing of stale/dead sessions") - }) - sessionsCmd.AddCommand(sessionsPruneCmd) - - // [ Use ] -------------------------------------------------------------- - - useCmd := &cobra.Command{ - Use: consts.UseStr, - Short: "Switch the active session or beacon", - Long: help.GetHelpFor([]string{consts.UseStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("use", true, useCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(useCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - server.AddCommand(useCmd) - - useSessionCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Switch the active session", - Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseSessionCmd(cmd, con, args) - }, - } - carapace.Gen(useSessionCmd).PositionalCompletion(use.SessionIDCompleter(con)) - useCmd.AddCommand(useSessionCmd) - - useBeaconCmd := &cobra.Command{ - Use: consts.BeaconsStr, - Short: "Switch the active beacon", - Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseBeaconCmd(cmd, con, args) - }, - } - carapace.Gen(useBeaconCmd).PositionalCompletion(use.BeaconIDCompleter(con)) - useCmd.AddCommand(useBeaconCmd) - - // [ Settings ] -------------------------------------------------------------- - - settingsCmd := &cobra.Command{ - Use: consts.SettingsStr, - Short: "Manage client settings", - Long: help.GetHelpFor([]string{consts.SettingsStr}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - settingsCmd.AddCommand(&cobra.Command{ - Use: consts.SaveStr, - Short: "Save the current settings to disk", - Long: help.GetHelpFor([]string{consts.SettingsStr, consts.SaveStr}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsSaveCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: consts.TablesStr, - Short: "Modify tables setting (style)", - Long: help.GetHelpFor([]string{consts.SettingsStr, consts.TablesStr}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsTablesCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "beacon-autoresults", - Short: "Automatically display beacon task results when completed", - Long: help.GetHelpFor([]string{consts.SettingsStr, "beacon-autoresults"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsBeaconsAutoResultCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "autoadult", - Short: "Automatically accept OPSEC warnings", - Long: help.GetHelpFor([]string{consts.SettingsStr, "autoadult"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsAutoAdultCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "always-overflow", - Short: "Disable table pagination", - Long: help.GetHelpFor([]string{consts.SettingsStr, "always-overflow"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsAlwaysOverflow(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "small-terminal", - Short: "Set the small terminal width", - Long: help.GetHelpFor([]string{consts.SettingsStr, "small-terminal"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsSmallTerm(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "user-connect", - Short: "Enable user connections/disconnections (can be very verbose when they use CLI)", - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsUserConnect(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "console-logs", - Short: "Log console output (toggle)", - Long: help.GetHelpFor([]string{consts.SettingsStr, "console-logs"}), - Run: func(ctx *cobra.Command, args []string) { - settings.SettingsConsoleLogs(ctx, con) - }, - }) - server.AddCommand(settingsCmd) - - // [ Info ] -------------------------------------------------------------- - - infoCmd := &cobra.Command{ - Use: consts.InfoStr, - Short: "Get info about session", - Long: help.GetHelpFor([]string{consts.InfoStr}), - Run: func(cmd *cobra.Command, args []string) { - info.InfoCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("use", false, infoCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - server.AddCommand(infoCmd) - - // [ Shellcode Encoders ] -------------------------------------------------------------- - - shikataGaNaiCmd := &cobra.Command{ - Use: consts.ShikataGaNai, - Short: "Polymorphic binary shellcode encoder (ノ ゜Д゜)ノ ︵ 仕方がない", - Long: help.GetHelpFor([]string{consts.ShikataGaNai}), - Run: func(cmd *cobra.Command, args []string) { - sgn.ShikataGaNaiCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - GroupID: consts.PayloadsHelpGroup, - } - server.AddCommand(shikataGaNaiCmd) - Flags("shikata ga nai", false, shikataGaNaiCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save output to local file") - f.StringP("arch", "a", "amd64", "architecture of shellcode") - f.IntP("iterations", "i", 1, "number of iterations") - f.StringP("bad-chars", "b", "", "hex encoded bad characters to avoid (e.g. 0001)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(shikataGaNaiCmd, func(comp *carapace.ActionMap) { - (*comp)["arch"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save shellcode") - }) - carapace.Gen(shikataGaNaiCmd).PositionalCompletion(carapace.ActionFiles().Tag("shellcode file")) - - // [ Generate ] -------------------------------------------------------------- - - generateCmd := &cobra.Command{ - Use: consts.GenerateStr, - Short: "Generate an implant binary", - Long: help.GetHelpFor([]string{consts.GenerateStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("generate", true, generateCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("session", false, generateCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - f.StringP("name", "N", "", "agent name") - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - f.StringP("template", "I", "sliver", "implant code template") - f.BoolP("external-builder", "E", false, "use an external builder") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - f.StringP("save", "s", "", "directory/file to the binary to") - }) - FlagComps(generateCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - server.AddCommand(generateCmd) - - generateBeaconCmd := &cobra.Command{ - Use: consts.BeaconStr, - Short: "Generate a beacon binary", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.BeaconStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateBeaconCmd(cmd, con, args) - }, - } - Flags("beacon", false, generateBeaconCmd, func(f *pflag.FlagSet) { - f.Int64P("days", "D", 0, "beacon interval days") - f.Int64P("hours", "H", 0, "beacon interval hours") - f.Int64P("minutes", "M", 0, "beacon interval minutes") - f.Int64P("seconds", "S", 60, "beacon interval seconds") - f.Int64P("jitter", "J", 30, "beacon interval jitter in seconds") - - // Generate flags - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - f.StringP("name", "N", "", "agent name") - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - f.StringP("template", "I", "sliver", "implant code template") - f.BoolP("external-builder", "E", false, "use an external builder") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - f.StringP("save", "s", "", "directory/file to the binary to") - }) - FlagComps(generateBeaconCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - generateCmd.AddCommand(generateBeaconCmd) - - generateStagerCmd := &cobra.Command{ - Use: consts.MsfStagerStr, - Short: "Generate a stager using Metasploit (requires local Metasploit installation)", - Long: help.GetHelpFor([]string{consts.MsfStagerStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateStagerCmd(cmd, con, args) - }, - } - Flags("stager", false, generateStagerCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - f.StringP("lhost", "L", "", "Listening host") - f.Uint32P("lport", "l", 8443, "Listening port") - f.StringP("protocol", "r", "tcp", "Staging protocol (tcp/http/https)") - f.StringP("format", "f", "raw", "Output format (msfvenom formats, see help generate msf-stager for the list)") - f.StringP("badchars", "b", "", "bytes to exclude from stage shellcode") - f.StringP("save", "s", "", "directory to save the generated stager to") - f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") - }) - generateCmd.AddCommand(generateStagerCmd) - - generateInfoCmd := &cobra.Command{ - Use: consts.CompilerInfoStr, - Short: "Get information about the server's compiler", - Long: help.GetHelpFor([]string{consts.CompilerInfoStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateInfoCmd(cmd, con, args) - }, - } - generateCmd.AddCommand(generateInfoCmd) - - // Traffic Encoder SubCommands - trafficEncodersCmd := &cobra.Command{ - Use: consts.TrafficEncodersStr, - Short: "Manage implant traffic encoders", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.TrafficEncodersCmd(cmd, con, args) - }, - } - generateCmd.AddCommand(trafficEncodersCmd) - - trafficEncodersAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a new traffic encoder to the server from the local file system", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.AddStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.TrafficEncodersAddCmd(cmd, con, args) - }, - } - Flags("", false, trafficEncodersAddCmd, func(f *pflag.FlagSet) { - f.BoolP("skip-tests", "s", false, "skip testing the traffic encoder (not recommended)") - }) - carapace.Gen(trafficEncodersAddCmd).PositionalCompletion(carapace.ActionFiles("wasm").Tag("wasm files").Usage("local file path (expects .wasm)")) - trafficEncodersCmd.AddCommand(trafficEncodersAddCmd) - - trafficEncodersRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a traffic encoder from the server", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.TrafficEncodersRemoveCmd(cmd, con, args) - }, - } - carapace.Gen(trafficEncodersRmCmd).PositionalCompletion(generate.TrafficEncodersCompleter(con).Usage("traffic encoder to remove")) - trafficEncodersCmd.AddCommand(trafficEncodersRmCmd) - - // [ Regenerate ] -------------------------------------------------------------- - - regenerateCmd := &cobra.Command{ - Use: consts.RegenerateStr, - Short: "Regenerate an implant", - Long: help.GetHelpFor([]string{consts.RegenerateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.RegenerateCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("regenerate", false, regenerateCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "directory/file to the binary to") - }) - FlagComps(regenerateCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(regenerateCmd).PositionalCompletion(generate.ImplantBuildNameCompleter(con)) - server.AddCommand(regenerateCmd) - - // [ Profiles ] -------------------------------------------------------------- - - profilesCmd := &cobra.Command{ - Use: consts.ProfilesStr, - Short: "List existing profiles", - Long: help.GetHelpFor([]string{consts.ProfilesStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("profiles", true, profilesCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(profilesCmd) - - profilesGenerateCmd := &cobra.Command{ - Use: consts.GenerateStr, - Short: "Generate implant from a profile", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.GenerateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesGenerateCmd(cmd, con, args) - }, - } - Flags("profiles", false, profilesGenerateCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "directory/file to the binary to") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - }) - FlagComps(profilesGenerateCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(profilesGenerateCmd).PositionalCompletion(generate.ProfileNameCompleter(con)) - profilesCmd.AddCommand(profilesGenerateCmd) - - profilesNewCmd := &cobra.Command{ - Use: consts.NewStr, - Short: "Create a new implant profile (interactive session)", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesNewCmd(cmd, con, args) - }, - } - Flags("session", false, profilesNewCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("name", "N", "", "agent name") - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("template", "I", "sliver", "implant code template") - - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - }) - FlagComps(profilesNewCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(profilesNewCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the session profile (optional)")) - profilesCmd.AddCommand(profilesNewCmd) - - // New Beacon Profile Command - profilesNewBeaconCmd := &cobra.Command{ - Use: consts.BeaconStr, - Short: "Create a new implant profile (beacon)", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr, consts.BeaconStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesNewBeaconCmd(cmd, con, args) - }, - } - Flags("beacon", false, profilesNewBeaconCmd, func(f *pflag.FlagSet) { - f.Int64P("days", "D", 0, "beacon interval days") - f.Int64P("hours", "H", 0, "beacon interval hours") - f.Int64P("minutes", "M", 0, "beacon interval minutes") - f.Int64P("seconds", "S", 60, "beacon interval seconds") - f.Int64P("jitter", "J", 30, "beacon interval jitter in seconds") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - // Generate flags - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("name", "N", "", "agent name") - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("template", "I", "sliver", "implant code template") - - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - }) - FlagComps(profilesNewBeaconCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(profilesNewBeaconCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the beacon profile (optional)")) - profilesNewCmd.AddCommand(profilesNewBeaconCmd) - - profilesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a profile", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesRmCmd(cmd, con, args) - }, - } - carapace.Gen(profilesRmCmd).PositionalCompletion(generate.ProfileNameCompleter(con)) - profilesCmd.AddCommand(profilesRmCmd) - - implantBuildsCmd := &cobra.Command{ - Use: consts.ImplantBuildsStr, - Short: "List implant builds", - Long: help.GetHelpFor([]string{consts.ImplantBuildsStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ImplantsCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("implants", true, implantBuildsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("implants", false, implantBuildsCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "", "filter builds by operating system") - f.StringP("arch", "a", "", "filter builds by cpu architecture") - f.StringP("format", "f", "", "filter builds by artifact format") - f.BoolP("only-sessions", "s", false, "filter interactive sessions") - f.BoolP("only-beacons", "b", false, "filter beacons") - f.BoolP("no-debug", "d", false, "filter builds by debug flag") - }) - FlagComps(profilesNewBeaconCmd, func(comp *carapace.ActionMap) { - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["format"] = generate.FormatCompleter() - }) - server.AddCommand(implantBuildsCmd) - - implantsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove implant build", - Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.ImplantsRmCmd(cmd, con, args) - }, - } - carapace.Gen(implantsRmCmd).PositionalCompletion(generate.ImplantBuildNameCompleter(con)) - implantBuildsCmd.AddCommand(implantsRmCmd) - - canariesCmd := &cobra.Command{ - Use: consts.CanariesStr, - Short: "List previously generated canaries", - Long: help.GetHelpFor([]string{consts.CanariesStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.CanariesCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("canaries", false, canariesCmd, func(f *pflag.FlagSet) { - f.BoolP("burned", "b", false, "show only triggered/burned canaries") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Websites ] --------------------------------------------- - - websitesCmd := &cobra.Command{ - Use: consts.WebsitesStr, - Short: "Host static content (used with HTTP C2)", - Long: help.GetHelpFor([]string{consts.WebsitesStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - server.AddCommand(websitesCmd) - Flags("websites", true, websitesCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(websitesCmd).PositionalCompletion(websites.WebsiteNameCompleter(con)) - - websitesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove an entire website and all of its contents", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsiteRmCmd(cmd, con, args) - }, - } - carapace.Gen(websitesRmCmd).PositionalCompletion(websites.WebsiteNameCompleter(con)) - websitesCmd.AddCommand(websitesRmCmd) - - websitesRmWebContentCmd := &cobra.Command{ - Use: consts.RmWebContentStr, - Short: "Remove specific content from a website", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesRmContent(cmd, con, args) - }, - } - Flags("websites", false, websitesRmWebContentCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively add/rm content") - f.StringP("website", "w", "", "website name") - f.StringP("web-path", "p", "", "http path to host file at") - }) - websitesCmd.AddCommand(websitesRmWebContentCmd) - FlagComps(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { - (*comp)["website"] = websites.WebsiteNameCompleter(con) - }) - - websitesContentCmd := &cobra.Command{ - Use: consts.AddWebContentStr, - Short: "Add content to a website", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesAddContentCmd(cmd, con, args) - }, - } - Flags("websites", false, websitesContentCmd, func(f *pflag.FlagSet) { - f.StringP("website", "w", "", "website name") - f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") - f.StringP("web-path", "p", "/", "http path to host file at") - f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") - f.BoolP("recursive", "r", false, "recursively add/rm content") - }) - FlagComps(websitesContentCmd, func(comp *carapace.ActionMap) { - (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") - (*comp)["website"] = websites.WebsiteNameCompleter(con) - }) - websitesCmd.AddCommand(websitesContentCmd) - - websitesContentTypeCmd := &cobra.Command{ - Use: consts.WebContentTypeStr, - Short: "Update a path's content-type", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.WebContentTypeStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesUpdateContentCmd(cmd, con, args) - }, - } - Flags("websites", false, websitesContentTypeCmd, func(f *pflag.FlagSet) { - f.StringP("website", "w", "", "website name") - f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") - f.StringP("web-path", "p", "/", "http path to host file at") - }) - websitesCmd.AddCommand(websitesContentTypeCmd) - FlagComps(websitesContentTypeCmd, func(comp *carapace.ActionMap) { - (*comp)["website"] = websites.WebsiteNameCompleter(con) - }) - - // [ Beacons ] --------------------------------------------- - - beaconsCmd := &cobra.Command{ - Use: consts.BeaconsStr, - Short: "Manage beacons", - Long: help.GetHelpFor([]string{consts.BeaconsStr}), - GroupID: consts.SliverHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsCmd(cmd, con, args) - }, - } - Flags("beacons", true, beaconsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("beacons", false, beaconsCmd, func(f *pflag.FlagSet) { - f.StringP("kill", "k", "", "kill the designated beacon") - f.BoolP("kill-all", "K", false, "kill all beacons") - f.BoolP("force", "F", false, "force killing the beacon") - - f.StringP("filter", "f", "", "filter beacons by substring") - f.StringP("filter-re", "e", "", "filter beacons by regular expression") - }) - FlagComps(beaconsCmd, func(comp *carapace.ActionMap) { - (*comp)["kill"] = use.BeaconIDCompleter(con) - }) - beaconsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a beacon", - Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsRmCmd(cmd, con, args) - }, - } - carapace.Gen(beaconsRmCmd).PositionalCompletion(use.BeaconIDCompleter(con)) - beaconsCmd.AddCommand(beaconsRmCmd) - - beaconsWatchCmd := &cobra.Command{ - Use: consts.WatchStr, - Short: "Watch your beacons", - Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.WatchStr}), - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsWatchCmd(cmd, con, args) - }, - } - beaconsCmd.AddCommand(beaconsWatchCmd) - - beaconsPruneCmd := &cobra.Command{ - Use: consts.PruneStr, - Short: "Prune stale beacons automatically", - Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.PruneStr}), - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsPruneCmd(cmd, con, args) - }, - } - Flags("beacons", false, beaconsPruneCmd, func(f *pflag.FlagSet) { - f.StringP("duration", "d", "1h", "duration to prune beacons that have missed their last checkin") - }) - beaconsCmd.AddCommand(beaconsPruneCmd) - server.AddCommand(beaconsCmd) - - // [ Licenses ] --------------------------------------------- - - server.AddCommand(&cobra.Command{ - Use: consts.LicensesStr, - Short: "Open source licenses", - Long: help.GetHelpFor([]string{consts.LicensesStr}), - Run: func(cmd *cobra.Command, args []string) { - con.Println(licenses.All) - }, - GroupID: consts.GenericHelpGroup, - }) - - // [ WireGuard ] -------------------------------------------------------------- - - wgConfigCmd := &cobra.Command{ - Use: consts.WgConfigStr, - Short: "Generate a new WireGuard client config", - Long: help.GetHelpFor([]string{consts.WgConfigStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGConfigCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - server.AddCommand(wgConfigCmd) - - Flags("wg-config", true, wgConfigCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("wg-config", false, wgConfigCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save configuration to file (.conf)") - }) - FlagComps(wgConfigCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") - }) - - // [ Monitor ] -------------------------------------------------------------- - - monitorCmd := &cobra.Command{ - Use: consts.MonitorStr, - Short: "Monitor threat intel platforms for Sliver implants", - GroupID: consts.SliverHelpGroup, - } - monitorCmd.AddCommand(&cobra.Command{ - Use: "start", - Short: "Start the monitoring loops", - Run: func(cmd *cobra.Command, args []string) { - monitor.MonitorStartCmd(cmd, con, args) - }, - }) - monitorCmd.AddCommand(&cobra.Command{ - Use: "stop", - Short: "Stop the monitoring loops", - Run: func(cmd *cobra.Command, args []string) { - monitor.MonitorStopCmd(cmd, con, args) - }, - }) - server.AddCommand(monitorCmd) - - // [ Loot ] -------------------------------------------------------------- - - lootCmd := &cobra.Command{ - Use: consts.LootStr, - Short: "Manage the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("loot", true, lootCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("loot", false, lootCmd, func(f *pflag.FlagSet) { - f.StringP("filter", "f", "", "filter based on loot type") - }) - - lootAddCmd := &cobra.Command{ - Use: consts.LootLocalStr, - Short: "Add a local file to the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.LootLocalStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootAddLocalCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - lootCmd.AddCommand(lootAddCmd) - Flags("loot", false, lootAddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "name of this piece of loot") - f.StringP("type", "T", "", "force a specific loot type (file/cred)") - f.StringP("file-type", "F", "", "force a specific file type (binary/text)") - }) - FlagComps(lootAddCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") - }) - carapace.Gen(lootAddCmd).PositionalCompletion( - carapace.ActionFiles().Tag("local loot file").Usage("The local file path to the loot")) - - lootRemoteCmd := &cobra.Command{ - Use: consts.LootRemoteStr, - Short: "Add a remote file from the current session to the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.LootRemoteStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootAddRemoteCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - lootCmd.AddCommand(lootRemoteCmd) - Flags("loot", false, lootRemoteCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "name of this piece of loot") - f.StringP("type", "T", "", "force a specific loot type (file/cred)") - f.StringP("file-type", "F", "", "force a specific file type (binary/text)") - }) - FlagComps(lootRemoteCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") - }) - carapace.Gen(lootRemoteCmd).PositionalCompletion(carapace.ActionValues().Usage("The file path on the remote host to the loot")) - - lootRenameCmd := &cobra.Command{ - Use: consts.RenameStr, - Short: "Re-name a piece of existing loot", - Long: help.GetHelpFor([]string{consts.LootStr, consts.RenameStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootRenameCmd(cmd, con, args) - }, - } - lootCmd.AddCommand(lootRenameCmd) - - lootFetchCmd := &cobra.Command{ - Use: consts.FetchStr, - Short: "Fetch a piece of loot from the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.FetchStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootFetchCmd(cmd, con, args) - }, - } - lootCmd.AddCommand(lootFetchCmd) - Flags("loot", false, lootFetchCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save loot to a local file") - f.StringP("filter", "f", "", "filter based on loot type") - }) - FlagComps(lootFetchCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") - }) - - lootRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a piece of loot from the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootRmCmd(cmd, con, args) - }, - } - lootCmd.AddCommand(lootRmCmd) - Flags("loot", false, lootRmCmd, func(f *pflag.FlagSet) { - f.StringP("filter", "f", "", "filter based on loot type") - }) - - server.AddCommand(lootCmd) - - // [ Credentials ] ------------------------------------------------------------ - credsCmd := &cobra.Command{ - Use: consts.CredsStr, - Short: "Manage the database of credentials", - Long: help.GetHelpFor([]string{consts.CredsStr}), - GroupID: consts.GenericHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - creds.CredsCmd(cmd, con, args) - }, - } - Flags("creds", true, credsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(credsCmd) - - credsAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a credential to the database", - Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - creds.CredsAddCmd(cmd, con, args) - }, - } - Flags("", false, credsAddCmd, func(f *pflag.FlagSet) { - f.StringP("collection", "c", "", "name of collection") - f.StringP("username", "u", "", "username for the credential") - f.StringP("plaintext", "p", "", "plaintext for the credential") - f.StringP("hash", "P", "", "hash of the credential") - f.StringP("hash-type", "H", "", "hash type of the credential") - }) - FlagComps(credsAddCmd, func(comp *carapace.ActionMap) { - (*comp)["hash-type"] = creds.CredsHashTypeCompleter(con) - }) - credsCmd.AddCommand(credsAddCmd) - - credsAddFileCmd := &cobra.Command{ - Use: consts.FileStr, - Short: "Add a credential to the database", - Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr, consts.FileStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - creds.CredsAddHashFileCmd(cmd, con, args) - }, - } - Flags("", false, credsAddFileCmd, func(f *pflag.FlagSet) { - f.StringP("collection", "c", "", "name of collection") - f.StringP("file-format", "F", creds.HashNewlineFormat, "file format of the credential file") - f.StringP("hash-type", "H", "", "hash type of the credential") - }) - FlagComps(credsAddFileCmd, func(comp *carapace.ActionMap) { - (*comp)["collection"] = creds.CredsCollectionCompleter(con) - (*comp)["file-format"] = creds.CredsHashFileFormatCompleter(con) - (*comp)["hash-type"] = creds.CredsHashTypeCompleter(con) - }) - carapace.Gen(credsAddFileCmd).PositionalCompletion(carapace.ActionFiles().Tag("credential file")) - credsAddCmd.AddCommand(credsAddFileCmd) - - credsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a credential to the database", - Long: help.GetHelpFor([]string{consts.CredsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - creds.CredsRmCmd(cmd, con, args) - }, - } - carapace.Gen(credsRmCmd).PositionalCompletion(creds.CredsCredentialIDCompleter(con).Usage("id of credential to remove (leave empty to select)")) - credsCmd.AddCommand(credsRmCmd) - - // [ Hosts ] --------------------------------------------------------------------- - - hostsCmd := &cobra.Command{ - Use: consts.HostsStr, - Short: "Manage the database of hosts", - Long: help.GetHelpFor([]string{consts.HostsStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - server.AddCommand(hostsCmd) - Flags("hosts", true, hostsCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - hostsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a host from the database", - Long: help.GetHelpFor([]string{consts.HostsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsRmCmd(cmd, con, args) - }, - } - hostsCmd.AddCommand(hostsRmCmd) - - hostsIOCCmd := &cobra.Command{ - Use: consts.IOCStr, - Short: "Manage tracked IOCs on a given host", - Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsIOCCmd(cmd, con, args) - }, - } - hostsCmd.AddCommand(hostsIOCCmd) - - hostsIOCRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Delete IOCs from the database", - Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsIOCRmCmd(cmd, con, args) - }, - } - hostsIOCCmd.AddCommand(hostsIOCRmCmd) - - // [ Reactions ] ----------------------------------------------------------------- - - reactionCmd := &cobra.Command{ - Use: consts.ReactionStr, - Short: "Manage automatic reactions to events", - Long: help.GetHelpFor([]string{consts.ReactionStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - server.AddCommand(reactionCmd) - - reactionSetCmd := &cobra.Command{ - Use: consts.SetStr, - Short: "Set a reaction to an event", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SetStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionSetCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionSetCmd) - Flags("reactions", false, reactionSetCmd, func(f *pflag.FlagSet) { - f.StringP("event", "e", "", "specify the event type to react to") - }) - - FlagComps(reactionSetCmd, func(comp *carapace.ActionMap) { - (*comp)["event"] = carapace.ActionValues( - consts.SessionOpenedEvent, - consts.SessionClosedEvent, - consts.SessionUpdateEvent, - consts.BeaconRegisteredEvent, - consts.CanaryEvent, - consts.WatchtowerEvent, - ) - }) - - reactionUnsetCmd := &cobra.Command{ - Use: consts.UnsetStr, - Short: "Unset an existing reaction", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.UnsetStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionUnsetCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionUnsetCmd) - Flags("reactions", false, reactionUnsetCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "the id of the reaction to remove") - }) - FlagComps(reactionUnsetCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = reaction.ReactionIDCompleter(con) - }) - - reactionSaveCmd := &cobra.Command{ - Use: consts.SaveStr, - Short: "Save current reactions to disk", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SaveStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionSaveCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionSaveCmd) - - reactionReloadCmd := &cobra.Command{ - Use: consts.ReloadStr, - Short: "Reload reactions from disk, replaces the running configuration", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.ReloadStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionReloadCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionReloadCmd) - - // [ Prelude's Operator ] ------------------------------------------------------------ - operatorCmd := &cobra.Command{ - Use: consts.PreludeOperatorStr, - Short: "Manage connection to Prelude's Operator", - Long: help.GetHelpFor([]string{consts.PreludeOperatorStr}), - GroupID: consts.GenericHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - operator.OperatorCmd(cmd, con, args) - }, - } - server.AddCommand(operatorCmd) - - operatorConnectCmd := &cobra.Command{ - Use: consts.ConnectStr, - Short: "Connect with Prelude's Operator", - Long: help.GetHelpFor([]string{consts.PreludeOperatorStr, consts.ConnectStr}), - Run: func(cmd *cobra.Command, args []string) { - operator.ConnectCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - operatorCmd.AddCommand(operatorConnectCmd) - Flags("operator", false, operatorConnectCmd, func(f *pflag.FlagSet) { - f.BoolP("skip-existing", "s", false, "Do not add existing sessions as Operator Agents") - f.StringP("aes-key", "a", "abcdefghijklmnopqrstuvwxyz012345", "AES key for communication encryption") - f.StringP("range", "r", "sliver", "Agents range") - }) - carapace.Gen(operatorConnectCmd).PositionalCompletion( - carapace.ActionValues().Usage("connection string to the Operator Host (e.g. 127.0.0.1:1234)")) - - // [ Builders ] --------------------------------------------- - - buildersCmd := &cobra.Command{ - Use: consts.BuildersStr, - Short: "List external builders", - Long: help.GetHelpFor([]string{consts.BuildersStr}), - Run: func(cmd *cobra.Command, args []string) { - builders.BuildersCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - server.AddCommand(buildersCmd) - Flags("builders", false, buildersCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Crack ] ------------------------------------------------------------ - crackCmd := &cobra.Command{ - Use: consts.CrackStr, - Short: "Crack: GPU password cracking", - Long: help.GetHelpFor([]string{consts.CrackStr}), - GroupID: consts.GenericHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - crack.CrackCmd(cmd, con, args) - }, - } - Flags("", true, crackCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(crackCmd) - - crackStationsCmd := &cobra.Command{ - Use: consts.StationsStr, - Short: "Manage crackstations", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.StationsStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackStationsCmd(cmd, con, args) - }, - } - crackCmd.AddCommand(crackStationsCmd) - - wordlistsCmd := &cobra.Command{ - Use: consts.WordlistsStr, - Short: "Manage wordlists", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.WordlistsStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackWordlistsCmd(cmd, con, args) - }, - } - crackCmd.AddCommand(wordlistsCmd) - - wordlistsAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a wordlist", - Run: func(cmd *cobra.Command, args []string) { - crack.CrackWordlistsAddCmd(cmd, con, args) - }, - } - Flags("", false, wordlistsAddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "wordlist name (blank = filename)") - }) - carapace.Gen(wordlistsAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local wordlist file")) - wordlistsCmd.AddCommand(wordlistsAddCmd) - - wordlistsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a wordlist", - Run: func(cmd *cobra.Command, args []string) { - crack.CrackWordlistsRmCmd(cmd, con, args) - }, - } - wordlistsCmd.AddCommand(wordlistsRmCmd) - carapace.Gen(wordlistsRmCmd).PositionalCompletion(crack.CrackWordlistCompleter(con).Usage("wordlist to remove")) - - rulesCmd := &cobra.Command{ - Use: consts.RulesStr, - Short: "Manage rule files", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackRulesCmd(cmd, con, args) - }, - } - crackCmd.AddCommand(rulesCmd) - - rulesAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a rules file", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackRulesAddCmd(cmd, con, args) - }, - } - Flags("", false, rulesAddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "rules name (blank = filename)") - }) - carapace.Gen(rulesAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local rules file")) - rulesCmd.AddCommand(rulesAddCmd) - - rulesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove rules", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackRulesRmCmd(cmd, con, args) - }, - } - carapace.Gen(rulesRmCmd).PositionalCompletion(crack.CrackRulesCompleter(con).Usage("rules to remove")) - rulesCmd.AddCommand(rulesRmCmd) - - hcstat2Cmd := &cobra.Command{ - Use: consts.Hcstat2Str, - Short: "Manage markov hcstat2 files", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackHcstat2Cmd(cmd, con, args) - }, - } - crackCmd.AddCommand(hcstat2Cmd) - - hcstat2AddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a hcstat2 file", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackHcstat2AddCmd(cmd, con, args) - }, - } - Flags("", false, hcstat2AddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "hcstat2 name (blank = filename)") - }) - carapace.Gen(hcstat2AddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local hcstat2 file")) - hcstat2Cmd.AddCommand(hcstat2AddCmd) - - hcstat2RmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove hcstat2 file", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackHcstat2RmCmd(cmd, con, args) - }, - } - carapace.Gen(hcstat2RmCmd).PositionalCompletion(crack.CrackHcstat2Completer(con).Usage("hcstat2 to remove")) - hcstat2Cmd.AddCommand(hcstat2RmCmd) + // [ Bind commands ] -------------------------------------------------------- + + // Below are bounds all commands of the server menu, gathered by the group + // under which they should be printed in help messages and/or completions. + // You can either add a new bindCommands() call with a new group (which will + // be automatically added to the command tree), or add your commands in one of + // the present calls. + + // Core + bindCommands(consts.GenericHelpGroup, server, con, + exit.Command, + licenses.Commands, + settings.Commands, + alias.Commands, + armory.Commands, + update.Commands, + operators.Commands, + operator.Commands, + creds.Commands, + crack.Commands, + ) + + // C2 Network + bindCommands(consts.NetworkHelpGroup, server, con, + jobs.Commands, + websites.Commands, + wireguard.Commands, + ) + + // Payloads + bindCommands(consts.PayloadsHelpGroup, server, con, + sgn.Commands, + generate.Commands, + builders.Commands, + ) + + // Slivers + bindCommands(consts.SliverHelpGroup, server, con, + use.Commands, + info.Commands, + sessions.Commands, + beacons.Commands, + monitor.Commands, + loot.Commands, + hosts.Commands, + reaction.Commands, + ) // [ Post-command declaration setup]----------------------------------------- // Everything below this line should preferably not be any command binding - // (unless you know what you're doing). If there are any final modifications - // to make to the sliver menu command tree, it time to do them here. + // (although you can do so without fear). If there are any final modifications + // to make to the server menu command tree, it time to do them here. server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) - // Bind a readline subcommand to the `settings` one, for allowing users to - // manipulate the shell instance keymaps, bindings, macros and global options. - settingsCmd.AddCommand(readline.Commands(con.App.Shell())) - return server } diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go new file mode 100644 index 0000000000..0928b782d0 --- /dev/null +++ b/client/command/sessions/commands.go @@ -0,0 +1,85 @@ +package sessions + +import ( + "context" + "fmt" + "strings" + + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/commonpb" +) + +// Commands returns the `sessions` command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + sessionsCmd := &cobra.Command{ + Use: consts.SessionsStr, + Short: "Session management", + Long: help.GetHelpFor([]string{consts.SessionsStr}), + Run: func(cmd *cobra.Command, args []string) { + SessionsCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("sessions", true, sessionsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("sessions", false, sessionsCmd, func(f *pflag.FlagSet) { + f.StringP("interact", "i", "", "interact with a session") + f.StringP("kill", "k", "", "kill the designated session") + f.BoolP("kill-all", "K", false, "kill all the sessions") + f.BoolP("clean", "C", false, "clean out any sessions marked as [DEAD]") + f.BoolP("force", "F", false, "force session action without waiting for results") + + f.StringP("filter", "f", "", "filter sessions by substring") + f.StringP("filter-re", "e", "", "filter sessions by regular expression") + }) + flags.BindFlagCompletions(sessionsCmd, func(comp *carapace.ActionMap) { + (*comp)["interact"] = SessionIDCompleter(con) + (*comp)["kill"] = SessionIDCompleter(con) + }) + + sessionsPruneCmd := &cobra.Command{ + Use: consts.PruneStr, + Short: "Kill all stale/dead sessions", + Long: help.GetHelpFor([]string{consts.SessionsStr, consts.PruneStr}), + Run: func(cmd *cobra.Command, args []string) { + SessionsPruneCmd(cmd, con, args) + }, + } + flags.Bind("prune", false, sessionsPruneCmd, func(f *pflag.FlagSet) { + f.BoolP("force", "F", false, "Force the killing of stale/dead sessions") + }) + sessionsCmd.AddCommand(sessionsPruneCmd) + + return []*cobra.Command{sessionsCmd} +} + +// SessionIDCompleter completes session IDs +func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { + callback := func(_ carapace.Context) carapace.Action { + results := make([]string, 0) + + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err == nil { + for _, s := range sessions.Sessions { + link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) + id := fmt.Sprintf("%s (%d)", s.Name, s.PID) + userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) + desc := strings.Join([]string{id, userHost, link}, " ") + + results = append(results, s.ID[:8]) + results = append(results, desc) + } + } + return carapace.ActionValuesDescribed(results...).Tag("sessions") + } + + return carapace.ActionCallback(callback) +} diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go new file mode 100644 index 0000000000..c82e20bd38 --- /dev/null +++ b/client/command/settings/commands.go @@ -0,0 +1,92 @@ +package settings + +import ( + "github.com/reeflective/console/commands/readline" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + settingsCmd := &cobra.Command{ + Use: consts.SettingsStr, + Short: "Manage client settings", + Long: help.GetHelpFor([]string{consts.SettingsStr}), + Run: func(cmd *cobra.Command, args []string) { + SettingsCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + settingsCmd.AddCommand(&cobra.Command{ + Use: consts.SaveStr, + Short: "Save the current settings to disk", + Long: help.GetHelpFor([]string{consts.SettingsStr, consts.SaveStr}), + Run: func(cmd *cobra.Command, args []string) { + SettingsSaveCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: consts.TablesStr, + Short: "Modify tables setting (style)", + Long: help.GetHelpFor([]string{consts.SettingsStr, consts.TablesStr}), + Run: func(cmd *cobra.Command, args []string) { + SettingsTablesCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "beacon-autoresults", + Short: "Automatically display beacon task results when completed", + Long: help.GetHelpFor([]string{consts.SettingsStr, "beacon-autoresults"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsBeaconsAutoResultCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "autoadult", + Short: "Automatically accept OPSEC warnings", + Long: help.GetHelpFor([]string{consts.SettingsStr, "autoadult"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsAutoAdultCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "always-overflow", + Short: "Disable table pagination", + Long: help.GetHelpFor([]string{consts.SettingsStr, "always-overflow"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsAlwaysOverflow(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "small-terminal", + Short: "Set the small terminal width", + Long: help.GetHelpFor([]string{consts.SettingsStr, "small-terminal"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsSmallTerm(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "user-connect", + Short: "Enable user connections/disconnections (can be very verbose when they use CLI)", + Run: func(cmd *cobra.Command, args []string) { + SettingsUserConnect(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "console-logs", + Short: "Log console output (toggle)", + Long: help.GetHelpFor([]string{consts.SettingsStr, "console-logs"}), + Run: func(ctx *cobra.Command, args []string) { + SettingsConsoleLogs(ctx, con) + }, + }) + + // Bind a readline subcommand to the `settings` one, for allowing users to + // manipulate the shell instance keymaps, bindings, macros and global options. + settingsCmd.AddCommand(readline.Commands(con.App.Shell())) + + return []*cobra.Command{settingsCmd} +} diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go new file mode 100644 index 0000000000..2d81134c19 --- /dev/null +++ b/client/command/shikata-ga-nai/commands.go @@ -0,0 +1,40 @@ +package sgn + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + shikataGaNaiCmd := &cobra.Command{ + Use: consts.ShikataGaNai, + Short: "Polymorphic binary shellcode encoder (ノ ゜Д゜)ノ ︵ 仕方がない", + Long: help.GetHelpFor([]string{consts.ShikataGaNai}), + Run: func(cmd *cobra.Command, args []string) { + ShikataGaNaiCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("shikata ga nai", false, shikataGaNaiCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save output to local file") + f.StringP("arch", "a", "amd64", "architecture of shellcode") + f.IntP("iterations", "i", 1, "number of iterations") + f.StringP("bad-chars", "b", "", "hex encoded bad characters to avoid (e.g. 0001)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(shikataGaNaiCmd, func(comp *carapace.ActionMap) { + (*comp)["arch"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save shellcode") + }) + carapace.Gen(shikataGaNaiCmd).PositionalCompletion(carapace.ActionFiles().Tag("shellcode file")) + + return []*cobra.Command{shikataGaNaiCmd} +} diff --git a/client/command/use/commands.go b/client/command/use/commands.go new file mode 100644 index 0000000000..d5c37a44c0 --- /dev/null +++ b/client/command/use/commands.go @@ -0,0 +1,53 @@ +package use + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + useCmd := &cobra.Command{ + Use: consts.UseStr, + Short: "Switch the active session or beacon", + Long: help.GetHelpFor([]string{consts.UseStr}), + Run: func(cmd *cobra.Command, args []string) { + UseCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("use", true, useCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(useCmd).PositionalCompletion(BeaconAndSessionIDCompleter(con)) + + useSessionCmd := &cobra.Command{ + Use: consts.SessionsStr, + Short: "Switch the active session", + Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), + Run: func(cmd *cobra.Command, args []string) { + UseSessionCmd(cmd, con, args) + }, + } + carapace.Gen(useSessionCmd).PositionalCompletion(SessionIDCompleter(con)) + useCmd.AddCommand(useSessionCmd) + + useBeaconCmd := &cobra.Command{ + Use: consts.BeaconsStr, + Short: "Switch the active beacon", + Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), + Run: func(cmd *cobra.Command, args []string) { + UseBeaconCmd(cmd, con, args) + }, + } + carapace.Gen(useBeaconCmd).PositionalCompletion(BeaconIDCompleter(con)) + useCmd.AddCommand(useBeaconCmd) + + return []*cobra.Command{useCmd} +} diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go new file mode 100644 index 0000000000..862244b3cd --- /dev/null +++ b/client/command/websites/commands.go @@ -0,0 +1,99 @@ +package websites + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + websitesCmd := &cobra.Command{ + Use: consts.WebsitesStr, + Short: "Host static content (used with HTTP C2)", + Long: help.GetHelpFor([]string{consts.WebsitesStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("websites", true, websitesCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(websitesCmd).PositionalCompletion(WebsiteNameCompleter(con)) + + websitesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove an entire website and all of its contents", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsiteRmCmd(cmd, con, args) + }, + } + carapace.Gen(websitesRmCmd).PositionalCompletion(WebsiteNameCompleter(con)) + websitesCmd.AddCommand(websitesRmCmd) + + websitesRmWebContentCmd := &cobra.Command{ + Use: consts.RmWebContentStr, + Short: "Remove specific content from a website", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesRmContent(cmd, con, args) + }, + } + flags.Bind("websites", false, websitesRmWebContentCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively add/rm content") + f.StringP("website", "w", "", "website name") + f.StringP("web-path", "p", "", "http path to host file at") + }) + websitesCmd.AddCommand(websitesRmWebContentCmd) + flags.BindFlagCompletions(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { + (*comp)["website"] = WebsiteNameCompleter(con) + }) + + websitesContentCmd := &cobra.Command{ + Use: consts.AddWebContentStr, + Short: "Add content to a website", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesAddContentCmd(cmd, con, args) + }, + } + flags.Bind("websites", false, websitesContentCmd, func(f *pflag.FlagSet) { + f.StringP("website", "w", "", "website name") + f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") + f.StringP("web-path", "p", "/", "http path to host file at") + f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") + f.BoolP("recursive", "r", false, "recursively add/rm content") + }) + flags.BindFlagCompletions(websitesContentCmd, func(comp *carapace.ActionMap) { + (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") + (*comp)["website"] = WebsiteNameCompleter(con) + }) + websitesCmd.AddCommand(websitesContentCmd) + + websitesContentTypeCmd := &cobra.Command{ + Use: consts.WebContentTypeStr, + Short: "Update a path's content-type", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.WebContentTypeStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesUpdateContentCmd(cmd, con, args) + }, + } + flags.Bind("websites", false, websitesContentTypeCmd, func(f *pflag.FlagSet) { + f.StringP("website", "w", "", "website name") + f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") + f.StringP("web-path", "p", "/", "http path to host file at") + }) + websitesCmd.AddCommand(websitesContentTypeCmd) + flags.BindFlagCompletions(websitesContentTypeCmd, func(comp *carapace.ActionMap) { + (*comp)["website"] = WebsiteNameCompleter(con) + }) + + return []*cobra.Command{websitesCmd} +} diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go new file mode 100644 index 0000000000..dcbb9dc82d --- /dev/null +++ b/client/command/wireguard/commands.go @@ -0,0 +1,37 @@ +package wireguard + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + wgConfigCmd := &cobra.Command{ + Use: consts.WgConfigStr, + Short: "Generate a new WireGuard client config", + Long: help.GetHelpFor([]string{consts.WgConfigStr}), + Run: func(cmd *cobra.Command, args []string) { + WGConfigCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + + flags.Bind("wg-config", true, wgConfigCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("wg-config", false, wgConfigCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save configuration to file (.conf)") + }) + flags.BindFlagCompletions(wgConfigCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") + }) + + return []*cobra.Command{wgConfigCmd} +} diff --git a/client/console/console.go b/client/console/console.go index fde4a37587..f523ca76da 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -40,6 +40,7 @@ import ( "google.golang.org/protobuf/proto" "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/reaction" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" @@ -205,6 +206,16 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds con.setupAsciicastRecord(asciicastLog, asciicastStream) } + // Only load reactions when the console is going to be started. + if !con.IsCLI { + n, err := reaction.LoadReactions() + if err != nil && !os.IsNotExist(err) { + con.PrintErrorf("Failed to load reactions: %s\n", err) + } else if n > 0 { + con.PrintInfof("Loaded %d reaction(s) from disk\n", n) + } + } + if !con.IsCLI { return con.App.Start() } From e23f04096282ba7dff4e408af19922473094f248 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 22 Jun 2023 17:55:32 +0200 Subject: [PATCH 005/109] Split sliver commands in their files --- client/command/backdoor/commands.go | 38 + client/command/command.go | 4 +- client/command/completers/commands.go | 17 + client/command/cursed/commands.go | 149 ++ client/command/dllhijack/commands.go | 43 + client/command/environment/commands.go | 59 + client/command/exec/commands.go | 276 ++++ client/command/extensions/commands.go | 69 + client/command/filesystem/commands.go | 212 +++ client/command/help/commands.go | 17 + client/command/info/commands.go | 70 + client/command/kill/commands.go | 30 + client/command/network/commands.go | 49 + client/command/pivots/commands.go | 101 ++ client/command/portfwd/commands.go | 64 + client/command/privilege/commands.go | 175 +++ client/command/processes/commands.go | 73 + client/command/reconfig/commands.go | 47 + client/command/registry/commands.go | 129 ++ client/command/rportfwd/commands.go | 64 + client/command/screenshot/commands.go | 37 + client/command/server.go | 10 +- client/command/sessions/commands.go | 56 +- client/command/shell/commands.go | 33 + client/command/sliver.go | 1955 +----------------------- client/command/socks/commands.go | 65 + client/command/tasks/commands.go | 58 + client/command/wasm/commands.go | 54 + client/command/wireguard/commands.go | 85 ++ 29 files changed, 2141 insertions(+), 1898 deletions(-) create mode 100644 client/command/backdoor/commands.go create mode 100644 client/command/completers/commands.go create mode 100644 client/command/cursed/commands.go create mode 100644 client/command/dllhijack/commands.go create mode 100644 client/command/environment/commands.go create mode 100644 client/command/exec/commands.go create mode 100644 client/command/extensions/commands.go create mode 100644 client/command/filesystem/commands.go create mode 100644 client/command/help/commands.go create mode 100644 client/command/kill/commands.go create mode 100644 client/command/network/commands.go create mode 100644 client/command/pivots/commands.go create mode 100644 client/command/portfwd/commands.go create mode 100644 client/command/privilege/commands.go create mode 100644 client/command/processes/commands.go create mode 100644 client/command/reconfig/commands.go create mode 100644 client/command/registry/commands.go create mode 100644 client/command/rportfwd/commands.go create mode 100644 client/command/screenshot/commands.go create mode 100644 client/command/shell/commands.go create mode 100644 client/command/socks/commands.go create mode 100644 client/command/tasks/commands.go create mode 100644 client/command/wasm/commands.go diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go new file mode 100644 index 0000000000..8fa7b4bbff --- /dev/null +++ b/client/command/backdoor/commands.go @@ -0,0 +1,38 @@ +package backdoor + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + backdoorCmd := &cobra.Command{ + Use: consts.BackdoorStr, + Short: "Infect a remote file with a sliver shellcode", + Long: help.GetHelpFor([]string{consts.BackdoorStr}), + Args: cobra.ExactArgs(1), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + BackdoorCmd(cmd, con, args) + }, + } + flags.Bind("", false, backdoorCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "profile to use for service binary") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(backdoorCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + }) + carapace.Gen(backdoorCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the remote file to backdoor")) + + return []*cobra.Command{backdoorCmd} +} diff --git a/client/command/command.go b/client/command/command.go index 9ba69ab42f..2afd028b3e 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -101,11 +101,11 @@ func RestrictTargets(filters ...string) map[string]string { // - double bind session commands // - don't bind readline command in CLI. -// bindCommands is a helper used to bind a list of root commands to a given menu, for a given "command help group". +// bind is a helper used to bind a list of root commands to a given menu, for a given "command help group". // @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. // @menu - The command menu to which the commands should be bound (either server or implant menu). // @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bindCommands(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { +func bind(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { found := false // Ensure the given command group is available in the menu. diff --git a/client/command/completers/commands.go b/client/command/completers/commands.go new file mode 100644 index 0000000000..a6c8864c7d --- /dev/null +++ b/client/command/completers/commands.go @@ -0,0 +1,17 @@ +package completers + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + return nil +} diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go new file mode 100644 index 0000000000..6680df71e4 --- /dev/null +++ b/client/command/cursed/commands.go @@ -0,0 +1,149 @@ +package cursed + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + cursedCmd := &cobra.Command{ + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Long: help.GetHelpFor([]string{consts.Cursed}), + GroupID: consts.ExecutionHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + CursedCmd(cmd, con, args) + }, + } + flags.Bind("", true, cursedCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + cursedRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a Curse from a process", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + CursedRmCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedRmCmd) + flags.Bind("", false, cursedRmCmd, func(f *pflag.FlagSet) { + f.BoolP("kill", "k", false, "kill the process after removing the curse") + }) + carapace.Gen(cursedRmCmd).PositionalCompletion(carapace.ActionValues().Usage("bind port of the Cursed process to stop")) + + cursedConsoleCmd := &cobra.Command{ + Use: consts.CursedConsole, + Short: "Start a JavaScript console connected to a debug target", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), + Run: func(cmd *cobra.Command, args []string) { + CursedConsoleCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedConsoleCmd) + flags.Bind("", false, cursedConsoleCmd, func(f *pflag.FlagSet) { + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)`") + }) + + cursedChromeCmd := &cobra.Command{ + Use: consts.CursedChrome, + Short: "Automatically inject a Cursed Chrome payload into a remote Chrome extension", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedChrome}), + Run: func(cmd *cobra.Command, args []string) { + CursedChromeCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedChromeCmd) + flags.Bind("", false, cursedChromeCmd, func(f *pflag.FlagSet) { + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") + f.BoolP("restore", "R", true, "restore the user's session after process termination") + f.StringP("exe", "e", "", "chrome/chromium browser executable path (blank string = auto)") + f.StringP("user-data", "u", "", "user data directory (blank string = auto)") + f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") + f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") + f.BoolP("headless", "H", false, "start browser process in headless mode") + }) + flags.BindFlagCompletions(cursedChromeCmd, func(comp *carapace.ActionMap) { + (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") + }) + cursedChromeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + carapace.Gen(cursedChromeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Chrome CLI arguments")) + + cursedEdgeCmd := &cobra.Command{ + Use: consts.CursedEdge, + Short: "Automatically inject a Cursed Chrome payload into a remote Edge extension", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedEdge}), + Run: func(cmd *cobra.Command, args []string) { + CursedEdgeCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedEdgeCmd) + flags.Bind("", false, cursedEdgeCmd, func(f *pflag.FlagSet) { + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") + f.BoolP("restore", "R", true, "restore the user's session after process termination") + f.StringP("exe", "e", "", "edge browser executable path (blank string = auto)") + f.StringP("user-data", "u", "", "user data directory (blank string = auto)") + f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") + f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") + f.BoolP("headless", "H", false, "start browser process in headless mode") + }) + flags.BindFlagCompletions(cursedEdgeCmd, func(comp *carapace.ActionMap) { + (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") + }) + cursedEdgeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + carapace.Gen(cursedEdgeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Edge CLI arguments")) + + cursedElectronCmd := &cobra.Command{ + Use: consts.CursedElectron, + Short: "Curse a remote Electron application", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedElectron}), + Run: func(cmd *cobra.Command, args []string) { + CursedElectronCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedElectronCmd) + flags.Bind("", false, cursedElectronCmd, func(f *pflag.FlagSet) { + f.StringP("exe", "e", "", "remote electron executable absolute path") + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") + }) + cursedElectronCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + carapace.Gen(cursedElectronCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Electron CLI arguments")) + + CursedCookiesCmd := &cobra.Command{ + Use: consts.CursedCookies, + Short: "Dump all cookies from cursed process", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedCookies}), + Run: func(cmd *cobra.Command, args []string) { + CursedCookiesCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(CursedCookiesCmd) + flags.Bind("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save to file") + }) + + cursedScreenshotCmd := &cobra.Command{ + Use: consts.ScreenshotStr, + Short: "Take a screenshot of a cursed process debug target", + Long: help.GetHelpFor([]string{consts.Cursed, consts.ScreenshotStr}), + Run: func(cmd *cobra.Command, args []string) { + CursedScreenshotCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedScreenshotCmd) + flags.Bind("", false, cursedScreenshotCmd, func(f *pflag.FlagSet) { + f.Int64P("quality", "q", 100, "screenshot quality (1 - 100)") + f.StringP("save", "s", "", "save to file") + }) + + return []*cobra.Command{cursedCmd} +} diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go new file mode 100644 index 0000000000..b9aae25f22 --- /dev/null +++ b/client/command/dllhijack/commands.go @@ -0,0 +1,43 @@ +package dllhijack + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + dllhijackCmd := &cobra.Command{ + Use: consts.DLLHijackStr, + Short: "Plant a DLL for a hijack scenario", + Long: help.GetHelpFor([]string{consts.DLLHijackStr}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + DllHijackCmd(cmd, con, args) + }, + } + flags.Bind("", false, dllhijackCmd, func(f *pflag.FlagSet) { + f.StringP("reference-path", "r", "", "Path to the reference DLL on the remote system") + f.StringP("reference-file", "R", "", "Path to the reference DLL on the local system") + f.StringP("file", "f", "", "Local path to the DLL to plant for the hijack") + f.StringP("profile", "p", "", "Profile name to use as a base DLL") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(dllhijackCmd, func(comp *carapace.ActionMap) { + (*comp)["reference-file"] = carapace.ActionFiles() + (*comp)["file"] = carapace.ActionFiles() + (*comp)["profile"] = generate.ProfileNameCompleter(con) + }) + carapace.Gen(dllhijackCmd).PositionalCompletion(carapace.ActionValues().Usage("Path to upload the DLL to on the remote system")) + + return []*cobra.Command{dllhijackCmd} +} diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go new file mode 100644 index 0000000000..ed72775b1f --- /dev/null +++ b/client/command/environment/commands.go @@ -0,0 +1,59 @@ +package environment + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + envCmd := &cobra.Command{ + Use: consts.EnvStr, + Short: "List environment variables", + Long: help.GetHelpFor([]string{consts.EnvStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + EnvGetCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", true, envCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(envCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable to fetch (optional)")) + + envSetCmd := &cobra.Command{ + Use: consts.SetStr, + Short: "Set environment variables", + Long: help.GetHelpFor([]string{consts.EnvStr, consts.SetStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + EnvSetCmd(cmd, con, args) + }, + } + envCmd.AddCommand(envSetCmd) + carapace.Gen(envSetCmd).PositionalCompletion( + carapace.ActionValues().Usage("environment variable name"), + carapace.ActionValues().Usage("value to assign"), + ) + + envUnsetCmd := &cobra.Command{ + Use: consts.UnsetStr, + Short: "Clear environment variables", + Long: help.GetHelpFor([]string{consts.EnvStr, consts.UnsetStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + EnvUnsetCmd(cmd, con, args) + }, + } + envCmd.AddCommand(envUnsetCmd) + carapace.Gen(envUnsetCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable name")) + + return []*cobra.Command{envCmd} +} diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go new file mode 100644 index 0000000000..13edbe3de5 --- /dev/null +++ b/client/command/exec/commands.go @@ -0,0 +1,276 @@ +package exec + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + executeCmd := &cobra.Command{ + Use: consts.ExecuteStr, + Short: "Execute a program on the remote system", + Long: help.GetHelpFor([]string{consts.ExecuteStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExecuteCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, executeCmd, func(f *pflag.FlagSet) { + f.BoolP("token", "T", false, "execute command with current token (windows only)") + f.BoolP("output", "o", false, "capture command output") + f.BoolP("save", "s", false, "save output to a file") + f.BoolP("loot", "X", false, "save output as loot") + f.BoolP("ignore-stderr", "S", false, "don't print STDERR output") + f.StringP("stdout", "O", "", "remote path to redirect STDOUT to") + f.StringP("stderr", "E", "", "remote path to redirect STDERR to") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.Uint32P("ppid", "P", 0, "parent process id (optional, Windows only)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + executeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(executeCmd).PositionalCompletion(carapace.ActionValues().Usage("command to execute (required)")) + carapace.Gen(executeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to the command (optional)")) + + executeAssemblyCmd := &cobra.Command{ + Use: consts.ExecuteAssemblyStr, + Short: "Loads and executes a .NET assembly in a child process (Windows Only)", + Long: help.GetHelpFor([]string{consts.ExecuteAssemblyStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExecuteAssemblyCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, executeAssemblyCmd, func(f *pflag.FlagSet) { + f.StringP("process", "p", "notepad.exe", "hosting process to inject into") + f.StringP("method", "m", "", "Optional method (a method is required for a .NET DLL)") + f.StringP("class", "c", "", "Optional class name (required for .NET DLL)") + f.StringP("app-domain", "d", "", "AppDomain name to create for .NET assembly. Generated randomly if not set.") + f.StringP("arch", "a", "x84", "Assembly target architecture: x86, x64, x84 (x86+x64)") + f.BoolP("in-process", "i", false, "Run in the current sliver process") + f.StringP("runtime", "r", "", "Runtime to use for running the assembly (only supported when used with --in-process)") + f.BoolP("save", "s", false, "save output to file") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.Uint32P("ppid", "P", 0, "parent process id (optional)") + f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") + f.BoolP("amsi-bypass", "M", false, "Bypass AMSI on Windows (only supported when used with --in-process)") + f.BoolP("etw-bypass", "E", false, "Bypass ETW on Windows (only supported when used with --in-process)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + executeAssemblyCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(executeAssemblyCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to assembly file (required)")) + carapace.Gen(executeAssemblyCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the assembly entrypoint (optional)")) + + executeShellcodeCmd := &cobra.Command{ + Use: consts.ExecuteShellcodeStr, + Short: "Executes the given shellcode in the sliver process", + Long: help.GetHelpFor([]string{consts.ExecuteShellcodeStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExecuteShellcodeCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, executeShellcodeCmd, func(f *pflag.FlagSet) { + f.BoolP("rwx-pages", "r", false, "Use RWX permissions for memory pages") + f.Uint32P("pid", "p", 0, "Pid of process to inject into (0 means injection into ourselves)") + f.StringP("process", "n", `c:\windows\system32\notepad.exe`, "Process to inject into when running in interactive mode") + f.BoolP("interactive", "i", false, "Inject into a new process and interact with it") + f.BoolP("shikata-ga-nai", "S", false, "encode shellcode using shikata ga nai prior to execution") + f.StringP("architecture", "A", "amd64", "architecture of the shellcode: 386, amd64 (used with --shikata-ga-nai flag)") + f.Uint32P("iterations", "I", 1, "number of encoding iterations (used with --shikata-ga-nai flag)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(executeShellcodeCmd, func(comp *carapace.ActionMap) { + (*comp)["shikata-ga-nai"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") + }) + carapace.Gen(executeShellcodeCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shellcode file (required)")) + + sideloadCmd := &cobra.Command{ + Use: consts.SideloadStr, + Short: "Load and execute a shared object (shared library/DLL) in a remote process", + Long: help.GetHelpFor([]string{consts.SideloadStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + SideloadCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, sideloadCmd, func(f *pflag.FlagSet) { + f.StringP("entry-point", "e", "", "Entrypoint for the DLL (Windows only)") + f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") + f.BoolP("unicode", "w", false, "Command line is passed to unmanaged DLL function in UNICODE format. (default is ANSI)") + f.BoolP("save", "s", false, "save output to file") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") + f.Uint32P("ppid", "P", 0, "parent process id (optional)") + f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + sideloadCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(sideloadCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shared library file (required)")) + carapace.Gen(sideloadCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the binary (optional)")) + + spawnDllCmd := &cobra.Command{ + Use: consts.SpawnDllStr, + Short: "Load and execute a Reflective DLL in a remote process", + Long: help.GetHelpFor([]string{consts.SpawnDllStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + SpawnDllCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, spawnDllCmd, func(f *pflag.FlagSet) { + f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") + f.StringP("export", "e", "ReflectiveLoader", "Entrypoint of the Reflective DLL") + f.BoolP("save", "s", false, "save output to file") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") + f.UintP("ppid", "P", 0, "parent process id (optional)") + f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + spawnDllCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(spawnDllCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to DLL file (required)")) + carapace.Gen(spawnDllCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the DLL entrypoint (optional)")) + + migrateCmd := &cobra.Command{ + Use: consts.MigrateStr, + Short: "Migrate into a remote process", + Long: help.GetHelpFor([]string{consts.MigrateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + MigrateCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, migrateCmd, func(f *pflag.FlagSet) { + f.BoolP("disable-sgn", "S", true, "disable shikata ga nai shellcode encoder") + f.Uint32P("pid", "p", 0, "process id to migrate into") + f.StringP("process-name", "n", "", "name of the process to migrate into") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(migrateCmd).PositionalCompletion(carapace.ActionValues().Usage("PID of process to migrate into")) + + msfCmd := &cobra.Command{ + Use: consts.MsfStr, + Short: "Execute an MSF payload in the current process", + Long: help.GetHelpFor([]string{consts.MsfStr}), + Run: func(cmd *cobra.Command, args []string) { + MsfCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, msfCmd, func(f *pflag.FlagSet) { + f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") + f.StringP("lhost", "L", "", "listen host") + f.IntP("lport", "l", 4444, "listen port") + f.StringP("encoder", "e", "", "msf encoder") + f.IntP("iterations", "i", 1, "iterations of the encoder") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + msfInjectCmd := &cobra.Command{ + Use: consts.MsfInjectStr, + Short: "Inject an MSF payload into a process", + Long: help.GetHelpFor([]string{consts.MsfInjectStr}), + Run: func(cmd *cobra.Command, args []string) { + MsfInjectCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, msfInjectCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "pid to inject into") + f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") + f.StringP("lhost", "L", "", "listen host") + f.IntP("lport", "l", 4444, "listen port") + f.StringP("encoder", "e", "", "msf encoder") + f.IntP("iterations", "i", 1, "iterations of the encoder") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + psExecCmd := &cobra.Command{ + Use: consts.PsExecStr, + Short: "Start a sliver service on a remote target", + Long: help.GetHelpFor([]string{consts.PsExecStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + PsExecCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, psExecCmd, func(f *pflag.FlagSet) { + f.StringP("service-name", "s", "Sliver", "name that will be used to register the service") + f.StringP("service-description", "d", "Sliver implant", "description of the service") + f.StringP("profile", "p", "", "profile to use for service binary") + f.StringP("binpath", "b", "c:\\windows\\temp", "directory to which the executable will be uploaded") + f.StringP("custom-exe", "c", "", "custom service executable to use instead of generating a new Sliver") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(psExecCmd, func(comp *carapace.ActionMap) { + (*comp)["custom-exe"] = carapace.ActionFiles() + }) + carapace.Gen(psExecCmd).PositionalCompletion(carapace.ActionValues().Usage("hostname (required)")) + + sshCmd := &cobra.Command{ + Use: consts.SSHStr, + Short: "Run a SSH command on a remote host", + Long: help.GetHelpFor([]string{consts.SSHStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + SSHCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, sshCmd, func(f *pflag.FlagSet) { + f.UintP("port", "p", 22, "SSH port") + f.StringP("private-key", "i", "", "path to private key file") + f.StringP("password", "P", "", "SSH user password") + f.StringP("login", "l", "", "username to use to connect") + f.BoolP("skip-loot", "s", false, "skip the prompt to use loot credentials") + f.StringP("kerberos-config", "c", "/etc/krb5.conf", "path to remote Kerberos config file") + f.StringP("kerberos-keytab", "k", "", "path to Kerberos keytab file") + f.StringP("kerberos-realm", "r", "", "Kerberos realm") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + sshCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + flags.BindFlagCompletions(sshCmd, func(comp *carapace.ActionMap) { + (*comp)["private-key"] = carapace.ActionFiles() + (*comp)["kerberos-keytab"] = carapace.ActionFiles() + }) + + carapace.Gen(sshCmd).PositionalCompletion(carapace.ActionValues().Usage("remote host to SSH to (required)")) + carapace.Gen(sshCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("command line with arguments")) + + return []*cobra.Command{executeCmd, executeAssemblyCmd, executeShellcodeCmd, sideloadCmd, spawnDllCmd, migrateCmd, msfCmd, msfInjectCmd, psExecCmd, sshCmd} +} diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go new file mode 100644 index 0000000000..7ee046d4c4 --- /dev/null +++ b/client/command/extensions/commands.go @@ -0,0 +1,69 @@ +package extensions + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + extensionCmd := &cobra.Command{ + Use: consts.ExtensionsStr, + Short: "Manage extensions", + Long: help.GetHelpFor([]string{consts.ExtensionsStr}), + GroupID: consts.ExtensionHelpGroup, + Run: func(cmd *cobra.Command, _ []string) { + ExtensionsCmd(cmd, con) + }, + } + + extensionCmd.AddCommand(&cobra.Command{ + Use: consts.ListStr, + Short: "List extensions loaded in the current session or beacon", + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.ListStr}), + Run: func(cmd *cobra.Command, args []string) { + ExtensionsListCmd(cmd, con, args) + }, + }) + + extensionLoadCmd := &cobra.Command{ + Use: consts.LoadStr, + Short: "Temporarily load an extension from a local directory", + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.LoadStr}), + Run: func(cmd *cobra.Command, args []string) { + ExtensionLoadCmd(cmd, con, args) + }, + } + extensionCmd.AddCommand(extensionLoadCmd) + carapace.Gen(extensionLoadCmd).PositionalCompletion(carapace.ActionDirectories().Usage("path to the extension directory")) + + extensionInstallCmd := &cobra.Command{ + Use: consts.InstallStr, + Short: "Install an extension from a local directory or .tar.gz file", + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.InstallStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExtensionsInstallCmd(cmd, con, args) + }, + } + extensionCmd.AddCommand(extensionInstallCmd) + carapace.Gen(extensionInstallCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to the extension .tar.gz or directory")) + + extensionRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove an installed extension", + Args: cobra.ExactArgs(1), + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + ExtensionsRemoveCmd(cmd, con, args) + }, + } + extensionCmd.AddCommand(extensionRmCmd) + carapace.Gen(extensionRmCmd).PositionalCompletion(ExtensionsCommandNameCompleter(con).Usage("the command name of the extension to remove")) + + return []*cobra.Command{extensionCmd} +} diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go new file mode 100644 index 0000000000..425527704a --- /dev/null +++ b/client/command/filesystem/commands.go @@ -0,0 +1,212 @@ +package filesystem + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + mvCmd := &cobra.Command{ + Use: consts.MvStr, + Short: "Move or rename a file", + Long: help.GetHelpFor([]string{consts.MvStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + MvCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, mvCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(mvCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to source file (required)"), + carapace.ActionValues().Usage("path to dest file (required)"), + ) + + lsCmd := &cobra.Command{ + Use: consts.LsStr, + Short: "List current directory", + Long: help.GetHelpFor([]string{consts.LsStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + LsCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, lsCmd, func(f *pflag.FlagSet) { + f.BoolP("reverse", "r", false, "reverse sort order") + f.BoolP("modified", "m", false, "sort by modified time") + f.BoolP("size", "s", false, "sort by size") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(lsCmd).PositionalCompletion(carapace.ActionValues().Usage("path to enumerate (optional)")) + + rmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a file or directory", + Long: help.GetHelpFor([]string{consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RmCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, rmCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively remove files") + f.BoolP("force", "F", false, "ignore safety and forcefully remove files") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(rmCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to remove")) + + mkdirCmd := &cobra.Command{ + Use: consts.MkdirStr, + Short: "Make a directory", + Long: help.GetHelpFor([]string{consts.MkdirStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + MkdirCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, mkdirCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(mkdirCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory to create")) + + cdCmd := &cobra.Command{ + Use: consts.CdStr, + Short: "Change directory", + Long: help.GetHelpFor([]string{consts.CdStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + CdCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, cdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(cdCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory")) + + pwdCmd := &cobra.Command{ + Use: consts.PwdStr, + Short: "Print working directory", + Long: help.GetHelpFor([]string{consts.PwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PwdCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, pwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + catCmd := &cobra.Command{ + Use: consts.CatStr, + Short: "Dump file to stdout", + Long: help.GetHelpFor([]string{consts.CatStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + CatCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, catCmd, func(f *pflag.FlagSet) { + f.BoolP("colorize-output", "c", false, "colorize output") + f.BoolP("hex", "x", false, "display as a hex dump") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting (optional)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(catCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to print")) + + downloadCmd := &cobra.Command{ + Use: consts.DownloadStr, + Short: "Download a file", + Long: help.GetHelpFor([]string{consts.DownloadStr}), + Args: cobra.RangeArgs(1, 2), + Run: func(cmd *cobra.Command, args []string) { + DownloadCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, downloadCmd, func(f *pflag.FlagSet) { + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting") + f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting") + f.StringP("name", "n", "", "name to assign the download if looting") + f.BoolP("recurse", "r", false, "recursively download all files in a directory") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(downloadCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to the file or directory to download"), + carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), + ) + + uploadCmd := &cobra.Command{ + Use: consts.UploadStr, + Short: "Upload a file", + Long: help.GetHelpFor([]string{consts.UploadStr}), + Args: cobra.RangeArgs(1, 2), + Run: func(cmd *cobra.Command, args []string) { + UploadCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, uploadCmd, func(f *pflag.FlagSet) { + f.BoolP("ioc", "i", false, "track uploaded file as an ioc") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(uploadCmd).PositionalCompletion( + carapace.ActionFiles().Usage("local path to the file to upload"), + carapace.ActionValues().Usage("path to the file or directory to upload to (optional)"), + ) + + memfilesCmd := &cobra.Command{ + Use: consts.MemfilesStr, + Short: "List current memfiles", + Long: help.GetHelpFor([]string{consts.MemfilesStr}), + GroupID: consts.FilesystemHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + MemfilesListCmd(cmd, con, args) + }, + } + flags.Bind("", true, memfilesCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + memfilesAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a memfile", + Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + MemfilesAddCmd(cmd, con, args) + }, + } + memfilesCmd.AddCommand(memfilesAddCmd) + + memfilesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a memfile", + Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + MemfilesRmCmd(cmd, con, args) + }, + } + memfilesCmd.AddCommand(memfilesRmCmd) + + carapace.Gen(memfilesRmCmd).PositionalCompletion(carapace.ActionValues().Usage("memfile file descriptor")) + + return []*cobra.Command{mvCmd, lsCmd, rmCmd, mkdirCmd, pwdCmd, catCmd, cdCmd, downloadCmd, uploadCmd, memfilesCmd} +} diff --git a/client/command/help/commands.go b/client/command/help/commands.go new file mode 100644 index 0000000000..3799c739aa --- /dev/null +++ b/client/command/help/commands.go @@ -0,0 +1,17 @@ +package help + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + return nil +} diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 90472999d3..64582c6877 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -30,3 +30,73 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { return []*cobra.Command{infoCmd} } + +// SliverCommands returns all info commands working on an active target. +func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { + pingCmd := &cobra.Command{ + Use: consts.PingStr, + Short: "Send round trip message to implant (does not use ICMP)", + Long: help.GetHelpFor([]string{consts.PingStr}), + Run: func(cmd *cobra.Command, args []string) { + PingCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, pingCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + getPIDCmd := &cobra.Command{ + Use: consts.GetPIDStr, + Short: "Get session pid", + Long: help.GetHelpFor([]string{consts.GetPIDStr}), + Run: func(cmd *cobra.Command, args []string) { + PIDCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, getPIDCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + getUIDCmd := &cobra.Command{ + Use: consts.GetUIDStr, + Short: "Get session process UID", + Long: help.GetHelpFor([]string{consts.GetUIDStr}), + Run: func(cmd *cobra.Command, args []string) { + UIDCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, getUIDCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + getGIDCmd := &cobra.Command{ + Use: consts.GetGIDStr, + Short: "Get session process GID", + Long: help.GetHelpFor([]string{consts.GetGIDStr}), + Run: func(cmd *cobra.Command, args []string) { + GIDCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, getGIDCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + whoamiCmd := &cobra.Command{ + Use: consts.WhoamiStr, + Short: "Get session user execution context", + Long: help.GetHelpFor([]string{consts.WhoamiStr}), + Run: func(cmd *cobra.Command, args []string) { + WhoamiCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, whoamiCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{pingCmd, getPIDCmd, getUIDCmd, getGIDCmd, whoamiCmd} +} diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go new file mode 100644 index 0000000000..e9b0bdac15 --- /dev/null +++ b/client/command/kill/commands.go @@ -0,0 +1,30 @@ +package kill + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + killCmd := &cobra.Command{ + Use: consts.KillStr, + Short: "Kill a session", + Long: help.GetHelpFor([]string{consts.KillStr}), + Run: func(cmd *cobra.Command, args []string) { + KillCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("use", false, killCmd, func(f *pflag.FlagSet) { + f.BoolP("force", "F", false, "Force kill, does not clean up") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{killCmd} +} diff --git a/client/command/network/commands.go b/client/command/network/commands.go new file mode 100644 index 0000000000..31fd801e9f --- /dev/null +++ b/client/command/network/commands.go @@ -0,0 +1,49 @@ +package network + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + ifconfigCmd := &cobra.Command{ + Use: consts.IfconfigStr, + Short: "View network interface configurations", + Long: help.GetHelpFor([]string{consts.IfconfigStr}), + Run: func(cmd *cobra.Command, args []string) { + IfconfigCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", false, ifconfigCmd, func(f *pflag.FlagSet) { + f.BoolP("all", "A", false, "show all network adapters (default only shows IPv4)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + netstatCmd := &cobra.Command{ + Use: consts.NetstatStr, + Short: "Print network connection information", + Long: help.GetHelpFor([]string{consts.NetstatStr}), + Run: func(cmd *cobra.Command, args []string) { + NetstatCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", false, netstatCmd, func(f *pflag.FlagSet) { + f.BoolP("tcp", "T", true, "display information about TCP sockets") + f.BoolP("udp", "u", false, "display information about UDP sockets") + f.BoolP("ip4", "4", true, "display information about IPv4 sockets") + f.BoolP("ip6", "6", false, "display information about IPv6 sockets") + f.BoolP("listen", "l", false, "display information about listening sockets") + f.BoolP("numeric", "n", false, "display numeric addresses (disable hostname resolution)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{ifconfigCmd, netstatCmd} +} diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go new file mode 100644 index 0000000000..9a3362da71 --- /dev/null +++ b/client/command/pivots/commands.go @@ -0,0 +1,101 @@ +package pivots + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + pivotsCmd := &cobra.Command{ + Use: consts.PivotsStr, + Short: "List pivots for active session", + Long: help.GetHelpFor([]string{consts.PivotsStr}), + Run: func(cmd *cobra.Command, args []string) { + PivotsCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("", true, pivotsCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + namedPipeCmd := &cobra.Command{ + Use: consts.NamedPipeStr, + Short: "Start a named pipe pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), + Run: func(cmd *cobra.Command, args []string) { + StartNamedPipeListenerCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(namedPipeCmd) + flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") + f.BoolP("allow-all", "a", false, "allow all users to connect") + }) + + tcpListenerCmd := &cobra.Command{ + Use: consts.TCPListenerStr, + Short: "Start a TCP pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + StartTCPListenerCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(tcpListenerCmd) + flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "remote interface to bind pivot listener") + f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") + }) + + pivotStopCmd := &cobra.Command{ + Use: consts.StopStr, + Short: "Stop a pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), + Run: func(cmd *cobra.Command, args []string) { + StopPivotListenerCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(pivotStopCmd) + flags.Bind("", false, pivotStopCmd, func(f *pflag.FlagSet) { + f.Uint32P("id", "i", 0, "id of the pivot listener to stop") + }) + flags.BindFlagCompletions(pivotStopCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PivotIDCompleter(con) + }) + + pivotDetailsCmd := &cobra.Command{ + Use: consts.DetailsStr, + Short: "Get details of a pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), + Run: func(cmd *cobra.Command, args []string) { + PivotDetailsCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(pivotDetailsCmd) + flags.Bind("", false, pivotDetailsCmd, func(f *pflag.FlagSet) { + f.IntP("id", "i", 0, "id of the pivot listener to get details for") + }) + flags.BindFlagCompletions(pivotDetailsCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PivotIDCompleter(con) + }) + + graphCmd := &cobra.Command{ + Use: consts.GraphStr, + Short: "Get pivot listeners graph", + Long: help.GetHelpFor([]string{consts.PivotsStr, "graph"}), + Run: func(cmd *cobra.Command, args []string) { + PivotsGraphCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(graphCmd) + + return []*cobra.Command{pivotsCmd} +} diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go new file mode 100644 index 0000000000..003c247443 --- /dev/null +++ b/client/command/portfwd/commands.go @@ -0,0 +1,64 @@ +package portfwd + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + portfwdCmd := &cobra.Command{ + Use: consts.PortfwdStr, + Short: "In-band TCP port forwarding", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PortfwdCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", true, portfwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + addCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Create a new port forwarding tunnel", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PortfwdAddCmd(cmd, con, args) + }, + } + portfwdCmd.AddCommand(addCmd) + flags.Bind("", false, addCmd, func(f *pflag.FlagSet) { + f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") + f.StringP("bind", "b", "127.0.0.1:8080", "bind port forward to interface") + }) + flags.BindFlagCompletions(addCmd, func(comp *carapace.ActionMap) { + (*comp)["bind"] = completers.ClientInterfacesCompleter() + }) + + portfwdRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a port forwarding tunnel", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PortfwdRmCmd(cmd, con, args) + }, + } + portfwdCmd.AddCommand(portfwdRmCmd) + flags.Bind("", false, portfwdRmCmd, func(f *pflag.FlagSet) { + f.IntP("id", "i", 0, "id of portfwd to remove") + }) + flags.BindFlagCompletions(portfwdRmCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PortfwdIDCompleter(con) + }) + + return []*cobra.Command{portfwdCmd} +} diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go new file mode 100644 index 0000000000..995fec1bc8 --- /dev/null +++ b/client/command/privilege/commands.go @@ -0,0 +1,175 @@ +package privilege + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/filesystem" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + runAsCmd := &cobra.Command{ + Use: consts.RunAsStr, + Short: "Run a new process in the context of the designated user (Windows Only)", + Long: help.GetHelpFor([]string{consts.RunAsStr}), + Run: func(cmd *cobra.Command, args []string) { + RunAsCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, runAsCmd, func(f *pflag.FlagSet) { + f.StringP("username", "u", "", "user to impersonate") + f.StringP("process", "p", "", "process to start") + f.StringP("args", "a", "", "arguments for the process") + f.StringP("domain", "d", "", "domain of the user") + f.StringP("password", "P", "", "password of the user") + f.BoolP("show-window", "s", false, ` + Log on, but use the specified credentials on the network only. The new process uses the same token as the caller, but the system creates a new logon session within LSA, and the process uses the specified credentials as the default credentials.`) + f.BoolP("net-only", "n", false, "use ") + f.Int64P("timeout", "t", 30, "grpc timeout in seconds") + }) + + impersonateCmd := &cobra.Command{ + Use: consts.ImpersonateStr, + Short: "Impersonate a logged in user.", + Long: help.GetHelpFor([]string{consts.ImpersonateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ImpersonateCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, impersonateCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", 30, "grpc timeout in seconds") + }) + carapace.Gen(impersonateCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the user account to impersonate")) + + revToSelfCmd := &cobra.Command{ + Use: consts.RevToSelfStr, + Short: "Revert to self: lose stolen Windows token", + Long: help.GetHelpFor([]string{consts.RevToSelfStr}), + Run: func(cmd *cobra.Command, args []string) { + RevToSelfCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, revToSelfCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", 30, "grpc timeout in seconds") + }) + + getSystemCmd := &cobra.Command{ + Use: consts.GetSystemStr, + Short: "Spawns a new sliver session as the NT AUTHORITY\\SYSTEM user (Windows Only)", + Long: help.GetHelpFor([]string{consts.GetSystemStr}), + Run: func(cmd *cobra.Command, args []string) { + GetSystemCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, getSystemCmd, func(f *pflag.FlagSet) { + f.StringP("process", "p", "spoolsv.exe", "SYSTEM process to inject into") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + makeTokenCmd := &cobra.Command{ + Use: consts.MakeTokenStr, + Short: "Create a new Logon Session with the specified credentials", + Long: help.GetHelpFor([]string{consts.MakeTokenStr}), + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + MakeTokenCmd(cmd, con, args) + }, + } + flags.Bind("", false, makeTokenCmd, func(f *pflag.FlagSet) { + f.StringP("username", "u", "", "username of the user to impersonate") + f.StringP("password", "p", "", "password of the user to impersonate") + f.StringP("domain", "d", "", "domain of the user to impersonate") + f.StringP("logon-type", "T", "LOGON_NEW_CREDENTIALS", "logon type to use") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + chmodCmd := &cobra.Command{ + Use: consts.ChmodStr, + Short: "Change permissions on a file or directory", + Long: help.GetHelpFor([]string{consts.ChmodStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + filesystem.ChmodCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + } + flags.Bind("", false, chmodCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively change permissions on files") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(chmodCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to file to change mod perms"), + carapace.ActionValues().Usage("file permissions in octal (eg. 0644)"), + ) + + chownCmd := &cobra.Command{ + Use: consts.ChownStr, + Short: "Change owner on a file or directory", + Long: help.GetHelpFor([]string{consts.ChownStr}), + Args: cobra.ExactArgs(3), + Run: func(cmd *cobra.Command, args []string) { + filesystem.ChownCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + } + flags.Bind("", false, chownCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively change permissions on files") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(chownCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to file to change owner for"), + carapace.ActionValues().Usage("user ID"), + carapace.ActionValues().Usage("group ID (required)"), + ) + + chtimesCmd := &cobra.Command{ + Use: consts.ChtimesStr, + Short: "Change access and modification times on a file (timestomp)", + Long: help.GetHelpFor([]string{consts.ChtimesStr}), + Args: cobra.ExactArgs(3), + Run: func(cmd *cobra.Command, args []string) { + filesystem.ChtimesCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + } + flags.Bind("", false, chtimesCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(chtimesCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to file to change access timestamps"), + carapace.ActionValues().Usage("last accessed time in DateTime format, i.e. 2006-01-02 15:04:05"), + carapace.ActionValues().Usage("last modified time in DateTime format, i.e. 2006-01-02 15:04:05"), + ) + + getprivsCmd := &cobra.Command{ + Use: consts.GetPrivsStr, + Short: "Get current privileges (Windows only)", + Long: help.GetHelpFor([]string{consts.GetPrivsStr}), + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + GetPrivsCmd(cmd, con, args) + }, + } + flags.Bind("", false, getprivsCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{runAsCmd, impersonateCmd, revToSelfCmd, makeTokenCmd, getSystemCmd, chtimesCmd, chmodCmd, chownCmd, getprivsCmd} +} diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go new file mode 100644 index 0000000000..f844894b70 --- /dev/null +++ b/client/command/processes/commands.go @@ -0,0 +1,73 @@ +package processes + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + psCmd := &cobra.Command{ + Use: consts.PsStr, + Short: "List remote processes", + Long: help.GetHelpFor([]string{consts.PsStr}), + Run: func(cmd *cobra.Command, args []string) { + PsCmd(cmd, con, args) + }, + GroupID: consts.ProcessHelpGroup, + } + flags.Bind("", false, psCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "filter based on pid") + f.StringP("exe", "e", "", "filter based on executable name") + f.StringP("owner", "o", "", "filter based on owner") + f.BoolP("print-cmdline", "c", false, "print command line arguments") + f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") + f.IntP("skip-pages", "S", 0, "skip the first n page(s)") + f.BoolP("tree", "T", false, "print process tree") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + procdumpCmd := &cobra.Command{ + Use: consts.ProcdumpStr, + Short: "Dump process memory", + Long: help.GetHelpFor([]string{consts.ProcdumpStr}), + Run: func(cmd *cobra.Command, args []string) { + ProcdumpCmd(cmd, con, args) + }, + GroupID: consts.ProcessHelpGroup, + } + flags.Bind("", false, procdumpCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "target pid") + f.StringP("name", "n", "", "target process name") + f.StringP("save", "s", "", "save to file (will overwrite if exists)") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("loot-name", "N", "", "name to assign when adding the memory dump to the loot store (optional)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + terminateCmd := &cobra.Command{ + Use: consts.TerminateStr, + Short: "Terminate a process on the remote system", + Long: help.GetHelpFor([]string{consts.TerminateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TerminateCmd(cmd, con, args) + }, + GroupID: consts.ProcessHelpGroup, + } + flags.Bind("", false, terminateCmd, func(f *pflag.FlagSet) { + f.BoolP("force", "F", false, "disregard safety and kill the PID") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(terminateCmd).PositionalCompletion(carapace.ActionValues().Usage("process ID")) + + return []*cobra.Command{psCmd, procdumpCmd, terminateCmd} +} diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go new file mode 100644 index 0000000000..5e52838177 --- /dev/null +++ b/client/command/reconfig/commands.go @@ -0,0 +1,47 @@ +package reconfig + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + reconfigCmd := &cobra.Command{ + Use: consts.ReconfigStr, + Short: "Reconfigure the active beacon/session", + Long: help.GetHelpFor([]string{consts.ReconfigStr}), + Run: func(cmd *cobra.Command, args []string) { + ReconfigCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + } + flags.Bind("reconfig", false, reconfigCmd, func(f *pflag.FlagSet) { + f.StringP("reconnect-interval", "r", "", "reconnect interval for implant") + f.StringP("beacon-interval", "i", "", "beacon callback interval") + f.StringP("beacon-jitter", "j", "", "beacon callback jitter (random up to)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + renameCmd := &cobra.Command{ + Use: consts.RenameStr, + Short: "Rename the active beacon/session", + Long: help.GetHelpFor([]string{consts.RenameStr}), + Run: func(cmd *cobra.Command, args []string) { + RenameCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("rename", false, renameCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "change implant name to") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{reconfigCmd, renameCmd} +} diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go new file mode 100644 index 0000000000..228cf37e40 --- /dev/null +++ b/client/command/registry/commands.go @@ -0,0 +1,129 @@ +package registry + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + registryCmd := &cobra.Command{ + Use: consts.RegistryStr, + Short: "Windows registry operations", + Long: help.GetHelpFor([]string{consts.RegistryStr}), + GroupID: consts.InfoHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("registry", true, registryCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + registryReadCmd := &cobra.Command{ + Use: consts.RegistryReadStr, + Short: "Read values from the Windows registry", + Long: help.GetHelpFor([]string{consts.RegistryReadStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegReadCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryReadCmd) + flags.Bind("", false, registryReadCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to read values from") + }) + carapace.Gen(registryReadCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryWriteCmd := &cobra.Command{ + Use: consts.RegistryWriteStr, + Short: "Write values to the Windows registry", + Long: help.GetHelpFor([]string{consts.RegistryWriteStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + RegWriteCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryWriteCmd) + flags.Bind("", false, registryWriteCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + f.StringP("type", "T", "string", "type of the value to write (string, dword, qword, binary). If binary, you must provide a path to a file with --path") + f.StringP("path", "p", "", "path to the binary file to write") + }) + carapace.Gen(registryWriteCmd).PositionalCompletion( + carapace.ActionValues().Usage("registry path"), + carapace.ActionValues().Usage("value to write"), + ) + + registryCreateKeyCmd := &cobra.Command{ + Use: consts.RegistryCreateKeyStr, + Short: "Create a registry key", + Long: help.GetHelpFor([]string{consts.RegistryCreateKeyStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegCreateKeyCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryCreateKeyCmd) + flags.Bind("", false, registryCreateKeyCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + }) + carapace.Gen(registryCreateKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryDeleteKeyCmd := &cobra.Command{ + Use: consts.RegistryDeleteKeyStr, + Short: "Remove a registry key", + Long: help.GetHelpFor([]string{consts.RegistryDeleteKeyStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegDeleteKeyCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryDeleteKeyCmd) + flags.Bind("", false, registryDeleteKeyCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to remove value from") + }) + carapace.Gen(registryDeleteKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryListSubCmd := &cobra.Command{ + Use: consts.RegistryListSubStr, + Short: "List the sub keys under a registry key", + Long: help.GetHelpFor([]string{consts.RegistryListSubStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegListSubKeysCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryListSubCmd) + flags.Bind("", false, registryListSubCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + }) + carapace.Gen(registryListSubCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryListValuesCmd := &cobra.Command{ + Use: consts.RegistryListValuesStr, + Short: "List the values for a registry key", + Long: help.GetHelpFor([]string{consts.RegistryListValuesStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegListValuesCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryListValuesCmd) + flags.Bind("", false, registryListValuesCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + }) + carapace.Gen(registryListValuesCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + return []*cobra.Command{registryCmd} +} diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go new file mode 100644 index 0000000000..d2b35b6eb7 --- /dev/null +++ b/client/command/rportfwd/commands.go @@ -0,0 +1,64 @@ +package rportfwd + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + rportfwdCmd := &cobra.Command{ + Use: consts.RportfwdStr, + Short: "reverse port forwardings", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + RportFwdListenersCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", true, rportfwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + rportfwdAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add and start reverse port forwarding", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + StartRportFwdListenerCmd(cmd, con, args) + }, + } + rportfwdCmd.AddCommand(rportfwdAddCmd) + flags.Bind("", false, rportfwdAddCmd, func(f *pflag.FlagSet) { + f.StringP("remote", "r", "", "remote address : connection is forwarded to") + f.StringP("bind", "b", "", "bind address : for implants to listen on") + }) + flags.BindFlagCompletions(rportfwdAddCmd, func(comp *carapace.ActionMap) { + (*comp)["remote"] = completers.ClientInterfacesCompleter() + }) + + rportfwdRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Stop and remove reverse port forwarding", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + StopRportFwdListenerCmd(cmd, con, args) + }, + } + rportfwdCmd.AddCommand(rportfwdRmCmd) + flags.Bind("", false, rportfwdRmCmd, func(f *pflag.FlagSet) { + f.Uint32P("id", "i", 0, "id of portfwd to remove") + }) + flags.BindFlagCompletions(rportfwdRmCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PortfwdIDCompleter(con) + }) + + return []*cobra.Command{rportfwdCmd} +} diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go new file mode 100644 index 0000000000..85758509ae --- /dev/null +++ b/client/command/screenshot/commands.go @@ -0,0 +1,37 @@ +package screenshot + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + screenshotCmd := &cobra.Command{ + Use: consts.ScreenshotStr, + Short: "Take a screenshot", + Long: help.GetHelpFor([]string{consts.ScreenshotStr}), + Run: func(cmd *cobra.Command, args []string) { + ScreenshotCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, screenshotCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save to file (will overwrite if exists)") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(screenshotCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles() + }) + + return []*cobra.Command{screenshotCmd} +} diff --git a/client/command/server.go b/client/command/server.go index 5ff9306a07..034ac242c7 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -76,7 +76,7 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. // the present calls. // Core - bindCommands(consts.GenericHelpGroup, server, con, + bind(consts.GenericHelpGroup, server, con, exit.Command, licenses.Commands, settings.Commands, @@ -90,21 +90,21 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. ) // C2 Network - bindCommands(consts.NetworkHelpGroup, server, con, + bind(consts.NetworkHelpGroup, server, con, jobs.Commands, websites.Commands, wireguard.Commands, ) // Payloads - bindCommands(consts.PayloadsHelpGroup, server, con, + bind(consts.PayloadsHelpGroup, server, con, sgn.Commands, generate.Commands, builders.Commands, ) // Slivers - bindCommands(consts.SliverHelpGroup, server, con, + bind(consts.SliverHelpGroup, server, con, use.Commands, info.Commands, sessions.Commands, @@ -115,7 +115,7 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. reaction.Commands, ) - // [ Post-command declaration setup]----------------------------------------- + // [ Post-command declaration setup ]----------------------------------------- // Everything below this line should preferably not be any command binding // (although you can do so without fear). If there are any final modifications diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 0928b782d0..a550d43b9a 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -68,7 +68,7 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err == nil { - for _, s := range sessions.Sessions { + for _, s := range Sessions { link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) id := fmt.Sprintf("%s (%d)", s.Name, s.PID) userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) @@ -83,3 +83,57 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(callback) } + +// SliverCommands returns all session control commands for the active target. +func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { + backgroundCmd := &cobra.Command{ + Use: consts.BackgroundStr, + Short: "Background an active session", + Long: help.GetHelpFor([]string{consts.BackgroundStr}), + Run: func(cmd *cobra.Command, args []string) { + BackgroundCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("use", false, backgroundCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + openSessionCmd := &cobra.Command{ + Use: consts.InteractiveStr, + Short: "Task a beacon to open an interactive session (Beacon only)", + Long: help.GetHelpFor([]string{consts.InteractiveStr}), + Run: func(cmd *cobra.Command, args []string) { + InteractiveCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + } + flags.Bind("interactive", false, openSessionCmd, func(f *pflag.FlagSet) { + f.StringP("mtls", "m", "", "mtls connection strings") + f.StringP("wg", "g", "", "wg connection strings") + f.StringP("http", "b", "", "http(s) connection strings") + f.StringP("dns", "n", "", "dns connection strings") + f.StringP("named-pipe", "p", "", "namedpipe connection strings") + f.StringP("tcp-pivot", "i", "", "tcppivot connection strings") + + f.StringP("delay", "d", "0s", "delay opening the session (after checkin) for a given period of time") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + closeSessionCmd := &cobra.Command{ + Use: consts.CloseStr, + Short: "Close an interactive session without killing the remote process", + Long: help.GetHelpFor([]string{consts.CloseStr}), + Run: func(cmd *cobra.Command, args []string) { + CloseSessionCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("", false, closeSessionCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{backgroundCmd, openSessionCmd, closeSessionCmd} +} diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go new file mode 100644 index 0000000000..4791cc8215 --- /dev/null +++ b/client/command/shell/commands.go @@ -0,0 +1,33 @@ +package shell + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + shellCmd := &cobra.Command{ + Use: consts.ShellStr, + Short: "Start an interactive shell", + Long: help.GetHelpFor([]string{consts.ShellStr}), + Run: func(cmd *cobra.Command, args []string) { + ShellCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + } + flags.Bind("", false, shellCmd, func(f *pflag.FlagSet) { + f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") + f.StringP("shell-path", "s", "", "path to shell interpreter") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{shellCmd} +} diff --git a/client/command/sliver.go b/client/command/sliver.go index f69bcd483e..15a3d32c91 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -20,22 +20,17 @@ package command import ( "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" - "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/cursed" "github.com/bishopfox/sliver/client/command/dllhijack" "github.com/bishopfox/sliver/client/command/environment" "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/filesystem" - "github.com/bishopfox/sliver/client/command/generate" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/network" @@ -51,7 +46,6 @@ import ( "github.com/bishopfox/sliver/client/command/shell" "github.com/bishopfox/sliver/client/command/socks" "github.com/bishopfox/sliver/client/command/tasks" - "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/wasm" "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" @@ -68,18 +62,69 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { }, } - groups := []*cobra.Group{ - {ID: consts.SliverCoreHelpGroup, Title: consts.SliverCoreHelpGroup}, - {ID: consts.InfoHelpGroup, Title: consts.InfoHelpGroup}, - {ID: consts.FilesystemHelpGroup, Title: consts.FilesystemHelpGroup}, - {ID: consts.NetworkHelpGroup, Title: consts.NetworkHelpGroup}, - {ID: consts.ExecutionHelpGroup, Title: consts.ExecutionHelpGroup}, - {ID: consts.PrivilegesHelpGroup, Title: consts.PrivilegesHelpGroup}, - {ID: consts.ProcessHelpGroup, Title: consts.ProcessHelpGroup}, - {ID: consts.AliasHelpGroup, Title: consts.AliasHelpGroup}, - {ID: consts.ExtensionHelpGroup, Title: consts.ExtensionHelpGroup}, - } - sliver.AddGroup(groups...) + // [ Core ] + bind(consts.SliverCoreHelpGroup, sliver, con, + reconfig.Commands, + // sessions.Commands, + sessions.SliverCommands, + kill.Commands, + // use.Commands, + tasks.Commands, + pivots.Commands, + ) + + // [ Info ] + bind(consts.InfoHelpGroup, sliver, con, + // info.Commands, + info.SliverCommands, + screenshot.Commands, + environment.Commands, + registry.Commands, + ) + + // [ Filesystem ] + bind(consts.FilesystemHelpGroup, sliver, con, + filesystem.Commands, + ) + + // [ Network tools ] + bind(consts.NetworkHelpGroup, sliver, con, + network.Commands, + rportfwd.Commands, + portfwd.Commands, + socks.Commands, + wireguard.SliverCommands, + ) + + // [ Execution ] + bind(consts.ExecutionHelpGroup, sliver, con, + shell.Commands, + exec.Commands, + backdoor.Commands, + dllhijack.Commands, + cursed.Commands, + wasm.Commands, + ) + + // [ Privileges ] + bind(consts.PrivilegesHelpGroup, sliver, con, + privilege.Commands, + ) + + // [ Processes ] + bind(consts.ProcessHelpGroup, sliver, con, + processes.Commands, + ) + + // [ Aliases ] + bind(consts.AliasHelpGroup, sliver, con) + + // [ Extensions ] + bind(consts.ExtensionHelpGroup, sliver, con, + extensions.Commands, + ) + + // [ Post-command declaration setup ]---------------------------------------- // Load Aliases aliasManifests := assets.GetInstalledAliasManifests() @@ -103,1879 +148,9 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { extensions.ExtensionRegisterCommand(ext, sliver, con) } - // [ Reconfig ] --------------------------------------------------------------- - - reconfigCmd := &cobra.Command{ - Use: consts.ReconfigStr, - Short: "Reconfigure the active beacon/session", - Long: help.GetHelpFor([]string{consts.ReconfigStr}), - Run: func(cmd *cobra.Command, args []string) { - reconfig.ReconfigCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: hideCommand(consts.BeaconCmdsFilter), - } - sliver.AddCommand(reconfigCmd) - Flags("reconfig", false, reconfigCmd, func(f *pflag.FlagSet) { - f.StringP("reconnect-interval", "r", "", "reconnect interval for implant") - f.StringP("beacon-interval", "i", "", "beacon callback interval") - f.StringP("beacon-jitter", "j", "", "beacon callback jitter (random up to)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - renameCmd := &cobra.Command{ - Use: consts.RenameStr, - Short: "Rename the active beacon/session", - Long: help.GetHelpFor([]string{consts.RenameStr}), - Run: func(cmd *cobra.Command, args []string) { - reconfig.RenameCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(renameCmd) - Flags("rename", false, renameCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "change implant name to") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Sessions ] -------------------------------------------------------------- - - sessionsCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Session management", - Long: help.GetHelpFor([]string{consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - Flags("sessions", true, sessionsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("sessions", false, sessionsCmd, func(f *pflag.FlagSet) { - f.StringP("interact", "i", "", "interact with a session") - f.StringP("kill", "k", "", "kill the designated session") - f.BoolP("kill-all", "K", false, "kill all the sessions") - f.BoolP("clean", "C", false, "clean out any sessions marked as [DEAD]") - f.BoolP("force", "F", false, "force session action without waiting for results") - - f.StringP("filter", "f", "", "filter sessions by substring") - f.StringP("filter-re", "e", "", "filter sessions by regular expression") - }) - FlagComps(sessionsCmd, func(comp *carapace.ActionMap) { - (*comp)["interact"] = use.BeaconAndSessionIDCompleter(con) - (*comp)["kill"] = use.BeaconAndSessionIDCompleter(con) - }) - sliver.AddCommand(sessionsCmd) - - sessionsPruneCmd := &cobra.Command{ - Use: consts.PruneStr, - Short: "Kill all stale/dead sessions", - Long: help.GetHelpFor([]string{consts.SessionsStr, consts.PruneStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsPruneCmd(cmd, con, args) - }, - } - Flags("prune", false, sessionsPruneCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "Force the killing of stale/dead sessions") - }) - sessionsCmd.AddCommand(sessionsPruneCmd) - - backgroundCmd := &cobra.Command{ - Use: consts.BackgroundStr, - Short: "Background an active session", - Long: help.GetHelpFor([]string{consts.BackgroundStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.BackgroundCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - Flags("use", false, backgroundCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sliver.AddCommand(backgroundCmd) - - killCmd := &cobra.Command{ - Use: consts.KillStr, - Short: "Kill a session", - Long: help.GetHelpFor([]string{consts.KillStr}), - Run: func(cmd *cobra.Command, args []string) { - kill.KillCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(killCmd) - Flags("use", false, backgroundCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "Force kill, does not clean up") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - openSessionCmd := &cobra.Command{ - Use: consts.InteractiveStr, - Short: "Task a beacon to open an interactive session (Beacon only)", - Long: help.GetHelpFor([]string{consts.InteractiveStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.InteractiveCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: hideCommand(consts.BeaconCmdsFilter), - } - sliver.AddCommand(openSessionCmd) - Flags("interactive", false, openSessionCmd, func(f *pflag.FlagSet) { - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "namedpipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcppivot connection strings") - - f.StringP("delay", "d", "0s", "delay opening the session (after checkin) for a given period of time") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Use ] -------------------------------------------------------------- - - useCmd := &cobra.Command{ - Use: consts.UseStr, - Short: "Switch the active session or beacon", - Long: help.GetHelpFor([]string{consts.UseStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - Flags("use", true, useCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(useCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - - if !con.IsCLI { - sliver.AddCommand(useCmd) - } - - useSessionCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Switch the active session", - Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseSessionCmd(cmd, con, args) - }, - } - carapace.Gen(useSessionCmd).PositionalCompletion(use.SessionIDCompleter(con)) - useCmd.AddCommand(useSessionCmd) - - useBeaconCmd := &cobra.Command{ - Use: consts.BeaconsStr, - Short: "Switch the active beacon", - Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseBeaconCmd(cmd, con, args) - }, - } - carapace.Gen(useBeaconCmd).PositionalCompletion(use.BeaconIDCompleter(con)) - useCmd.AddCommand(useBeaconCmd) - - // [ Close ] -------------------------------------------------------------- - closeSessionCmd := &cobra.Command{ - Use: consts.CloseStr, - Short: "Close an interactive session without killing the remote process", - Long: help.GetHelpFor([]string{consts.CloseStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.CloseSessionCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(closeSessionCmd) - Flags("", false, closeSessionCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Tasks ] -------------------------------------------------------------- - - tasksCmd := &cobra.Command{ - Use: consts.TasksStr, - Short: "Beacon task management", - Long: help.GetHelpFor([]string{consts.TasksStr}), - Run: func(cmd *cobra.Command, args []string) { - tasks.TasksCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: hideCommand(consts.BeaconCmdsFilter), - } - Flags("tasks", true, tasksCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") - f.IntP("skip-pages", "S", 0, "skip the first n page(s)") - f.StringP("filter", "f", "", "filter based on task type (case-insensitive prefix matching)") - }) - sliver.AddCommand(tasksCmd) - - fetchCmd := &cobra.Command{ - Use: consts.FetchStr, - Short: "Fetch the details of a beacon task", - Long: help.GetHelpFor([]string{consts.TasksStr, consts.FetchStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - tasks.TasksFetchCmd(cmd, con, args) - }, - } - tasksCmd.AddCommand(fetchCmd) - carapace.Gen(fetchCmd).PositionalCompletion(tasks.BeaconTaskIDCompleter(con).Usage("beacon task ID")) - - cancelCmd := &cobra.Command{ - Use: consts.CancelStr, - Short: "Cancel a pending beacon task", - Long: help.GetHelpFor([]string{consts.TasksStr, consts.CancelStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - tasks.TasksCancelCmd(cmd, con, args) - }, - } - tasksCmd.AddCommand(cancelCmd) - carapace.Gen(cancelCmd).PositionalCompletion(tasks.BeaconPendingTasksCompleter(con).Usage("beacon task ID")) - - // [ Info ] -------------------------------------------------------------- - - infoCmd := &cobra.Command{ - Use: consts.InfoStr, - Short: "Get info about session", - Long: help.GetHelpFor([]string{consts.InfoStr}), - Run: func(cmd *cobra.Command, args []string) { - info.InfoCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - Flags("use", false, infoCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - sliver.AddCommand(infoCmd) - - pingCmd := &cobra.Command{ - Use: consts.PingStr, - Short: "Send round trip message to implant (does not use ICMP)", - Long: help.GetHelpFor([]string{consts.PingStr}), - Run: func(cmd *cobra.Command, args []string) { - info.PingCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(pingCmd) - Flags("", false, pingCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - getPIDCmd := &cobra.Command{ - Use: consts.GetPIDStr, - Short: "Get session pid", - Long: help.GetHelpFor([]string{consts.GetPIDStr}), - Run: func(cmd *cobra.Command, args []string) { - info.PIDCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(getPIDCmd) - Flags("", false, getPIDCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - getUIDCmd := &cobra.Command{ - Use: consts.GetUIDStr, - Short: "Get session process UID", - Long: help.GetHelpFor([]string{consts.GetUIDStr}), - Run: func(cmd *cobra.Command, args []string) { - info.UIDCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(getUIDCmd) - Flags("", false, getUIDCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - getGIDCmd := &cobra.Command{ - Use: consts.GetGIDStr, - Short: "Get session process GID", - Long: help.GetHelpFor([]string{consts.GetGIDStr}), - Run: func(cmd *cobra.Command, args []string) { - info.GIDCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(getGIDCmd) - Flags("", false, getGIDCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - whoamiCmd := &cobra.Command{ - Use: consts.WhoamiStr, - Short: "Get session user execution context", - Long: help.GetHelpFor([]string{consts.WhoamiStr}), - Run: func(cmd *cobra.Command, args []string) { - info.WhoamiCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(whoamiCmd) - Flags("", false, whoamiCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Shell ] -------------------------------------------------------------- - - shellCmd := &cobra.Command{ - Use: consts.ShellStr, - Short: "Start an interactive shell", - Long: help.GetHelpFor([]string{consts.ShellStr}), - Run: func(cmd *cobra.Command, args []string) { - shell.ShellCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.SessionCmdsFilter), - } - sliver.AddCommand(shellCmd) - Flags("", false, shellCmd, func(f *pflag.FlagSet) { - f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") - f.StringP("shell-path", "s", "", "path to shell interpreter") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Exec ] -------------------------------------------------------------- - - executeCmd := &cobra.Command{ - Use: consts.ExecuteStr, - Short: "Execute a program on the remote system", - Long: help.GetHelpFor([]string{consts.ExecuteStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.ExecuteCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(executeCmd) - Flags("", false, executeCmd, func(f *pflag.FlagSet) { - f.BoolP("token", "T", false, "execute command with current token (windows only)") - f.BoolP("output", "o", false, "capture command output") - f.BoolP("save", "s", false, "save output to a file") - f.BoolP("loot", "X", false, "save output as loot") - f.BoolP("ignore-stderr", "S", false, "don't print STDERR output") - f.StringP("stdout", "O", "", "remote path to redirect STDOUT to") - f.StringP("stderr", "E", "", "remote path to redirect STDERR to") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.Uint32P("ppid", "P", 0, "parent process id (optional, Windows only)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - executeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(executeCmd).PositionalCompletion(carapace.ActionValues().Usage("command to execute (required)")) - carapace.Gen(executeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to the command (optional)")) - - executeAssemblyCmd := &cobra.Command{ - Use: consts.ExecuteAssemblyStr, - Short: "Loads and executes a .NET assembly in a child process (Windows Only)", - Long: help.GetHelpFor([]string{consts.ExecuteAssemblyStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.ExecuteAssemblyCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(executeAssemblyCmd) - Flags("", false, executeAssemblyCmd, func(f *pflag.FlagSet) { - f.StringP("process", "p", "notepad.exe", "hosting process to inject into") - f.StringP("method", "m", "", "Optional method (a method is required for a .NET DLL)") - f.StringP("class", "c", "", "Optional class name (required for .NET DLL)") - f.StringP("app-domain", "d", "", "AppDomain name to create for .NET assembly. Generated randomly if not set.") - f.StringP("arch", "a", "x84", "Assembly target architecture: x86, x64, x84 (x86+x64)") - f.BoolP("in-process", "i", false, "Run in the current sliver process") - f.StringP("runtime", "r", "", "Runtime to use for running the assembly (only supported when used with --in-process)") - f.BoolP("save", "s", false, "save output to file") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.Uint32P("ppid", "P", 0, "parent process id (optional)") - f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") - f.BoolP("amsi-bypass", "M", false, "Bypass AMSI on Windows (only supported when used with --in-process)") - f.BoolP("etw-bypass", "E", false, "Bypass ETW on Windows (only supported when used with --in-process)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - executeAssemblyCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(executeAssemblyCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to assembly file (required)")) - carapace.Gen(executeAssemblyCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the assembly entrypoint (optional)")) - - executeShellcodeCmd := &cobra.Command{ - Use: consts.ExecuteShellcodeStr, - Short: "Executes the given shellcode in the sliver process", - Long: help.GetHelpFor([]string{consts.ExecuteShellcodeStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.ExecuteShellcodeCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(executeShellcodeCmd) - Flags("", false, executeShellcodeCmd, func(f *pflag.FlagSet) { - f.BoolP("rwx-pages", "r", false, "Use RWX permissions for memory pages") - f.Uint32P("pid", "p", 0, "Pid of process to inject into (0 means injection into ourselves)") - f.StringP("process", "n", `c:\windows\system32\notepad.exe`, "Process to inject into when running in interactive mode") - f.BoolP("interactive", "i", false, "Inject into a new process and interact with it") - f.BoolP("shikata-ga-nai", "S", false, "encode shellcode using shikata ga nai prior to execution") - f.StringP("architecture", "A", "amd64", "architecture of the shellcode: 386, amd64 (used with --shikata-ga-nai flag)") - f.Uint32P("iterations", "I", 1, "number of encoding iterations (used with --shikata-ga-nai flag)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(executeShellcodeCmd, func(comp *carapace.ActionMap) { - (*comp)["shikata-ga-nai"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") - }) - carapace.Gen(executeShellcodeCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shellcode file (required)")) - - sideloadCmd := &cobra.Command{ - Use: consts.SideloadStr, - Short: "Load and execute a shared object (shared library/DLL) in a remote process", - Long: help.GetHelpFor([]string{consts.SideloadStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.SideloadCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(sideloadCmd) - Flags("", false, sideloadCmd, func(f *pflag.FlagSet) { - f.StringP("entry-point", "e", "", "Entrypoint for the DLL (Windows only)") - f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") - f.BoolP("unicode", "w", false, "Command line is passed to unmanaged DLL function in UNICODE format. (default is ANSI)") - f.BoolP("save", "s", false, "save output to file") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") - f.Uint32P("ppid", "P", 0, "parent process id (optional)") - f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sideloadCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(sideloadCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shared library file (required)")) - carapace.Gen(sideloadCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the binary (optional)")) - - spawnDllCmd := &cobra.Command{ - Use: consts.SpawnDllStr, - Short: "Load and execute a Reflective DLL in a remote process", - Long: help.GetHelpFor([]string{consts.SpawnDllStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.SpawnDllCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(spawnDllCmd) - Flags("", false, spawnDllCmd, func(f *pflag.FlagSet) { - f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") - f.StringP("export", "e", "ReflectiveLoader", "Entrypoint of the Reflective DLL") - f.BoolP("save", "s", false, "save output to file") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") - f.UintP("ppid", "P", 0, "parent process id (optional)") - f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - spawnDllCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(spawnDllCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to DLL file (required)")) - carapace.Gen(spawnDllCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the DLL entrypoint (optional)")) - - migrateCmd := &cobra.Command{ - Use: consts.MigrateStr, - Short: "Migrate into a remote process", - Long: help.GetHelpFor([]string{consts.MigrateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.MigrateCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(migrateCmd) - Flags("", false, migrateCmd, func(f *pflag.FlagSet) { - f.BoolP("disable-sgn", "S", true, "disable shikata ga nai shellcode encoder") - f.Uint32P("pid", "p", 0, "process id to migrate into") - f.StringP("process-name", "n", "", "name of the process to migrate into") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(migrateCmd).PositionalCompletion(carapace.ActionValues().Usage("PID of process to migrate into")) - - msfCmd := &cobra.Command{ - Use: consts.MsfStr, - Short: "Execute an MSF payload in the current process", - Long: help.GetHelpFor([]string{consts.MsfStr}), - Run: func(cmd *cobra.Command, args []string) { - exec.MsfCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(msfCmd) - Flags("", false, msfCmd, func(f *pflag.FlagSet) { - f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") - f.StringP("lhost", "L", "", "listen host") - f.IntP("lport", "l", 4444, "listen port") - f.StringP("encoder", "e", "", "msf encoder") - f.IntP("iterations", "i", 1, "iterations of the encoder") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - msfInjectCmd := &cobra.Command{ - Use: consts.MsfInjectStr, - Short: "Inject an MSF payload into a process", - Long: help.GetHelpFor([]string{consts.MsfInjectStr}), - Run: func(cmd *cobra.Command, args []string) { - exec.MsfInjectCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(msfInjectCmd) - Flags("", false, msfInjectCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "pid to inject into") - f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") - f.StringP("lhost", "L", "", "listen host") - f.IntP("lport", "l", 4444, "listen port") - f.StringP("encoder", "e", "", "msf encoder") - f.IntP("iterations", "i", 1, "iterations of the encoder") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - psExecCmd := &cobra.Command{ - Use: consts.PsExecStr, - Short: "Start a sliver service on a remote target", - Long: help.GetHelpFor([]string{consts.PsExecStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.PsExecCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(psExecCmd) - Flags("", false, psExecCmd, func(f *pflag.FlagSet) { - f.StringP("service-name", "s", "Sliver", "name that will be used to register the service") - f.StringP("service-description", "d", "Sliver implant", "description of the service") - f.StringP("profile", "p", "", "profile to use for service binary") - f.StringP("binpath", "b", "c:\\windows\\temp", "directory to which the executable will be uploaded") - f.StringP("custom-exe", "c", "", "custom service executable to use instead of generating a new Sliver") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(psExecCmd, func(comp *carapace.ActionMap) { - (*comp)["custom-exe"] = carapace.ActionFiles() - }) - carapace.Gen(psExecCmd).PositionalCompletion(carapace.ActionValues().Usage("hostname (required)")) - - sshCmd := &cobra.Command{ - Use: consts.SSHStr, - Short: "Run a SSH command on a remote host", - Long: help.GetHelpFor([]string{consts.SSHStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.SSHCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(sshCmd) - Flags("", false, sshCmd, func(f *pflag.FlagSet) { - f.UintP("port", "p", 22, "SSH port") - f.StringP("private-key", "i", "", "path to private key file") - f.StringP("password", "P", "", "SSH user password") - f.StringP("login", "l", "", "username to use to connect") - f.BoolP("skip-loot", "s", false, "skip the prompt to use loot credentials") - f.StringP("kerberos-config", "c", "/etc/krb5.conf", "path to remote Kerberos config file") - f.StringP("kerberos-keytab", "k", "", "path to Kerberos keytab file") - f.StringP("kerberos-realm", "r", "", "Kerberos realm") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sshCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - FlagComps(sshCmd, func(comp *carapace.ActionMap) { - (*comp)["private-key"] = carapace.ActionFiles() - (*comp)["kerberos-keytab"] = carapace.ActionFiles() - }) - - carapace.Gen(sshCmd).PositionalCompletion(carapace.ActionValues().Usage("remote host to SSH to (required)")) - carapace.Gen(sshCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("command line with arguments")) - - // [ Extensions ] ----------------------------------------------------------------- - extensionCmd := &cobra.Command{ - Use: consts.ExtensionsStr, - Short: "Manage extensions", - Long: help.GetHelpFor([]string{consts.ExtensionsStr}), - GroupID: consts.ExtensionHelpGroup, - Run: func(cmd *cobra.Command, _ []string) { - extensions.ExtensionsCmd(cmd, con) - }, - } - sliver.AddCommand(extensionCmd) - - extensionCmd.AddCommand(&cobra.Command{ - Use: consts.ListStr, - Short: "List extensions loaded in the current session or beacon", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.ListStr}), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionsListCmd(cmd, con, args) - }, - }) - - extensionLoadCmd := &cobra.Command{ - Use: consts.LoadStr, - Short: "Temporarily load an extension from a local directory", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.LoadStr}), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionLoadCmd(cmd, con, args) - }, - } - extensionCmd.AddCommand(extensionLoadCmd) - carapace.Gen(extensionLoadCmd).PositionalCompletion(carapace.ActionDirectories().Usage("path to the extension directory")) - - extensionInstallCmd := &cobra.Command{ - Use: consts.InstallStr, - Short: "Install an extension from a local directory or .tar.gz file", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.InstallStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionsInstallCmd(cmd, con, args) - }, - } - extensionCmd.AddCommand(extensionInstallCmd) - carapace.Gen(extensionInstallCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to the extension .tar.gz or directory")) - - extensionRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove an installed extension", - Args: cobra.ExactArgs(1), - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionsRemoveCmd(cmd, con, args) - }, - } - extensionCmd.AddCommand(extensionRmCmd) - carapace.Gen(extensionRmCmd).PositionalCompletion(extensions.ExtensionsCommandNameCompleter(con).Usage("the command name of the extension to remove")) - - // [ Filesystem ] --------------------------------------------- - - mvCmd := &cobra.Command{ - Use: consts.MvStr, - Short: "Move or rename a file", - Long: help.GetHelpFor([]string{consts.MvStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MvCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(mvCmd) - Flags("", false, mvCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(mvCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to source file (required)"), - carapace.ActionValues().Usage("path to dest file (required)"), - ) - - lsCmd := &cobra.Command{ - Use: consts.LsStr, - Short: "List current directory", - Long: help.GetHelpFor([]string{consts.LsStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.LsCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(lsCmd) - Flags("", false, lsCmd, func(f *pflag.FlagSet) { - f.BoolP("reverse", "r", false, "reverse sort order") - f.BoolP("modified", "m", false, "sort by modified time") - f.BoolP("size", "s", false, "sort by size") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(lsCmd).PositionalCompletion(carapace.ActionValues().Usage("path to enumerate (optional)")) - - rmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a file or directory", - Long: help.GetHelpFor([]string{consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.RmCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(rmCmd) - Flags("", false, rmCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively remove files") - f.BoolP("force", "F", false, "ignore safety and forcefully remove files") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(rmCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to remove")) - - mkdirCmd := &cobra.Command{ - Use: consts.MkdirStr, - Short: "Make a directory", - Long: help.GetHelpFor([]string{consts.MkdirStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MkdirCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(mkdirCmd) - Flags("", false, mkdirCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(mkdirCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory to create")) - - cdCmd := &cobra.Command{ - Use: consts.CdStr, - Short: "Change directory", - Long: help.GetHelpFor([]string{consts.CdStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.CdCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(cdCmd) - Flags("", false, cdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(cdCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory")) - - pwdCmd := &cobra.Command{ - Use: consts.PwdStr, - Short: "Print working directory", - Long: help.GetHelpFor([]string{consts.PwdStr}), - Run: func(cmd *cobra.Command, args []string) { - filesystem.PwdCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(pwdCmd) - Flags("", false, pwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - catCmd := &cobra.Command{ - Use: consts.CatStr, - Short: "Dump file to stdout", - Long: help.GetHelpFor([]string{consts.CatStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.CatCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(catCmd) - Flags("", false, catCmd, func(f *pflag.FlagSet) { - f.BoolP("colorize-output", "c", false, "colorize output") - f.BoolP("hex", "x", false, "display as a hex dump") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") - f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting (optional)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(catCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to print")) - - downloadCmd := &cobra.Command{ - Use: consts.DownloadStr, - Short: "Download a file", - Long: help.GetHelpFor([]string{consts.DownloadStr}), - Args: cobra.RangeArgs(1, 2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.DownloadCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(downloadCmd) - Flags("", false, downloadCmd, func(f *pflag.FlagSet) { - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting") - f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting") - f.StringP("name", "n", "", "name to assign the download if looting") - f.BoolP("recurse", "r", false, "recursively download all files in a directory") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(downloadCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to the file or directory to download"), - carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), - ) - - uploadCmd := &cobra.Command{ - Use: consts.UploadStr, - Short: "Upload a file", - Long: help.GetHelpFor([]string{consts.UploadStr}), - Args: cobra.RangeArgs(1, 2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.UploadCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(uploadCmd) - Flags("", false, uploadCmd, func(f *pflag.FlagSet) { - f.BoolP("ioc", "i", false, "track uploaded file as an ioc") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(uploadCmd).PositionalCompletion( - carapace.ActionFiles().Usage("local path to the file to upload"), - carapace.ActionValues().Usage("path to the file or directory to upload to (optional)"), - ) - - memfilesCmd := &cobra.Command{ - Use: consts.MemfilesStr, - Short: "List current memfiles", - Long: help.GetHelpFor([]string{consts.MemfilesStr}), - GroupID: consts.FilesystemHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - filesystem.MemfilesListCmd(cmd, con, args) - }, - } - Flags("", true, memfilesCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sliver.AddCommand(memfilesCmd) - - memfilesAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a memfile", - Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MemfilesAddCmd(cmd, con, args) - }, - } - memfilesCmd.AddCommand(memfilesAddCmd) - - memfilesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a memfile", - Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MemfilesRmCmd(cmd, con, args) - }, - } - memfilesCmd.AddCommand(memfilesRmCmd) - - carapace.Gen(memfilesRmCmd).PositionalCompletion(carapace.ActionValues().Usage("memfile file descriptor")) - - // [ Network ] --------------------------------------------- - - ifconfigCmd := &cobra.Command{ - Use: consts.IfconfigStr, - Short: "View network interface configurations", - Long: help.GetHelpFor([]string{consts.IfconfigStr}), - Run: func(cmd *cobra.Command, args []string) { - network.IfconfigCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(ifconfigCmd) - Flags("", false, ifconfigCmd, func(f *pflag.FlagSet) { - f.BoolP("all", "A", false, "show all network adapters (default only shows IPv4)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - netstatCmd := &cobra.Command{ - Use: consts.NetstatStr, - Short: "Print network connection information", - Long: help.GetHelpFor([]string{consts.NetstatStr}), - Run: func(cmd *cobra.Command, args []string) { - network.NetstatCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(netstatCmd) - Flags("", false, netstatCmd, func(f *pflag.FlagSet) { - f.BoolP("tcp", "T", true, "display information about TCP sockets") - f.BoolP("udp", "u", false, "display information about UDP sockets") - f.BoolP("ip4", "4", true, "display information about IPv4 sockets") - f.BoolP("ip6", "6", false, "display information about IPv6 sockets") - f.BoolP("listen", "l", false, "display information about listening sockets") - f.BoolP("numeric", "n", false, "display numeric addresses (disable hostname resolution)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Processes ] --------------------------------------------- - - psCmd := &cobra.Command{ - Use: consts.PsStr, - Short: "List remote processes", - Long: help.GetHelpFor([]string{consts.PsStr}), - Run: func(cmd *cobra.Command, args []string) { - processes.PsCmd(cmd, con, args) - }, - GroupID: consts.ProcessHelpGroup, - } - sliver.AddCommand(psCmd) - Flags("", false, psCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "filter based on pid") - f.StringP("exe", "e", "", "filter based on executable name") - f.StringP("owner", "o", "", "filter based on owner") - f.BoolP("print-cmdline", "c", false, "print command line arguments") - f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") - f.IntP("skip-pages", "S", 0, "skip the first n page(s)") - f.BoolP("tree", "T", false, "print process tree") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - procdumpCmd := &cobra.Command{ - Use: consts.ProcdumpStr, - Short: "Dump process memory", - Long: help.GetHelpFor([]string{consts.ProcdumpStr}), - Run: func(cmd *cobra.Command, args []string) { - processes.ProcdumpCmd(cmd, con, args) - }, - GroupID: consts.ProcessHelpGroup, - } - sliver.AddCommand(procdumpCmd) - Flags("", false, procdumpCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "target pid") - f.StringP("name", "n", "", "target process name") - f.StringP("save", "s", "", "save to file (will overwrite if exists)") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("loot-name", "N", "", "name to assign when adding the memory dump to the loot store (optional)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - terminateCmd := &cobra.Command{ - Use: consts.TerminateStr, - Short: "Terminate a process on the remote system", - Long: help.GetHelpFor([]string{consts.TerminateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - processes.TerminateCmd(cmd, con, args) - }, - GroupID: consts.ProcessHelpGroup, - } - sliver.AddCommand(terminateCmd) - Flags("", false, terminateCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "disregard safety and kill the PID") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(terminateCmd).PositionalCompletion(carapace.ActionValues().Usage("process ID")) - - // [ Privileges ] --------------------------------------------- - - runAsCmd := &cobra.Command{ - Use: consts.RunAsStr, - Short: "Run a new process in the context of the designated user (Windows Only)", - Long: help.GetHelpFor([]string{consts.RunAsStr}), - Run: func(cmd *cobra.Command, args []string) { - privilege.RunAsCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(runAsCmd) - Flags("", false, runAsCmd, func(f *pflag.FlagSet) { - f.StringP("username", "u", "", "user to impersonate") - f.StringP("process", "p", "", "process to start") - f.StringP("args", "a", "", "arguments for the process") - f.StringP("domain", "d", "", "domain of the user") - f.StringP("password", "P", "", "password of the user") - f.BoolP("show-window", "s", false, ` - Log on, but use the specified credentials on the network only. The new process uses the same token as the caller, but the system creates a new logon session within LSA, and the process uses the specified credentials as the default credentials.`) - f.BoolP("net-only", "n", false, "use ") - f.Int64P("timeout", "t", 30, "grpc timeout in seconds") - }) - - impersonateCmd := &cobra.Command{ - Use: consts.ImpersonateStr, - Short: "Impersonate a logged in user.", - Long: help.GetHelpFor([]string{consts.ImpersonateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - privilege.ImpersonateCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(impersonateCmd) - Flags("", false, impersonateCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", 30, "grpc timeout in seconds") - }) - carapace.Gen(impersonateCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the user account to impersonate")) - - revToSelfCmd := &cobra.Command{ - Use: consts.RevToSelfStr, - Short: "Revert to self: lose stolen Windows token", - Long: help.GetHelpFor([]string{consts.RevToSelfStr}), - Run: func(cmd *cobra.Command, args []string) { - privilege.RevToSelfCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(revToSelfCmd) - Flags("", false, revToSelfCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", 30, "grpc timeout in seconds") - }) - - getSystemCmd := &cobra.Command{ - Use: consts.GetSystemStr, - Short: "Spawns a new sliver session as the NT AUTHORITY\\SYSTEM user (Windows Only)", - Long: help.GetHelpFor([]string{consts.GetSystemStr}), - Run: func(cmd *cobra.Command, args []string) { - privilege.GetSystemCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(getSystemCmd) - Flags("", false, getSystemCmd, func(f *pflag.FlagSet) { - f.StringP("process", "p", "spoolsv.exe", "SYSTEM process to inject into") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - makeTokenCmd := &cobra.Command{ - Use: consts.MakeTokenStr, - Short: "Create a new Logon Session with the specified credentials", - Long: help.GetHelpFor([]string{consts.MakeTokenStr}), - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - privilege.MakeTokenCmd(cmd, con, args) - }, - } - sliver.AddCommand(makeTokenCmd) - Flags("", false, makeTokenCmd, func(f *pflag.FlagSet) { - f.StringP("username", "u", "", "username of the user to impersonate") - f.StringP("password", "p", "", "password of the user to impersonate") - f.StringP("domain", "d", "", "domain of the user to impersonate") - f.StringP("logon-type", "T", "LOGON_NEW_CREDENTIALS", "logon type to use") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - chmodCmd := &cobra.Command{ - Use: consts.ChmodStr, - Short: "Change permissions on a file or directory", - Long: help.GetHelpFor([]string{consts.ChmodStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.ChmodCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - } - sliver.AddCommand(chmodCmd) - Flags("", false, chmodCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively change permissions on files") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(chmodCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to file to change mod perms"), - carapace.ActionValues().Usage("file permissions in octal (eg. 0644)"), - ) - - chownCmd := &cobra.Command{ - Use: consts.ChownStr, - Short: "Change owner on a file or directory", - Long: help.GetHelpFor([]string{consts.ChownStr}), - Args: cobra.ExactArgs(3), - Run: func(cmd *cobra.Command, args []string) { - filesystem.ChownCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - } - sliver.AddCommand(chownCmd) - Flags("", false, chownCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively change permissions on files") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(chownCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to file to change owner for"), - carapace.ActionValues().Usage("user ID"), - carapace.ActionValues().Usage("group ID (required)"), - ) - - chtimesCmd := &cobra.Command{ - Use: consts.ChtimesStr, - Short: "Change access and modification times on a file (timestomp)", - Long: help.GetHelpFor([]string{consts.ChtimesStr}), - Args: cobra.ExactArgs(3), - Run: func(cmd *cobra.Command, args []string) { - filesystem.ChtimesCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - } - sliver.AddCommand(chtimesCmd) - Flags("", false, chtimesCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(chtimesCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to file to change access timestamps"), - carapace.ActionValues().Usage("last accessed time in DateTime format, i.e. 2006-01-02 15:04:05"), - carapace.ActionValues().Usage("last modified time in DateTime format, i.e. 2006-01-02 15:04:05"), - ) - - // [ Screenshot ] --------------------------------------------- - - screenshotCmd := &cobra.Command{ - Use: consts.ScreenshotStr, - Short: "Take a screenshot", - Long: help.GetHelpFor([]string{consts.ScreenshotStr}), - Run: func(cmd *cobra.Command, args []string) { - screenshot.ScreenshotCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(screenshotCmd) - Flags("", false, screenshotCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save to file (will overwrite if exists)") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(screenshotCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles() - }) - - // [ Backdoor ] --------------------------------------------- - - backdoorCmd := &cobra.Command{ - Use: consts.BackdoorStr, - Short: "Infect a remote file with a sliver shellcode", - Long: help.GetHelpFor([]string{consts.BackdoorStr}), - Args: cobra.ExactArgs(1), - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - backdoor.BackdoorCmd(cmd, con, args) - }, - } - sliver.AddCommand(backdoorCmd) - Flags("", false, backdoorCmd, func(f *pflag.FlagSet) { - f.StringP("profile", "p", "", "profile to use for service binary") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(screenshotCmd, func(comp *carapace.ActionMap) { - (*comp)["profile"] = generate.ProfileNameCompleter(con) - }) - carapace.Gen(backdoorCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the remote file to backdoor")) - - // // [ DLL Hijack ] ----------------------------------------------------------------- - - dllhijackCmd := &cobra.Command{ - Use: consts.DLLHijackStr, - Short: "Plant a DLL for a hijack scenario", - Long: help.GetHelpFor([]string{consts.DLLHijackStr}), - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - dllhijack.DllHijackCmd(cmd, con, args) - }, - } - sliver.AddCommand(dllhijackCmd) - Flags("", false, dllhijackCmd, func(f *pflag.FlagSet) { - f.StringP("reference-path", "r", "", "Path to the reference DLL on the remote system") - f.StringP("reference-file", "R", "", "Path to the reference DLL on the local system") - f.StringP("file", "f", "", "Local path to the DLL to plant for the hijack") - f.StringP("profile", "p", "", "Profile name to use as a base DLL") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(dllhijackCmd, func(comp *carapace.ActionMap) { - (*comp)["reference-file"] = carapace.ActionFiles() - (*comp)["file"] = carapace.ActionFiles() - (*comp)["profile"] = generate.ProfileNameCompleter(con) - }) - carapace.Gen(dllhijackCmd).PositionalCompletion(carapace.ActionValues().Usage("Path to upload the DLL to on the remote system")) - - // [ Get Privs ] ----------------------------------------------------------------- - getprivsCmd := &cobra.Command{ - Use: consts.GetPrivsStr, - Short: "Get current privileges (Windows only)", - Long: help.GetHelpFor([]string{consts.GetPrivsStr}), - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - privilege.GetPrivsCmd(cmd, con, args) - }, - } - sliver.AddCommand(getprivsCmd) - Flags("", false, getprivsCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - // - - // [ Environment ] --------------------------------------------- - - envCmd := &cobra.Command{ - Use: consts.EnvStr, - Short: "List environment variables", - Long: help.GetHelpFor([]string{consts.EnvStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - environment.EnvGetCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(envCmd) - Flags("", true, envCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(envCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable to fetch (optional)")) - - envSetCmd := &cobra.Command{ - Use: consts.SetStr, - Short: "Set environment variables", - Long: help.GetHelpFor([]string{consts.EnvStr, consts.SetStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - environment.EnvSetCmd(cmd, con, args) - }, - } - envCmd.AddCommand(envSetCmd) - carapace.Gen(envSetCmd).PositionalCompletion( - carapace.ActionValues().Usage("environment variable name"), - carapace.ActionValues().Usage("value to assign"), - ) - - envUnsetCmd := &cobra.Command{ - Use: consts.UnsetStr, - Short: "Clear environment variables", - Long: help.GetHelpFor([]string{consts.EnvStr, consts.UnsetStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - environment.EnvUnsetCmd(cmd, con, args) - }, - } - envCmd.AddCommand(envUnsetCmd) - carapace.Gen(envUnsetCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable name")) - - // [ Registry ] --------------------------------------------- - - registryCmd := &cobra.Command{ - Use: consts.RegistryStr, - Short: "Windows registry operations", - Long: help.GetHelpFor([]string{consts.RegistryStr}), - GroupID: consts.InfoHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(registryCmd) - Flags("registry", true, registryCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - registryReadCmd := &cobra.Command{ - Use: consts.RegistryReadStr, - Short: "Read values from the Windows registry", - Long: help.GetHelpFor([]string{consts.RegistryReadStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegReadCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryReadCmd) - Flags("", false, registryReadCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to read values from") - }) - carapace.Gen(registryReadCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryWriteCmd := &cobra.Command{ - Use: consts.RegistryWriteStr, - Short: "Write values to the Windows registry", - Long: help.GetHelpFor([]string{consts.RegistryWriteStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - registry.RegWriteCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryWriteCmd) - Flags("", false, registryWriteCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - f.StringP("type", "T", "string", "type of the value to write (string, dword, qword, binary). If binary, you must provide a path to a file with --path") - f.StringP("path", "p", "", "path to the binary file to write") - }) - carapace.Gen(registryWriteCmd).PositionalCompletion( - carapace.ActionValues().Usage("registry path"), - carapace.ActionValues().Usage("value to write"), - ) - - registryCreateKeyCmd := &cobra.Command{ - Use: consts.RegistryCreateKeyStr, - Short: "Create a registry key", - Long: help.GetHelpFor([]string{consts.RegistryCreateKeyStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegCreateKeyCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryCreateKeyCmd) - Flags("", false, registryCreateKeyCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - }) - carapace.Gen(registryCreateKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryDeleteKeyCmd := &cobra.Command{ - Use: consts.RegistryDeleteKeyStr, - Short: "Remove a registry key", - Long: help.GetHelpFor([]string{consts.RegistryDeleteKeyStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegDeleteKeyCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryDeleteKeyCmd) - Flags("", false, registryDeleteKeyCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to remove value from") - }) - carapace.Gen(registryDeleteKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryListSubCmd := &cobra.Command{ - Use: consts.RegistryListSubStr, - Short: "List the sub keys under a registry key", - Long: help.GetHelpFor([]string{consts.RegistryListSubStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegListSubKeysCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryListSubCmd) - Flags("", false, registryListSubCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - }) - carapace.Gen(registryListSubCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryListValuesCmd := &cobra.Command{ - Use: consts.RegistryListValuesStr, - Short: "List the values for a registry key", - Long: help.GetHelpFor([]string{consts.RegistryListValuesStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegListValuesCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryListValuesCmd) - Flags("", false, registryListValuesCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - }) - carapace.Gen(registryListValuesCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - // [ Reverse Port Forwarding ] -------------------------------------------------------------- - - rportfwdCmd := &cobra.Command{ - Use: consts.RportfwdStr, - Short: "reverse port forwardings", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - rportfwd.RportFwdListenersCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(rportfwdCmd) - Flags("", true, rportfwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - rportfwdAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add and start reverse port forwarding", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - rportfwd.StartRportFwdListenerCmd(cmd, con, args) - }, - } - rportfwdCmd.AddCommand(rportfwdAddCmd) - Flags("", false, rportfwdAddCmd, func(f *pflag.FlagSet) { - f.StringP("remote", "r", "", "remote address : connection is forwarded to") - f.StringP("bind", "b", "", "bind address : for implants to listen on") - }) - FlagComps(rportfwdAddCmd, func(comp *carapace.ActionMap) { - (*comp)["remote"] = completers.ClientInterfacesCompleter() - }) - - rportfwdRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Stop and remove reverse port forwarding", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - rportfwd.StopRportFwdListenerCmd(cmd, con, args) - }, - } - rportfwdCmd.AddCommand(rportfwdRmCmd) - Flags("", false, rportfwdRmCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of portfwd to remove") - }) - FlagComps(rportfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = rportfwd.PortfwdIDCompleter(con) - }) - - // [ Pivots ] -------------------------------------------------------------- - - pivotsCmd := &cobra.Command{ - Use: consts.PivotsStr, - Short: "List pivots for active session", - Long: help.GetHelpFor([]string{consts.PivotsStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.PivotsCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(pivotsCmd) - Flags("", true, pivotsCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - namedPipeCmd := &cobra.Command{ - Use: consts.NamedPipeStr, - Short: "Start a named pipe pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.StartNamedPipeListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(namedPipeCmd) - Flags("", false, namedPipeCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") - f.BoolP("allow-all", "a", false, "allow all users to connect") - }) - - tcpListenerCmd := &cobra.Command{ - Use: consts.TCPListenerStr, - Short: "Start a TCP pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.StartTCPListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(tcpListenerCmd) - Flags("", false, tcpListenerCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "remote interface to bind pivot listener") - f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") - }) - - pivotStopCmd := &cobra.Command{ - Use: consts.StopStr, - Short: "Stop a pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.StopPivotListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(pivotStopCmd) - Flags("", false, pivotStopCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of the pivot listener to stop") - }) - FlagComps(pivotStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = pivots.PivotIDCompleter(con) - }) - - pivotDetailsCmd := &cobra.Command{ - Use: consts.DetailsStr, - Short: "Get details of a pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.PivotDetailsCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(pivotDetailsCmd) - Flags("", false, pivotDetailsCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of the pivot listener to get details for") - }) - FlagComps(pivotDetailsCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = pivots.PivotIDCompleter(con) - }) - - graphCmd := &cobra.Command{ - Use: consts.GraphStr, - Short: "Get pivot listeners graph", - Long: help.GetHelpFor([]string{consts.PivotsStr, "graph"}), - Run: func(cmd *cobra.Command, args []string) { - pivots.PivotsGraphCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(graphCmd) - - // [ Portfwd ] -------------------------------------------------------------- - - portfwdCmd := &cobra.Command{ - Use: consts.PortfwdStr, - Short: "In-band TCP port forwarding", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - portfwd.PortfwdCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(portfwdCmd) - Flags("", true, portfwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - addCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Create a new port forwarding tunnel", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - portfwd.PortfwdAddCmd(cmd, con, args) - }, - } - portfwdCmd.AddCommand(addCmd) - Flags("", false, addCmd, func(f *pflag.FlagSet) { - f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") - f.StringP("bind", "b", "127.0.0.1:8080", "bind port forward to interface") - }) - FlagComps(addCmd, func(comp *carapace.ActionMap) { - (*comp)["bind"] = completers.ClientInterfacesCompleter() - }) - - portfwdRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a port forwarding tunnel", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - portfwd.PortfwdRmCmd(cmd, con, args) - }, - } - portfwdCmd.AddCommand(portfwdRmCmd) - Flags("", false, portfwdRmCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of portfwd to remove") - }) - FlagComps(portfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = portfwd.PortfwdIDCompleter(con) - }) - - // [ Socks ] -------------------------------------------------------------- - - socksCmd := &cobra.Command{ - Use: consts.Socks5Str, - Short: "In-band SOCKS5 Proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), - Run: func(cmd *cobra.Command, args []string) { - socks.SocksCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(socksCmd) - Flags("", true, socksCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - socksStartCmd := &cobra.Command{ - Use: consts.StartStr, - Short: "Start an in-band SOCKS5 proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), - Run: func(cmd *cobra.Command, args []string) { - socks.SocksStartCmd(cmd, con, args) - }, - } - socksCmd.AddCommand(socksStartCmd) - Flags("", false, socksStartCmd, func(f *pflag.FlagSet) { - f.StringP("host", "H", "127.0.0.1", "Bind a Socks5 Host") - f.StringP("port", "P", "1081", "Bind a Socks5 Port") - f.StringP("user", "u", "", "socks5 auth username (will generate random password)") - }) - FlagComps(socksStartCmd, func(comp *carapace.ActionMap) { - (*comp)["host"] = completers.ClientInterfacesCompleter() - }) - - socksStopCmd := &cobra.Command{ - Use: consts.StopStr, - Short: "Stop a SOCKS5 proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), - Run: func(cmd *cobra.Command, args []string) { - socks.SocksStopCmd(cmd, con, args) - }, - } - socksCmd.AddCommand(socksStopCmd) - Flags("", false, socksStopCmd, func(f *pflag.FlagSet) { - f.Uint64P("id", "i", 0, "id of portfwd to remove") - }) - FlagComps(socksStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = socks.SocksIDCompleter(con) - }) - - // [ WireGuard ] -------------------------------------------------------------- - - wgPortFwdCmd := &cobra.Command{ - Use: consts.WgPortFwdStr, - Short: "List ports forwarded by the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGPortFwdListCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - Annotations: hideCommand(consts.WireguardCmdsFilter), - } - Flags("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sliver.AddCommand(wgPortFwdCmd) - - wgPortFwdAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a port forward from the WireGuard tun interface to a host on the target network", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGPortFwdAddCmd(cmd, con, args) - }, - } - Flags("wg portforward", false, wgPortFwdAddCmd, func(f *pflag.FlagSet) { - f.Int32P("bind", "b", 1080, "port to listen on the WireGuard tun interface") - f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") - }) - wgPortFwdCmd.AddCommand(wgPortFwdAddCmd) - - wgPortFwdRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a port forward from the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGPortFwdRmCmd(cmd, con, args) - }, - } - wgPortFwdCmd.AddCommand(wgPortFwdRmCmd) - - carapace.Gen(wgPortFwdRmCmd).PositionalCompletion(wireguard.PortfwdIDCompleter(con).Usage("forwarder ID")) - - wgSocksCmd := &cobra.Command{ - Use: consts.WgSocksStr, - Short: "List socks servers listening on the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgSocksStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGSocksListCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - Annotations: hideCommand(consts.WireguardCmdsFilter), - } - sliver.AddCommand(wgSocksCmd) - Flags("wg socks", true, wgSocksCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - wgSocksStartCmd := &cobra.Command{ - Use: consts.StartStr, - Short: "Start a socks5 listener on the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StartStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGSocksStartCmd(cmd, con, args) - }, - } - wgSocksCmd.AddCommand(wgSocksStartCmd) - Flags("wg socks", false, wgSocksStartCmd, func(f *pflag.FlagSet) { - f.Int32P("bind", "b", 3090, "port to listen on the WireGuard tun interface") - }) - - wgSocksStopCmd := &cobra.Command{ - Use: consts.StopStr, - Short: "Stop a socks5 listener on the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StopStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGSocksStopCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - wgSocksCmd.AddCommand(wgSocksStopCmd) - carapace.Gen(wgSocksStopCmd).PositionalCompletion(wireguard.SocksIDCompleter(con).Usage("Socks server ID")) - - // [ Curse Commands ] ------------------------------------------------------------ - - cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", - Long: help.GetHelpFor([]string{consts.Cursed}), - GroupID: consts.ExecutionHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedCmd(cmd, con, args) - }, - } - sliver.AddCommand(cursedCmd) - Flags("", true, cursedCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - cursedRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a Curse from a process", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedRmCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedRmCmd) - Flags("", false, cursedRmCmd, func(f *pflag.FlagSet) { - f.BoolP("kill", "k", false, "kill the process after removing the curse") - }) - carapace.Gen(cursedRmCmd).PositionalCompletion(carapace.ActionValues().Usage("bind port of the Cursed process to stop")) - - cursedConsoleCmd := &cobra.Command{ - Use: consts.CursedConsole, - Short: "Start a JavaScript console connected to a debug target", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedConsoleCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedConsoleCmd) - Flags("", false, cursedConsoleCmd, func(f *pflag.FlagSet) { - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)`") - }) - - cursedChromeCmd := &cobra.Command{ - Use: consts.CursedChrome, - Short: "Automatically inject a Cursed Chrome payload into a remote Chrome extension", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedChrome}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedChromeCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedChromeCmd) - Flags("", false, cursedChromeCmd, func(f *pflag.FlagSet) { - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") - f.BoolP("restore", "R", true, "restore the user's session after process termination") - f.StringP("exe", "e", "", "chrome/chromium browser executable path (blank string = auto)") - f.StringP("user-data", "u", "", "user data directory (blank string = auto)") - f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") - f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") - f.BoolP("headless", "H", false, "start browser process in headless mode") - }) - FlagComps(cursedChromeCmd, func(comp *carapace.ActionMap) { - (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") - }) - cursedChromeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - carapace.Gen(cursedChromeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Chrome CLI arguments")) - - cursedEdgeCmd := &cobra.Command{ - Use: consts.CursedEdge, - Short: "Automatically inject a Cursed Chrome payload into a remote Edge extension", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedEdge}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedEdgeCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedEdgeCmd) - Flags("", false, cursedEdgeCmd, func(f *pflag.FlagSet) { - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") - f.BoolP("restore", "R", true, "restore the user's session after process termination") - f.StringP("exe", "e", "", "edge browser executable path (blank string = auto)") - f.StringP("user-data", "u", "", "user data directory (blank string = auto)") - f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") - f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") - f.BoolP("headless", "H", false, "start browser process in headless mode") - }) - FlagComps(cursedEdgeCmd, func(comp *carapace.ActionMap) { - (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") - }) - cursedEdgeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - carapace.Gen(cursedEdgeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Edge CLI arguments")) - - cursedElectronCmd := &cobra.Command{ - Use: consts.CursedElectron, - Short: "Curse a remote Electron application", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedElectron}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedElectronCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedElectronCmd) - Flags("", false, cursedElectronCmd, func(f *pflag.FlagSet) { - f.StringP("exe", "e", "", "remote electron executable absolute path") - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") - }) - cursedElectronCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - carapace.Gen(cursedElectronCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Electron CLI arguments")) - - CursedCookiesCmd := &cobra.Command{ - Use: consts.CursedCookies, - Short: "Dump all cookies from cursed process", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedCookies}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedCookiesCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(CursedCookiesCmd) - Flags("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save to file") - }) - - cursedScreenshotCmd := &cobra.Command{ - Use: consts.ScreenshotStr, - Short: "Take a screenshot of a cursed process debug target", - Long: help.GetHelpFor([]string{consts.Cursed, consts.ScreenshotStr}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedScreenshotCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedScreenshotCmd) - Flags("", false, cursedScreenshotCmd, func(f *pflag.FlagSet) { - f.Int64P("quality", "q", 100, "screenshot quality (1 - 100)") - f.StringP("save", "s", "", "save to file") - }) - - // [ Wasm ] ----------------------------------------------------------------- - - wasmCmd := &cobra.Command{ - Use: consts.WasmStr, - Short: "Execute a Wasm Module Extension", - Long: help.GetHelpFor([]string{consts.WasmStr}), - GroupID: consts.ExecutionHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - wasm.WasmCmd(cmd, con, args) - }, - } - sliver.AddCommand(wasmCmd) - Flags("", true, wasmCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("", false, wasmCmd, func(f *pflag.FlagSet) { - f.BoolP("pipe", "P", false, "pipe module stdin/stdout/stderr to the current terminal (session only)") - f.StringP("file", "f", "", "include local file(s) in wasm module's /memfs (glob pattern) ") - f.StringP("dir", "d", "", "recursively include local directory in wasm module's /memfs (glob pattern)") - f.BoolP("skip-registration", "s", false, "assume the extension is already registered") - f.BoolP("loot", "X", false, "save output as loot, incompatible with --pipe") - }) - FlagComps(wasmCmd, func(comp *carapace.ActionMap) { - (*comp)["file"] = carapace.ActionFiles() - (*comp)["dir"] = carapace.ActionDirectories() - }) - wasmComp := carapace.Gen(wasmCmd) - wasmComp.PositionalCompletion(carapace.ActionFiles().Usage("wasm/wasi module file (.wasm)")) - wasmComp.PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the wasm module (optional)")) - - wasmLsCmd := &cobra.Command{ - Use: consts.LsStr, - Short: "List registered wasm extensions with current session/beacon", - Long: help.GetHelpFor([]string{consts.WasmStr, consts.LsStr}), - Run: func(cmd *cobra.Command, args []string) { - wasm.WasmLsCmd(cmd, con, args) - }, - } - wasmCmd.AddCommand(wasmLsCmd) - - // [ Post-command declaration setup ]---------------------------------------- - // Everything below this line should preferably not be any command binding - // (unless you know what you're doing). If there are any final modifications - // to make to the sliver menu command tree, it time to do them here. + // (although you can do so without fear). If there are any final modifications + // to make to the server menu command tree, it time to do them here. sliver.InitDefaultHelpCmd() sliver.SetHelpCommandGroupID(consts.SliverCoreHelpGroup) diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go new file mode 100644 index 0000000000..90f3571276 --- /dev/null +++ b/client/command/socks/commands.go @@ -0,0 +1,65 @@ +package socks + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + socksCmd := &cobra.Command{ + Use: consts.Socks5Str, + Short: "In-band SOCKS5 Proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + Run: func(cmd *cobra.Command, args []string) { + SocksCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", true, socksCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + socksStartCmd := &cobra.Command{ + Use: consts.StartStr, + Short: "Start an in-band SOCKS5 proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + Run: func(cmd *cobra.Command, args []string) { + SocksStartCmd(cmd, con, args) + }, + } + socksCmd.AddCommand(socksStartCmd) + flags.Bind("", false, socksStartCmd, func(f *pflag.FlagSet) { + f.StringP("host", "H", "127.0.0.1", "Bind a Socks5 Host") + f.StringP("port", "P", "1081", "Bind a Socks5 Port") + f.StringP("user", "u", "", "socks5 auth username (will generate random password)") + }) + flags.BindFlagCompletions(socksStartCmd, func(comp *carapace.ActionMap) { + (*comp)["host"] = completers.ClientInterfacesCompleter() + }) + + socksStopCmd := &cobra.Command{ + Use: consts.StopStr, + Short: "Stop a SOCKS5 proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + Run: func(cmd *cobra.Command, args []string) { + SocksStopCmd(cmd, con, args) + }, + } + socksCmd.AddCommand(socksStopCmd) + flags.Bind("", false, socksStopCmd, func(f *pflag.FlagSet) { + f.Uint64P("id", "i", 0, "id of portfwd to remove") + }) + flags.BindFlagCompletions(socksStopCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = SocksIDCompleter(con) + }) + + return []*cobra.Command{socksCmd} +} diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go new file mode 100644 index 0000000000..2f5bc11259 --- /dev/null +++ b/client/command/tasks/commands.go @@ -0,0 +1,58 @@ +package tasks + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + tasksCmd := &cobra.Command{ + Use: consts.TasksStr, + Short: "Beacon task management", + Long: help.GetHelpFor([]string{consts.TasksStr}), + Run: func(cmd *cobra.Command, args []string) { + TasksCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + } + flags.Bind("tasks", true, tasksCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") + f.IntP("skip-pages", "S", 0, "skip the first n page(s)") + f.StringP("filter", "f", "", "filter based on task type (case-insensitive prefix matching)") + }) + + fetchCmd := &cobra.Command{ + Use: consts.FetchStr, + Short: "Fetch the details of a beacon task", + Long: help.GetHelpFor([]string{consts.TasksStr, consts.FetchStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + TasksFetchCmd(cmd, con, args) + }, + } + tasksCmd.AddCommand(fetchCmd) + carapace.Gen(fetchCmd).PositionalCompletion(BeaconTaskIDCompleter(con).Usage("beacon task ID")) + + cancelCmd := &cobra.Command{ + Use: consts.CancelStr, + Short: "Cancel a pending beacon task", + Long: help.GetHelpFor([]string{consts.TasksStr, consts.CancelStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + TasksCancelCmd(cmd, con, args) + }, + } + tasksCmd.AddCommand(cancelCmd) + carapace.Gen(cancelCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) + + return []*cobra.Command{tasksCmd} +} diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go new file mode 100644 index 0000000000..175eaed811 --- /dev/null +++ b/client/command/wasm/commands.go @@ -0,0 +1,54 @@ +package wasm + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + wasmCmd := &cobra.Command{ + Use: consts.WasmStr, + Short: "Execute a Wasm Module Extension", + Long: help.GetHelpFor([]string{consts.WasmStr}), + GroupID: consts.ExecutionHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + WasmCmd(cmd, con, args) + }, + } + flags.Bind("", true, wasmCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("", false, wasmCmd, func(f *pflag.FlagSet) { + f.BoolP("pipe", "P", false, "pipe module stdin/stdout/stderr to the current terminal (session only)") + f.StringP("file", "f", "", "include local file(s) in wasm module's /memfs (glob pattern) ") + f.StringP("dir", "d", "", "recursively include local directory in wasm module's /memfs (glob pattern)") + f.BoolP("skip-registration", "s", false, "assume the extension is already registered") + f.BoolP("loot", "X", false, "save output as loot, incompatible with --pipe") + }) + flags.BindFlagCompletions(wasmCmd, func(comp *carapace.ActionMap) { + (*comp)["file"] = carapace.ActionFiles() + (*comp)["dir"] = carapace.ActionDirectories() + }) + wasmComp := carapace.Gen(wasmCmd) + wasmComp.PositionalCompletion(carapace.ActionFiles().Usage("wasm/wasi module file (.wasm)")) + wasmComp.PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the wasm module (optional)")) + + wasmLsCmd := &cobra.Command{ + Use: consts.LsStr, + Short: "List registered wasm extensions with current session/beacon", + Long: help.GetHelpFor([]string{consts.WasmStr, consts.LsStr}), + Run: func(cmd *cobra.Command, args []string) { + WasmLsCmd(cmd, con, args) + }, + } + wasmCmd.AddCommand(wasmLsCmd) + + return []*cobra.Command{wasmCmd} +} diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index dcbb9dc82d..daa4460539 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -35,3 +35,88 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { return []*cobra.Command{wgConfigCmd} } + +// SliverCommands returns all Wireguard commands that can be used on an active target. +func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { + wgPortFwdCmd := &cobra.Command{ + Use: consts.WgPortFwdStr, + Short: "List ports forwarded by the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + Run: func(cmd *cobra.Command, args []string) { + WGPortFwdListCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), + } + flags.Bind("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + wgPortFwdAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a port forward from the WireGuard tun interface to a host on the target network", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + WGPortFwdAddCmd(cmd, con, args) + }, + } + flags.Bind("wg portforward", false, wgPortFwdAddCmd, func(f *pflag.FlagSet) { + f.Int32P("bind", "b", 1080, "port to listen on the WireGuard tun interface") + f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") + }) + wgPortFwdCmd.AddCommand(wgPortFwdAddCmd) + + wgPortFwdRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a port forward from the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + WGPortFwdRmCmd(cmd, con, args) + }, + } + wgPortFwdCmd.AddCommand(wgPortFwdRmCmd) + + carapace.Gen(wgPortFwdRmCmd).PositionalCompletion(PortfwdIDCompleter(con).Usage("forwarder ID")) + + wgSocksCmd := &cobra.Command{ + Use: consts.WgSocksStr, + Short: "List socks servers listening on the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgSocksStr}), + Run: func(cmd *cobra.Command, args []string) { + WGSocksListCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), + } + flags.Bind("wg socks", true, wgSocksCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + wgSocksStartCmd := &cobra.Command{ + Use: consts.StartStr, + Short: "Start a socks5 listener on the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StartStr}), + Run: func(cmd *cobra.Command, args []string) { + WGSocksStartCmd(cmd, con, args) + }, + } + wgSocksCmd.AddCommand(wgSocksStartCmd) + flags.Bind("wg socks", false, wgSocksStartCmd, func(f *pflag.FlagSet) { + f.Int32P("bind", "b", 3090, "port to listen on the WireGuard tun interface") + }) + + wgSocksStopCmd := &cobra.Command{ + Use: consts.StopStr, + Short: "Stop a socks5 listener on the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StopStr}), + Run: func(cmd *cobra.Command, args []string) { + WGSocksStopCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + wgSocksCmd.AddCommand(wgSocksStopCmd) + carapace.Gen(wgSocksStopCmd).PositionalCompletion(SocksIDCompleter(con).Usage("Socks server ID")) + + return []*cobra.Command{wgPortFwdCmd, wgSocksCmd} +} From 2da61c1e54e8d455bee3afeafb6e4de772098404 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 22 Jun 2023 19:29:04 +0200 Subject: [PATCH 006/109] Finish splits. Compiles --- client/command/alias/alias.go | 8 +++---- client/command/beacons/commands.go | 33 ++++++++++++++++++++++++--- client/command/completers/commands.go | 17 -------------- client/command/exit/commands.go | 17 -------------- client/command/help/commands.go | 17 -------------- client/command/help/long-help.go | 3 +-- client/command/server.go | 12 ++++++++++ client/command/sessions/commands.go | 2 +- client/command/use/commands.go | 3 ++- client/command/use/use.go | 26 ++------------------- client/console/console.go | 11 --------- client/constants/constants.go | 7 ++++++ 12 files changed, 59 insertions(+), 97 deletions(-) delete mode 100644 client/command/completers/commands.go delete mode 100644 client/command/exit/commands.go delete mode 100644 client/command/help/commands.go diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index c418427ba9..2ff708f858 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -24,14 +24,14 @@ import ( "io/ioutil" "strings" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" ) // AliasesCmd - The alias command diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 433e204f2d..d526d7412d 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -1,15 +1,19 @@ package beacons import ( + "context" + "fmt" + "strings" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/commonpb" ) // Commands returns the “ command and its subcommands. @@ -35,7 +39,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("filter-re", "e", "", "filter beacons by regular expression") }) flags.BindFlagCompletions(beaconsCmd, func(comp *carapace.ActionMap) { - (*comp)["kill"] = use.BeaconIDCompleter(con) + (*comp)["kill"] = BeaconIDCompleter(con) }) beaconsRmCmd := &cobra.Command{ Use: consts.RmStr, @@ -45,7 +49,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { BeaconsRmCmd(cmd, con, args) }, } - carapace.Gen(beaconsRmCmd).PositionalCompletion(use.BeaconIDCompleter(con)) + carapace.Gen(beaconsRmCmd).PositionalCompletion(BeaconIDCompleter(con)) beaconsCmd.AddCommand(beaconsRmCmd) beaconsWatchCmd := &cobra.Command{ @@ -73,3 +77,26 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { return []*cobra.Command{beaconsCmd} } + +// BeaconIDCompleter completes beacon IDs +func BeaconIDCompleter(con *console.SliverConsoleClient) carapace.Action { + callback := func(_ carapace.Context) carapace.Action { + results := make([]string, 0) + + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err == nil { + for _, b := range beacons.Beacons { + link := fmt.Sprintf("[%s <- %s]", b.ActiveC2, b.RemoteAddress) + id := fmt.Sprintf("%s (%d)", b.Name, b.PID) + userHost := fmt.Sprintf("%s@%s", b.Username, b.Hostname) + desc := strings.Join([]string{id, userHost, link}, " ") + + results = append(results, b.ID[:8]) + results = append(results, desc) + } + } + return carapace.ActionValuesDescribed(results...).Tag("beacons") + } + + return carapace.ActionCallback(callback) +} diff --git a/client/command/completers/commands.go b/client/command/completers/commands.go deleted file mode 100644 index a6c8864c7d..0000000000 --- a/client/command/completers/commands.go +++ /dev/null @@ -1,17 +0,0 @@ -package completers - -import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { - return nil -} diff --git a/client/command/exit/commands.go b/client/command/exit/commands.go deleted file mode 100644 index 75b67ea3a6..0000000000 --- a/client/command/exit/commands.go +++ /dev/null @@ -1,17 +0,0 @@ -package exit - -import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { - return nil -} diff --git a/client/command/help/commands.go b/client/command/help/commands.go deleted file mode 100644 index 3799c739aa..0000000000 --- a/client/command/help/commands.go +++ /dev/null @@ -1,17 +0,0 @@ -package help - -import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { - return nil -} diff --git a/client/command/help/long-help.go b/client/command/help/long-help.go index 281167634c..fccb56c5a6 100644 --- a/client/command/help/long-help.go +++ b/client/command/help/long-help.go @@ -28,7 +28,6 @@ import ( "strings" "text/template" - "github.com/bishopfox/sliver/client/command/creds" consts "github.com/bishopfox/sliver/client/constants" ) @@ -1219,7 +1218,7 @@ Sliver uses the same hash identifiers as Hashcat (use the #): % 10s - One hash per line. % 10s - A file containing lines of 'username:hash' pairs. % 10s - A CSV file containing 'username,hash' pairs (additional columns ignored). -`, creds.HashNewlineFormat, creds.UserColonHashNewlineFormat, creds.CSVFormat) +`, consts.HashNewlineFormat, consts.UserColonHashNewlineFormat, consts.CSVFormat) ) const ( diff --git a/client/command/server.go b/client/command/server.go index 034ac242c7..1a2c035a63 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,6 +19,8 @@ package command */ import ( + "os" + "github.com/reeflective/console" "github.com/spf13/cobra" @@ -121,6 +123,16 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. // (although you can do so without fear). If there are any final modifications // to make to the server menu command tree, it time to do them here. + // Only load reactions when the console is going to be started. + if !con.IsCLI { + n, err := reaction.LoadReactions() + if err != nil && !os.IsNotExist(err) { + con.PrintErrorf("Failed to load reactions: %s\n", err) + } else if n > 0 { + con.PrintInfof("Loaded %d reaction(s) from disk\n", n) + } + } + server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index a550d43b9a..65e4de8966 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -68,7 +68,7 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err == nil { - for _, s := range Sessions { + for _, s := range sessions.Sessions { link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) id := fmt.Sprintf("%s (%d)", s.Name, s.PID) userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) diff --git a/client/command/use/commands.go b/client/command/use/commands.go index d5c37a44c0..0dd4ce5a1f 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -5,6 +5,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -46,7 +47,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { UseBeaconCmd(cmd, con, args) }, } - carapace.Gen(useBeaconCmd).PositionalCompletion(BeaconIDCompleter(con)) + carapace.Gen(useBeaconCmd).PositionalCompletion(beacons.BeaconIDCompleter(con)) useCmd.AddCommand(useBeaconCmd) return []*cobra.Command{useCmd} diff --git a/client/command/use/use.go b/client/command/use/use.go index 14b1f6e2b4..1cacc26e7e 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -31,6 +31,7 @@ import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -188,7 +189,7 @@ func BeaconAndSessionIDCompleter(con *console.SliverConsoleClient) carapace.Acti return action.Invoke(ctx).Merge( SessionIDCompleter(con).Invoke(ctx), - BeaconIDCompleter(con).Invoke(ctx), + beacons.BeaconIDCompleter(con).Invoke(ctx), ).ToA() } @@ -217,26 +218,3 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(callback) } - -// BeaconIDCompleter completes beacon IDs -func BeaconIDCompleter(con *console.SliverConsoleClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { - results := make([]string, 0) - - beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) - if err == nil { - for _, b := range beacons.Beacons { - link := fmt.Sprintf("[%s <- %s]", b.ActiveC2, b.RemoteAddress) - id := fmt.Sprintf("%s (%d)", b.Name, b.PID) - userHost := fmt.Sprintf("%s@%s", b.Username, b.Hostname) - desc := strings.Join([]string{id, userHost, link}, " ") - - results = append(results, b.ID[:8]) - results = append(results, desc) - } - } - return carapace.ActionValuesDescribed(results...).Tag("beacons") - } - - return carapace.ActionCallback(callback) -} diff --git a/client/console/console.go b/client/console/console.go index f523ca76da..fde4a37587 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -40,7 +40,6 @@ import ( "google.golang.org/protobuf/proto" "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/reaction" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" @@ -206,16 +205,6 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds con.setupAsciicastRecord(asciicastLog, asciicastStream) } - // Only load reactions when the console is going to be started. - if !con.IsCLI { - n, err := reaction.LoadReactions() - if err != nil && !os.IsNotExist(err) { - con.PrintErrorf("Failed to load reactions: %s\n", err) - } else if n > 0 { - con.PrintInfof("Loaded %d reaction(s) from disk\n", n) - } - } - if !con.IsCLI { return con.App.Start() } diff --git a/client/constants/constants.go b/client/constants/constants.go index ef128ae7a3..645a357ac1 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -325,3 +325,10 @@ const ( WindowsCmdsFilter = "windows" WireguardCmdsFilter = "wireguard" ) + +// Creds (needed here to avoid recursive imports) +const ( + UserColonHashNewlineFormat = "user:hash" // username:hash\n + HashNewlineFormat = "hash" // hash\n + CSVFormat = "csv" // username,hash\n +) From 51473ec137992a40dace36d27d3dd73cd82b381a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 22 Jun 2023 20:26:04 +0200 Subject: [PATCH 007/109] Add many missing completers --- client/command/armory/commands.go | 4 ++++ client/command/completers/completers.go | 29 +++++++++++++++++++++++++ client/command/exec/commands.go | 2 ++ client/command/extensions/commands.go | 2 +- client/command/filesystem/commands.go | 5 +++++ client/command/generate/commands.go | 4 ++++ client/command/hosts/commands.go | 2 +- client/command/jobs/commands.go | 4 ++++ client/command/loot/commands.go | 22 +++++++++++++++---- client/command/processes/commands.go | 3 +++ client/command/update/commands.go | 5 +++++ 11 files changed, 76 insertions(+), 6 deletions(-) diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 5e59ef2a44..fe2649dd16 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -5,6 +5,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -28,6 +29,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") f.StringP("timeout", "t", "15m", "download timeout") }) + flags.BindFlagCompletions(armoryCmd, func(comp *carapace.ActionMap) { + (*comp)["proxy"] = completers.LocalProxyCompleter() + }) armoryInstallCmd := &cobra.Command{ Use: consts.InstallStr, diff --git a/client/command/completers/completers.go b/client/command/completers/completers.go index 6973751922..762b14b62f 100644 --- a/client/command/completers/completers.go +++ b/client/command/completers/completers.go @@ -55,3 +55,32 @@ func ClientInterfacesCompleter() carapace.Action { return carapace.ActionValues(results...).Tag("client interfaces").NoSpace(':') }) } + +// LocalProxyCompleter gives URL completion to all flags/arguments that accept a client proxy address. +func LocalProxyCompleter() carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + prefix := "" + + hostPort := carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action { + switch len(c.Parts) { + case 0: + return ClientInterfacesCompleter() + case 1: + return carapace.ActionMessage("server port") + default: + return carapace.ActionValues() + } + }) + + return carapace.ActionMultiParts("://", func(c carapace.Context) carapace.Action { + switch len(c.Parts) { + case 0: + return carapace.ActionValues("http", "https").Tag("proxy protocols").Suffix("://") + case 1: + return hostPort + default: + return carapace.ActionValues() + } + }).Invoke(c).Prefix(prefix).ToA() + }) +} diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 13edbe3de5..a0cc0473e2 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" @@ -237,6 +238,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { }) flags.BindFlagCompletions(psExecCmd, func(comp *carapace.ActionMap) { (*comp)["custom-exe"] = carapace.ActionFiles() + (*comp)["profile"] = generate.ProfileNameCompleter(con) }) carapace.Gen(psExecCmd).PositionalCompletion(carapace.ActionValues().Usage("hostname (required)")) diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 7ee046d4c4..236f13e6ba 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -15,7 +15,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { Use: consts.ExtensionsStr, Short: "Manage extensions", Long: help.GetHelpFor([]string{consts.ExtensionsStr}), - GroupID: consts.ExtensionHelpGroup, + GroupID: consts.ExecutionHelpGroup, Run: func(cmd *cobra.Command, _ []string) { ExtensionsCmd(cmd, con) }, diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index 425527704a..78241cf6ce 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -7,6 +7,7 @@ import ( "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" ) @@ -148,6 +149,10 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("recurse", "r", false, "recursively download all files in a directory") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(downloadCmd, func(comp *carapace.ActionMap) { + (*comp)["type"] = loot.LootTypeCompleter(con) + (*comp)["file-type"] = loot.FileTypeCompleter(con) + }) carapace.Gen(downloadCmd).PositionalCompletion( carapace.ActionValues().Usage("path to the file or directory to download"), carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index c30db8c28e..9bd4bdff95 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -67,6 +67,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("save", "s", "", "directory to save the generated stager to") f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") }) + flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) generateCmd.AddCommand(generateStagerCmd) generateInfoCmd := &cobra.Command{ @@ -327,6 +330,7 @@ func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverConsoleCl (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") (*comp)["format"] = FormatCompleter() (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + (*comp)["traffic-encoders"] = TrafficEncodersCompleter(con).UniqueList(",") }) } diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index ca6573d325..e9a92634ef 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -55,5 +55,5 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } hostsIOCCmd.AddCommand(hostsIOCRmCmd) - return []*cobra.Command{hostsCmd, hostsIOCCmd} + return []*cobra.Command{hostsCmd} } diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index d3564d2a2a..b5cb4f1bb3 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -136,6 +136,10 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("persistent", "p", false, "make persistent across restarts") }) + flags.BindFlagCompletions(httpsCmd, func(comp *carapace.ActionMap) { + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + }) // Staging listeners stageCmd := &cobra.Command{ diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index 4087ce6ed4..8b2368f4b5 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -45,8 +45,8 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) flags.BindFlagCompletions(lootAddCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + (*comp)["type"] = LootTypeCompleter(con) + (*comp)["file-type"] = FileTypeCompleter(con) }) carapace.Gen(lootAddCmd).PositionalCompletion( carapace.ActionFiles().Tag("local loot file").Usage("The local file path to the loot")) @@ -67,8 +67,8 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) flags.BindFlagCompletions(lootRemoteCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + (*comp)["type"] = LootTypeCompleter(con) + (*comp)["file-type"] = FileTypeCompleter(con) }) carapace.Gen(lootRemoteCmd).PositionalCompletion(carapace.ActionValues().Usage("The file path on the remote host to the loot")) @@ -97,6 +97,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { }) flags.BindFlagCompletions(lootFetchCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") + (*comp)["filter"] = FileTypeCompleter(con) }) lootRmCmd := &cobra.Command{ @@ -111,6 +112,19 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { flags.Bind("loot", false, lootRmCmd, func(f *pflag.FlagSet) { f.StringP("filter", "f", "", "filter based on loot type") }) + flags.BindFlagCompletions(lootRmCmd, func(comp *carapace.ActionMap) { + (*comp)["filter"] = LootTypeCompleter(con) + }) return []*cobra.Command{lootCmd} } + +// FileTypeCompleter completes valid filetypes for loot. +func FileTypeCompleter(con *console.SliverConsoleClient) carapace.Action { + return carapace.ActionValues("binary", "text").Tag("loot file type") +} + +// LootTypeCompleter completes valid loot type for a loot. +func LootTypeCompleter(con *console.SliverConsoleClient) carapace.Action { + return carapace.ActionValues("file", "cred").Tag("loot type") +} diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index f844894b70..9fab3d63c5 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -52,6 +52,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(procdumpCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles() + }) terminateCmd := &cobra.Command{ Use: consts.TerminateStr, diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 251d2c41f3..1f4f8cb0a9 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -1,9 +1,11 @@ package update import ( + "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -28,6 +30,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("insecure", "I", false, "skip tls certificate validation") f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(updateCmd, func(comp *carapace.ActionMap) { + (*comp)["proxy"] = completers.LocalProxyCompleter() + }) versionCmd := &cobra.Command{ Use: consts.VersionStr, From c3881b29be4fec893231987e411ebe734a83a435 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 19 Jul 2023 04:47:13 +0200 Subject: [PATCH 008/109] Successful use of teamserver/teamclient on first test --- client/cli/cli.go | 40 +++++---- client/cli/config.go | 71 --------------- client/cli/console.go | 65 ++------------ client/cli/implant.go | 13 ++- client/cli/import.go | 58 ------------ client/cli/teamclient.go | 57 ++++++++++++ client/cli/version.go | 3 +- client/console/console.go | 110 +++++++++++------------ server/cli/cli.go | 182 ++++++++++++++++++++++++++++---------- server/cli/teamserver.go | 83 +++++++++++++++++ server/console/console.go | 5 +- 11 files changed, 366 insertions(+), 321 deletions(-) delete mode 100644 client/cli/config.go delete mode 100644 client/cli/import.go create mode 100644 client/cli/teamclient.go create mode 100644 server/cli/teamserver.go diff --git a/client/cli/cli.go b/client/cli/cli.go index b36a37af99..e01c3021a7 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,11 +24,11 @@ import ( "os" "path" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/version" + "github.com/reeflective/team/client/commands" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -37,7 +37,7 @@ const ( var sliverServerVersion = fmt.Sprintf("v%s", version.FullVersion()) -// Initialize logging +// Initialize logging. func initLogging(appDir string) *os.File { log.SetFlags(log.LstdFlags | log.Lshortfile) logFile, err := os.OpenFile(path.Join(appDir, logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) @@ -49,19 +49,26 @@ func initLogging(appDir string) *os.File { } func init() { - rootCmd.TraverseChildren = true - // Create the console client, without any RPC or commands bound to it yet. // This created before anything so that multiple commands can make use of // the same underlying command/run infrastructure. con := console.NewConsole(false) - // Import - rootCmd.AddCommand(importCmd()) + // Teamclient API and commands for remote CLI. + teamclient := newSliverTeam(con) + teamclientCmds := commands.Generate(teamclient) + + // rootCmd.AddCommand(teamclientCmds) // Version rootCmd.AddCommand(cmdVersion) + preRun := func(_ *cobra.Command, _ []string) error { + return teamclient.Connect() + } + + rootCmd.PersistentPreRunE = preRun + // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with @@ -75,20 +82,21 @@ func init() { // command completion/filtering purposes. rootCmd.AddCommand(implantCmd(con)) - // No subcommand invoked means starting the console. - rootCmd.RunE, rootCmd.PostRunE = consoleRunnerCmd(con, true) - // Completions - carapace.Gen(rootCmd) + comps := carapace.Gen(rootCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) } var rootCmd = &cobra.Command{ - Use: "sliver-client", - Short: "", - Long: ``, + Use: "sliver-client", + Short: "Client-only Sliver C2 management", + Long: ``, + TraverseChildren: true, } -// Execute - Execute root command +// Execute - Execute root command. func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) diff --git a/client/cli/config.go b/client/cli/config.go deleted file mode 100644 index 71d858d3b3..0000000000 --- a/client/cli/config.go +++ /dev/null @@ -1,71 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "sort" - - "github.com/bishopfox/sliver/client/assets" - - "gopkg.in/AlecAivazis/survey.v1" -) - -func selectConfig() *assets.ClientConfig { - configs := assets.GetConfigs() - - if len(configs) == 0 { - return nil - } - - if len(configs) == 1 { - for _, config := range configs { - return config - } - } - - answer := struct{ Config string }{} - qs := getPromptForConfigs(configs) - err := survey.Ask(qs, &answer) - if err != nil { - fmt.Println(err.Error()) - return nil - } - - return configs[answer.Config] -} - -func getPromptForConfigs(configs map[string]*assets.ClientConfig) []*survey.Question { - keys := []string{} - for k := range configs { - keys = append(keys, k) - } - sort.Strings(keys) - - return []*survey.Question{ - { - Name: "config", - Prompt: &survey.Select{ - Message: "Select a server:", - Options: keys, - Default: keys[0], - }, - }, - } -} diff --git a/client/cli/console.go b/client/cli/console.go index 67e208a382..cbd7b1ca16 100644 --- a/client/cli/console.go +++ b/client/cli/console.go @@ -1,73 +1,20 @@ package cli import ( - "fmt" - - "github.com/spf13/cobra" - "google.golang.org/grpc" - - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/spf13/cobra" ) -// consoleCmd generates the console with required pre/post runners -func consoleCmd(con *console.SliverConsoleClient) *cobra.Command { +// consoleCmd generates the console with required pre/post runners. +func consoleCmd(con *console.SliverClient) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", Short: "Start the sliver client console", + RunE: func(cmd *cobra.Command, args []string) error { + return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + }, } - consoleCmd.RunE, consoleCmd.PersistentPostRunE = consoleRunnerCmd(con, true) - return consoleCmd } - -func consoleRunnerCmd(con *console.SliverConsoleClient, run bool) (pre, post func(cmd *cobra.Command, args []string) error) { - var ln *grpc.ClientConn - - pre = func(_ *cobra.Command, _ []string) error { - appDir := assets.GetRootAppDir() - logFile := initLogging(appDir) - defer logFile.Close() - - configs := assets.GetConfigs() - if len(configs) == 0 { - fmt.Printf("No config files found at %s (see --help)\n", assets.GetConfigDir()) - return nil - } - config := selectConfig() - if config == nil { - return nil - } - - // Don't clobber output when simply running an implant command from system shell. - if run { - fmt.Printf("Connecting to %s:%d ...\n", config.LHost, config.LPort) - } - - var rpc rpcpb.SliverRPCClient - var err error - - rpc, ln, err = transport.MTLSConnect(config) - if err != nil { - fmt.Printf("Connection to server failed %s", err) - return nil - } - - return console.StartClient(con, rpc, command.ServerCommands(con, nil), command.SliverCommands(con), run) - } - - // Close the RPC connection once exiting - post = func(_ *cobra.Command, _ []string) error { - if ln != nil { - return ln.Close() - } - - return nil - } - - return pre, post -} diff --git a/client/cli/implant.go b/client/cli/implant.go index 1f24db8ba8..61cea3af38 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -3,18 +3,17 @@ package cli import ( "errors" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func implantCmd(con *console.SliverConsoleClient) *cobra.Command { - con.IsCLI = true + con.IsCLI = trueSliverClient makeCommands := command.SliverCommands(con) cmd := makeCommands() @@ -35,7 +34,7 @@ func implantCmd(con *console.SliverConsoleClient) *cobra.Command { } func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (pre, post func(cmd *cobra.Command, args []string) error) { - startConsole, closeConsole := consoleRunnerCmd(con, false) + startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient // The pre-run function connects to the server and sets up a "fake" console, // so we can have access to active sessions/beacons, and other stuff needed. @@ -60,7 +59,7 @@ func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (p } func makeCompleters(cmd *cobra.Command, con *console.SliverConsoleClient) { - comps := carapace.Gen(cmd) + comps := carapace.Gen(cmd)SliverClient comps.PreRun(func(cmd *cobra.Command, args []string) { cmd.PersistentPreRunE(cmd, args) diff --git a/client/cli/import.go b/client/cli/import.go deleted file mode 100644 index b953916b27..0000000000 --- a/client/cli/import.go +++ /dev/null @@ -1,58 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2020 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "os" - - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" -) - -func importCmd() *cobra.Command { - cmdImport := &cobra.Command{ - Use: "import", - Short: "Import a client configuration file", - Long: `import [config files]`, - Run: func(cmd *cobra.Command, args []string) { - if 0 < len(args) { - for _, arg := range args { - conf, err := assets.ReadConfig(arg) - if err != nil { - fmt.Printf("[!] %s\n", err) - os.Exit(3) - } - assets.SaveConfig(conf) - } - } else { - fmt.Printf("Missing config file path, see --help") - } - }, - ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{}, cobra.ShellCompDirectiveDefault - }, - } - - carapace.Gen(cmdImport).PositionalCompletion(carapace.ActionFiles().Tag("server configuration")) - - return cmdImport -} diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go new file mode 100644 index 0000000000..e54e8e303d --- /dev/null +++ b/client/cli/teamclient.go @@ -0,0 +1,57 @@ +package cli + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/reeflective/team/client" + teamGrpc "github.com/reeflective/team/transports/grpc/client" + "google.golang.org/grpc" +) + +func newSliverTeam(con *console.SliverClient) *client.Client { + gTeamclient := teamGrpc.NewTeamClient() + + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(gTeamclient, bindClient), + ) + + teamclient, err := client.New("sliver", gTeamclient, clientOpts...) + if err != nil { + // WARN: Remote this + panic(err) + } + + return teamclient +} diff --git a/client/cli/version.go b/client/cli/version.go index 24d640871a..89ad72e863 100644 --- a/client/cli/version.go +++ b/client/cli/version.go @@ -21,9 +21,8 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/version" + "github.com/spf13/cobra" ) var cmdVersion = &cobra.Command{ diff --git a/client/console/console.go b/client/console/console.go index fde4a37587..af67e17456 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -32,13 +32,6 @@ import ( "sync" "time" - "github.com/gofrs/uuid" - "github.com/reeflective/console" - "github.com/reeflective/readline" - "github.com/spf13/cobra" - "golang.org/x/exp/slog" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" @@ -48,6 +41,12 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/gofrs/uuid" + "github.com/reeflective/console" + "github.com/reeflective/readline" + "github.com/spf13/cobra" + "golang.org/x/exp/slog" + "google.golang.org/protobuf/proto" ) const ( @@ -55,7 +54,7 @@ const ( ) const ( - // ANSI Colors + // ANSI Colors. Normal = "\033[0m" Black = "\033[30m" Red = "\033[31m" @@ -71,25 +70,25 @@ const ( DownN = "\033[%dB" Underline = "\033[4m" - // Info - Display colorful information + // Info - Display colorful information. Info = Bold + Cyan + "[*] " + Normal - // Warn - Warn a user + // Warn - Warn a user. Warn = Bold + Red + "[!] " + Normal - // Debug - Display debug information + // Debug - Display debug information. Debug = Bold + Purple + "[-] " + Normal - // Woot - Display success + // Woot - Display success. Woot = Bold + Green + "[$] " + Normal - // Success - Diplay success + // Success - Diplay success. Success = Bold + Green + "[+] " + Normal ) -// Observer - A function to call when the sessions changes +// Observer - A function to call when the sessions changes. type ( Observer func(*clientpb.Session, *clientpb.Beacon) BeaconTaskCallback func(*clientpb.BeaconTask) ) -type SliverConsoleClient struct { +type SliverClient struct { App *console.Console Rpc rpcpb.SliverRPCClient ActiveTarget *ActiveTarget @@ -107,11 +106,11 @@ type SliverConsoleClient struct { // NewConsole creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func NewConsole(isServer bool) *SliverConsoleClient { +func NewConsole(isServer bool) *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() - con := &SliverConsoleClient{ + con := &SliverClient{ App: console.New("sliver"), ActiveTarget: &ActiveTarget{ observers: map[int]Observer{}, @@ -161,8 +160,7 @@ func NewConsole(isServer bool) *SliverConsoleClient { // Init requires a working RPC connection to the sliver server, and 2 different sets of commands. // If run is true, the console application is started, making this call blocking. Otherwise, commands and // RPC connection are bound to the console (making the console ready to run), but the console does not start. -func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds, sliverCmds console.Commands, run bool) error { - con.Rpc = rpc +func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands, run bool) error { con.IsCLI = !run // The console application needs to query the terminal for cursor positions @@ -184,7 +182,7 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds // Events go con.startEventLoop() - go core.TunnelLoop(rpc) + go core.TunnelLoop(con.Rpc) // console logger if con.Settings.ConsoleLogs { @@ -212,7 +210,7 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds return nil } -func (con *SliverConsoleClient) startEventLoop() { +func (con *SliverClient) startEventLoop() { eventStream, err := con.Rpc.Events(context.Background(), &commonpb.Empty{}) if err != nil { fmt.Printf(Warn+"%s\n", err) @@ -328,23 +326,23 @@ func (con *SliverConsoleClient) startEventLoop() { } } -// CreateEventListener - creates a new event listener and returns its ID -func (con *SliverConsoleClient) CreateEventListener() (string, <-chan *clientpb.Event) { +// CreateEventListener - creates a new event listener and returns its ID. +func (con *SliverClient) CreateEventListener() (string, <-chan *clientpb.Event) { listener := make(chan *clientpb.Event, 100) listenerID, _ := uuid.NewV4() con.EventListeners.Store(listenerID.String(), listener) return listenerID.String(), listener } -// RemoveEventListener - removes an event listener given its id -func (con *SliverConsoleClient) RemoveEventListener(listenerID string) { +// RemoveEventListener - removes an event listener given its id. +func (con *SliverClient) RemoveEventListener(listenerID string) { value, ok := con.EventListeners.LoadAndDelete(listenerID) if ok { close(value.(chan *clientpb.Event)) } } -func (con *SliverConsoleClient) triggerEventListeners(event *clientpb.Event) { +func (con *SliverClient) triggerEventListeners(event *clientpb.Event) { con.EventListeners.Range(func(key, value interface{}) bool { listener := value.(chan *clientpb.Event) listener <- event // Do not block while sending the event to the listener @@ -352,7 +350,7 @@ func (con *SliverConsoleClient) triggerEventListeners(event *clientpb.Event) { }) } -func (con *SliverConsoleClient) triggerReactions(event *clientpb.Event) { +func (con *SliverClient) triggerReactions(event *clientpb.Event) { reactions := core.Reactions.On(event.EventType) if len(reactions) == 0 { return @@ -388,8 +386,8 @@ func (con *SliverConsoleClient) triggerReactions(event *clientpb.Event) { } } -// triggerBeaconTaskCallback - Triggers the callback for a beacon task -func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { +// triggerBeaconTaskCallback - Triggers the callback for a beacon task. +func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { task := &clientpb.BeaconTask{} err := proto.Unmarshal(data, task) if err != nil { @@ -424,13 +422,13 @@ func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { } } -func (con *SliverConsoleClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { +func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { con.BeaconTaskCallbacksMutex.Lock() defer con.BeaconTaskCallbacksMutex.Unlock() con.BeaconTaskCallbacks[taskID] = callback } -func (con *SliverConsoleClient) GetPrompt() string { +func (con *SliverClient) GetPrompt() string { prompt := Underline + "sliver" + Normal if con.IsServer { prompt = Bold + "[server] " + Normal + Underline + "sliver" + Normal @@ -444,7 +442,7 @@ func (con *SliverConsoleClient) GetPrompt() string { return Clearln + prompt } -func (con *SliverConsoleClient) PrintLogo() { +func (con *SliverClient) PrintLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { panic(err.Error()) @@ -469,7 +467,7 @@ func (con *SliverConsoleClient) PrintLogo() { con.CheckLastUpdate() } -func (con *SliverConsoleClient) CheckLastUpdate() { +func (con *SliverClient) CheckLastUpdate() { now := time.Now() lastUpdate := getLastUpdateCheck() compiledAt, err := version.Compiled() @@ -503,7 +501,7 @@ func getLastUpdateCheck() *time.Time { return &lastUpdate } -func (con *SliverConsoleClient) GetSession(arg string) *clientpb.Session { +func (con *SliverClient) GetSession(arg string) *clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintWarnf("%s", err) @@ -517,8 +515,8 @@ func (con *SliverConsoleClient) GetSession(arg string) *clientpb.Session { return nil } -// GetSessionsByName - Return all sessions for an Implant by name -func (con *SliverConsoleClient) GetSessionsByName(name string) []*clientpb.Session { +// GetSessionsByName - Return all sessions for an Implant by name. +func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { fmt.Printf(Warn+"%s\n", err) @@ -534,8 +532,8 @@ func (con *SliverConsoleClient) GetSessionsByName(name string) []*clientpb.Sessi } // GetActiveSessionConfig - Get the active sessions's config -// TODO: Switch to query config based on ConfigID -func (con *SliverConsoleClient) GetActiveSessionConfig() *clientpb.ImplantConfig { +// TODO: Switch to query config based on ConfigID. +func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { session := con.ActiveTarget.GetSession() if session == nil { return nil @@ -562,7 +560,7 @@ func (con *SliverConsoleClient) GetActiveSessionConfig() *clientpb.ImplantConfig } // exitConsole prompts the user for confirmation to exit the console. -func (c *SliverConsoleClient) exitConsole(_ *console.Console) { +func (c *SliverClient) exitConsole(_ *console.Console) { reader := bufio.NewReader(os.Stdin) fmt.Print("Confirm exit (Y/y, Ctrl-C): ") text, _ := reader.ReadString('\n') @@ -574,18 +572,18 @@ func (c *SliverConsoleClient) exitConsole(_ *console.Console) { } // exitImplantMenu uses the background command to detach from the implant menu. -func (c *SliverConsoleClient) exitImplantMenu(_ *console.Console) { +func (c *SliverClient) exitImplantMenu(_ *console.Console) { root := c.App.Menu(consts.ImplantMenu).Command root.SetArgs([]string{"background"}) root.Execute() } -func (con *SliverConsoleClient) SpinUntil(message string, ctrl chan bool) { +func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } -// FormatDateDelta - Generate formatted date string of the time delta between then and now -func (con *SliverConsoleClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { +// FormatDateDelta - Generate formatted date string of the time delta between then and now. +func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) var interval string @@ -612,8 +610,8 @@ func (con *SliverConsoleClient) FormatDateDelta(t time.Time, includeDate bool, c return interval } -// GrpcContext - Generate a context for a GRPC request, if no grumble context or an invalid flag is provided 60 seconds is used instead -func (con *SliverConsoleClient) GrpcContext(cmd *cobra.Command) (context.Context, context.CancelFunc) { +// GrpcContext - Generate a context for a GRPC request, if no grumble context or an invalid flag is provided 60 seconds is used instead. +func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, context.CancelFunc) { if cmd == nil { return context.WithTimeout(context.Background(), 60*time.Second) } @@ -635,10 +633,10 @@ type ActiveTarget struct { beacon *clientpb.Beacon observers map[int]Observer observerID int - con *SliverConsoleClient + con *SliverClient } -// GetSessionInteractive - Get the active target(s) +// GetSessionInteractive - Get the active target(s). func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { if s.session == nil && s.beacon == nil { fmt.Printf(Warn + "Please select a session or beacon via `use`\n") @@ -647,12 +645,12 @@ func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { return s.session, s.beacon } -// GetSessionInteractive - Get the active target(s) +// GetSessionInteractive - Get the active target(s). func (s *ActiveTarget) Get() (*clientpb.Session, *clientpb.Beacon) { return s.session, s.beacon } -// GetSessionInteractive - GetSessionInteractive the active session +// GetSessionInteractive - GetSessionInteractive the active session. func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { if s.session == nil { fmt.Printf(Warn + "Please select a session via `use`\n") @@ -661,12 +659,12 @@ func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { return s.session } -// GetSession - Same as GetSession() but doesn't print a warning +// GetSession - Same as GetSession() but doesn't print a warning. func (s *ActiveTarget) GetSession() *clientpb.Session { return s.session } -// GetBeaconInteractive - Get beacon interactive the active session +// GetBeaconInteractive - Get beacon interactive the active session. func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { if s.beacon == nil { fmt.Printf(Warn + "Please select a beacon via `use`\n") @@ -675,7 +673,7 @@ func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { return s.beacon } -// GetBeacon - Same as GetBeacon() but doesn't print a warning +// GetBeacon - Same as GetBeacon() but doesn't print a warning. func (s *ActiveTarget) GetBeacon() *clientpb.Beacon { return s.beacon } @@ -685,7 +683,7 @@ func (s *ActiveTarget) IsSession() bool { return s.session != nil } -// AddObserver - Observers to notify when the active session changes +// AddObserver - Observers to notify when the active session changes. func (s *ActiveTarget) AddObserver(observer Observer) int { s.observerID++ s.observers[s.observerID] = observer @@ -722,7 +720,7 @@ func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { return req } -// Set - Change the active session +// Set - Change the active session. func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { if session != nil && beacon != nil { s.con.PrintErrorf("cannot set both an active beacon and an active session") @@ -776,7 +774,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } -// Background - Background the active session +// Background - Background the active session. func (s *ActiveTarget) Background() { defer s.con.App.ShowCommands() @@ -794,7 +792,7 @@ func (s *ActiveTarget) Background() { // Expose or hide commands if the active target does support them (or not). // Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -func (con *SliverConsoleClient) ExposeCommands() { +func (con *SliverClient) ExposeCommands() { con.App.ShowCommands() if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { diff --git a/server/cli/cli.go b/server/cli/cli.go index c150e8f24f..cdab21160e 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -23,18 +23,18 @@ import ( "log" "os" "path/filepath" - "runtime/debug" "strings" - "github.com/spf13/cobra" - + "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/console" "github.com/bishopfox/sliver/server/cryptography" - "github.com/bishopfox/sliver/server/daemon" + "github.com/reeflective/team/server/commands" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -68,17 +68,52 @@ func initConsoleLogging(appDir string) *os.File { } func init() { + // Console interface, started closed-loop or not. + con := console.NewConsole(false) + + // Teamserver/client API and commands for remote/local CLI. + teamserver, teamclient := newSliverTeam(con) + teamserverCmds := commands.Generate(teamserver, teamclient) + + rootCmd.AddCommand(teamserverCmds) + + // Pre-runners to self-connect + preRun := func(cmd *cobra.Command, _ []string) error { + // Ensure the server has what it needs + assets.Setup(false, true) + certs.SetupCAs() + certs.SetupWGKeys() + cryptography.AgeServerKeyPair() + cryptography.MinisignServerPrivateKey() + + // Let our runtime teamclient be served. + if err := teamserver.Serve(teamclient); err != nil { + return err + } + + // Start persistent implant/c2 jobs (not teamservers) + serverConfig := configs.GetServerConfig() + c2.StartPersistentJobs(serverConfig) + + // Only start the teamservers when the console being + // ran is the console itself: the daemon command will + // start them on its own, since the config is different. + if cmd.Name() == "console" { + teamserver.ListenerStartPersistents() // Automatically logged errors. + // console.StartPersistentJobs(serverConfig) // Old alternative + } + + return nil + } + + rootCmd.PersistentPreRunE = preRun + + rootCmd.AddCommand(consoleCmd(con)) + // Unpack unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") rootCmd.AddCommand(unpackCmd) - // Operator - operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") - operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") - operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") - operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") - rootCmd.AddCommand(operatorCmd) - // Certs cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) @@ -88,54 +123,54 @@ func init() { cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) rootCmd.AddCommand(cmdImportCA) - // Daemon - daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") - daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") - daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") - rootCmd.AddCommand(daemonCmd) - // Builder rootCmd.AddCommand(initBuilderCmd()) // Version rootCmd.AddCommand(versionCmd) + + // Completions + comps := carapace.Gen(rootCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) } var rootCmd = &cobra.Command{ Use: "sliver-server", Short: "", Long: ``, - Run: func(cmd *cobra.Command, args []string) { - // Root command starts the server normally - - appDir := assets.GetRootAppDir() - logFile := initConsoleLogging(appDir) - defer logFile.Close() - - defer func() { - if r := recover(); r != nil { - log.Printf("panic:\n%s", debug.Stack()) - fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - os.Exit(99) - } - }() - - assets.Setup(false, true) - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - console.StartPersistentJobs(serverConfig) - if serverConfig.DaemonMode { - daemon.Start(daemon.BlankHost, daemon.BlankPort) - } else { - os.Args = os.Args[:1] // Hide cli from grumble console - console.Start() - } - }, + // Run: func(cmd *cobra.Command, args []string) { + // // Root command starts the server normally + // + // appDir := assets.GetRootAppDir() + // logFile := initConsoleLogging(appDir) + // defer logFile.Close() + // + // defer func() { + // if r := recover(); r != nil { + // log.Printf("panic:\n%s", debug.Stack()) + // fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) + // os.Exit(99) + // } + // }() + // + // assets.Setup(false, true) + // certs.SetupCAs() + // certs.SetupWGKeys() + // cryptography.AgeServerKeyPair() + // cryptography.MinisignServerPrivateKey() + // + // serverConfig := configs.GetServerConfig() + // c2.StartPersistentJobs(serverConfig) + // console.StartPersistentJobs(serverConfig) + // if serverConfig.DaemonMode { + // daemon.Start(daemon.BlankHost, daemon.BlankPort) + // } else { + // os.Args = os.Args[:1] // Hide cli from grumble console + // console.Start() + // } + // }, } // Execute - Execute root command @@ -145,3 +180,52 @@ func Execute() { os.Exit(1) } } + +func initAlt() { + // Unpack + unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") + rootCmd.AddCommand(unpackCmd) + + // Operator + // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") + // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") + // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") + // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") + // rootCmd.AddCommand(operatorCmd) + + // Certs + cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") + cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) + rootCmd.AddCommand(cmdExportCA) + + cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") + cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) + rootCmd.AddCommand(cmdImportCA) + + // Daemon + // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") + // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") + // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") + // rootCmd.AddCommand(daemonCmd) + + // Builder + rootCmd.AddCommand(initBuilderCmd()) + + // Version + rootCmd.AddCommand(versionCmd) +} + +// consoleCmd generates the console with required pre/post runners +func consoleCmd(con *console.SliverClient) *cobra.Command { + consoleCmd := &cobra.Command{ + Use: "console", + Short: "Start the sliver client console", + RunE: func(cmd *cobra.Command, args []string) error { + return console.StartClient(con, con.Rpc, command.ServerCommands(con, nil), command.SliverCommands(con), true) + }, + } + + // consoleCmd.RunE, consoleCmd.PersistentPostRunE = consoleRunnerCmd(con, true) + + return consoleCmd +} diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go new file mode 100644 index 0000000000..75efe3da0c --- /dev/null +++ b/server/cli/teamserver.go @@ -0,0 +1,83 @@ +package cli + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "log" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/rpc" + "github.com/reeflective/team/client" + "github.com/reeflective/team/server" + teamGrpc "github.com/reeflective/team/transports/grpc/server" + "google.golang.org/grpc" +) + +func newSliverTeam(con *console.SliverConsoleClient) (*server.Server, *client.Client) { + // Teamserver + gTeamserver := teamGrpc.NewListener() + + var serverOpts []server.Options + serverOpts = append(serverOpts, + server.WithDefaultPort(31337), + server.WithListener(gTeamserver), + ) + + teamserver, err := server.New("sliver", serverOpts...) + if err != nil { + log.Fatal(err) + } + + bindServer := func(grpcServer *grpc.Server) error { + if grpcServer == nil { + return errors.New("No gRPC server to use for service") + } + + rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) + + return nil + } + + gTeamserver.PostServe(bindServer) + + // Teamclient + gTeamclient := teamGrpc.NewClientFrom(gTeamserver) + + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(gTeamclient, bindClient), + ) + + teamclient := teamserver.Self(clientOpts...) + + return teamserver, teamclient +} diff --git a/server/console/console.go b/server/console/console.go index 7303ac9156..af40d3a734 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -32,7 +32,6 @@ import ( "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" clienttransport "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/transport" "google.golang.org/grpc" @@ -56,13 +55,13 @@ func Start() { return } defer conn.Close() - localRPC := rpcpb.NewSliverRPCClient(conn) + // localRPC := rpcpb.NewSliverRPCClient(conn) if err := configs.CheckHTTPC2ConfigErrors(); err != nil { fmt.Printf(Warn+"Error in HTTP C2 config: %s\n", err) } con := console.NewConsole(false) - console.StartClient(con, localRPC, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) + console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) con.App.Start() } From 9a51d32fa7671158ffeded9ba6fcdcb18fbd35c0 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 19 Jul 2023 05:38:04 +0200 Subject: [PATCH 009/109] New vendor deps + renaming --- client/command/alias/alias.go | 6 +- client/command/alias/commands.go | 2 +- client/command/alias/install.go | 8 +- client/command/alias/load.go | 12 +- client/command/alias/remove.go | 4 +- client/command/armory/armory.go | 6 +- client/command/armory/commands.go | 2 +- client/command/armory/install.go | 16 +- client/command/armory/search.go | 2 +- client/command/armory/update.go | 6 +- client/command/backdoor/backdoor.go | 2 +- client/command/backdoor/commands.go | 2 +- client/command/beacons/beacons.go | 6 +- client/command/beacons/commands.go | 4 +- client/command/beacons/helpers.go | 6 +- client/command/beacons/prune.go | 2 +- client/command/beacons/rm.go | 2 +- client/command/beacons/watch.go | 2 +- client/command/builders/builders.go | 4 +- client/command/builders/commands.go | 2 +- client/command/command.go | 5 +- client/command/crack/commands.go | 2 +- client/command/crack/crack-files.go | 24 +- client/command/crack/crack.go | 14 +- client/command/crack/helpers.go | 6 +- client/command/creds/add.go | 4 +- client/command/creds/commands.go | 2 +- client/command/creds/creds.go | 14 +- client/command/creds/rm.go | 2 +- client/command/creds/select.go | 2 +- client/command/cursed/commands.go | 2 +- client/command/cursed/cursed-chrome.go | 12 +- client/command/cursed/cursed-console.go | 6 +- client/command/cursed/cursed-cookies.go | 2 +- client/command/cursed/cursed-edge.go | 6 +- client/command/cursed/cursed-electron.go | 10 +- client/command/cursed/cursed-rm.go | 2 +- client/command/cursed/cursed-screenshot.go | 2 +- client/command/cursed/cursed.go | 4 +- client/command/dllhijack/commands.go | 2 +- client/command/dllhijack/dllhijack.go | 2 +- client/command/environment/commands.go | 2 +- client/command/environment/get.go | 4 +- client/command/environment/set.go | 4 +- client/command/environment/unset.go | 4 +- client/command/exec/commands.go | 2 +- client/command/exec/execute-assembly.go | 4 +- client/command/exec/execute-shellcode.go | 6 +- client/command/exec/execute.go | 12 +- client/command/exec/migrate.go | 2 +- client/command/exec/msf-inject.go | 4 +- client/command/exec/msf.go | 2 +- client/command/exec/psexec.go | 2 +- client/command/exec/sideload.go | 4 +- client/command/exec/spawndll.go | 4 +- client/command/exec/ssh.go | 6 +- client/command/exit/exit.go | 4 +- client/command/extensions/commands.go | 2 +- client/command/extensions/extensions.go | 6 +- client/command/extensions/install.go | 8 +- client/command/extensions/list.go | 2 +- client/command/extensions/load.go | 14 +- client/command/extensions/remove.go | 4 +- client/command/filesystem/cat.go | 4 +- client/command/filesystem/cd.go | 2 +- client/command/filesystem/chmod.go | 4 +- client/command/filesystem/chown.go | 4 +- client/command/filesystem/chtimes.go | 4 +- client/command/filesystem/commands.go | 2 +- client/command/filesystem/cp.go | 4 +- client/command/filesystem/download.go | 4 +- client/command/filesystem/ls.go | 4 +- client/command/filesystem/memfiles-add.go | 4 +- client/command/filesystem/memfiles-list.go | 4 +- client/command/filesystem/memfiles-rm.go | 4 +- client/command/filesystem/mkdir.go | 4 +- client/command/filesystem/mv.go | 4 +- client/command/filesystem/pwd.go | 4 +- client/command/filesystem/rm.go | 4 +- client/command/filesystem/upload.go | 4 +- client/command/generate/canaries.go | 4 +- client/command/generate/commands.go | 4 +- client/command/generate/generate-beacon.go | 4 +- client/command/generate/generate-info.go | 2 +- client/command/generate/generate-stager.go | 2 +- client/command/generate/generate.go | 22 +- client/command/generate/helpers.go | 8 +- client/command/generate/implants-rm.go | 2 +- client/command/generate/implants.go | 8 +- client/command/generate/profiles-generate.go | 2 +- client/command/generate/profiles-new.go | 4 +- client/command/generate/profiles-rm.go | 2 +- client/command/generate/profiles.go | 12 +- client/command/generate/regenerate.go | 2 +- client/command/generate/traffic-encoders.go | 16 +- client/command/hosts/commands.go | 2 +- client/command/hosts/hosts-ioc-rm.go | 2 +- client/command/hosts/hosts-ioc.go | 6 +- client/command/hosts/hosts-rm.go | 2 +- client/command/hosts/hosts.go | 12 +- client/command/info/commands.go | 4 +- client/command/info/info.go | 12 +- client/command/info/ping.go | 2 +- client/command/jobs/commands.go | 2 +- client/command/jobs/dns.go | 2 +- client/command/jobs/http.go | 2 +- client/command/jobs/https.go | 2 +- client/command/jobs/jobs.go | 10 +- client/command/jobs/mtls.go | 2 +- client/command/jobs/stage.go | 2 +- client/command/jobs/wg.go | 2 +- client/command/kill/commands.go | 2 +- client/command/kill/kill.go | 6 +- client/command/licenses/commands.go | 2 +- client/command/loot/commands.go | 6 +- client/command/loot/fetch.go | 2 +- client/command/loot/local.go | 2 +- client/command/loot/loot.go | 6 +- client/command/loot/remote.go | 8 +- client/command/loot/rename.go | 2 +- client/command/loot/rm.go | 2 +- client/command/monitor/commands.go | 2 +- client/command/monitor/start.go | 2 +- client/command/monitor/stop.go | 2 +- client/command/network/commands.go | 2 +- client/command/network/ifconfig.go | 4 +- client/command/network/netstat.go | 4 +- client/command/operators/commands.go | 2 +- client/command/operators/operators.go | 4 +- client/command/pivots/commands.go | 2 +- client/command/pivots/details.go | 4 +- client/command/pivots/graph.go | 2 +- client/command/pivots/helpers.go | 4 +- client/command/pivots/pivots.go | 4 +- client/command/pivots/start.go | 4 +- client/command/pivots/stop.go | 2 +- client/command/portfwd/commands.go | 2 +- client/command/portfwd/portfwd-add.go | 2 +- client/command/portfwd/portfwd-rm.go | 2 +- client/command/portfwd/portfwd.go | 6 +- client/command/prelude-operator/commands.go | 2 +- client/command/prelude-operator/connect.go | 2 +- client/command/prelude-operator/operator.go | 2 +- client/command/privilege/commands.go | 2 +- client/command/privilege/getprivs.go | 4 +- client/command/privilege/getsystem.go | 4 +- client/command/privilege/impersonate.go | 4 +- client/command/privilege/make-token.go | 4 +- client/command/privilege/rev2self.go | 4 +- client/command/privilege/runas.go | 4 +- client/command/processes/commands.go | 2 +- client/command/processes/procdump.go | 6 +- client/command/processes/ps.go | 8 +- client/command/processes/terminate.go | 4 +- client/command/reaction/commands.go | 2 +- client/command/reaction/helpers.go | 2 +- client/command/reaction/reaction.go | 4 +- client/command/reaction/reload.go | 2 +- client/command/reaction/save.go | 2 +- client/command/reaction/set.go | 6 +- client/command/reaction/unset.go | 4 +- client/command/reconfig/commands.go | 2 +- client/command/reconfig/reconfig.go | 2 +- client/command/reconfig/rename.go | 2 +- client/command/registry/commands.go | 2 +- client/command/registry/reg-create.go | 4 +- client/command/registry/reg-delete.go | 4 +- client/command/registry/reg-list.go | 8 +- client/command/registry/reg-read.go | 4 +- client/command/registry/reg-write.go | 4 +- client/command/rportfwd/commands.go | 2 +- client/command/rportfwd/portfwd-add.go | 4 +- client/command/rportfwd/portfwd-rm.go | 4 +- client/command/rportfwd/portfwd.go | 6 +- client/command/screenshot/commands.go | 2 +- client/command/screenshot/screenshot.go | 6 +- client/command/server.go | 11 +- client/command/sessions/background.go | 2 +- client/command/sessions/close.go | 2 +- client/command/sessions/commands.go | 6 +- client/command/sessions/helpers.go | 2 +- client/command/sessions/interactive.go | 2 +- client/command/sessions/prune.go | 2 +- client/command/sessions/sessions.go | 4 +- client/command/settings/beacons.go | 2 +- client/command/settings/commands.go | 2 +- client/command/settings/opsec.go | 6 +- client/command/settings/settings.go | 14 +- client/command/settings/tables.go | 6 +- client/command/shell/commands.go | 2 +- client/command/shell/shell.go | 4 +- client/command/shikata-ga-nai/commands.go | 2 +- client/command/shikata-ga-nai/sgn.go | 2 +- client/command/sliver.go | 7 +- client/command/socks/commands.go | 2 +- client/command/socks/socks-start.go | 2 +- client/command/socks/socks-stop.go | 2 +- client/command/socks/socks.go | 4 +- client/command/taskmany/taskmany.go | 10 +- client/command/tasks/commands.go | 2 +- client/command/tasks/fetch.go | 10 +- client/command/tasks/helpers.go | 4 +- client/command/tasks/tasks-cancel.go | 2 +- client/command/tasks/tasks.go | 4 +- client/command/update/commands.go | 2 +- client/command/update/update.go | 6 +- client/command/use/beacons.go | 2 +- client/command/use/commands.go | 2 +- client/command/use/sessions.go | 2 +- client/command/use/use.go | 10 +- client/command/wasm/commands.go | 2 +- client/command/wasm/memfs.go | 2 +- client/command/wasm/wasm.go | 14 +- client/command/websites/commands.go | 2 +- .../command/websites/websites-add-content.go | 2 +- .../command/websites/websites-rm-content.go | 2 +- client/command/websites/websites-rm.go | 2 +- .../websites/websites-update-content.go | 2 +- client/command/websites/websites.go | 10 +- client/command/wireguard/commands.go | 4 +- client/command/wireguard/wg-config.go | 2 +- client/command/wireguard/wg-portfwd-add.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 4 +- client/command/wireguard/wg-portfwd.go | 2 +- client/command/wireguard/wg-socks-start.go | 2 +- client/command/wireguard/wg-socks-stop.go | 2 +- client/command/wireguard/wg-socks.go | 4 +- go.mod | 14 +- go.sum | 17 +- .../github.com/ncruces/go-sqlite3/README.md | 11 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 6 +- .../ncruces/go-sqlite3/driver/driver.go | 16 +- .../ncruces/go-sqlite3/embed/build.sh | 9 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1444429 -> 1427169 bytes vendor/github.com/ncruces/go-sqlite3/go.work | 6 + vendor/github.com/psanford/memfs/LICENSE | 27 + vendor/github.com/psanford/memfs/Readme.md | 50 ++ vendor/github.com/psanford/memfs/memfs.go | 426 +++++++++++++++ .../github.com/reeflective/team/.golangci.yml | 450 ++++++++++++++++ vendor/github.com/reeflective/team/README.md | 120 +++++ .../reeflective/team/client/client.go | 282 ++++++++++ .../team/client/commands/commands.go | 230 ++++++++ .../team/client/commands/import.go | 60 +++ .../reeflective/team/client/commands/users.go | 89 +++ .../team/client/commands/version.go | 63 +++ .../reeflective/team/client/config.go | 256 +++++++++ .../reeflective/team/client/directories.go | 94 ++++ .../reeflective/team/client/errors.go | 43 ++ .../github.com/reeflective/team/client/log.go | 114 ++++ .../reeflective/team/client/options.go | 200 +++++++ .../reeflective/team/internal/assets/fs.go | 203 +++++++ .../reeflective/team/internal/certs/README.md | 4 + .../reeflective/team/internal/certs/ca.go | 149 ++++++ .../reeflective/team/internal/certs/certs.go | 375 +++++++++++++ .../reeflective/team/internal/certs/tls.go | 87 +++ .../reeflective/team/internal/certs/users.go | 100 ++++ .../team/internal/command/command.go | 108 ++++ .../team/internal/db/certificates.go | 47 ++ .../reeflective/team/internal/db/config.go | 93 ++++ .../reeflective/team/internal/db/sql-cgo.go | 35 ++ .../reeflective/team/internal/db/sql-go.go | 34 ++ .../reeflective/team/internal/db/sql-wasm.go | 38 ++ .../reeflective/team/internal/db/sql.go | 126 +++++ .../reeflective/team/internal/db/user.go | 47 ++ .../team/internal/db/wasmsqlite/License | 21 + .../team/internal/db/wasmsqlite/README.md | 56 ++ .../team/internal/db/wasmsqlite/ddlmod.go | 234 ++++++++ .../team/internal/db/wasmsqlite/errors.go | 7 + .../team/internal/db/wasmsqlite/migrator.go | 423 +++++++++++++++ .../team/internal/db/wasmsqlite/sqlite.go | 224 ++++++++ .../reeflective/team/internal/log/cli.go | 300 +++++++++++ .../reeflective/team/internal/log/db.go | 63 +++ .../reeflective/team/internal/log/log.go | 181 +++++++ .../reeflective/team/internal/log/perms.go | 60 +++ .../team/internal/log/perms_windows.go | 46 ++ .../reeflective/team/internal/log/text.go | 97 ++++ .../team/internal/systemd/config.go | 110 ++++ .../team/internal/systemd/teamserver.service | 17 + .../team/internal/version/.gitignore | 1 + .../internal/version/teamserver_version_info | 14 + .../team/internal/version/version.go | 96 ++++ .../team/server/commands/commands.go | 260 +++++++++ .../team/server/commands/completers.go | 140 +++++ .../team/server/commands/teamserver.go | 372 +++++++++++++ .../reeflective/team/server/commands/user.go | 216 ++++++++ .../reeflective/team/server/config.go | 205 +++++++ .../reeflective/team/server/core.go | 240 +++++++++ .../github.com/reeflective/team/server/db.go | 193 +++++++ .../reeflective/team/server/directories.go | 124 +++++ .../reeflective/team/server/errors.go | 83 +++ .../reeflective/team/server/jobs.go | 227 ++++++++ .../github.com/reeflective/team/server/log.go | 141 +++++ .../reeflective/team/server/options.go | 236 ++++++++ .../reeflective/team/server/server.go | 263 +++++++++ .../reeflective/team/server/users.go | 279 ++++++++++ .../github.com/reeflective/team/teamclient.go | 66 +++ .../team/transports/grpc/client/client.go | 189 +++++++ .../team/transports/grpc/client/middleware.go | 99 ++++ .../team/transports/grpc/common/log.go | 66 +++ .../team/transports/grpc/proto/buf.gen.yaml | 13 + .../team/transports/grpc/proto/buf.work.yaml | 3 + .../team/transports/grpc/proto/buf.yaml | 12 + .../team/transports/grpc/proto/client.pb.go | 505 ++++++++++++++++++ .../team/transports/grpc/proto/client.proto | 40 ++ .../team/transports/grpc/proto/service.pb.go | 85 +++ .../team/transports/grpc/proto/service.proto | 13 + .../transports/grpc/proto/service_grpc.pb.go | 146 +++++ .../team/transports/grpc/server/middleware.go | 218 ++++++++ .../team/transports/grpc/server/rpc.go | 73 +++ .../team/transports/grpc/server/server.go | 204 +++++++ vendor/golang.org/x/sync/errgroup/errgroup.go | 10 +- vendor/golang.org/x/sync/errgroup/go120.go | 14 + .../golang.org/x/sync/errgroup/pre_go120.go | 15 + vendor/modules.txt | 32 +- 314 files changed, 11201 insertions(+), 535 deletions(-) create mode 100644 vendor/github.com/ncruces/go-sqlite3/go.work create mode 100644 vendor/github.com/psanford/memfs/LICENSE create mode 100644 vendor/github.com/psanford/memfs/Readme.md create mode 100644 vendor/github.com/psanford/memfs/memfs.go create mode 100644 vendor/github.com/reeflective/team/.golangci.yml create mode 100644 vendor/github.com/reeflective/team/README.md create mode 100644 vendor/github.com/reeflective/team/client/client.go create mode 100644 vendor/github.com/reeflective/team/client/commands/commands.go create mode 100644 vendor/github.com/reeflective/team/client/commands/import.go create mode 100644 vendor/github.com/reeflective/team/client/commands/users.go create mode 100644 vendor/github.com/reeflective/team/client/commands/version.go create mode 100644 vendor/github.com/reeflective/team/client/config.go create mode 100644 vendor/github.com/reeflective/team/client/directories.go create mode 100644 vendor/github.com/reeflective/team/client/errors.go create mode 100644 vendor/github.com/reeflective/team/client/log.go create mode 100644 vendor/github.com/reeflective/team/client/options.go create mode 100644 vendor/github.com/reeflective/team/internal/assets/fs.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/README.md create mode 100644 vendor/github.com/reeflective/team/internal/certs/ca.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/certs.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/tls.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/users.go create mode 100644 vendor/github.com/reeflective/team/internal/command/command.go create mode 100644 vendor/github.com/reeflective/team/internal/db/certificates.go create mode 100644 vendor/github.com/reeflective/team/internal/db/config.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql-cgo.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql-go.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql-wasm.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql.go create mode 100644 vendor/github.com/reeflective/team/internal/db/user.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/License create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go create mode 100644 vendor/github.com/reeflective/team/internal/log/cli.go create mode 100644 vendor/github.com/reeflective/team/internal/log/db.go create mode 100644 vendor/github.com/reeflective/team/internal/log/log.go create mode 100644 vendor/github.com/reeflective/team/internal/log/perms.go create mode 100644 vendor/github.com/reeflective/team/internal/log/perms_windows.go create mode 100644 vendor/github.com/reeflective/team/internal/log/text.go create mode 100644 vendor/github.com/reeflective/team/internal/systemd/config.go create mode 100644 vendor/github.com/reeflective/team/internal/systemd/teamserver.service create mode 100644 vendor/github.com/reeflective/team/internal/version/.gitignore create mode 100644 vendor/github.com/reeflective/team/internal/version/teamserver_version_info create mode 100644 vendor/github.com/reeflective/team/internal/version/version.go create mode 100644 vendor/github.com/reeflective/team/server/commands/commands.go create mode 100644 vendor/github.com/reeflective/team/server/commands/completers.go create mode 100644 vendor/github.com/reeflective/team/server/commands/teamserver.go create mode 100644 vendor/github.com/reeflective/team/server/commands/user.go create mode 100644 vendor/github.com/reeflective/team/server/config.go create mode 100644 vendor/github.com/reeflective/team/server/core.go create mode 100644 vendor/github.com/reeflective/team/server/db.go create mode 100644 vendor/github.com/reeflective/team/server/directories.go create mode 100644 vendor/github.com/reeflective/team/server/errors.go create mode 100644 vendor/github.com/reeflective/team/server/jobs.go create mode 100644 vendor/github.com/reeflective/team/server/log.go create mode 100644 vendor/github.com/reeflective/team/server/options.go create mode 100644 vendor/github.com/reeflective/team/server/server.go create mode 100644 vendor/github.com/reeflective/team/server/users.go create mode 100644 vendor/github.com/reeflective/team/teamclient.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/client.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/middleware.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/common/log.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.proto create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.proto create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/middleware.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/rpc.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/server.go create mode 100644 vendor/golang.org/x/sync/errgroup/go120.go create mode 100644 vendor/golang.org/x/sync/errgroup/pre_go120.go diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 2ff708f858..595c8831f9 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -35,7 +35,7 @@ import ( ) // AliasesCmd - The alias command -func AliasesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) error { +func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) error { if 0 < len(loadedAliases) { PrintAliases(con) } else { @@ -46,7 +46,7 @@ func AliasesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintAliases - Print a list of loaded aliases -func PrintAliases(con *console.SliverConsoleClient) { +func PrintAliases(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -89,7 +89,7 @@ func PrintAliases(con *console.SliverConsoleClient) { } // AliasCommandNameCompleter - Completer for installed extensions command names -func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverConsoleClient) []string { +func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverClient) []string { results := []string{} for name := range loadedAliases { if strings.HasPrefix(name, prefix) { diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go index 5b7bff8727..a30af147cd 100644 --- a/client/command/alias/commands.go +++ b/client/command/alias/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the `alias` command and its child commands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { aliasCmd := &cobra.Command{ Use: consts.AliasesStr, Short: "List current aliases", diff --git a/client/command/alias/install.go b/client/command/alias/install.go index e63ea0f374..6914c04085 100644 --- a/client/command/alias/install.go +++ b/client/command/alias/install.go @@ -34,7 +34,7 @@ import ( ) // AliasesInstallCmd - Install an alias -func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { aliasLocalPath := args[0] fi, err := os.Stat(aliasLocalPath) if os.IsNotExist(err) { @@ -49,7 +49,7 @@ func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // Install an extension from a directory -func installFromDir(aliasLocalPath string, con *console.SliverConsoleClient) { +func installFromDir(aliasLocalPath string, con *console.SliverClient) { manifestData, err := ioutil.ReadFile(filepath.Join(aliasLocalPath, ManifestFileName)) if err != nil { con.PrintErrorf("Error reading %s: %s", ManifestFileName, err) @@ -102,7 +102,7 @@ func installFromDir(aliasLocalPath string, con *console.SliverConsoleClient) { } // Install an extension from a .tar.gz file -func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.SliverConsoleClient) *string { +func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(aliasGzFilePath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, aliasGzFilePath, err) @@ -153,7 +153,7 @@ func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.Sl return &installPath } -func installArtifact(aliasGzFilePath string, installPath, artifactPath string, con *console.SliverConsoleClient) error { +func installArtifact(aliasGzFilePath string, installPath, artifactPath string, con *console.SliverClient) error { data, err := util.ReadFileFromTarGz(aliasGzFilePath, fmt.Sprintf("./%s", strings.TrimPrefix(artifactPath, string(os.PathSeparator)))) if err != nil { return err diff --git a/client/command/alias/load.go b/client/command/alias/load.go index 4b6237267b..ed4e31df32 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -124,7 +124,7 @@ func (a *AliasManifest) getFileForTarget(cmdName string, targetOS string, target } // AliasesLoadCmd - Locally load a alias into the Sliver shell. -func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") alias, err := LoadAlias(dirPath, cmd.Root(), con) @@ -136,7 +136,7 @@ func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // LoadAlias - Load an alias into the Sliver shell from a given directory -func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverConsoleClient) (*AliasManifest, error) { +func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverClient) (*AliasManifest, error) { // retrieve alias manifest var err error manifestPath, err = filepath.Abs(manifestPath) @@ -241,7 +241,7 @@ func ParseAliasManifest(data []byte) (*AliasManifest, error) { return alias, nil } -func runAliasCommand(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -475,7 +475,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintSpawnDLLOutput - Prints the output of a spawn dll command -func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFilePath *os.File, con *console.SliverConsoleClient) { +func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, spawnDllResp.GetResult()) if outFilePath != nil { outFilePath.Write([]byte(spawnDllResp.GetResult())) @@ -484,7 +484,7 @@ func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFil } // PrintSideloadOutput - Prints the output of a sideload command -func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFilePath *os.File, con *console.SliverConsoleClient) { +func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, sideloadResp.GetResult()) if outFilePath != nil { outFilePath.Write([]byte(sideloadResp.GetResult())) @@ -493,7 +493,7 @@ func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFil } // PrintAssemblyOutput - Prints the output of an execute-assembly command -func PrintAssemblyOutput(cmdName string, execAsmResp *sliverpb.ExecuteAssembly, outFilePath *os.File, con *console.SliverConsoleClient) { +func PrintAssemblyOutput(cmdName string, execAsmResp *sliverpb.ExecuteAssembly, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, string(execAsmResp.GetOutput())) if outFilePath != nil { outFilePath.Write(execAsmResp.GetOutput()) diff --git a/client/command/alias/remove.go b/client/command/alias/remove.go index 3a7fb7ab43..c3b075b5b7 100644 --- a/client/command/alias/remove.go +++ b/client/command/alias/remove.go @@ -32,7 +32,7 @@ import ( ) // AliasesRemoveCmd - Locally load a alias into the Sliver shell. -func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") if name == "" { @@ -55,7 +55,7 @@ func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // RemoveAliasByCommandName - Remove an alias by command name -func RemoveAliasByCommandName(commandName string, con *console.SliverConsoleClient) error { +func RemoveAliasByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") } diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index 14d55069f4..c32ef13fb2 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -105,7 +105,7 @@ var ( ) // ArmoryCmd - The main armory command -func ArmoryCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmoryCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { armoriesConfig := assets.GetArmoriesConfig() con.PrintInfof("Fetching %d armory index(es) ... ", len(armoriesConfig)) clientConfig := parseArmoryHTTPConfig(cmd) @@ -240,7 +240,7 @@ func AliasExtensionOrBundleCompleter() carapace.Action { } // PrintArmoryPackages - Prints the armory packages -func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverConsoleClient) { +func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { width = 1 @@ -331,7 +331,7 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte } // PrintArmoryBundles - Prints the armory bundles -func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverConsoleClient) { +func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Bundles" + console.Normal) diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index fe2649dd16..80cb290e18 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the `armory` command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { armoryCmd := &cobra.Command{ Use: consts.ArmoryStr, Short: "Automatically download and install extensions/aliases", diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 730b40ed34..8c53a093c2 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -39,7 +39,7 @@ import ( var ErrPackageNotFound = errors.New("package not found") // ArmoryInstallCmd - The armory install command -func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") if name == "" { @@ -77,7 +77,7 @@ func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args con.PrintErrorf("No package or bundle named '%s' was found", name) } -func installBundle(bundle *ArmoryBundle, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func installBundle(bundle *ArmoryBundle, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { for _, pkgName := range bundle.Packages { err := installPackageByName(pkgName, clientConfig, con) if err != nil { @@ -86,7 +86,7 @@ func installBundle(bundle *ArmoryBundle, clientConfig ArmoryHTTPConfig, con *con } } -func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error { +func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { aliases, extensions := packagesInCache() for _, alias := range aliases { if alias.CommandName == name || name == "all" { @@ -112,7 +112,7 @@ func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *conso return ErrPackageNotFound } -func installAlias(alias *alias.AliasManifest, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func installAlias(alias *alias.AliasManifest, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { err := installAliasPackageByName(alias.CommandName, clientConfig, con) if err != nil { con.PrintErrorf("Failed to install alias '%s': %s", alias.CommandName, err) @@ -120,7 +120,7 @@ func installAlias(alias *alias.AliasManifest, clientConfig ArmoryHTTPConfig, con } } -func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error { +func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { var entry *pkgCacheEntry pkgCache.Range(func(key, value interface{}) bool { cacheEntry := value.(pkgCacheEntry) @@ -186,7 +186,7 @@ func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con * return nil } -func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { deps := make(map[string]struct{}) resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con) sliverMenu := con.App.Menu(constants.ImplantMenu) @@ -209,7 +209,7 @@ func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTP const maxDepDepth = 10 // Arbitrary recursive limit for dependencies -func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { var entry *pkgCacheEntry pkgCache.Range(func(key, value interface{}) bool { cacheEntry := value.(pkgCacheEntry) @@ -242,7 +242,7 @@ func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, resolveExtensionPackageDependencies(entry.Extension.DependsOn, deps, clientConfig, con) } -func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error { +func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { var entry *pkgCacheEntry pkgCache.Range(func(key, value interface{}) bool { cacheEntry := value.(pkgCacheEntry) diff --git a/client/command/armory/search.go b/client/command/armory/search.go index b20a8967c3..dda619ac50 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -29,7 +29,7 @@ import ( ) // ArmorySearchCmd - Search for packages by name -func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) refresh(clientConfig) diff --git a/client/command/armory/update.go b/client/command/armory/update.go index 76676355e9..4f14d0006b 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -31,7 +31,7 @@ import ( ) // ArmoryUpdateCmd - Update all installed extensions/aliases -func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) refresh(clientConfig) @@ -66,7 +66,7 @@ func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func checkForAliasUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) []string { +func checkForAliasUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverClient) []string { cachedAliases, _ := packagesInCache() results := []string{} for _, aliasManifestPath := range assets.GetInstalledAliasManifests() { @@ -89,7 +89,7 @@ func checkForAliasUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverCons return results } -func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) []string { +func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverClient) []string { _, cachedExtensions := packagesInCache() results := []string{} for _, extManifestPath := range assets.GetInstalledExtensionManifests() { diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index 9cdc64de29..af220da2c4 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -28,7 +28,7 @@ import ( ) // BackdoorCmd - Command to inject implant code into an existing binary -func BackdoorCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BackdoorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go index 8fa7b4bbff..615750479c 100644 --- a/client/command/backdoor/commands.go +++ b/client/command/backdoor/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { backdoorCmd := &cobra.Command{ Use: consts.BackdoorStr, Short: "Infect a remote file with a sliver shellcode", diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 409d8ee824..5abfa659c9 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -36,7 +36,7 @@ import ( ) // BeaconsCmd - Display/interact with beacons -func BeaconsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { killFlag, _ := cmd.Flags().GetString("kill") killAll, _ := cmd.Flags().GetBool("kill-all") @@ -94,7 +94,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintBeacons - Display a list of beacons -func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverConsoleClient) { +func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { if len(beacons) == 0 { con.PrintInfof("No beacons 🙁\n") return @@ -103,7 +103,7 @@ func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp con.Printf("%s\n", tw.Render()) } -func renderBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverConsoleClient) table.Writer { +func renderBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) table.Writer { width, _, err := term.GetSize(0) if err != nil { width = 999 diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index d526d7412d..9849017446 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -17,7 +17,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { beaconsCmd := &cobra.Command{ Use: consts.BeaconsStr, Short: "Manage beacons", @@ -79,7 +79,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // BeaconIDCompleter completes beacon IDs -func BeaconIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index e12b8f7183..37473b9975 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -43,7 +43,7 @@ var ( ) // SelectBeacon - Interactive menu for the user to select an session, optionally only display live sessions -func SelectBeacon(con *console.SliverConsoleClient) (*clientpb.Beacon, error) { +func SelectBeacon(con *console.SliverClient) (*clientpb.Beacon, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) @@ -102,7 +102,7 @@ func SelectBeacon(con *console.SliverConsoleClient) (*clientpb.Beacon, error) { return nil, ErrNoSelection } -func GetBeacon(con *console.SliverConsoleClient, beaconID string) (*clientpb.Beacon, error) { +func GetBeacon(con *console.SliverClient, beaconID string) (*clientpb.Beacon, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) @@ -120,7 +120,7 @@ func GetBeacon(con *console.SliverConsoleClient, beaconID string) (*clientpb.Bea return nil, ErrBeaconNotFound } -func GetBeacons(con *console.SliverConsoleClient) (*clientpb.Beacons, error) { +func GetBeacons(con *console.SliverClient) (*clientpb.Beacons, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index 8c0ea55078..b3e48cd0dd 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -30,7 +30,7 @@ import ( ) // BeaconsPruneCmd - Prune stale beacons automatically -func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { duration, _ := cmd.Flags().GetString("duration") pruneDuration, err := time.ParseDuration(duration) if err != nil { diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index f3d8ee77d4..c8974b5d92 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -25,7 +25,7 @@ import ( ) // BeaconsRmCmd - Display/interact with beacons -func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := SelectBeacon(con) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/beacons/watch.go b/client/command/beacons/watch.go index 210de23102..f5a6699b75 100644 --- a/client/command/beacons/watch.go +++ b/client/command/beacons/watch.go @@ -31,7 +31,7 @@ import ( ) // BeaconsWatchCmd - Watch your beacons in real-ish time -func BeaconsWatchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsWatchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { done := waitForInput() defer func() { con.Printf(console.UpN+console.Clearln+"\r", 1) diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index ade5846ab4..42e7b9a008 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -33,7 +33,7 @@ import ( ) // BuildersCmd - List external builders -func BuildersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s", err) @@ -46,7 +46,7 @@ func BuildersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func PrintBuilders(externalBuilders []*clientpb.Builder, con *console.SliverConsoleClient) { +func PrintBuilders(externalBuilders []*clientpb.Builder, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go index 882cb50952..d80cbe44fe 100644 --- a/client/command/builders/commands.go +++ b/client/command/builders/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { buildersCmd := &cobra.Command{ Use: consts.BuildersStr, Short: "List external builders", diff --git a/client/command/command.go b/client/command/command.go index 2afd028b3e..33318adf12 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,12 +21,11 @@ package command import ( "strings" + client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 @@ -105,7 +104,7 @@ func RestrictTargets(filters ...string) map[string]string { // @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. // @menu - The command menu to which the commands should be bound (either server or implant menu). // @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bind(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { +func bind(group string, menu *cobra.Command, con *client.SliverClient, cmds ...func(con *client.SliverClient) []*cobra.Command) { found := false // Ensure the given command group is available in the menu. diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go index 44b0982c0c..7fc4e08df0 100644 --- a/client/command/crack/commands.go +++ b/client/command/crack/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { crackCmd := &cobra.Command{ Use: consts.CrackStr, Short: "Crack: GPU password cracking", diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index cd7af7c7cd..e69de1bd1c 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -36,7 +36,7 @@ import ( ) // CrackWordlistsCmd - Manage GPU cracking stations -func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { con.PrintErrorf("%s\n", err) @@ -56,7 +56,7 @@ func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // CrackRulesCmd - Manage GPU cracking stations -func CrackRulesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { con.PrintErrorf("%s\n", err) @@ -76,7 +76,7 @@ func CrackRulesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } // CrackHcstat2Cmd - Manage GPU cracking stations -func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { con.PrintErrorf("%s\n", err) @@ -95,7 +95,7 @@ func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverConsoleClient) { +func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{"Name", "Size"}) @@ -105,7 +105,7 @@ func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverConsole con.Printf("%s\n", tw.Render()) } -func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverConsoleClient) { +func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverClient) { wordlistTable := table.NewWriter() wordlistTable.SetTitle(console.Bold + "Wordlists" + console.Normal) wordlistTable.SetStyle(settings.GetTableStyle(con)) @@ -163,7 +163,7 @@ func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverC } // CrackWordlistsAddCmd - Manage GPU cracking stations -func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") var localPath string @@ -207,7 +207,7 @@ func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, } // CrackRulesAddCmd - add a rules file -func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") var localPath string @@ -251,7 +251,7 @@ func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // CrackHcstat2AddCmd - add a hcstat2 file -func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") var localPath string @@ -294,7 +294,7 @@ func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar addCrackFile(hcstat2, crackFile, con) } -func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *console.SliverConsoleClient) { +func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *console.SliverClient) { digest := sha256.New() wordlistReader := io.TeeReader(localFile, digest) @@ -403,7 +403,7 @@ func readChunkAt(tmpFile *os.File, offset int64, chunkSize int64) ([]byte, error } // CrackWordlistsRmCmd - Manage GPU cracking stations -func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var wordlistName string if len(args) > 0 { wordlistName = args[0] @@ -437,7 +437,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // CrackRulesRmCmd - Manage GPU cracking stations -func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var rulesName string if len(args) > 0 { rulesName = args[0] @@ -471,7 +471,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // CrackHcstat2RmCmd - remove a hcstat2 file -func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var hcstat2Name string if len(args) > 0 { hcstat2Name = args[0] diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 829933e132..163f0d8e9a 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -33,7 +33,7 @@ import ( ) // CrackCmd - GPU password cracking interface -func CrackCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if !AreCrackersOnline(con) { PrintNoCrackstations(con) } else { @@ -58,7 +58,7 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // CrackStationsCmd - Manage GPU cracking stations -func CrackStationsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackStationsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -71,11 +71,11 @@ func CrackStationsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func PrintNoCrackstations(con *console.SliverConsoleClient) { +func PrintNoCrackstations(con *console.SliverClient) { con.PrintInfof("No crackstations connected to server\n") } -func AreCrackersOnline(con *console.SliverConsoleClient) bool { +func AreCrackersOnline(con *console.SliverClient) bool { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { return false @@ -83,7 +83,7 @@ func AreCrackersOnline(con *console.SliverConsoleClient) bool { return len(crackers.Crackstations) > 0 } -func PrintCrackers(crackers []*clientpb.Crackstation, con *console.SliverConsoleClient) { +func PrintCrackers(crackers []*clientpb.Crackstation, con *console.SliverClient) { sort.Slice(crackers, func(i, j int) bool { return crackers[i].Name < crackers[j].Name }) @@ -96,7 +96,7 @@ func PrintCrackers(crackers []*clientpb.Crackstation, con *console.SliverConsole } } -func printCracker(cracker *clientpb.Crackstation, index int, con *console.SliverConsoleClient) { +func printCracker(cracker *clientpb.Crackstation, index int, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + console.Orange + fmt.Sprintf(">>> Crackstation %02d - %s (%s)", index+1, cracker.Name, cracker.OperatorName) + console.Normal + "\n") @@ -135,7 +135,7 @@ func printCracker(cracker *clientpb.Crackstation, index int, con *console.Sliver printBenchmarks(cracker, con) } -func printBenchmarks(cracker *clientpb.Crackstation, con *console.SliverConsoleClient) { +func printBenchmarks(cracker *clientpb.Crackstation, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Benchmarks" + console.Normal) diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index a5409a2637..7cc947348a 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -10,7 +10,7 @@ import ( "github.com/rsteube/carapace" ) -func CrackHcstat2Completer(con *console.SliverConsoleClient) carapace.Action { +func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { @@ -33,7 +33,7 @@ func CrackHcstat2Completer(con *console.SliverConsoleClient) carapace.Action { }) } -func CrackWordlistCompleter(con *console.SliverConsoleClient) carapace.Action { +func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { @@ -57,7 +57,7 @@ func CrackWordlistCompleter(con *console.SliverConsoleClient) carapace.Action { }) } -func CrackRulesCompleter(con *console.SliverConsoleClient) carapace.Action { +func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 3f7e4352e7..4d84bb8574 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -38,7 +38,7 @@ const ( ) // CredsCmd - Add new credentials -func CredsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") username, _ := cmd.Flags().GetString("username") plaintext, _ := cmd.Flags().GetString("plaintext") @@ -77,7 +77,7 @@ func CredsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // CredsCmd - Add new credentials -func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") filePath := args[0] fileFormat, _ := cmd.Flags().GetString("file-format") diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go index 4ec0bfec49..aba841248e 100644 --- a/client/command/creds/commands.go +++ b/client/command/creds/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { credsCmd := &cobra.Command{ Use: consts.CredsStr, Short: "Manage the database of credentials", diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 73cc5e70b3..012292aca8 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -34,7 +34,7 @@ import ( ) // CredsCmd - Manage credentials -func CredsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -47,7 +47,7 @@ func CredsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin PrintCreds(creds.Credentials, con) } -func PrintCreds(creds []*clientpb.Credential, con *console.SliverConsoleClient) { +func PrintCreds(creds []*clientpb.Credential, con *console.SliverClient) { collections := make(map[string][]*clientpb.Credential) for _, cred := range creds { collections[cred.Collection] = append(collections[cred.Collection], cred) @@ -58,7 +58,7 @@ func PrintCreds(creds []*clientpb.Credential, con *console.SliverConsoleClient) } } -func printCollection(collection string, creds []*clientpb.Credential, con *console.SliverConsoleClient) { +func printCollection(collection string, creds []*clientpb.Credential, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) if collection != "" { @@ -88,7 +88,7 @@ func printCollection(collection string, creds []*clientpb.Credential, con *conso } // CredsHashTypeCompleter completes hash types. -func CredsHashTypeCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsHashTypeCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) @@ -102,7 +102,7 @@ func CredsHashTypeCompleter(con *console.SliverConsoleClient) carapace.Action { } // CredsHashFileFormatCompleter completes file formats for hash-files -func CredsHashFileFormatCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValuesDescribed( UserColonHashNewlineFormat, "One hash per line.", HashNewlineFormat, "A file containing lines of 'username:hash' pairs.", @@ -111,7 +111,7 @@ func CredsHashFileFormatCompleter(con *console.SliverConsoleClient) carapace.Act } // CredsCollectionCompleter completes existing creds collection names -func CredsCollectionCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) @@ -134,7 +134,7 @@ func CredsCollectionCompleter(con *console.SliverConsoleClient) carapace.Action } // CredsCredentialIDCompleter completes credential IDs. -func CredsCredentialIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index c119f0efd1..2498327062 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -28,7 +28,7 @@ import ( ) // CredsCmd - Add new credentials -func CredsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var id string if len(args) > 0 { id = args[0] diff --git a/client/command/creds/select.go b/client/command/creds/select.go index a375937aa0..89f02a865f 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -16,7 +16,7 @@ import ( ) // SelectCredential - Interactive menu for the user to select a credentials from the database -func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.SliverConsoleClient) (*clientpb.Credential, error) { +func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.SliverClient) (*clientpb.Credential, error) { var creds *clientpb.Credentials var err error if hashType == clientpb.HashType_INVALID { diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 6680df71e4..ba187a36b3 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { cursedCmd := &cobra.Command{ Use: consts.Cursed, Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 04cfa2146d..51656b9683 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -52,7 +52,7 @@ var ( ) // CursedChromeCmd - Execute a .NET assembly in-memory -func CursedChromeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedChromeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -112,7 +112,7 @@ func CursedChromeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) *core.CursedProcess { +func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) *core.CursedProcess { chromeProcess, err := getChromeProcess(session, cmd, con) if err != nil { con.PrintErrorf("%s\n", err) @@ -154,7 +154,7 @@ func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *cons return curse } -func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) (*core.CursedProcess, error) { +func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) (*core.CursedProcess, error) { name := "Chrome" if isEdge { name = "Edge" @@ -254,7 +254,7 @@ func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra return curse, nil } -func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (string, error) { +func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (string, error) { userDataFlag, _ := cmd.Flags().GetString("user-data") if userDataFlag != "" { return userDataFlag, nil @@ -307,7 +307,7 @@ func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Co } } -func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (string, error) { +func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (string, error) { exeFlag, _ := cmd.Flags().GetString("exe") if exeFlag != "" { return exeFlag, nil @@ -417,7 +417,7 @@ func isChromeProcess(executable string) bool { return false } -func getChromeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (*commonpb.Process, error) { +func getChromeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (*commonpb.Process, error) { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index 046bb45308..f70bdcb42a 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -35,7 +35,7 @@ import ( "github.com/bishopfox/sliver/client/overlord" ) -func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { curse := selectCursedProcess(con) if curse == nil { return @@ -56,7 +56,7 @@ func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args startCursedConsole(curse, true, target, con) } -func selectDebugTarget(targets []overlord.ChromeDebugTarget, con *console.SliverConsoleClient) *overlord.ChromeDebugTarget { +func selectDebugTarget(targets []overlord.ChromeDebugTarget, con *console.SliverClient) *overlord.ChromeDebugTarget { if len(targets) < 1 { con.PrintErrorf("No debug targets\n") return nil @@ -94,7 +94,7 @@ var helperHooks = []string{ "console.log = (...a) => {return a;}", // console.log } -func startCursedConsole(curse *core.CursedProcess, helpers bool, target *overlord.ChromeDebugTarget, con *console.SliverConsoleClient) { +func startCursedConsole(curse *core.CursedProcess, helpers bool, target *overlord.ChromeDebugTarget, con *console.SliverClient) { tmpFile, _ := os.CreateTemp("", "cursed") shell := readline.NewShell() shell.History.AddFromFile("cursed history", tmpFile.Name()) diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index 59859771d0..a2f46dfa4e 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/client/overlord" ) -func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { curse := selectCursedProcess(con) if curse == nil { return diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index a83da8c2f3..7ec9c67cdd 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -36,7 +36,7 @@ import ( ) // CursedChromeCmd - Execute a .NET assembly in-memory -func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -96,7 +96,7 @@ func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } } -func avadaKedavraEdge(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) *core.CursedProcess { +func avadaKedavraEdge(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) *core.CursedProcess { edgeProcess, err := getEdgeProcess(session, cmd, con) if err != nil { con.PrintErrorf("%s\n", err) @@ -153,7 +153,7 @@ func isEdgeProcess(executable string) bool { return false } -func getEdgeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (*commonpb.Process, error) { +func getEdgeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (*commonpb.Process, error) { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index 1d11bc2422..e990536da3 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -38,7 +38,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func CursedElectronCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedElectronCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -68,7 +68,7 @@ func CursedElectronCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg con.PrintInfof("Found %d debug targets, good hunting!\n", len(targets)) } -func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) *core.CursedProcess { +func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) *core.CursedProcess { exists, err := checkElectronPath(electronExe, session, cmd, con) if err != nil { con.PrintErrorf("%s", err) @@ -119,7 +119,7 @@ func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *co return curse } -func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (bool, error) { +func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (bool, error) { ls, err := con.Rpc.Ls(context.Background(), &sliverpb.LsReq{ Request: con.ActiveTarget.Request(cmd), Path: electronExe, @@ -130,7 +130,7 @@ func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra return ls.GetExists(), nil } -func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (*commonpb.Process, error) { +func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (*commonpb.Process, error) { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) @@ -148,7 +148,7 @@ func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *co return nil, nil } -func startCursedElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) (*core.CursedProcess, error) { +func startCursedElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) (*core.CursedProcess, error) { con.PrintInfof("Starting '%s' ... ", path.Base(electronExe)) debugPort := getRemoteDebuggerPort(cmd) args := []string{ diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index 3220557f23..fdbf14c1a5 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func CursedRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index d6cc8dc4ca..237ccf6908 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -29,7 +29,7 @@ import ( "github.com/bishopfox/sliver/client/overlord" ) -func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { curse := selectCursedProcess(con) if curse == nil { return diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index fe81219f6d..5c011ef963 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -36,7 +36,7 @@ import ( ) // CursedChromeCmd - Execute a .NET assembly in-memory -func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Collect existing curses from core cursedProcesses := [][]string{} core.CursedProcesses.Range(func(key, value interface{}) bool { @@ -72,7 +72,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // selectCursedProcess - Interactively select a cursed process from a list -func selectCursedProcess(con *console.SliverConsoleClient) *core.CursedProcess { +func selectCursedProcess(con *console.SliverClient) *core.CursedProcess { cursedProcesses := []*core.CursedProcess{} core.CursedProcesses.Range(func(key, value interface{}) bool { cursedProcesses = append(cursedProcesses, value.(*core.CursedProcess)) diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go index b9aae25f22..54735cc958 100644 --- a/client/command/dllhijack/commands.go +++ b/client/command/dllhijack/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { dllhijackCmd := &cobra.Command{ Use: consts.DLLHijackStr, Short: "Plant a DLL for a hijack scenario", diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 48eb91dd19..5f9f40c8f0 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -34,7 +34,7 @@ import ( // dllhijack --ref-path c:\windows\system32\msasn1.dll --ref-file /tmp/ref.dll --profile dll TARGET_PATH // DllHijackCmd -- implements the dllhijack command -func DllHijackCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func DllHijackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( localRefData []byte targetDLLData []byte diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go index ed72775b1f..6c030ae77c 100644 --- a/client/command/environment/commands.go +++ b/client/command/environment/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { envCmd := &cobra.Command{ Use: consts.EnvStr, Short: "List environment variables", diff --git a/client/command/environment/get.go b/client/command/environment/get.go index cdf40aecc5..5cd630bfaf 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -31,7 +31,7 @@ import ( ) // EnvGetCmd - Get a remote environment variable -func EnvGetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -66,7 +66,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintGetEnvInfo - Print the results of the env get command -func PrintGetEnvInfo(envInfo *sliverpb.EnvInfo, con *console.SliverConsoleClient) { +func PrintGetEnvInfo(envInfo *sliverpb.EnvInfo, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) return diff --git a/client/command/environment/set.go b/client/command/environment/set.go index 395d5edbd3..7db6d4124f 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -32,7 +32,7 @@ import ( ) // EnvSetCmd - Set a remote environment variable -func EnvSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -72,7 +72,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintSetEnvInfo - Print the set environment info -func PrintSetEnvInfo(name string, value string, envInfo *sliverpb.SetEnv, con *console.SliverConsoleClient) { +func PrintSetEnvInfo(name string, value string, envInfo *sliverpb.SetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) return diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index 664497f703..c5b7b2773a 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -31,7 +31,7 @@ import ( ) // EnvUnsetCmd - Unset a remote environment variable -func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -67,7 +67,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintUnsetEnvInfo - Print the set environment info -func PrintUnsetEnvInfo(name string, envInfo *sliverpb.UnsetEnv, con *console.SliverConsoleClient) { +func PrintUnsetEnvInfo(name string, envInfo *sliverpb.UnsetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) return diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 79b6174323..d0be42aa9f 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { executeCmd := &cobra.Command{ Use: consts.ExecuteStr, Short: "Execute a program on the remote system", diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index 34f16a03ce..ef10f39715 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -34,7 +34,7 @@ import ( ) // ExecuteAssemblyCmd - Execute a .NET assembly in-memory -func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -132,7 +132,7 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar } } -func HandleExecuteAssemblyResponse(execAssembly *sliverpb.ExecuteAssembly, assemblyPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleExecuteAssemblyResponse(execAssembly *sliverpb.ExecuteAssembly, assemblyPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 7857a9383b..4727e0fa40 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -38,7 +38,7 @@ import ( ) // ExecuteShellcodeCmd - Execute shellcode in-memory -func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -129,7 +129,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // PrintExecuteShellcode - Display result of shellcode execution -func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverConsoleClient) { +func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverClient) { if task.Response.GetErr() != "" { con.PrintErrorf("%s\n", task.Response.GetErr()) } else { @@ -137,7 +137,7 @@ func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverConsoleClient } } -func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, rwxPages bool, con *console.SliverConsoleClient) { +func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, rwxPages bool, con *console.SliverClient) { // Check active session session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index fd45ab5aa6..03513f9173 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -34,7 +34,7 @@ import ( ) // ExecuteCmd - Run a command on the remote system -func ExecuteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -113,7 +113,7 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } } -func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { var lootedOutput []byte stdout, _ := cmd.Flags().GetString("stdout") saveLoot, _ := cmd.Flags().GetBool("loot") @@ -137,7 +137,7 @@ func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName stri } // PrintExecute - Print the output of an executed command -func PrintExecute(exec *sliverpb.Execute, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintExecute(exec *sliverpb.Execute, cmd *cobra.Command, con *console.SliverClient) { ignoreStderr, _ := cmd.Flags().GetBool("ignore-stderr") stdout, _ := cmd.Flags().GetString("stdout") stderr, _ := cmd.Flags().GetString("stderr") @@ -210,7 +210,7 @@ func combineCommandOutput(exec *sliverpb.Execute, combineStdOut bool, combineStd return []byte(outputString) } -func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cmdName string, hostName string, con *console.SliverConsoleClient) { +func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cmdName string, hostName string, con *console.SliverClient) { if len(commandOutput) == 0 { con.PrintInfof("There was no output from execution, so there is nothing to loot.\n") return @@ -229,7 +229,7 @@ func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cm loot.SendLootMessage(lootMessage, con) } -func PrintExecutionOutput(executionOutput string, saveOutput bool, commandName string, hostName string, con *console.SliverConsoleClient) { +func PrintExecutionOutput(executionOutput string, saveOutput bool, commandName string, hostName string, con *console.SliverClient) { con.PrintInfof("Output:\n%s", executionOutput) if saveOutput { @@ -237,7 +237,7 @@ func PrintExecutionOutput(executionOutput string, saveOutput bool, commandName s } } -func SaveExecutionOutput(executionOutput string, commandName string, hostName string, con *console.SliverConsoleClient) { +func SaveExecutionOutput(executionOutput string, commandName string, hostName string, con *console.SliverClient) { var outFilePath *os.File var err error diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 1a0e421ca5..2e696f43fb 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -31,7 +31,7 @@ import ( ) // MigrateCmd - Windows only, inject an implant into another process -func MigrateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { return diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index b8d274345a..0b5bf257af 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -33,7 +33,7 @@ import ( ) // MsfInjectCmd - Inject a metasploit payload into a remote process -func MsfInjectCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -100,7 +100,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintMsfRemote - Print the results of the remote injection attempt -func PrintMsfRemote(msfRemote *sliverpb.Task, con *console.SliverConsoleClient) { +func PrintMsfRemote(msfRemote *sliverpb.Task, con *console.SliverClient) { if msfRemote.Response == nil { con.PrintErrorf("Empty response from msf payload injection task") return diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 9108478c66..1b06a3e29f 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -32,7 +32,7 @@ import ( ) // MsfCmd - Inject a metasploit payload into the current remote process -func MsfCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index 69f08a3a51..eb18442abb 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -39,7 +39,7 @@ import ( ) // PsExecCmd - psexec command implementation. -func PsExecCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index b965c5385a..991ee835cb 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -35,7 +35,7 @@ import ( ) // SideloadCmd - Sideload a shared library on the remote system -func SideloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -96,7 +96,7 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func HandleSideloadResponse(sideload *sliverpb.Sideload, binPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleSideloadResponse(sideload *sliverpb.Sideload, binPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index d522f100b4..068965113c 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -34,7 +34,7 @@ import ( ) // SpawnDllCmd - Spawn execution of a DLL on the remote system -func SpawnDllCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -85,7 +85,7 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func HandleSpawnDLLResponse(spawndll *sliverpb.SpawnDll, binPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleSpawnDLLResponse(spawndll *sliverpb.SpawnDll, binPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index f7b8f4dbb9..67dea6252d 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -33,7 +33,7 @@ import ( ) // SSHCmd - A built-in SSH client command for the remote system (doesn't shell out) -func SSHCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( privKey []byte err error @@ -121,7 +121,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintSSHCmd - Print the ssh command response -func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverConsoleClient) { +func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverClient) { if sshCmd.Response != nil && sshCmd.Response.Err != "" { con.PrintErrorf("Error: %s\n", sshCmd.Response.Err) if sshCmd.StdErr != "" { @@ -139,7 +139,7 @@ func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverConsoleClient) } } -func tryCredsFromLoot(con *console.SliverConsoleClient) (string, string, []byte) { +func tryCredsFromLoot(con *console.SliverClient) (string, string, []byte) { var ( username string password string diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index ba0f1ee79b..f09f930b3e 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -31,7 +31,7 @@ import ( ) // ExitCmd - Exit the console -func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExitCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { fmt.Println("Exiting...") if con.IsServer { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) @@ -56,7 +56,7 @@ func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // Commands returns the `exit` command. -func Command(con *console.SliverConsoleClient) []*cobra.Command { +func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{{ Use: "exit", Short: "Exit the program", diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 236f13e6ba..62df2bf6cc 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -10,7 +10,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { extensionCmd := &cobra.Command{ Use: consts.ExtensionsStr, Short: "Manage extensions", diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index 980386150f..5bc6f0cd86 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -35,7 +35,7 @@ import ( ) // ExtensionsCmd - List information about installed extensions -func ExtensionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient) { +func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { if 0 < len(getInstalledManifests()) { PrintExtensions(con) } else { @@ -44,7 +44,7 @@ func ExtensionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient) { } // PrintExtensions - Print a list of loaded extensions -func PrintExtensions(con *console.SliverConsoleClient) { +func PrintExtensions(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -115,7 +115,7 @@ func getInstalledManifests() map[string]*ExtensionManifest { } // ExtensionsCommandNameCompleter - Completer for installed extensions command names -func ExtensionsCommandNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func ExtensionsCommandNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { installedManifests := getInstalledManifests() results := []string{} diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index 66e240f549..d6053f1736 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -32,7 +32,7 @@ import ( ) // ExtensionsInstallCmd - Install an extension -func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { extLocalPath := args[0] fi, err := os.Stat(extLocalPath) @@ -48,7 +48,7 @@ func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, } // Install an extension from a directory -func installFromDir(extLocalPath string, con *console.SliverConsoleClient) { +func installFromDir(extLocalPath string, con *console.SliverClient) { manifestData, err := os.ReadFile(filepath.Join(extLocalPath, ManifestFileName)) if err != nil { con.PrintErrorf("Error reading %s: %s", ManifestFileName, err) @@ -99,7 +99,7 @@ func installFromDir(extLocalPath string, con *console.SliverConsoleClient) { } // InstallFromFilePath - Install an extension from a .tar.gz file -func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverConsoleClient) *string { +func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, extLocalPath, err) @@ -150,7 +150,7 @@ func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.S return &installPath } -func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverConsoleClient) error { +func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverClient) error { data, err := util.ReadFileFromTarGz(extGzFilePath, "."+filepath.ToSlash(artifactPath)) if err != nil { return err diff --git a/client/command/extensions/list.go b/client/command/extensions/list.go index afc479a75c..6733e15779 100644 --- a/client/command/extensions/list.go +++ b/client/command/extensions/list.go @@ -28,7 +28,7 @@ import ( ) // ExtensionsListCmd - List all extension loaded on the active session/beacon -func ExtensionsListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionsListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index 72b7d2fd29..f794cea1a7 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -106,7 +106,7 @@ func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, ta } // ExtensionLoadCmd - Load extension command -func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") extCmd, err := LoadExtensionManifest(filepath.Join(dirPath, ManifestFileName)) @@ -175,7 +175,7 @@ func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { } // ExtensionRegisterCommand - Register a new extension command -func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverConsoleClient) { +func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) { if errInvalidArgs := checkExtensionArgs(extCmd); errInvalidArgs != nil { con.PrintErrorf(errInvalidArgs.Error()) return @@ -210,7 +210,7 @@ func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con cmd.AddCommand(extensionCmd) } -func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionManifest, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) error { var extensionList []string binPath, err := ext.getFileForTarget(cmd.Name(), goos, goarch) if err != nil { @@ -261,7 +261,7 @@ func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionMa return nil } -func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd *cobra.Command, con *console.SliverClient) error { registerResp, err := con.Rpc.RegisterExtension(context.Background(), &sliverpb.RegisterExtensionReq{ Name: ext.CommandName, Data: binData, @@ -278,7 +278,7 @@ func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd return nil } -func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con *console.SliverClient) error { depExt, ok := loadedExtensions[depName] if ok { depBinPath, err := depExt.getFileForTarget(depExt.CommandName, goos, goarch) @@ -294,7 +294,7 @@ func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con return fmt.Errorf("missing dependency %s", depName) } -func runExtensionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( err error extensionArgs []byte @@ -389,7 +389,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintExtOutput - Print the ext execution output -func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.CallExtension, con *console.SliverConsoleClient) { +func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.CallExtension, con *console.SliverClient) { if extName == commandName { con.PrintInfof("Successfully executed %s", extName) } else { diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index ceadf621c3..f2c19c18cd 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -33,7 +33,7 @@ import ( ) // ExtensionsRemoveCmd - Remove an extension -func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] if name == "" { con.PrintErrorf("Extension name is required\n") @@ -55,7 +55,7 @@ func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // RemoveExtensionByCommandName - Remove an extension by command name -func RemoveExtensionByCommandName(commandName string, con *console.SliverConsoleClient) error { +func RemoveExtensionByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") } diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 5da4c0e730..aacb93b471 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -38,7 +38,7 @@ import ( ) // CatCmd - Display the contents of a remote file -func CatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -81,7 +81,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintCat - Print the download to stdout -func PrintCat(download *sliverpb.Download, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintCat(download *sliverpb.Download, cmd *cobra.Command, con *console.SliverClient) { var ( lootDownload bool = true err error diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 02fcf5ff69..325a45a659 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -31,7 +31,7 @@ import ( ) // CdCmd - Change directory on the remote system -func CdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 083c2feab1..01439b7c44 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -30,7 +30,7 @@ import ( ) // ChmodCmd - Change the permissions of a file on the remote file system -func ChmodCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -78,7 +78,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintChmod - Print the chmod response -func PrintChmod(chmod *sliverpb.Chmod, con *console.SliverConsoleClient) { +func PrintChmod(chmod *sliverpb.Chmod, con *console.SliverClient) { if chmod.Response != nil && chmod.Response.Err != "" { con.PrintErrorf("%s\n", chmod.Response.Err) return diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index 1a95be6255..b9282fc8f3 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -30,7 +30,7 @@ import ( ) // ChownCmd - Change the owner of a file on the remote file system -func ChownCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -86,7 +86,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintChown - Print the chown response -func PrintChown(chown *sliverpb.Chown, con *console.SliverConsoleClient) { +func PrintChown(chown *sliverpb.Chown, con *console.SliverClient) { if chown.Response != nil && chown.Response.Err != "" { con.PrintErrorf("%s\n", chown.Response.Err) return diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index eee6b4f503..1535387111 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -31,7 +31,7 @@ import ( ) // ChtimesCmd - Change the access and modified time of a file on the remote file system -func ChtimesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -99,7 +99,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintChtimes - Print the Chtimes response -func PrintChtimes(chtimes *sliverpb.Chtimes, con *console.SliverConsoleClient) { +func PrintChtimes(chtimes *sliverpb.Chtimes, con *console.SliverClient) { if chtimes.Response != nil && chtimes.Response.Err != "" { con.PrintErrorf("%s\n", chtimes.Response.Err) return diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index 3c1c64d713..d0b8c85775 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { mvCmd := &cobra.Command{ Use: consts.MvStr, Short: "Move or rename a file", diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 9d0fe895a9..9231806d9a 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func CpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) (err error) { +func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -72,7 +72,7 @@ func CpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) return } -func PrintCp(cp *sliverpb.Cp, con *console.SliverConsoleClient) { +func PrintCp(cp *sliverpb.Cp, con *console.SliverClient) { if cp.Response != nil && cp.Response.Err != "" { con.PrintErrorf("%s\n", cp.Response.Err) return diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 6192a9fa5e..512332585f 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -39,7 +39,7 @@ import ( "github.com/bishopfox/sliver/util/encoders" ) -func DownloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -104,7 +104,7 @@ func prettifyDownloadName(path string) string { return filteredString } -func HandleDownloadResponse(download *sliverpb.Download, cmd *cobra.Command, args []string, con *console.SliverConsoleClient) { +func HandleDownloadResponse(download *sliverpb.Download, cmd *cobra.Command, args []string, con *console.SliverClient) { var err error if download.Response != nil && download.Response.Err != "" { con.PrintErrorf("%s\n", download.Response.Err) diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index 28e56348f4..b779dbe5af 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -39,7 +39,7 @@ import ( ) // LsCmd - List the contents of a remote directory -func LsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -76,7 +76,7 @@ func LsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintLs - Display an sliverpb.Ls object -func PrintLs(ls *sliverpb.Ls, flags *pflag.FlagSet, con *console.SliverConsoleClient) { +func PrintLs(ls *sliverpb.Ls, flags *pflag.FlagSet, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) return diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 2183298574..073d260702 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -29,7 +29,7 @@ import ( ) // MemfilesAddCmd - Add memfile -func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -58,7 +58,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // PrintAddMemfile - Print the memfiles response -func PrintAddMemfile(memfilesAdd *sliverpb.MemfilesAdd, con *console.SliverConsoleClient) { +func PrintAddMemfile(memfilesAdd *sliverpb.MemfilesAdd, con *console.SliverClient) { if memfilesAdd.Response != nil && memfilesAdd.Response.Err != "" { con.PrintErrorf("%s\n", memfilesAdd.Response.Err) return diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index e868a440c4..e8e9f661c1 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -35,7 +35,7 @@ import ( ) // MemfilesListCmd - List memfiles -func MemfilesListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -64,7 +64,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintMemfiles - Display an sliverpb.Ls object -func PrintMemfiles(ls *sliverpb.Ls, con *console.SliverConsoleClient) { +func PrintMemfiles(ls *sliverpb.Ls, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) return diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 169b3ec0ad..697e9205c6 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -30,7 +30,7 @@ import ( ) // MemfilesRmCmd - Remove a memfile -func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -68,7 +68,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } // PrintRmMemfile - Remove a memfile -func PrintRmMemfile(memfilesList *sliverpb.MemfilesRm, con *console.SliverConsoleClient) { +func PrintRmMemfile(memfilesList *sliverpb.MemfilesRm, con *console.SliverClient) { if memfilesList.Response != nil && memfilesList.Response.Err != "" { con.PrintErrorf("%s\n", memfilesList.Response.Err) return diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index e759f56f28..ae0427767a 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -31,7 +31,7 @@ import ( ) // MkdirCmd - Make a remote directory -func MkdirCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -69,7 +69,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintMkdir - Print make directory -func PrintMkdir(mkdir *sliverpb.Mkdir, con *console.SliverConsoleClient) { +func PrintMkdir(mkdir *sliverpb.Mkdir, con *console.SliverClient) { if mkdir.Response != nil && mkdir.Response.Err != "" { con.PrintErrorf("%s\n", mkdir.Response.Err) return diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 61aa523f70..784a9ec7aa 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func MvCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) (err error) { +func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -78,7 +78,7 @@ func MvCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintMv - Print the renamed file -func PrintMv(mv *sliverpb.Mv, con *console.SliverConsoleClient) { +func PrintMv(mv *sliverpb.Mv, con *console.SliverClient) { if mv.Response != nil && mv.Response.Err != "" { con.PrintErrorf("%s\n", mv.Response.Err) return diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 865de3bd8c..01b0981561 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -31,7 +31,7 @@ import ( ) // PwdCmd - Print the remote working directory -func PwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -59,7 +59,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintPwd - Print the remote working directory -func PrintPwd(pwd *sliverpb.Pwd, con *console.SliverConsoleClient) { +func PrintPwd(pwd *sliverpb.Pwd, con *console.SliverClient) { if pwd.Response != nil && pwd.Response.Err != "" { con.PrintErrorf("%s\n", pwd.Response.Err) return diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index 72fc88b40d..e954b7b50f 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -31,7 +31,7 @@ import ( ) // RmCmd - Remove a directory from the remote file system -func RmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -74,7 +74,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintRm - Print the rm response -func PrintRm(rm *sliverpb.Rm, con *console.SliverConsoleClient) { +func PrintRm(rm *sliverpb.Rm, con *console.SliverClient) { if rm.Response != nil && rm.Response.Err != "" { con.PrintErrorf("%s\n", rm.Response.Err) return diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 9e163699dc..63ef374ab5 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -36,7 +36,7 @@ import ( ) // UploadCmd - Upload a file to the remote system -func UploadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -111,7 +111,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintUpload - Print the result of the upload command -func PrintUpload(upload *sliverpb.Upload, con *console.SliverConsoleClient) { +func PrintUpload(upload *sliverpb.Upload, con *console.SliverClient) { if upload.Response != nil && upload.Response.Err != "" { con.PrintErrorf("%s\n", upload.Response.Err) return diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index e2a9ff240f..bf475a4665 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -14,7 +14,7 @@ import ( ) // CanariesCmd - Display canaries from the database and their status -func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { canaries, err := con.Rpc.Canaries(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to list canaries %s", err) @@ -29,7 +29,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintCanaries - Print the canaries tracked by the server -func PrintCanaries(con *console.SliverConsoleClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { +func PrintCanaries(con *console.SliverClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index cd5b971859..067248fde1 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { // [ Generate ] -------------------------------------------------------------- generateCmd := &cobra.Command{ Use: consts.GenerateStr, @@ -334,7 +334,7 @@ func coreImplantFlags(name string, cmd *cobra.Command) { } // coreImplantFlagCompletions binds completions to flags registered in coreImplantFlags. -func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverConsoleClient) { +func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverClient) { flags.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { (*comp)["debug-file"] = carapace.ActionFiles() (*comp)["os"] = OSCompleter(con) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index 43820aa7d4..c28c2fdc7c 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -17,7 +17,7 @@ var ( ) // GenerateBeaconCmd - The main command used to generate implant binaries -func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { return @@ -39,7 +39,7 @@ func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } } -func parseBeaconFlags(cmd *cobra.Command, con *console.SliverConsoleClient, config *clientpb.ImplantConfig) error { +func parseBeaconFlags(cmd *cobra.Command, con *console.SliverClient, config *clientpb.ImplantConfig) error { days, _ := cmd.Flags().GetInt64("days") hours, _ := cmd.Flags().GetInt64("hours") minutes, _ := cmd.Flags().GetInt64("minutes") diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index 9fe59c3321..a8c78273c9 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -10,7 +10,7 @@ import ( ) // GenerateInfoCmd - Display information about the Sliver server's compiler configuration -func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to get compiler information: %s\n", err) diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index 6806ffb184..cc73e4d88c 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -34,7 +34,7 @@ import ( ) // GenerateStagerCmd - Generate a stager using Metasploit -func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var stageProto clientpb.StageProtocol lhost, _ := cmd.Flags().GetString("lhost") if lhost == "" { diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index 9e105e31bd..b51bfc30fa 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -89,7 +89,7 @@ var ( ) // GenerateCmd - The main command used to generate implant binaries -func GenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { return @@ -127,7 +127,7 @@ func expandPath(path string) string { return filepath.Join(os.Getenv("HOME"), path[1:]) } -func saveLocation(save, DefaultName string, con *console.SliverConsoleClient) (string, error) { +func saveLocation(save, DefaultName string, con *console.SliverClient) (string, error) { var saveTo string if save == "" { save, _ = os.Getwd() @@ -182,7 +182,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } // Shared function that extracts the compile flags from the grumble context -func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *clientpb.ImplantConfig { +func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb.ImplantConfig { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { name = strings.ToLower(nameF) @@ -405,7 +405,7 @@ func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *cl } // parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled -func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverConsoleClient) (bool, []*commonpb.File) { +func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverClient) (bool, []*commonpb.File) { trafficEncoders, _ := cmd.Flags().GetString("traffic-encoders") encoders := []*commonpb.File{} if trafficEncoders != "" { @@ -425,7 +425,7 @@ func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *consol return false, encoders } -func getTargets(targetOS string, targetArch string, con *console.SliverConsoleClient) (string, string) { +func getTargets(targetOS string, targetArch string, con *console.SliverClient) (string, string) { /* For UX we convert some synonymous terms */ if targetOS == "darwin" || targetOS == "mac" || targetOS == "macos" || targetOS == "osx" { targetOS = "darwin" @@ -778,7 +778,7 @@ func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -func externalBuild(config *clientpb.ImplantConfig, save string, con *console.SliverConsoleClient) (*commonpb.File, error) { +func externalBuild(config *clientpb.ImplantConfig, save string, con *console.SliverClient) (*commonpb.File, error) { potentialBuilders, err := findExternalBuilders(config, con) if err != nil { return nil, err @@ -901,7 +901,7 @@ func externalBuild(config *clientpb.ImplantConfig, save string, con *console.Sli return nil, nil } -func compile(config *clientpb.ImplantConfig, save string, con *console.SliverConsoleClient) (*commonpb.File, error) { +func compile(config *clientpb.ImplantConfig, save string, con *console.SliverClient) (*commonpb.File, error) { if config.IsBeacon { interval := time.Duration(config.BeaconInterval) con.PrintInfof("Generating new %s/%s beacon implant binary (%v)\n", config.GOOS, config.GOARCH, interval) @@ -994,7 +994,7 @@ func getLimitsString(config *clientpb.ImplantConfig) string { return strings.Join(limits, "; ") } -func checkBuildTargetCompatibility(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverConsoleClient) bool { +func checkBuildTargetCompatibility(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverClient) bool { if format == clientpb.OutputFormat_EXECUTABLE { return true // We don't need cross-compilers when targeting EXECUTABLE formats } @@ -1035,7 +1035,7 @@ func hasCC(targetOS string, targetArch string, crossCompilers []*clientpb.CrossC return false } -func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverConsoleClient) bool { +func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverClient) bool { con.PrintWarnf("Missing cross-compiler for %s on %s/%s\n", nameOfOutputFormat(format), targetOS, targetArch) switch targetOS { case "windows": @@ -1053,7 +1053,7 @@ func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, tar return confirm } -func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverConsoleClient) ([]*clientpb.Builder, error) { +func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverClient) ([]*clientpb.Builder, error) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { return nil, err @@ -1079,7 +1079,7 @@ func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverCon return validBuilders, nil } -func selectExternalBuilder(builders []*clientpb.Builder, con *console.SliverConsoleClient) (*clientpb.Builder, error) { +func selectExternalBuilder(builders []*clientpb.Builder, con *console.SliverClient) (*clientpb.Builder, error) { choices := []string{} for _, builder := range builders { choices = append(choices, builder.Name) diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index f234c09159..41ade08c58 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -12,7 +12,7 @@ import ( ) // GetSliverBinary - Get the binary of an implant based on it's profile -func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverConsoleClient) ([]byte, error) { +func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient) ([]byte, error) { var data []byte // get implant builds builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) @@ -59,7 +59,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverConsol } // FormatCompleter completes builds' architectures. -func ArchCompleter(con *console.SliverConsoleClient) carapace.Action { +func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { @@ -93,7 +93,7 @@ func ArchCompleter(con *console.SliverConsoleClient) carapace.Action { } // FormatCompleter completes build operating systems -func OSCompleter(con *console.SliverConsoleClient) carapace.Action { +func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { @@ -136,7 +136,7 @@ func FormatCompleter() carapace.Action { } // TrafficEncoderCompleter - Completes the names of traffic encoders -func TrafficEncodersCompleter(con *console.SliverConsoleClient) carapace.Action { +func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index acb6f6b92e..f9b539e2d5 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -12,7 +12,7 @@ import ( ) // ImplantsRmCmd - Deletes an archived implant build from the server -func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") if name == "" { diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 5553188b0a..826c2f9bd8 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -44,7 +44,7 @@ type ImplantBuildFilter struct { } // ImplantsCmd - Displays archived implant builds -func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -60,7 +60,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintImplantBuilds - Print the implant builds on the server -func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverConsoleClient) { +func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -124,7 +124,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl } // ImplantBuildNameCompleter - Completer for implant build names -func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -194,7 +194,7 @@ func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action } // ImplantBuildByName - Get an implant build by name -func ImplantBuildByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantConfig { +func ImplantBuildByName(name string, con *console.SliverClient) *clientpb.ImplantConfig { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { return nil diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index f83ab231e2..fcc05e53ae 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -30,7 +30,7 @@ import ( ) // ProfilesGenerateCmd - Generate an implant binary based on a profile -func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 8d04ff0a85..04f9c5b4c3 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -27,7 +27,7 @@ import ( ) // ProfilesNewCmd - Create a new implant profile -func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] @@ -50,7 +50,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // ProfilesNewBeaconCmd - Create a new beacon profile -func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index 4015c4ea87..55bc75289f 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -30,7 +30,7 @@ import ( ) // ProfilesRmCmd - Delete an implant profile -func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 2fc45faa77..592e0b62fc 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -36,7 +36,7 @@ import ( ) // ProfilesCmd - Display implant profiles -func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profiles := getImplantProfiles(con) if profiles == nil { return @@ -50,7 +50,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintProfiles - Print the profiles -func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverConsoleClient) { +func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -97,7 +97,7 @@ func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverConso con.Printf("%s\n", tw.Render()) } -func getImplantProfiles(con *console.SliverConsoleClient) []*clientpb.ImplantProfile { +func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -107,7 +107,7 @@ func getImplantProfiles(con *console.SliverConsoleClient) []*clientpb.ImplantPro } // GetImplantProfileByName - Get an implant profile by a specific name -func GetImplantProfileByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantProfile { +func GetImplantProfileByName(name string, con *console.SliverClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -264,7 +264,7 @@ func populateProfileProperties(config *clientpb.ImplantConfig) map[string]string } // PrintProfileInfo - Print detailed information about a given profile -func PrintProfileInfo(name string, con *console.SliverConsoleClient) { +func PrintProfileInfo(name string, con *console.SliverClient) { profile := GetImplantProfileByName(name, con) if profile == nil { con.PrintErrorf("Could not find a profile with the name \"%s\"", name) @@ -421,7 +421,7 @@ func PrintProfileInfo(name string, con *console.SliverConsoleClient) { } // ProfileNameCompleter - Completer for implant build names -func ProfileNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 2720a383df..65a69eae1f 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -29,7 +29,7 @@ import ( ) // RegenerateCmd - Download an archived implant build/binary -func RegenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { save, _ := cmd.Flags().GetString("save") if save == "" { save, _ = os.Getwd() diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 539d4dd3c0..899033907e 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -43,7 +43,7 @@ import ( ) // TrafficEncodersCmd - Generate traffic encoders command implementation -func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() encoderMap, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) @@ -55,7 +55,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar } // DisplayTrafficEncoders - Display traffic encoders map from server -func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverConsoleClient) { +func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -84,7 +84,7 @@ func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console } // TrafficEncodersAddCmd - Add a new traffic encoder to the server -func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -167,7 +167,7 @@ func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { } // displayTrafficEncoderTests - Display traffic encoder tests in real time -func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverConsoleClient) { +func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverClient) { listenerID, events := con.CreateEventListener() defer con.RemoveEventListener(listenerID) lineCount := 0 @@ -192,7 +192,7 @@ func displayTrafficEncoderTestProgress(testID string, completed chan interface{} } // clearLines - Clear a number of lines from the console -func clearLines(count int, con *console.SliverConsoleClient) { +func clearLines(count int, con *console.SliverClient) { for i := 0; i < count; i++ { con.Printf(console.Clearln + "\r") con.Printf(console.UpN, 1) @@ -200,7 +200,7 @@ func clearLines(count int, con *console.SliverConsoleClient) { } // displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written -func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverConsoleClient) int { +func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -246,7 +246,7 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest } // TrafficEncodersRemoveCmd - Remove a traffic encoder -func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, cancel := con.GrpcContext(cmd) defer cancel() @@ -273,7 +273,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClie } // SelectTrafficEncoder - Select a traffic encoder from a list -func SelectTrafficEncoder(con *console.SliverConsoleClient) string { +func SelectTrafficEncoder(con *console.SliverClient) string { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() encoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index e9a92634ef..dcb7f97b6a 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { hostsCmd := &cobra.Command{ Use: consts.HostsStr, Short: "Manage the database of hosts", diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index b8b2ad47fc..f75ec4ec6e 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -27,7 +27,7 @@ import ( ) // HostsIOCRmCmd - Remove a host from the database -func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index b52d409995..2fa469eee2 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -34,7 +34,7 @@ import ( ) // HostsIOCCmd - Remove a host from the database -func HostsIOCCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsIOCCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { con.PrintErrorf("%s\n", err) @@ -48,7 +48,7 @@ func HostsIOCCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func hostIOCsTable(host *clientpb.Host, con *console.SliverConsoleClient) string { +func hostIOCsTable(host *clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(table.StyleBold) tw.AppendHeader(table.Row{"File Path", "SHA-256"}) @@ -61,7 +61,7 @@ func hostIOCsTable(host *clientpb.Host, con *console.SliverConsoleClient) string return tw.Render() } -func SelectHostIOC(host *clientpb.Host, con *console.SliverConsoleClient) (*clientpb.IOC, error) { +func SelectHostIOC(host *clientpb.Host, con *console.SliverClient) (*clientpb.IOC, error) { // Sort the keys because maps have a randomized order, these keys must be ordered for the selection // to work properly since we rely on the index of the user's selection to find the session in the map var keys []string diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index 0066ed5305..f0b4aca451 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -27,7 +27,7 @@ import ( ) // HostsRmCmd - Remove a host from the database -func HostsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index 5655183884..ab81194921 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -47,7 +47,7 @@ var ( ) // HostsCmd - Main hosts command -func HostsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s", err) @@ -60,7 +60,7 @@ func HostsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } } -func hostsTable(hosts []*clientpb.Host, con *console.SliverConsoleClient) string { +func hostsTable(hosts []*clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -96,7 +96,7 @@ func hostsTable(hosts []*clientpb.Host, con *console.SliverConsoleClient) string return tw.Render() } -func hostSessions(hostUUID string, con *console.SliverConsoleClient) string { +func hostSessions(hostUUID string, con *console.SliverClient) string { hostSessions := SessionsForHost(hostUUID, con) if len(hostSessions) == 0 { return "None" @@ -108,7 +108,7 @@ func hostSessions(hostUUID string, con *console.SliverConsoleClient) string { return fmt.Sprintf("%d", len(sessionIDs)) } -func hostBeacons(hostUUID string, con *console.SliverConsoleClient) string { +func hostBeacons(hostUUID string, con *console.SliverClient) string { beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { return "Error" @@ -127,7 +127,7 @@ func hostBeacons(hostUUID string, con *console.SliverConsoleClient) string { } // SessionsForHost - Find session for a given host by id -func SessionsForHost(hostUUID string, con *console.SliverConsoleClient) []*clientpb.Session { +func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { return []*clientpb.Session{} @@ -142,7 +142,7 @@ func SessionsForHost(hostUUID string, con *console.SliverConsoleClient) []*clien } // SelectHost - Interactively select a host from the database -func SelectHost(con *console.SliverConsoleClient) (*clientpb.Host, error) { +func SelectHost(con *console.SliverClient) (*clientpb.Host, error) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { return nil, err diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 64582c6877..c33aef06d1 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { infoCmd := &cobra.Command{ Use: consts.InfoStr, Short: "Get info about session", @@ -32,7 +32,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // SliverCommands returns all info commands working on an active target. -func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { +func SliverCommands(con *console.SliverClient) []*cobra.Command { pingCmd := &cobra.Command{ Use: consts.PingStr, Short: "Send round trip message to implant (does not use ICMP)", diff --git a/client/command/info/info.go b/client/command/info/info.go index b49083ab02..468e84fb71 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -33,7 +33,7 @@ import ( ) // InfoCmd - Display information about the active session -func InfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func InfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error // Check if we have an active target via 'use' @@ -111,7 +111,7 @@ func InfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // PIDCmd - Get the active session's PID -func PIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -124,7 +124,7 @@ func PIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // UIDCmd - Get the active session's UID -func UIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -137,7 +137,7 @@ func UIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // GIDCmd - Get the active session's GID -func GIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -150,7 +150,7 @@ func GIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // WhoamiCmd - Displays the current user of the active session -func WhoamiCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -195,7 +195,7 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } } -func PrintTokenOwner(cto *sliverpb.CurrentTokenOwner, con *console.SliverConsoleClient) { +func PrintTokenOwner(cto *sliverpb.CurrentTokenOwner, con *console.SliverClient) { if cto.Response != nil && cto.Response.Err != "" { con.PrintErrorf("%s\n", cto.Response.Err) return diff --git a/client/command/info/ping.go b/client/command/info/ping.go index e09ae18410..600ef4c513 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -11,7 +11,7 @@ import ( ) // PingCmd - Send a round trip C2 message to an implant (does not use ICMP) -func PingCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PingCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 17f255a77c..7ecf238d94 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { // Job control jobsCmd := &cobra.Command{ Use: consts.JobsStr, diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index fc447adab6..1c58ec32e2 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -29,7 +29,7 @@ import ( ) // DNSListenerCmd - Start a DNS lisenter -func DNSListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domainsF, _ := cmd.Flags().GetString("domains") domains := strings.Split(domainsF, ",") for index, domain := range domains { diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index f4ac3941f6..d97b39d815 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -29,7 +29,7 @@ import ( ) // HTTPListenerCmd - Start an HTTP listener -func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index 474c32b799..5f3233b2fa 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -32,7 +32,7 @@ import ( ) // HTTPSListenerCmd - Start an HTTPS listener -func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index e65ff66911..ff958e761a 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -37,7 +37,7 @@ import ( ) // JobsCmd - Manage server jobs (listeners, etc) -func JobsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if pid, _ := cmd.Flags().GetInt32("kill"); pid != -1 { jobKill(uint32(pid), con) } else if all, _ := cmd.Flags().GetBool("kill-all"); all { @@ -62,7 +62,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // PrintJobs - Prints a list of active jobs -func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverConsoleClient) { +func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -91,7 +91,7 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverConsoleClient) } // JobsIDCompleter completes jobs IDs with descriptions. -func JobsIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { @@ -112,7 +112,7 @@ func JobsIDCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(callback) } -func jobKill(jobID uint32, con *console.SliverConsoleClient) { +func jobKill(jobID uint32, con *console.SliverClient) { con.PrintInfof("Killing job #%d ...\n", jobID) jobKill, err := con.Rpc.KillJob(context.Background(), &clientpb.KillJobReq{ ID: jobID, @@ -124,7 +124,7 @@ func jobKill(jobID uint32, con *console.SliverConsoleClient) { } } -func killAllJobs(con *console.SliverConsoleClient) { +func killAllJobs(con *console.SliverClient) { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 89f87cbe34..93256d8c84 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -28,7 +28,7 @@ import ( ) // MTLSListenerCmd - Start an mTLS listener -func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") persistent, _ := cmd.Flags().GetBool("persistent") diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index d14b29df91..567dfa1f89 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -38,7 +38,7 @@ import ( ) // StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name -func StageListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profileName, _ := cmd.Flags().GetString("profile") listenerURL, _ := cmd.Flags().GetString("url") aesEncryptKey, _ := cmd.Flags().GetString("aes-encrypt-key") diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index 9cc244be1c..da97dc675e 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -28,7 +28,7 @@ import ( ) // WGListenerCmd - Start a WireGuard listener -func WGListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lport, _ := cmd.Flags().GetUint32("lport") nport, _ := cmd.Flags().GetUint32("nport") keyExchangePort, _ := cmd.Flags().GetUint32("key-port") diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go index e9b0bdac15..2128351edc 100644 --- a/client/command/kill/commands.go +++ b/client/command/kill/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { killCmd := &cobra.Command{ Use: consts.KillStr, Short: "Kill a session", diff --git a/client/command/kill/kill.go b/client/command/kill/kill.go index 4c982d855d..250a104e95 100644 --- a/client/command/kill/kill.go +++ b/client/command/kill/kill.go @@ -32,7 +32,7 @@ import ( ) // KillCmd - Kill the active session (not to be confused with TerminateCmd) -func KillCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func KillCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() // Confirm with the user, just in case they confused kill with terminate confirm := false @@ -67,7 +67,7 @@ func KillCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string con.PrintErrorf("No active session or beacon\n") } -func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) error { if session == nil { return errors.New("session does not exist") } @@ -84,7 +84,7 @@ func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.Sli return err } -func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.SliverClient) error { if beacon == nil { return errors.New("session does not exist") } diff --git a/client/command/licenses/commands.go b/client/command/licenses/commands.go index d0a9b18396..e1ade622e5 100644 --- a/client/command/licenses/commands.go +++ b/client/command/licenses/commands.go @@ -10,7 +10,7 @@ import ( ) // Commands returns the `licences` command. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { licensesCmd := &cobra.Command{ Use: consts.LicensesStr, Short: "Open source licenses", diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index 8b2368f4b5..dd22b06216 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { lootCmd := &cobra.Command{ Use: consts.LootStr, Short: "Manage the server's loot store", @@ -120,11 +120,11 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // FileTypeCompleter completes valid filetypes for loot. -func FileTypeCompleter(con *console.SliverConsoleClient) carapace.Action { +func FileTypeCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValues("binary", "text").Tag("loot file type") } // LootTypeCompleter completes valid loot type for a loot. -func LootTypeCompleter(con *console.SliverConsoleClient) carapace.Action { +func LootTypeCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValues("file", "cred").Tag("loot type") } diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index 0688fe0630..5f778da404 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -27,7 +27,7 @@ import ( ) // LootFetchCmd - Display the contents of or download a piece of loot -func LootFetchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 696cf44301..446a595f71 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -33,7 +33,7 @@ import ( ) // LootAddLocalCmd - Add a local file to the server as loot -func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { localPath := args[0] if _, err := os.Stat(localPath); os.IsNotExist(err) { con.PrintErrorf("Path '%s' not found\n", localPath) diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 0fbf41a3c9..faf48d9fdb 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -38,7 +38,7 @@ import ( ) // LootCmd - The loot root command -func LootCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allLoot, err := con.Rpc.LootAll(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to fetch loot %s\n", err) @@ -48,7 +48,7 @@ func LootCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // PrintAllFileLootTable - Displays a table of all file loot -func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverConsoleClient) { +func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) { if allLoot == nil || len(allLoot.Loot) == 0 { con.PrintInfof("No loot 🙁\n") return @@ -77,7 +77,7 @@ func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverConsole } // PrintLootFile - Display the contents of a piece of loot -func PrintLootFile(loot *clientpb.Loot, con *console.SliverConsoleClient) { +func PrintLootFile(loot *clientpb.Loot, con *console.SliverClient) { if loot.File == nil { return } diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 3b8460a504..940fbc4f25 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -55,7 +55,7 @@ func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileTy Eventually this function needs to be refactored out, but we made the decision to duplicate it for now */ -func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con *console.SliverConsoleClient) (*sliverpb.Download, error) { +func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con *console.SliverClient) (*sliverpb.Download, error) { ctrl := make(chan bool) con.SpinUntil(fmt.Sprintf("%s -> %s", fileName, "loot"), ctrl) download, err := con.Rpc.Download(context.Background(), &sliverpb.DownloadReq{ @@ -107,7 +107,7 @@ func CreateLootMessage(fileName string, lootName string, lootFileType clientpb.F return lootMessage } -func SendLootMessage(loot *clientpb.Loot, con *console.SliverConsoleClient) { +func SendLootMessage(loot *clientpb.Loot, con *console.SliverClient) { control := make(chan bool) con.SpinUntil(fmt.Sprintf("Sending looted file (%s) to the server...", loot.Name), control) @@ -125,7 +125,7 @@ func SendLootMessage(loot *clientpb.Loot, con *console.SliverConsoleClient) { } } -func LootDownload(download *sliverpb.Download, lootName string, fileType clientpb.FileType, cmd *cobra.Command, con *console.SliverConsoleClient) { +func LootDownload(download *sliverpb.Download, lootName string, fileType clientpb.FileType, cmd *cobra.Command, con *console.SliverClient) { // Was the download successful? if download.Response != nil && download.Response.Err != "" { con.PrintErrorf("%s\n", download.Response.Err) @@ -198,7 +198,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp } // LootAddRemoteCmd - Add a file from the remote system to the server as loot -func LootAddRemoteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootAddRemoteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index ad45133016..0666870d67 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -29,7 +29,7 @@ import ( ) // LootRenameCmd - Rename a piece of loot -func LootRenameCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index fef220e102..7377fba9d4 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -26,7 +26,7 @@ import ( "github.com/bishopfox/sliver/client/console" ) -func LootRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index 3a3080ee5d..da7c962e0c 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -8,7 +8,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { monitorCmd := &cobra.Command{ Use: consts.MonitorStr, Short: "Monitor threat intel platforms for Sliver implants", diff --git a/client/command/monitor/start.go b/client/command/monitor/start.go index d9133591e1..bafb59b16e 100644 --- a/client/command/monitor/start.go +++ b/client/command/monitor/start.go @@ -28,7 +28,7 @@ import ( ) // MonitorStartCmd - Start monitoring threat intel for implants -func MonitorStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MonitorStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { resp, err := con.Rpc.MonitorStart(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/monitor/stop.go b/client/command/monitor/stop.go index d4b553ea23..5857750e60 100644 --- a/client/command/monitor/stop.go +++ b/client/command/monitor/stop.go @@ -28,7 +28,7 @@ import ( ) // MonitorStopCmd - Stop monitoring threat intel for implants -func MonitorStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MonitorStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, err := con.Rpc.MonitorStop(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/network/commands.go b/client/command/network/commands.go index 31fd801e9f..137e5f68c5 100644 --- a/client/command/network/commands.go +++ b/client/command/network/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { ifconfigCmd := &cobra.Command{ Use: consts.IfconfigStr, Short: "View network interface configurations", diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index 529b17d314..d72969cc5a 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -36,7 +36,7 @@ import ( ) // IfconfigCmd - Display network interfaces on the remote system -func IfconfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -65,7 +65,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintIfconfig - Print the ifconfig response -func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverConsoleClient) { +func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverClient) { var err error interfaces := ifconfig.NetInterfaces sort.Slice(interfaces, func(i, j int) bool { diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index e576c6e543..452c6d672f 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -34,7 +34,7 @@ import ( ) // NetstatCmd - Display active network connections on the remote system -func NetstatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -77,7 +77,7 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } } -func PrintNetstat(netstat *sliverpb.Netstat, implantPID int32, activeC2 string, numeric bool, con *console.SliverConsoleClient) { +func PrintNetstat(netstat *sliverpb.Netstat, implantPID int32, activeC2 string, numeric bool, con *console.SliverClient) { lookup := func(skaddr *sliverpb.SockTabEntry_SockAddr) string { addr := skaddr.Ip names, err := net.LookupAddr(addr) diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go index 2713a124b3..acdf6c7835 100644 --- a/client/command/operators/commands.go +++ b/client/command/operators/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { operatorsCmd := &cobra.Command{ Use: consts.OperatorsStr, Short: "Manage operators", diff --git a/client/command/operators/operators.go b/client/command/operators/operators.go index 792d227ca9..70824a341d 100644 --- a/client/command/operators/operators.go +++ b/client/command/operators/operators.go @@ -32,7 +32,7 @@ import ( ) // OperatorsCmd - Display operators and current online status -func OperatorsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func OperatorsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { operators, err := con.Rpc.GetOperators(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -43,7 +43,7 @@ func OperatorsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } } -func displayOperators(operators []*clientpb.Operator, con *console.SliverConsoleClient) { +func displayOperators(operators []*clientpb.Operator, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index 9a3362da71..92a0b7db73 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { pivotsCmd := &cobra.Command{ Use: consts.PivotsStr, Short: "List pivots for active session", diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index db21e9dde2..c7ab12571b 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -31,7 +31,7 @@ import ( ) // PivotDetailsCmd - Display pivots for all sessions -func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -71,7 +71,7 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintPivotListenerDetails - Print details of a single pivot listener -func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.SliverConsoleClient) { +func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.SliverClient) { con.Printf("\n") con.Printf(" ID: %d\n", listener.ID) con.Printf(" Protocol: %s\n", PivotTypeToString(listener.Type)) diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 0c8ad0f3ce..5e067cc146 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -30,7 +30,7 @@ import ( ) // PivotsGraphCmd - Display pivots for all sessions -func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { graph, err := con.Rpc.PivotGraph(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index b83f27a9b2..ea933ce4c7 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -35,7 +35,7 @@ import ( ) // SelectPivotListener - Interactive menu to select a pivot listener -func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.SliverConsoleClient) (*sliverpb.PivotListener, error) { +func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.SliverClient) (*sliverpb.PivotListener, error) { // Render selection table buf := bytes.NewBufferString("") table := tabwriter.NewWriter(buf, 0, 2, 2, ' ', 0) @@ -67,7 +67,7 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive } // PivotIDCompleter completes pivot listeners' IDs. -func PivotIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index a883bdbdab..fef208f5ef 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -30,7 +30,7 @@ import ( ) // PivotsCmd - Display pivots for all sessions -func PivotsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -55,7 +55,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintPivotListeners - Print a table of pivot listeners -func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverConsoleClient) { +func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/pivots/start.go b/client/command/pivots/start.go index 34658b9eea..69f38e8ddf 100644 --- a/client/command/pivots/start.go +++ b/client/command/pivots/start.go @@ -29,7 +29,7 @@ import ( ) // StartTCPListenerCmd - Start a TCP pivot listener on the remote system -func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -53,7 +53,7 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system -func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 39caac33ab..6487d08e4d 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -28,7 +28,7 @@ import ( ) // StopPivotListenerCmd - Start a TCP pivot listener on the remote system -func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index 003c247443..bf4930a6c8 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { portfwdCmd := &cobra.Command{ Use: consts.PortfwdStr, Short: "In-band TCP port forwarding", diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 36559441df..a85e03e6a1 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -35,7 +35,7 @@ import ( var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") // PortfwdAddCmd - Add a new tunneled port forward -func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index ebcc5f5bda..f09f1281c5 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -26,7 +26,7 @@ import ( ) // PortfwdRmCmd - Remove an existing tunneled port forward -func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { portfwdID, _ := cmd.Flags().GetInt("id") if portfwdID < 1 { con.PrintErrorf("Must specify a valid portfwd id\n") diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 82c667168b..b7cfee7b5e 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -33,12 +33,12 @@ import ( ) // PortfwdCmd - Display information about tunneled port forward(s) -func PortfwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PortfwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintPortfwd(con) } // PrintPortfwd - Print the port forward(s) -func PrintPortfwd(con *console.SliverConsoleClient) { +func PrintPortfwd(con *console.SliverClient) { portfwds := core.Portfwds.List() if len(portfwds) == 0 { con.PrintInfof("No port forwards\n") @@ -68,7 +68,7 @@ func PrintPortfwd(con *console.SliverConsoleClient) { } // PortfwdIDCompleter completes IDs of local portforwarders -func PortfwdIDCompleter(_ *console.SliverConsoleClient) carapace.Action { +func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go index 9167d3037b..f152788fdf 100644 --- a/client/command/prelude-operator/commands.go +++ b/client/command/prelude-operator/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { operatorCmd := &cobra.Command{ Use: consts.PreludeOperatorStr, Short: "Manage connection to Prelude's Operator", diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index 93e9ee9c10..be07ff9aba 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -29,7 +29,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" ) -func ConnectCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { url := args[0] aesKey, _ := cmd.Flags().GetString("aes-key") agentRange, _ := cmd.Flags().GetString("range") diff --git a/client/command/prelude-operator/operator.go b/client/command/prelude-operator/operator.go index af91ba9d4f..f36a692150 100644 --- a/client/command/prelude-operator/operator.go +++ b/client/command/prelude-operator/operator.go @@ -25,7 +25,7 @@ import ( "github.com/bishopfox/sliver/client/prelude" ) -func OperatorCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func OperatorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if prelude.ImplantMapper != nil { con.PrintInfof("Connected to Operator at %s\n", prelude.ImplantMapper.GetConfig().OperatorURL) return diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go index 995fec1bc8..32095e4a7d 100644 --- a/client/command/privilege/commands.go +++ b/client/command/privilege/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { runAsCmd := &cobra.Command{ Use: consts.RunAsStr, Short: "Run a new process in the context of the designated user (Windows Only)", diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 13baa95a01..6dcc14307e 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -32,7 +32,7 @@ import ( ) // GetPrivsCmd - Get the current process privileges (Windows only) -func GetPrivsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -67,7 +67,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintGetPrivs - Print the results of the get privs command -func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverConsoleClient) { +func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverClient) { // Response is the Envelope (see RPC API), Err is part of it. if privs.Response != nil && privs.Response.Err != "" { con.PrintErrorf("NOTE: Information may be incomplete due to an error:\n") diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index 42771d77ba..20b862760b 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -31,7 +31,7 @@ import ( ) // GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system -func GetSystemCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -75,7 +75,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintGetSystem - Print the results of get system -func PrintGetSystem(getsystemResp *sliverpb.GetSystem, con *console.SliverConsoleClient) { +func PrintGetSystem(getsystemResp *sliverpb.GetSystem, con *console.SliverClient) { if getsystemResp.Response != nil && getsystemResp.Response.GetErr() != "" { con.PrintErrorf("%s\n", getsystemResp.GetResponse().GetErr()) return diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index 5fb3290726..95d764e81f 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -31,7 +31,7 @@ import ( ) // ImpersonateCmd - Windows only, impersonate a user token -func ImpersonateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -63,7 +63,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // PrintImpersonate - Print the results of the attempted impersonation -func PrintImpersonate(impersonate *sliverpb.Impersonate, username string, con *console.SliverConsoleClient) { +func PrintImpersonate(impersonate *sliverpb.Impersonate, username string, con *console.SliverClient) { if impersonate.Response != nil && impersonate.Response.GetErr() != "" { con.PrintErrorf("%s\n", impersonate.Response.GetErr()) return diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index ae1ee3fcc1..f3b02aad01 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -41,7 +41,7 @@ var logonTypes = map[string]uint32{ } // MakeTokenCmd - Windows only, create a token using "valid" credentails -func MakeTokenCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -95,7 +95,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintMakeToken - Print the results of attempting to make a token -func PrintMakeToken(makeToken *sliverpb.MakeToken, domain string, username string, con *console.SliverConsoleClient) { +func PrintMakeToken(makeToken *sliverpb.MakeToken, domain string, username string, con *console.SliverClient) { if makeToken.Response != nil && makeToken.Response.GetErr() != "" { con.PrintErrorf("%s\n", makeToken.Response.GetErr()) return diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index 2b5dea324a..069b8b329a 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -31,7 +31,7 @@ import ( ) // RevToSelfCmd - Drop any impersonated tokens -func RevToSelfCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -61,7 +61,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintRev2Self - Print the result of revert to self -func PrintRev2Self(revert *sliverpb.RevToSelf, con *console.SliverConsoleClient) { +func PrintRev2Self(revert *sliverpb.RevToSelf, con *console.SliverClient) { if revert.Response != nil && revert.Response.GetErr() != "" { con.PrintErrorf("%s\n", revert.Response.GetErr()) return diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index a83e6c5576..ade8aa8768 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -31,7 +31,7 @@ import ( ) // RunAsCmd - Run a command as another user on the remote system -func RunAsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -87,7 +87,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintRunAs - Print the result of run as -func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con *console.SliverConsoleClient) { +func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con *console.SliverClient) { if runAs.Response != nil && runAs.Response.GetErr() != "" { con.PrintErrorf("%s\n", runAs.Response.GetErr()) return diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index 9fab3d63c5..b473d89648 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { psCmd := &cobra.Command{ Use: consts.PsStr, Short: "List remote processes", diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index 904de72bab..bd3f59d75e 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -36,7 +36,7 @@ import ( ) // ProcdumpCmd - Dump the memory of a remote process -func ProcdumpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -107,7 +107,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintProcessDump - Handle the results of a process dump -func PrintProcessDump(dump *sliverpb.ProcessDump, saveTo string, hostname string, pid int, con *console.SliverConsoleClient) { +func PrintProcessDump(dump *sliverpb.ProcessDump, saveTo string, hostname string, pid int, con *console.SliverClient) { var err error var saveToFile *os.File if saveTo == "" { @@ -139,7 +139,7 @@ func getHostname(session *clientpb.Session, beacon *clientpb.Beacon) string { return "" } -func LootProcessDump(dump *sliverpb.ProcessDump, lootName string, hostName string, pid int, con *console.SliverConsoleClient) { +func LootProcessDump(dump *sliverpb.ProcessDump, lootName string, hostName string, pid int, con *console.SliverClient) { timeNow := time.Now().UTC() dumpFileName := fmt.Sprintf("procdump_%s_%d_%s.dmp", hostName, pid, timeNow.Format("20060102150405")) diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 73d7da514b..dbea16aa30 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -89,7 +89,7 @@ var knownSecurityTools = map[string][]string{ } // PsCmd - List processes on the remote system -func PsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -137,7 +137,7 @@ func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { } // PrintPS - Prints the process list -func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, con *console.SliverConsoleClient) { +func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, con *console.SliverClient) { pidFilter, _ := flags.GetInt("pid") exeFilter, _ := flags.GetString("exe") ownerFilter, _ := flags.GetString("owner") @@ -212,7 +212,7 @@ func findKnownSecurityProducts(ps *sliverpb.Ps) []string { } // procRow - Stylizes the process information -func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console.SliverConsoleClient) table.Row { +func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console.SliverClient) table.Row { session, beacon := con.ActiveTarget.GetInteractive() color := console.Normal @@ -287,7 +287,7 @@ func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console } // GetPIDByName - Get a PID by name from the active session -func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverConsoleClient) int { +func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverClient) int { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index b00f35f804..f7b91d9983 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -31,7 +31,7 @@ import ( ) // TerminateCmd - Terminate a process on the remote system -func TerminateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { con.PrintErrorf("No active session or beacon\n") @@ -72,7 +72,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintTerminate - Print the results of the terminate command -func PrintTerminate(terminated *sliverpb.Terminate, con *console.SliverConsoleClient) { +func PrintTerminate(terminated *sliverpb.Terminate, con *console.SliverClient) { if terminated.Response != nil && terminated.Response.GetErr() != "" { con.PrintErrorf("%s\n", terminated.Response.GetErr()) } else { diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index 5c8d215a30..56a05f88e4 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { reactionCmd := &cobra.Command{ Use: consts.ReactionStr, Short: "Manage automatic reactions to events", diff --git a/client/command/reaction/helpers.go b/client/command/reaction/helpers.go index 0e7d22b247..41b264fc37 100644 --- a/client/command/reaction/helpers.go +++ b/client/command/reaction/helpers.go @@ -86,7 +86,7 @@ func isReactable(reaction core.Reaction) bool { } // ReactionIDCompleter completes saved/available reaction IDs -func ReactionIDCompleter(_ *console.SliverConsoleClient) carapace.Action { +func ReactionIDCompleter(_ *console.SliverClient) carapace.Action { results := make([]string, 0) for _, reaction := range core.Reactions.All() { diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 2cd3cf0fa7..9e41468e24 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -32,7 +32,7 @@ import ( ) // ReactionCmd - Manage reactions to events -func ReactionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { totalReactions := 0 for _, eventType := range core.ReactableEvents { reactions := core.Reactions.On(eventType) @@ -49,7 +49,7 @@ func ReactionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func displayReactionsTable(eventType string, reactions []core.Reaction, con *console.SliverConsoleClient) { +func displayReactionsTable(eventType string, reactions []core.Reaction, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(fmt.Sprintf(console.Bold+"%s"+console.Normal, EventTypeToTitle(eventType))) diff --git a/client/command/reaction/reload.go b/client/command/reaction/reload.go index 37444ff854..fb34a6271e 100644 --- a/client/command/reaction/reload.go +++ b/client/command/reaction/reload.go @@ -28,7 +28,7 @@ import ( ) // ReactionSaveCmd - Manage reactions to events -func ReactionReloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionReloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if _, err := os.Stat(GetReactionFilePath()); os.IsNotExist(err) { con.PrintErrorf("Missing reaction file %s\n", GetReactionFilePath()) return diff --git a/client/command/reaction/save.go b/client/command/reaction/save.go index b98687bc8f..c4d796390f 100644 --- a/client/command/reaction/save.go +++ b/client/command/reaction/save.go @@ -30,7 +30,7 @@ import ( ) // ReactionSaveCmd - Manage reactions to events -func ReactionSaveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionPath := GetReactionFilePath() if _, err := os.Stat(reactionPath); !os.IsNotExist(err) { confirm := false diff --git a/client/command/reaction/set.go b/client/command/reaction/set.go index eb104615ce..05c286f396 100644 --- a/client/command/reaction/set.go +++ b/client/command/reaction/set.go @@ -33,7 +33,7 @@ import ( var ErrNonReactableEvent = errors.New("non-reactable event type") // ReactionSetCmd - Set a reaction upon an event -func ReactionSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { eventType, err := getEventType(cmd, con) if err != nil { con.PrintErrorf("%s\n", err) @@ -63,7 +63,7 @@ func ReactionSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ con.PrintInfof("Set reaction to %s (id: %d)\n", eventType, reaction.ID) } -func getEventType(cmd *cobra.Command, con *console.SliverConsoleClient) (string, error) { +func getEventType(cmd *cobra.Command, con *console.SliverClient) (string, error) { rawEventType, _ := cmd.Flags().GetString("event") if rawEventType == "" { return selectEventType(con) @@ -77,7 +77,7 @@ func getEventType(cmd *cobra.Command, con *console.SliverConsoleClient) (string, } } -func selectEventType(con *console.SliverConsoleClient) (string, error) { +func selectEventType(con *console.SliverClient) (string, error) { prompt := &survey.Select{ Message: "Select an event:", Options: core.ReactableEvents, diff --git a/client/command/reaction/unset.go b/client/command/reaction/unset.go index 7ffe541060..7b785478d1 100644 --- a/client/command/reaction/unset.go +++ b/client/command/reaction/unset.go @@ -33,7 +33,7 @@ import ( ) // ReactionUnsetCmd - Unset a reaction upon an event -func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionID, _ := cmd.Flags().GetInt("id") if reactionID == 0 { reaction, err := selectReaction(con) @@ -53,7 +53,7 @@ func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args con.Println() } -func selectReaction(con *console.SliverConsoleClient) (*core.Reaction, error) { +func selectReaction(con *console.SliverClient) (*core.Reaction, error) { outputBuf := bytes.NewBufferString("") table := tabwriter.NewWriter(outputBuf, 0, 2, 2, ' ', 0) allReactions := core.Reactions.All() diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index 5e52838177..5022c9acf3 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { reconfigCmd := &cobra.Command{ Use: consts.ReconfigStr, Short: "Reconfigure the active beacon/session", diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index 2800d345f4..fce35800d2 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -32,7 +32,7 @@ import ( ) // ReconfigCmd - Reconfigure metadata about a sessions -func ReconfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index 7866036a50..d4012281dc 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -29,7 +29,7 @@ import ( ) // RecnameCmd - Reconfigure metadata about a sessions -func RenameCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go index 228cf37e40..fec21cf040 100644 --- a/client/command/registry/commands.go +++ b/client/command/registry/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { registryCmd := &cobra.Command{ Use: consts.RegistryStr, Short: "Windows registry operations", diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index 275b2eed09..1791e8c018 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -32,7 +32,7 @@ import ( ) // RegCreateKeyCmd - Create a new Windows registry key -func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -98,7 +98,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintCreateKey - Print the results of the create key command -func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key string, con *console.SliverConsoleClient) { +func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key string, con *console.SliverClient) { if createKey.Response != nil && createKey.Response.Err != "" { con.PrintErrorf("%s", createKey.Response.Err) return diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index 7f846433db..80f80c484c 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -32,7 +32,7 @@ import ( ) // RegDeleteKeyCmd - Remove a Windows registry key -func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -98,7 +98,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintDeleteKey - Print the results of the delete key command -func PrintDeleteKey(deleteKey *sliverpb.RegistryDeleteKey, regPath string, key string, con *console.SliverConsoleClient) { +func PrintDeleteKey(deleteKey *sliverpb.RegistryDeleteKey, regPath string, key string, con *console.SliverClient) { if deleteKey.Response != nil && deleteKey.Response.Err != "" { con.PrintErrorf("%s", deleteKey.Response.Err) return diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index a25c00f29f..3bafb2a571 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -31,7 +31,7 @@ import ( ) // RegListSubKeysCmd - List sub registry keys -func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -73,7 +73,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // PrintListSubKeys - Print the list sub keys command result -func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath string, con *console.SliverConsoleClient) { +func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) return @@ -87,7 +87,7 @@ func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath } // RegListValuesCmd - List registry values -func RegListValuesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -124,7 +124,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintListValues - Print the registry list values -func PrintListValues(regList *sliverpb.RegistryValuesList, hive string, regPath string, con *console.SliverConsoleClient) { +func PrintListValues(regList *sliverpb.RegistryValuesList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) return diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index 62df3b7117..3109b32e8c 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -75,7 +75,7 @@ func getType(t string) (uint32, error) { } // RegReadCmd - Read a windows registry key: registry read --hostname aa.bc.local --hive HKCU "software\google\chrome\blbeacon\version" -func RegReadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( finalPath string key string @@ -146,7 +146,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintRegRead - Print the results of the registry read command -func PrintRegRead(regRead *sliverpb.RegistryRead, con *console.SliverConsoleClient) { +func PrintRegRead(regRead *sliverpb.RegistryRead, con *console.SliverClient) { if regRead.Response != nil && regRead.Response.Err != "" { con.PrintErrorf("%s\n", regRead.Response.Err) return diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index e477b5682e..542f258544 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -35,7 +35,7 @@ import ( ) // RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32 -func RegWriteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -160,7 +160,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintRegWrite - Print the registry write operation -func PrintRegWrite(regWrite *sliverpb.RegistryWrite, con *console.SliverConsoleClient) { +func PrintRegWrite(regWrite *sliverpb.RegistryWrite, con *console.SliverClient) { if regWrite.Response != nil && regWrite.Response.Err != "" { con.PrintErrorf("%s", regWrite.Response.Err) return diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index d2b35b6eb7..67c8ed193d 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { rportfwdCmd := &cobra.Command{ Use: consts.RportfwdStr, Short: "reverse port forwardings", diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 55d8b00119..40e3ec0554 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -32,7 +32,7 @@ import ( var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant -func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -66,7 +66,7 @@ func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClie printStartedRportFwdListener(rportfwdListener, con) } -func printStartedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverConsoleClient) { +func printStartedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { if rportfwdListener.Response != nil && rportfwdListener.Response.Err != "" { con.PrintErrorf("%s", rportfwdListener.Response.Err) return diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index 0d10f9b706..f86857777e 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -28,7 +28,7 @@ import ( ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant -func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -46,7 +46,7 @@ func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClien printStoppedRportFwdListener(rportfwdListener, con) } -func printStoppedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverConsoleClient) { +func printStoppedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { if rportfwdListener.Response != nil && rportfwdListener.Response.Err != "" { con.PrintErrorf("%s", rportfwdListener.Response.Err) return diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 0afcdc7605..9090fc3ae1 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -34,7 +34,7 @@ import ( ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant -func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -50,7 +50,7 @@ func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, PrintRportFwdListeners(rportfwdListeners, cmd.Flags(), con) } -func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags *pflag.FlagSet, con *console.SliverConsoleClient) { +func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags *pflag.FlagSet, con *console.SliverClient) { if rportfwdListeners.Response != nil && rportfwdListeners.Response.Err != "" { con.PrintErrorf("%s\n", rportfwdListeners.Response.Err) return @@ -79,7 +79,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags } // PortfwdIDCompleter completes IDs of remote portforwarders -func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go index 85758509ae..e5c1fbac99 100644 --- a/client/command/screenshot/commands.go +++ b/client/command/screenshot/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { screenshotCmd := &cobra.Command{ Use: consts.ScreenshotStr, Short: "Take a screenshot", diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index f15a884a41..39311d21fb 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -38,7 +38,7 @@ import ( ) // ScreenshotCmd - Take a screenshot of the remote system -func ScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -99,7 +99,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } // PrintScreenshot - Handle the screenshot command response -func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobra.Command, con *console.SliverClient) { timestamp := time.Now().Format("20060102150405") saveTo, _ := cmd.Flags().GetString("save") @@ -130,7 +130,7 @@ func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobr con.PrintInfof("Screenshot written to %s (%s)\n", saveToFile.Name(), util.ByteCountBinary(int64(n))) } -func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName string, con *console.SliverConsoleClient) { +func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName string, con *console.SliverClient) { timeNow := time.Now().UTC() screenshotFileName := fmt.Sprintf("screenshot_%s_%s.png", hostName, timeNow.Format("20060102150405")) diff --git a/client/command/server.go b/client/command/server.go index aca2735397..593b9e9ec4 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -21,9 +21,6 @@ package command import ( "os" - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -51,11 +48,13 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra.Command) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -65,8 +64,8 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. } if serverCmds != nil { - server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) - server.AddCommand(serverCmds()...) + server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) + server.AddCommand(serverCmds()) } // [ Bind commands ] -------------------------------------------------------- diff --git a/client/command/sessions/background.go b/client/command/sessions/background.go index a0e2b49c3b..e60c6a0caf 100644 --- a/client/command/sessions/background.go +++ b/client/command/sessions/background.go @@ -7,7 +7,7 @@ import ( ) // BackgroundCmd - Background the active session -func BackgroundCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BackgroundCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.ActiveTarget.Background() con.PrintInfof("Background ...\n") } diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index e630276989..13e5cb68cb 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -28,7 +28,7 @@ import ( ) // CloseSessionCmd - Close an interactive session but do not kill the remote process -func CloseSessionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CloseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Get the active session session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 65e4de8966..7993731183 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -17,7 +17,7 @@ import ( ) // Commands returns the `sessions` command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { sessionsCmd := &cobra.Command{ Use: consts.SessionsStr, Short: "Session management", @@ -62,7 +62,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // SessionIDCompleter completes session IDs -func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) @@ -85,7 +85,7 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { } // SliverCommands returns all session control commands for the active target. -func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { +func SliverCommands(con *console.SliverClient) []*cobra.Command { backgroundCmd := &cobra.Command{ Use: consts.BackgroundStr, Short: "Background an active session", diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index 0946336fe3..a1b6d6780e 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -42,7 +42,7 @@ var ( ) // SelectSession - Interactive menu for the user to select an session, optionally only display live sessions -func SelectSession(onlyAlive bool, con *console.SliverConsoleClient) (*clientpb.Session, error) { +func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { return nil, err diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index 7ba31e90e7..151ebaf55f 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -32,7 +32,7 @@ import ( ) // InteractiveCmd - Beacon only command to open an interactive session -func InteractiveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, _ []string) { +func InteractiveCmd(cmd *cobra.Command, con *console.SliverClient, _ []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index fdab122411..eaa5010ec0 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -29,7 +29,7 @@ import ( ) // SessionsPruneCmd - Forcefully kill stale sessions -func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index c17ecf6c31..5b8bbcda0e 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -37,7 +37,7 @@ import ( ) // SessionsCmd - Display/interact with sessions -func SessionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { interact, _ := cmd.Flags().GetString("interact") killFlag, _ := cmd.Flags().GetString("kill") killAll, _ := cmd.Flags().GetBool("kill-all") @@ -127,7 +127,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintSessions - Print the current sessions -func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterRegex *regexp.Regexp, con *console.SliverConsoleClient) { +func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { width = 999 diff --git a/client/command/settings/beacons.go b/client/command/settings/beacons.go index 61cd88f51a..6aafeaabab 100644 --- a/client/command/settings/beacons.go +++ b/client/command/settings/beacons.go @@ -26,7 +26,7 @@ import ( ) // SettingsBeaconsAutoResultCmd - The client settings command -func SettingsBeaconsAutoResultCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsBeaconsAutoResultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go index c82e20bd38..f312a6ed84 100644 --- a/client/command/settings/commands.go +++ b/client/command/settings/commands.go @@ -10,7 +10,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { settingsCmd := &cobra.Command{ Use: consts.SettingsStr, Short: "Manage client settings", diff --git a/client/command/settings/opsec.go b/client/command/settings/opsec.go index 40a4e99989..2fc964875d 100644 --- a/client/command/settings/opsec.go +++ b/client/command/settings/opsec.go @@ -27,7 +27,7 @@ import ( ) // SettingsAutoAdultCmd - The client settings command -func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -41,7 +41,7 @@ func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverConsoleClient, } // IsUserAnAdult - This should be called for any dangerous (OPSEC-wise) functions -func IsUserAnAdult(con *console.SliverConsoleClient) bool { +func IsUserAnAdult(con *console.SliverClient) bool { if GetAutoAdult(con) { return true } @@ -52,7 +52,7 @@ func IsUserAnAdult(con *console.SliverConsoleClient) bool { } // GetAutoAdult - Get the current auto adult setting -func GetAutoAdult(con *console.SliverConsoleClient) bool { +func GetAutoAdult(con *console.SliverClient) bool { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() } diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index c0da4c861c..11b13626ad 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -30,7 +30,7 @@ import ( ) // SettingsCmd - The client settings command -func SettingsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -54,7 +54,7 @@ func SettingsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // SettingsAlwaysOverflow - Toggle always overflow -func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -68,7 +68,7 @@ func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverConsoleClient } // SettingsConsoleLogs - Toggle console logs -func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverConsoleClient) { +func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverClient) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -82,7 +82,7 @@ func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverConsoleClient) { } // SettingsSmallTerm - Modify small terminal width value -func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -112,7 +112,7 @@ func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // SettingsTablesCmd - The client settings command -func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -144,7 +144,7 @@ func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // SettingsSaveCmd - The client settings command -func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -162,7 +162,7 @@ func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // SettingsAlwaysOverflow - Toggle always overflow -func SettingsUserConnect(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsUserConnect(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index a285605919..f895aba317 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -128,7 +128,7 @@ var ( ) // GetTableStyle - Get the current table style -func GetTableStyle(con *console.SliverConsoleClient) table.Style { +func GetTableStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() } @@ -141,7 +141,7 @@ func GetTableStyle(con *console.SliverConsoleClient) table.Style { } // GetTableWithBordersStyle - Get the table style with borders -func GetTableWithBordersStyle(con *console.SliverConsoleClient) table.Style { +func GetTableWithBordersStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() } @@ -179,7 +179,7 @@ func PagesOf(renderedTable string) [][]string { } // PaginateTable - Render paginated table to console -func PaginateTable(tw table.Writer, skipPages int, overflow bool, interactive bool, con *console.SliverConsoleClient) { +func PaginateTable(tw table.Writer, skipPages int, overflow bool, interactive bool, con *console.SliverClient) { renderedTable := tw.Render() lineCount := strings.Count(renderedTable, "\n") if !overflow || con.Settings.AlwaysOverflow { diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index 4791cc8215..d187bc4268 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { shellCmd := &cobra.Command{ Use: consts.ShellStr, Short: "Start an interactive shell", diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index f7c03fea70..c00e949bdd 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -41,7 +41,7 @@ const ( ) // ShellCmd - Start an interactive shell on the remote system -func ShellCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ShellCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -60,7 +60,7 @@ func ShellCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin con.Println("Shell exited") } -func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *console.SliverConsoleClient) { +func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *console.SliverClient) { con.Println() con.PrintInfof("Wait approximately 10 seconds after exit, and press to continue\n") con.PrintInfof("Opening shell tunnel (EOF to exit) ...\n\n") diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go index 2d81134c19..92a1e93ff4 100644 --- a/client/command/shikata-ga-nai/commands.go +++ b/client/command/shikata-ga-nai/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { shikataGaNaiCmd := &cobra.Command{ Use: consts.ShikataGaNai, Short: "Polymorphic binary shellcode encoder (ノ ゜Д゜)ノ ︵ 仕方がない", diff --git a/client/command/shikata-ga-nai/sgn.go b/client/command/shikata-ga-nai/sgn.go index f63f4b6c07..e05af7015c 100644 --- a/client/command/shikata-ga-nai/sgn.go +++ b/client/command/shikata-ga-nai/sgn.go @@ -31,7 +31,7 @@ import ( ) // ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder -func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { shellcodeFile := args[0] rawShellcode, err := ioutil.ReadFile(shellcodeFile) if err != nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 0b9446b13c..381fd56d4b 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,6 @@ package command */ import ( - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -50,10 +47,12 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // SliverCommands returns all commands bound to the implant menu. -func SliverCommands(con *client.SliverConsoleClient) console.Commands { +func SliverCommands(con *client.SliverClient) console.Commands { sliverCommands := func() *cobra.Command { sliver := &cobra.Command{ Short: "Implant commands", diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 90f3571276..f6077a910a 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { socksCmd := &cobra.Command{ Use: consts.Socks5Str, Short: "In-band SOCKS5 Proxy", diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 7922429305..a2541c484c 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -34,7 +34,7 @@ import ( ) // SocksStartCmd - Add a new tunneled port forward -func SocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index d6e21e2c13..2255d421b4 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -29,7 +29,7 @@ import ( ) // SocksStopCmd - Remove an existing tunneled port forward -func SocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socksID, _ := cmd.Flags().GetUint64("id") if socksID < 1 { con.PrintErrorf("Must specify a valid socks5 id\n") diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index ae006d91b3..24de779231 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -33,7 +33,7 @@ import ( ) // SocksCmd - Display information about tunneled port forward(s) -func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socks := core.SocksProxies.List() if len(socks) == 0 { con.PrintInfof("No socks5 proxies\n") @@ -60,7 +60,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // SocksIDCompleter completes IDs of remote of socks proxy servers -func SocksIDCompleter(_ *console.SliverConsoleClient) carapace.Action { +func SocksIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 74cc826753..4e01aacc01 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -37,7 +37,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" ) -func Command(con *console.SliverConsoleClient) []*cobra.Command { +func Command(con *console.SliverClient) []*cobra.Command { taskmanyCmd := &cobra.Command{ Use: consts.TaskmanyStr, Short: "Task many beacons or sessions", @@ -81,12 +81,12 @@ func Command(con *console.SliverConsoleClient) []*cobra.Command { } // TaskmanyCmd - Task many beacons / sessions -func TaskmanyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TaskmanyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("Must specify subcommand. See taskmany --help for supported subcommands.\n") } // Helper function to wrap grumble commands with taskmany logic -func WrapCommand(c *cobra.Command, con *console.SliverConsoleClient) *cobra.Command { +func WrapCommand(c *cobra.Command, con *console.SliverClient) *cobra.Command { wc := &cobra.Command{ Use: c.Use, Short: c.Short, @@ -100,7 +100,7 @@ func WrapCommand(c *cobra.Command, con *console.SliverConsoleClient) *cobra.Comm } // Wrap a function to run it for each beacon / session -func wrapFunctionWithTaskmany(con *console.SliverConsoleClient, f func(cmd *cobra.Command, args []string)) func(cmd *cobra.Command, args []string) { +func wrapFunctionWithTaskmany(con *console.SliverClient, f func(cmd *cobra.Command, args []string)) func(cmd *cobra.Command, args []string) { return func(cmd *cobra.Command, args []string) { defer con.Println() @@ -150,7 +150,7 @@ func wrapFunctionWithTaskmany(con *console.SliverConsoleClient, f func(cmd *cobr } } -func SelectMultipleBeaconsAndSessions(con *console.SliverConsoleClient) ([]*clientpb.Session, []*clientpb.Beacon, error) { +func SelectMultipleBeaconsAndSessions(con *console.SliverClient) ([]*clientpb.Session, []*clientpb.Beacon, error) { // Get and sort sessions sessionsObj, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index 2f5bc11259..20036ddfc1 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { tasksCmd := &cobra.Command{ Use: consts.TasksStr, Short: "Beacon task management", diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 61a11deb67..77eb28169f 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -48,7 +48,7 @@ import ( ) // TasksFetchCmd - Manage beacon tasks -func TasksFetchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return @@ -125,7 +125,7 @@ func filterTasksByTaskType(taskType string, tasks []*clientpb.BeaconTask) []*cli } // PrintTask - Print the details of a beacon task -func PrintTask(task *clientpb.BeaconTask, con *console.SliverConsoleClient) { +func PrintTask(task *clientpb.BeaconTask, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableWithBordersStyle(con)) tw.AppendRow(table.Row{console.Bold + "Beacon Task" + console.Normal, task.ID}) @@ -172,7 +172,7 @@ func emojiState(state string) string { } // Decode and render message specific content -func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverConsoleClient) { +func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { reqEnvelope := &sliverpb.Envelope{} proto.Unmarshal(task.Request, reqEnvelope) switch reqEnvelope.Type { @@ -743,7 +743,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverConsoleCli } } -func taskResponseDownload(download *sliverpb.Download, con *console.SliverConsoleClient) { +func taskResponseDownload(download *sliverpb.Download, con *console.SliverClient) { const ( dump = "Dump Contents" saveTo = "Save to File ..." @@ -766,7 +766,7 @@ func taskResponseDownload(download *sliverpb.Download, con *console.SliverConsol } } -func promptSaveToFile(data []byte, con *console.SliverConsoleClient) { +func promptSaveToFile(data []byte, con *console.SliverClient) { saveTo := "" saveToPrompt := &survey.Input{Message: "Save to: "} err := survey.AskOne(saveToPrompt, &saveTo) diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 2b24a80084..5d9393f84d 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -50,7 +50,7 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error } // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. -func BeaconTaskIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { beacon := con.ActiveTarget.GetBeacon() if beacon == nil { @@ -115,7 +115,7 @@ func BeaconTaskIDCompleter(con *console.SliverConsoleClient) carapace.Action { } // BeaconPendingTasksCompleter completes pending tasks -func BeaconPendingTasksCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { beacon := con.ActiveTarget.GetBeacon() if beacon == nil { diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index 3294af5977..c2c478348a 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -10,7 +10,7 @@ import ( ) // TasksCancelCmd - Cancel a beacon task before it's sent to the implant -func TasksCancelCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 2f087096ca..610aada08b 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -33,7 +33,7 @@ import ( ) // TasksCmd - Manage beacon tasks -func TasksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return @@ -47,7 +47,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintBeaconTasks - Print beacon tasks -func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 1f4f8cb0a9..25e0709a7b 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { updateCmd := &cobra.Command{ Use: consts.UpdateStr, Short: "Check for updates", diff --git a/client/command/update/update.go b/client/command/update/update.go index 06b6596b1e..3769f37c6d 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -48,7 +48,7 @@ import ( ) // UpdateCmd - Check for updates -func UpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { VerboseVersionsCmd(cmd, con, args) timeoutF, _ := cmd.Flags().GetInt("timeout") @@ -127,7 +127,7 @@ func UpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // VerboseVersionsCmd - Get verbose version information about the client and server -func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { clientVer := version.FullVersion() serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { @@ -219,7 +219,7 @@ func clientAssetForGOOS(assets []version.Asset) *version.Asset { return findAssetFor(prefix, suffixes, assets) } -func updateAvailable(con *console.SliverConsoleClient, client *http.Client, release *version.Release, saveTo string) { +func updateAvailable(con *console.SliverClient, client *http.Client, release *version.Release, saveTo string) { serverAsset := serverAssetForGOOS(release.Assets) clientAsset := clientAssetForGOOS(release.Assets) diff --git a/client/command/use/beacons.go b/client/command/use/beacons.go index 17a3835642..14328e8238 100644 --- a/client/command/use/beacons.go +++ b/client/command/use/beacons.go @@ -26,7 +26,7 @@ import ( ) // UseBeaconCmd - Change the active beacon -func UseBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UseBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := beacons.SelectBeacon(con) if beacon != nil { con.ActiveTarget.Set(nil, beacon) diff --git a/client/command/use/commands.go b/client/command/use/commands.go index 0dd4ce5a1f..a8a0fe9177 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { useCmd := &cobra.Command{ Use: consts.UseStr, Short: "Switch the active session or beacon", diff --git a/client/command/use/sessions.go b/client/command/use/sessions.go index 2b81ba13f7..3f8c8e64ee 100644 --- a/client/command/use/sessions.go +++ b/client/command/use/sessions.go @@ -26,7 +26,7 @@ import ( ) // UseSessionCmd - Change the active session -func UseSessionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, err := sessions.SelectSession(false, con) if session != nil { con.ActiveTarget.Set(session, nil) diff --git a/client/command/use/use.go b/client/command/use/use.go index 1cacc26e7e..cae5a974ff 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -40,7 +40,7 @@ import ( var ErrNoSelection = errors.New("no selection") // UseCmd - Change the active session -func UseCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var session *clientpb.Session var beacon *clientpb.Beacon var err error @@ -70,7 +70,7 @@ func UseCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // SessionOrBeaconByID - Select a session or beacon by ID -func SessionOrBeaconByID(id string, con *console.SliverConsoleClient) (*clientpb.Session, *clientpb.Beacon, error) { +func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { return nil, nil, err @@ -95,7 +95,7 @@ func SessionOrBeaconByID(id string, con *console.SliverConsoleClient) (*clientpb } // SelectSessionOrBeacon - Select a session or beacon -func SelectSessionOrBeacon(con *console.SliverConsoleClient) (*clientpb.Session, *clientpb.Beacon, error) { +func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { // Get and sort sessions sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -183,7 +183,7 @@ func SelectSessionOrBeacon(con *console.SliverConsoleClient) (*clientpb.Session, } // BeaconAndSessionIDCompleter - BeaconAndSessionIDCompleter for beacon / session ids -func BeaconAndSessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -197,7 +197,7 @@ func BeaconAndSessionIDCompleter(con *console.SliverConsoleClient) carapace.Acti } // SessionIDCompleter completes session IDs -func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 175eaed811..4327a6c93c 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { wasmCmd := &cobra.Command{ Use: consts.WasmStr, Short: "Execute a Wasm Module Extension", diff --git a/client/command/wasm/memfs.go b/client/command/wasm/memfs.go index 32fc448400..787e7f3f98 100644 --- a/client/command/wasm/memfs.go +++ b/client/command/wasm/memfs.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/cobra" ) -func parseMemFS(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) (map[string][]byte, error) { +func parseMemFS(cmd *cobra.Command, con *console.SliverClient, args []string) (map[string][]byte, error) { memfs := make(map[string][]byte) totalSize := 0 diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index 3abb990aa4..dc9f9b8c9b 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -46,7 +46,7 @@ const ( var wasmRegistrationCache = make(map[string][]string) // WasmCmd - Execute a WASM module extension -func WasmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WasmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -95,7 +95,7 @@ func WasmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } } -func isRegistered(name string, cmd *cobra.Command, con *console.SliverConsoleClient) bool { +func isRegistered(name string, cmd *cobra.Command, con *console.SliverClient) bool { // Check if we have already registered this wasm module if wasmRegistrationCache[idOf(con)] != nil { if util.Contains(wasmRegistrationCache[idOf(con)], name) { @@ -121,7 +121,7 @@ func isRegistered(name string, cmd *cobra.Command, con *console.SliverConsoleCli } // idOf - Quickly return the id of the current session or beacon -func idOf(con *console.SliverConsoleClient) string { +func idOf(con *console.SliverClient) string { if con.ActiveTarget != nil { if session := con.ActiveTarget.GetSession(); session != nil { return session.ID @@ -133,7 +133,7 @@ func idOf(con *console.SliverConsoleClient) string { return "" } -func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverConsoleClient) { +func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverClient) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() execWasmResp, err := con.Rpc.ExecWasmExtension(grpcCtx, execWasmReq) @@ -159,7 +159,7 @@ func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console. } } -func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverConsoleClient) { +func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverClient) { session := con.ActiveTarget.GetSession() if session == nil { con.PrintErrorf("No active session\n") @@ -227,7 +227,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR } } -func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console.SliverClient) error { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() data, err := os.ReadFile(wasmFilePath) @@ -254,7 +254,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console } // WasmLsCmd - Execute a WASM module extension -func WasmLsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WasmLsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index 862244b3cd..e8c5773f47 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { websitesCmd := &cobra.Command{ Use: consts.WebsitesStr, Short: "Host static content (used with HTTP C2)", diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index e296545078..f9bcd3992b 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -35,7 +35,7 @@ import ( ) // WebsitesAddContentCmd - Add static content to a website -func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { con.PrintErrorf("Must specify a website name via --website, see --help\n") diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index b0e4f1bce8..521b403bf2 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -29,7 +29,7 @@ import ( ) // WebsitesRmContent - Remove static content from a website -func WebsitesRmContent(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("website") webPath, _ := cmd.Flags().GetString("web-path") recursive, _ := cmd.Flags().GetBool("recursive") diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index 8f1a19359b..7b702ebaa9 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -28,7 +28,7 @@ import ( ) // WebsiteRmCmd - Remove a website and all its static content -func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index d7e21e4788..ab993526cf 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -28,7 +28,7 @@ import ( ) // WebsitesUpdateContentCmd - Update metadata about static website content -func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { con.PrintErrorf("Must specify a website name via --website, see --help\n") diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index 2af253a990..b2fe11f569 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -39,7 +39,7 @@ const ( ) // WebsitesCmd - Manage websites -func WebsitesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if len(args) > 0 { websiteName := args[0] ListWebsiteContent(websiteName, con) @@ -49,7 +49,7 @@ func WebsitesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // ListWebsites - Display a list of websites -func ListWebsites(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to list websites %s", err) @@ -67,7 +67,7 @@ func ListWebsites(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // ListWebsiteContent - List the static contents of a website -func ListWebsiteContent(websiteName string, con *console.SliverConsoleClient) { +func ListWebsiteContent(websiteName string, con *console.SliverClient) { website, err := con.Rpc.Website(context.Background(), &clientpb.Website{ Name: websiteName, }) @@ -83,7 +83,7 @@ func ListWebsiteContent(websiteName string, con *console.SliverConsoleClient) { } // PrintWebsite - Print a website and its contents, paths, etc. -func PrintWebsite(web *clientpb.Website, con *console.SliverConsoleClient) { +func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { con.Println(console.Clearln + console.Info + web.Name) con.Println() tw := table.NewWriter() @@ -111,7 +111,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverConsoleClient) { } // WebsiteNameCompleter completes the names of available websites. -func WebsiteNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index daa4460539..dd0e60e9c5 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { wgConfigCmd := &cobra.Command{ Use: consts.WgConfigStr, Short: "Generate a new WireGuard client config", @@ -37,7 +37,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // SliverCommands returns all Wireguard commands that can be used on an active target. -func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { +func SliverCommands(con *console.SliverClient) []*cobra.Command { wgPortFwdCmd := &cobra.Command{ Use: consts.WgPortFwdStr, Short: "List ports forwarded by the WireGuard tun interface", diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index 1568b51f04..fd5bf115ab 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -53,7 +53,7 @@ type wgQuickConfig struct { } // WGConfigCmd - Generate a WireGuard client configuration -func WGConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Error: %s\n", err) diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index c6817e38de..bf866bc34c 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -29,7 +29,7 @@ import ( ) // WGPortFwdAddCmd - Add a new WireGuard port forward -func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index b732719fdf..e3b4c24494 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -31,7 +31,7 @@ import ( ) // WGPortFwdRmCmd - Remove a WireGuard port forward -func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -67,7 +67,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders -func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index e7eabd8db4..2b42b1b374 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -30,7 +30,7 @@ import ( ) // WGPortFwdListCmd - List WireGuard port forwards -func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index a9062faff2..4038008b5c 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -28,7 +28,7 @@ import ( ) // WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy -func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index ef9da5a69d..9494dfbfe0 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -29,7 +29,7 @@ import ( ) // WGSocksStopCmd - Stop a WireGuard SOCKS proxy -func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { return diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 1bc1b13385..6046d20ed1 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -32,7 +32,7 @@ import ( ) // WGSocksListCmd - List WireGuard SOCKS proxies -func WGSocksListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -74,7 +74,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // SocksIDCompleter IDs of WireGuard socks servers. -func SocksIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/go.mod b/go.mod index dee8dbc9de..a0b5ef01ea 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,9 @@ module github.com/bishopfox/sliver go 1.20 -replace github.com/rsteube/carapace v0.36.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca + +replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team require ( filippo.io/age v1.1.1 @@ -30,10 +32,11 @@ require ( github.com/miekg/dns v1.1.55 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 - github.com/ncruces/go-sqlite3 v0.7.2 + github.com/ncruces/go-sqlite3 v0.8.1 github.com/reeflective/console v0.1.6 github.com/reeflective/readline v1.0.8 - github.com/rsteube/carapace v0.36.3 + github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 + github.com/rsteube/carapace v0.37.3 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 @@ -138,6 +141,7 @@ require ( github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect @@ -153,8 +157,8 @@ require ( github.com/x448/float16 v0.8.4 // indirect go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/sync v0.2.0 // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.9.1 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect diff --git a/go.sum b/go.sum index 6a0775b60b..ba570edf91 100644 --- a/go.sum +++ b/go.sum @@ -170,6 +170,7 @@ github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= @@ -301,8 +302,8 @@ github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/ github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B+gPPjbjINdufl0UXqyYplE0aGhx8= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945/go.mod h1:1grVt4HaTofvhFUZYtofeRbGXfczNwCie9MYoM4lP/o= -github.com/ncruces/go-sqlite3 v0.7.2 h1:K7jU4rnUxFdUsbEL+B0Xc+VexLTEwGSO6Qh91Qh4hYc= -github.com/ncruces/go-sqlite3 v0.7.2/go.mod h1:t3dP4AP9rJddU+ffFv0h6fWyeOCEhjxrYc1nsYG7aQI= +github.com/ncruces/go-sqlite3 v0.8.1 h1:e1Y7uHu96xC4fWKsCVWprbTi8vAaQX9R+8kgkxOHWaY= +github.com/ncruces/go-sqlite3 v0.8.1/go.mod h1:EhHe1qvG6Zc/8ffYMzre8n//rTRs1YNN5dUD1f1mEGc= github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FBZk= github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -319,6 +320,8 @@ github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= +github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= @@ -331,7 +334,7 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -424,8 +427,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -451,8 +454,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 8a06a28516..819fb9d6f1 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -31,16 +31,11 @@ This has benefits, but also comes with some drawbacks. Because WASM does not support shared memory, [WAL](https://www.sqlite.org/wal.html) support is [limited](https://www.sqlite.org/wal.html#noshm). -To work around this limitation, SQLite is compiled with -[`SQLITE_DEFAULT_LOCKING_MODE=1`](https://www.sqlite.org/compile.html#default_locking_mode), -making `EXCLUSIVE` the default locking mode. -For non-WAL databases, `NORMAL` locking mode can be activated with -[`PRAGMA locking_mode=NORMAL`](https://www.sqlite.org/pragma.html#pragma_locking_mode). +To work around this limitation, SQLite is [patched](sqlite3/locking_mode.patch) +to always use `EXCLUSIVE` locking mode for WAL databases. Because connection pooling is incompatible with `EXCLUSIVE` locking mode, -the `database/sql` driver defaults to `NORMAL` locking mode. -To open WAL databases, or use `EXCLUSIVE` locking mode, -disable connection pooling by calling +to open WAL databases you should disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). #### POSIX Advisory Locks diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index be10c719fa..ec168aa0d9 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -39,7 +39,7 @@ func Open(filename string) (*Conn, error) { // If none of the required flags is used, a combination of [OPEN_READWRITE] and [OPEN_CREATE] is used. // If a URI filename is used, PRAGMA statements to execute can be specified using "_pragma": // -// sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)&_pragma=locking_mode(normal)") +// sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)") // // https://www.sqlite.org/c3ref/open.html func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { @@ -278,7 +278,7 @@ func (c *Conn) SetInterrupt(ctx context.Context) (old context.Context) { break case <-ctx.Done(): // Done was closed. - const isInterruptedOffset = 280 + const isInterruptedOffset = 288 buf := util.View(c.mod, c.handle+isInterruptedOffset, 4) (*atomic.Uint32)(unsafe.Pointer(&buf[0])).Store(1) // Wait for the next call to SetInterrupt. @@ -295,7 +295,7 @@ func (c *Conn) checkInterrupt() bool { if c.interrupt == nil || c.interrupt.Err() == nil { return false } - const isInterruptedOffset = 280 + const isInterruptedOffset = 288 buf := util.View(c.mod, c.handle+isInterruptedOffset, 4) (*atomic.Uint32)(unsafe.Pointer(&buf[0])).Store(1) return true diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index f027c4ee9c..1675dd2af3 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -14,10 +14,9 @@ // // [PRAGMA] statements can be specified using "_pragma": // -// sql.Open("sqlite3", "file:demo.db?_pragma=busy_timeout(10000)&_pragma=locking_mode(normal)") +// sql.Open("sqlite3", "file:demo.db?_pragma=busy_timeout(10000)") // -// If no PRAGMAs are specified, a busy timeout of 1 minute -// and normal locking mode are used. +// If no PRAGMAs are specified, a busy timeout of 1 minute is set. // // Order matters: // busy timeout and locking mode should be the first PRAGMAs set, in that order. @@ -54,8 +53,8 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { return nil, err } + var pragmas bool c.txBegin = "BEGIN" - var pragmas []string if strings.HasPrefix(name, "file:") { if _, after, ok := strings.Cut(name, "?"); ok { query, _ := url.ParseQuery(after) @@ -70,14 +69,11 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", s) } - pragmas = query["_pragma"] + pragmas = len(query["_pragma"]) > 0 } } - if len(pragmas) == 0 { - err := c.Conn.Exec(` - PRAGMA busy_timeout=60000; - PRAGMA locking_mode=normal; - `) + if !pragmas { + err := c.Conn.Exec(`PRAGMA busy_timeout=60000`) if err != nil { c.Close() return nil, err diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index f461b2664f..105c216bf5 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -11,17 +11,20 @@ WASI_SDK="$ROOT/tools/wasi-sdk-20.0/bin" -o sqlite3.wasm "$ROOT/sqlite3/main.c" \ -I"$ROOT/sqlite3" \ -mexec-model=reactor \ - -mmutable-globals \ + -msimd128 -mmutable-globals \ -mbulk-memory -mreference-types \ -mnontrapping-fptoint -msign-ext \ + -fno-stack-protector -fno-stack-clash-protection \ -Wl,--initial-memory=327680 \ -Wl,--stack-first \ -Wl,--import-undefined \ + -D_HAVE_SQLITE_CONFIG_H \ $(awk '{print "-Wl,--export="$0}' exports.txt) trap 'rm -f sqlite3.tmp' EXIT "$BINARYEN/wasm-ctor-eval" -g -c _initialize sqlite3.wasm -o sqlite3.tmp -"$BINARYEN/wasm-opt" -g -O2 sqlite3.tmp -o sqlite3.wasm \ - --enable-multivalue --enable-mutable-globals \ +"$BINARYEN/wasm-opt" -g --strip -c -O3 \ + sqlite3.tmp -o sqlite3.wasm \ + --enable-simd --enable-mutable-globals --enable-multivalue \ --enable-bulk-memory --enable-reference-types \ --enable-nontrapping-float-to-int --enable-sign-ext \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index be6574a138252050b4ef34ee58179f1cc05b1e20..6a7c852d4953f86fb2c0af7247afb1556fd2b667 100644 GIT binary patch literal 1427169 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 literal 1444429 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%0DVvKV;inkAoqPM9(fi_x#o#4it>K(D!$ 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

    tbSrJ{DE=VR5AjOdN2WPUQg=-pO)r4-@5CABxD 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 diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work b/vendor/github.com/ncruces/go-sqlite3/go.work new file mode 100644 index 0000000000..0aa07f2e33 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/go.work @@ -0,0 +1,6 @@ +go 1.19 + +use ( + . + ./gormlite +) diff --git a/vendor/github.com/psanford/memfs/LICENSE b/vendor/github.com/psanford/memfs/LICENSE new file mode 100644 index 0000000000..fbf711fd73 --- /dev/null +++ b/vendor/github.com/psanford/memfs/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2021 The memfs Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/psanford/memfs/Readme.md b/vendor/github.com/psanford/memfs/Readme.md new file mode 100644 index 0000000000..ae85f8754f --- /dev/null +++ b/vendor/github.com/psanford/memfs/Readme.md @@ -0,0 +1,50 @@ +# memfs: A simple in-memory io/fs.FS filesystem + +memfs is an in-memory implementation of Go's io/fs.FS interface. +The goal is to make it easy and quick to build an fs.FS filesystem +when you don't have any complex requirements. + +Documentation: https://pkg.go.dev/github.com/psanford/memfs + +`io/fs` docs: https://tip.golang.org/pkg/io/fs/ + +## Usage + +``` +package main + +import ( + "fmt" + "io/fs" + + "github.com/psanford/memfs" +) + +func main() { + rootFS := memfs.New() + + err := rootFS.MkdirAll("dir1/dir2", 0777) + if err != nil { + panic(err) + } + + err = rootFS.WriteFile("dir1/dir2/f1.txt", []byte("incinerating-unsubstantial"), 0755) + if err != nil { + panic(err) + } + + err = fs.WalkDir(rootFS, ".", func(path string, d fs.DirEntry, err error) error { + fmt.Println(path) + return nil + }) + if err != nil { + panic(err) + } + + content, err := fs.ReadFile(rootFS, "dir1/dir2/f1.txt") + if err != nil { + panic(err) + } + fmt.Printf("%s\n", content) +} +``` diff --git a/vendor/github.com/psanford/memfs/memfs.go b/vendor/github.com/psanford/memfs/memfs.go new file mode 100644 index 0000000000..da2fd3e6a3 --- /dev/null +++ b/vendor/github.com/psanford/memfs/memfs.go @@ -0,0 +1,426 @@ +package memfs + +import ( + "bytes" + "errors" + "fmt" + "io/fs" + "os" + syspath "path" + "strings" + "sync" + "time" +) + +// FS is an in-memory filesystem that implements +// io/fs.FS +type FS struct { + dir *dir +} + +// New creates a new in-memory FileSystem. +func New() *FS { + return &FS{ + dir: &dir{ + children: make(map[string]childI), + }, + } +} + +// MkdirAll creates a directory named path, +// along with any necessary parents, and returns nil, +// or else returns an error. +// The permission bits perm (before umask) are used for all +// directories that MkdirAll creates. +// If path is already a directory, MkdirAll does nothing +// and returns nil. +func (rootFS *FS) MkdirAll(path string, perm os.FileMode) error { + if !fs.ValidPath(path) { + return fmt.Errorf("invalid path: %s: %w", path, fs.ErrInvalid) + } + + if path == "." { + // root dir always exists + return nil + } + + parts := strings.Split(path, "/") + + next := rootFS.dir + for _, part := range parts { + cur := next + cur.mu.Lock() + child := cur.children[part] + if child == nil { + newDir := &dir{ + name: part, + perm: perm, + children: make(map[string]childI), + } + cur.children[part] = newDir + next = newDir + } else { + childDir, ok := child.(*dir) + if !ok { + return fmt.Errorf("not a directory: %s: %w", part, fs.ErrInvalid) + } + next = childDir + } + cur.mu.Unlock() + } + + return nil +} + +func (rootFS *FS) getDir(path string) (*dir, error) { + if path == "" { + return rootFS.dir, nil + } + parts := strings.Split(path, "/") + + cur := rootFS.dir + for _, part := range parts { + err := func() error { + cur.mu.Lock() + defer cur.mu.Unlock() + child := cur.children[part] + if child == nil { + return fmt.Errorf("not a directory: %s: %w", part, fs.ErrNotExist) + } else { + childDir, ok := child.(*dir) + if !ok { + return fmt.Errorf("no such file or directory: %s: %w", part, fs.ErrNotExist) + } + cur = childDir + } + return nil + }() + if err != nil { + return nil, err + } + } + + return cur, nil +} + +func (rootFS *FS) get(path string) (childI, error) { + if path == "" { + return rootFS.dir, nil + } + + parts := strings.Split(path, "/") + + var ( + cur = rootFS.dir + + chld childI + err error + ) + for i, part := range parts { + chld, err = func() (childI, error) { + cur.mu.Lock() + defer cur.mu.Unlock() + child := cur.children[part] + if child == nil { + return nil, fmt.Errorf("not a directory: %s: %w", part, fs.ErrNotExist) + } else { + _, isFile := child.(*File) + if isFile { + if i == len(parts)-1 { + return child, nil + } else { + return nil, fmt.Errorf("no such file or directory: %s: %w", part, fs.ErrNotExist) + } + } + + childDir, ok := child.(*dir) + if !ok { + return nil, errors.New("not a directory") + } + cur = childDir + } + return child, nil + }() + if err != nil { + return nil, err + } + } + + return chld, nil +} + +func (rootFS *FS) create(path string) (*File, error) { + if !fs.ValidPath(path) { + return nil, fmt.Errorf("invalid path: %s: %w", path, fs.ErrInvalid) + } + + if path == "." { + // root dir + path = "" + } + + dirPart, filePart := syspath.Split(path) + + dirPart = strings.TrimSuffix(dirPart, "/") + dir, err := rootFS.getDir(dirPart) + if err != nil { + return nil, err + } + + dir.mu.Lock() + defer dir.mu.Unlock() + existing := dir.children[filePart] + if existing != nil { + _, ok := existing.(*File) + if !ok { + return nil, fmt.Errorf("path is a directory: %s: %w", path, fs.ErrExist) + } + } + + newFile := &File{ + name: filePart, + perm: 0o666, + content: &bytes.Buffer{}, + } + dir.children[filePart] = newFile + + return newFile, nil +} + +// WriteFile writes data to a file named by filename. +// If the file does not exist, WriteFile creates it with permissions perm +// (before umask); otherwise WriteFile truncates it before writing, without changing permissions. +func (rootFS *FS) WriteFile(path string, data []byte, perm os.FileMode) error { + if !fs.ValidPath(path) { + return fmt.Errorf("invalid path: %s: %w", path, fs.ErrInvalid) + } + + if path == "." { + // root dir + path = "" + } + + f, err := rootFS.create(path) + if err != nil { + return err + } + f.content = bytes.NewBuffer(data) + f.perm = perm + return nil +} + +// Open opens the named file. +func (rootFS *FS) Open(name string) (fs.File, error) { + if !fs.ValidPath(name) { + return nil, &fs.PathError{ + Op: "open", + Path: name, + Err: fs.ErrInvalid, + } + } + + if name == "." { + // root dir + name = "" + } + + child, err := rootFS.get(name) + if err != nil { + return nil, err + } + + switch cc := child.(type) { + case *File: + handle := &File{ + name: cc.name, + perm: cc.perm, + content: bytes.NewBuffer(cc.content.Bytes()), + } + return handle, nil + case *dir: + handle := &fhDir{ + dir: cc, + } + return handle, nil + } + + return nil, fmt.Errorf("unexpected file type in fs: %s: %w", name, fs.ErrInvalid) +} + +// Sub returns an FS corresponding to the subtree rooted at path. +func (rootFS *FS) Sub(path string) (fs.FS, error) { + dir, err := rootFS.getDir(path) + if err != nil { + return nil, err + } + return &FS{dir: dir}, nil +} + +type dir struct { + mu sync.Mutex + name string + perm os.FileMode + modTime time.Time + children map[string]childI +} + +type fhDir struct { + dir *dir + idx int +} + +func (d *fhDir) Stat() (fs.FileInfo, error) { + fi := fileInfo{ + name: d.dir.name, + size: 4096, + modTime: d.dir.modTime, + mode: d.dir.perm | fs.ModeDir, + } + return &fi, nil +} + +func (d *fhDir) Read(b []byte) (int, error) { + return 0, errors.New("is a directory") +} + +func (d *fhDir) Close() error { + return nil +} + +func (d *fhDir) ReadDir(n int) ([]fs.DirEntry, error) { + d.dir.mu.Lock() + defer d.dir.mu.Unlock() + + names := make([]string, 0, len(d.dir.children)) + for name := range d.dir.children { + names = append(names, name) + } + + if n <= 0 { + n = len(names) + } + + out := make([]fs.DirEntry, 0, n) + + for i := d.idx; i < n && i < len(names); i++ { + name := names[i] + child := d.dir.children[name] + + f, isFile := child.(*File) + if isFile { + stat, _ := f.Stat() + out = append(out, &dirEntry{ + info: stat, + }) + } else { + d := child.(*dir) + fi := fileInfo{ + name: d.name, + size: 4096, + modTime: d.modTime, + mode: d.perm | fs.ModeDir, + } + out = append(out, &dirEntry{ + info: &fi, + }) + } + + d.idx = i + } + return out, nil +} + +type File struct { + name string + perm os.FileMode + content *bytes.Buffer + modTime time.Time + closed bool +} + +func (f *File) Stat() (fs.FileInfo, error) { + if f.closed { + return nil, fs.ErrClosed + } + fi := fileInfo{ + name: f.name, + size: int64(f.content.Len()), + modTime: f.modTime, + mode: f.perm, + } + return &fi, nil +} + +func (f *File) Read(b []byte) (int, error) { + if f.closed { + return 0, fs.ErrClosed + } + return f.content.Read(b) +} + +func (f *File) Close() error { + if f.closed { + return fs.ErrClosed + } + f.closed = true + return nil +} + +type childI interface{} + +type fileInfo struct { + name string + size int64 + modTime time.Time + mode fs.FileMode +} + +// base name of the file +func (fi *fileInfo) Name() string { + return fi.name +} + +// length in bytes for regular files; system-dependent for others +func (fi *fileInfo) Size() int64 { + return fi.size +} + +// file mode bits +func (fi *fileInfo) Mode() fs.FileMode { + return fi.mode +} + +// modification time +func (fi *fileInfo) ModTime() time.Time { + return fi.modTime +} + +// abbreviation for Mode().IsDir() +func (fi *fileInfo) IsDir() bool { + return fi.mode&fs.ModeDir > 0 +} + +// underlying data source (can return nil) +func (fi *fileInfo) Sys() interface{} { + return nil +} + +type dirEntry struct { + info fs.FileInfo +} + +func (de *dirEntry) Name() string { + return de.info.Name() +} + +func (de *dirEntry) IsDir() bool { + return de.info.IsDir() +} + +func (de *dirEntry) Type() fs.FileMode { + return de.info.Mode() +} + +func (de *dirEntry) Info() (fs.FileInfo, error) { + return de.info, nil +} diff --git a/vendor/github.com/reeflective/team/.golangci.yml b/vendor/github.com/reeflective/team/.golangci.yml new file mode 100644 index 0000000000..5389185b52 --- /dev/null +++ b/vendor/github.com/reeflective/team/.golangci.yml @@ -0,0 +1,450 @@ + +# ************************************************************************************* # +# Golang CI Lint Global Configuration # +# ************************************************************************************* # + +# This configuration is divided into several subsections: +# - Options for analysis running +# - Enabled/disabled linters +# - Other exclusions & Issues management +# - Issues severity management +# - Per-linter configurations + +# +# -------------------------- Options for analysis running -------------------------- # +# +run: + # + # ***** Tests **** + # + # Include test files or not. + # Default: true + tests: true + + # + # ***** Ignored directories, files & patterns ***** + # + # Which dirs to skip: issues from them won't be reported. + # Can use regexp here: `generated.*`, regexp is applied on full path. + # Default value is empty list, + # but default dirs are skipped independently of this option's value (see skip-dirs-use-default). + # "/" will be replaced by current OS file path separator to properly work on Windows. + # skip-dirs: + + # Enables skipping of directories: + # - vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + # Default: true + skip-dirs-use-default: true + + # Which files to skip: they will be analyzed, but issues from them won't be reported. + # Default value is empty list, + # but there is no need to include all autogenerated files, + # we confidently recognize autogenerated files. + # If it's not please let us know. + # "/" will be replaced by current OS file path separator to properly work on Windows. + # skip-files: + # - ".*\\.my\\.go$" + # - lib/bad.go + + # + # ***** Dependencies & Modules ***** + # + # If set we pass it to "go list -mod={option}". From "go help modules": + # If invoked with -mod=readonly, the go command is disallowed from the implicit + # automatic updating of go.mod described above. Instead, it fails when any changes + # to go.mod are needed. This setting is most useful to check that go.mod does + # not need updates, such as in a continuous integration and testing system. + # If invoked with -mod=vendor, the go command assumes that the vendor + # directory holds the correct copies of dependencies and ignores + # the dependency descriptions in go.mod. + # + # Allowed values: readonly|vendor|mod + # By default, it isn't set. + modules-download-mode: readonly # NOT SURE WHICH ONE TO USE BY DEFAULT + + # + # ***** Other ***** + # + # Allow multiple parallel golangci-lint instances running. + # If false (default) - golangci-lint acquires file lock on start. + allow-parallel-runners: true + + # Specific go build tags + build-tags: + - go_sqlite + + +# +# -------------------------- Output Configuration Options --------------------------- # +# +# output: + # Format: colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions + # + # Multiple can be specified by separating them by comma, output can be provided + # for each of them by separating format name and path by colon symbol. + # Output path can be either `stdout`, `stderr` or path to the file to write to. + # Example: "checkstyle:report.json,colored-line-number" + # + # Default: colored-line-number + # format: json + # Print lines of code with issue. + # Default: true + # print-issued-lines: false + # Print linter name in the end of issue text. + # Default: true + # print-linter-name: false + # Make issues output unique by line. + # Default: true + # uniq-by-line: false + # Add a prefix to the output file references. + # Default is no prefix. + # path-prefix: "" + # Sort results by: filepath, line and column. + # sort-results: false + +# +# ------------------------------------- Linters ------------------------------------ # +# +linters: + # Disable all linters. + # disable-all: true + + # Enable presets. Used to enable entire sets of linters based on their "tags". + # Some of these enabled sets might be redundant with the explicitly & individually + # enabled linters above, so pay attention to what you want to do. + # Also, some linters are explicitly deactived in some section below, which might + # be undesired behavior to you. + # https://golangci-lint.run/usage/linters + presets: + - bugs + - comment + - complexity + - error + - format + - import + - metalinter + - module + - performance + # - sql + - style + - test + - unused + + # Enable specific linter + # https://golangci-lint.run/usage/linters/#enabled-by-default-linters + # + # Example line: + # - lintername # Description () + # where: + # () means the linter is not fast, and not auto-fix capable + # (fast) means the linter is only fast + # (auto) means the linter can auto-fix its detected issues. + # + enable: + # Linters enabled by default (commented out in list of disabled linters below) + # - deadcode # Finds unused code () + - errcheck # Finds unchecked errors in Go programs () + - gosimple # Specializes in simplifying a code () + - govet # Reports suspicious constructs, such as Printf calls with wrong args () + - ineffassign # Detects when assignments to existing variables are not used (fast) + - staticcheck # A ton of static analysis checks () + # - structcheck # Finds unused struct fields () + - unused # Checks for unused constants, variables, functions and types () + # - varcheck # Finds unused global variables and constants () + + # Other linters (not enabled by default, thus optional) + # - asciicheck # Checks that code does not contain non-ASCII identifiers (bugs, style) + - bidichk # checks for dangerous unicode character sequences (bugs) + - bodyclose # checks HTTP response body is closed successfully (perf,bugs) + - containedctx # detects struct-contained context.Context field (style) + - contextcheck # check the function use a non-inherited context (bugs) + - cyclop # checks function and package cyclomatic complexity (cplx) + - decorder # checks declaration order/count of types/consts/vars/funcs (fmt,style) + # - depguard # checks if imports are in a list of acceptable packages (style,imp,mod) + - dogsled # checks assignments with too many blank identifiers (style) + - dupl # tool for code clone detection (style) + - durationcheck # checks for two durations multiplied together (bugs) + - errchkjson # checks types passed to JSON encoding functions & related (bugs) + - errname # checks that sentinel errors are prefix with Err (style) + - errorlint # finds potential problems with Go 1.13 error wrap scheme (bugs, err) + # - exhaustive # checks exhaustiveness of enum switch statements (bugs) + # - exhaustivestruct # checks if all struct fields are initialized (style,test) + - exportloopref # checks for pointers to enclosing loop variables (bugs) + # - forbidigo # Forbids identifiers (style) + - forcetypeassert # finds forced type assertions (style) + - funlen # tool for detection of long functions (cplx) + - gci # Controls package import order and makes deterministic (fmt,import) + # - gochecknoglobals # checks that no global variables exist (style) + # - gochecknoinits # checks that no init functions are present (style) + - gocognit # computes and checks the cognitive complexity of functions (cplx) + - goconst # finds repeated strings that can be replaced by a constant (style) + - gocritic # diagnostics for bugs/perf/style issues. Extensible (style,meta) + - gocyclo # computes and checks cyclomatic complexity of functions (cplx) + - godot # checks if comments end in a period (style,cmt) + - godox # tool for detection of FIXME, TODO and other comments (style,cmt) + - goerr113 # checks the errors handling expressions (style,err) + - gofmt # formats and checks for code simplification (fmt) + - gofumpt # checks whether code was gofumpt-ed (fmt) + - goheader # checks if file header matches to pattern (style) + # - goimports # fixes imports, formats code same as gofmt (fmt,import) + # - golint # Deprecated + - gomnd # analyzer to detect magic numbers (style) + - gomoddirectives # manage replace/retract/excludes directives in go.mod (style,mod) + # - gomodguard # allow/block for direct module deps. (style,imp,mod) + - goprintffuncname # check that printf-like funcs are named with f at end (style) + - gosec # inspect code for security problems (bugs) + - grouper # analyzer to analyze expression groups (style) + # - ifshort # checks that code uses short syntax for if statements (style) + - importas # enforces consistent import aliases (style) + # - interfacer # Deprecated + - ireturn # accept Interfaces, return Concrete Types (style) + # - lll # Report long lines (style) + - maintidx # measures the maintainability index of each function (cplx) + - makezero # finds slice declarations with non-zero initial length (style,bugs) + # - maligned # Deprecated + - misspell # finds commonly misspelled English words in comments (style,cmt) + - nakedret # finds naked returns in functions greater than spec len (style) + - nestif # reports deeply nested if statements (cplx) + - nilerr # finds code returning nil even if checks error not nil (bugs) + - nilnil # checks no simultaneous return of nil err and invalid value (style) + # - nlreturn # checks for a new line before return and branch statements (style) + - noctx # fnds sending HTTP requests without context.Context (perf,bugs) + - nolintlint # reports ill-formed or insufficient nolint directives (style) + - paralleltest # detects missing usage of t.Parallel() in your tests (style,test) + - prealloc # finds slice declarations that could be preallocated (perf) + - predeclared # finds code shadowing one of Go's predeclared identifiers (style) + # - promlinter # checks Prometheus metrics naming via promlint + - revive # fast,extensible,flexible linter. Replacement of golint (style,meta) + # - rowserrcheck # checks if Err of rows is checked successfully (bugs,sql) + # - scopelint # Deprecated + # - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed (bugs,sql) + # - stylecheck # replacement for golint (style) + # - tagliatelle # checks struct tags (style) + - tenv # detects using os.Setenv instead of t.Setenv since go1.17 (style) + # - testpackage # makes you use a separate _test package (style,test) + - thelper # detects test helpers without t.Helper(), checks consistent (style) + - tparallel # detects inappropriate use of t.Parallel() in your tests (style,test) + # - typecheck # Like the front-end of the Go compiler, parses and type-checks Go code () + - unconvert # remove unnecessary type convertions (style) + - unparam # reports unused function parameters (unused) + - varnamelen # checks that the length of a var name matches its scope (style) + - wastedassign # finds wasted assignment statements (style) + # - whitespace # detection of leading and trailing whitespace (style) + # - wrapcheck # checks errors returned from external packages are wrapped (style,err) + - wsl # forces you to use empty lines ! (style) + + # Enable all available linters. + # enable-all: true + + # Disable specific linter + # https://golangci-lint.run/usage/linters/#disabled-by-default-linters--e--enable + disable: + # Linters enabled by default (commented out in list of disabled linters below) + # - deadcode + # - errcheck + # - gosimple + # - govet + # - ineffassign + # - staticcheck + # - structcheck + - typecheck + # - unused + # - varcheck + + # Deactivated linters above (explicitly deactived here, so that `presets` section + # above does not activate them again) + - asciicheck # Checks that code does not contain non-ASCII identifiers (bugs,style) + - depguard # checks if imports are in list of acceptable pkgs (style,imp,mod) + - exhaustive # checks exhaustiveness of enum switch statements (bugs) + - exhaustruct # checks if all struct fields are initialized (style,test) + - exhaustivestruct # checks if all struct fields are initialized (style,test) + - forbidigo # Forbids identifiers (style) + - gochecknoglobals # checks that no global variables exist (style) + - gochecknoinits # checks that no init functions are present (style) + - goimports # fixes imports, formats code same as gofmt (fmt,import) + - lll # Report long lines (style) + - promlinter # checks Prometheus metrics naming via promlint + - rowserrcheck # checks if Err of rows is checked successfully (bugs,sql) + - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed (bugs,sql) + - stylecheck # replacement for golint (style) + - testpackage # makes you use a separate _test package (style,test) + - whitespace # detection of leading and trailing whitespace (style) + - nonamedreturns + - scopelint # Deprecated + - nlreturn # checks for a new line before return and branch statements (style) + - ifshort # checks that code uses short syntax for if statements (style) + - deadcode # Finds unused code () + - structcheck # Finds unused struct fields () + - varcheck # Finds unused global variables and constants () + - gomodguard # allow/block for direct module deps. (style,imp,mod) + - musttag + - wrapcheck # checks errors returned from external packages are wrapped (style,err) + - tagliatelle # checks struct tags (style) + + # Run only fast linters from enabled linters set (first run won't be fast) + # Default: false + # fast: true + + +# +# --------------------------------- Linter settings ------------------------------------ # +# + +# This file contains only configs which differ from defaults. +# All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml +linters-settings: + cyclop: + # The maximal code complexity to report. + # Default: 10 + max-complexity: 30 + # The maximal average package complexity. + # If it's higher than 0.0 (float) the check is enabled + # Default: 0.0 + package-average: 10.0 + + errcheck: + # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. + # Such cases aren't reported by default. + # Default: false + check-type-assertions: true + + exhaustive: + # Program elements to check for exhaustiveness. + # Default: [ switch ] + check: + - switch + - map + + funlen: + # Checks the number of lines in a function. + # If lower than 0, disable the check. + # Default: 60 + lines: 100 + # Checks the number of statements in a function. + # If lower than 0, disable the check. + # Default: 40 + statements: 50 + + gocognit: + # Minimal code complexity to report + # Default: 30 (but we recommend 10-20) + min-complexity: 30 + + wsl: + allow-cuddle-declarations: true + allow-separated-leading-comment: true + + paralleltest: + ignore-missing: true + +# +# ----------------------- Other exclusions & Issues management -------------------------- # +# +issues: + # List of regexps of issue texts to exclude. + # + # But independently of this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. + # To list all excluded by default patterns execute `golangci-lint run --help` + # + # Default: [] + # exclude: + # - abcdef + + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + # Exclude some linters from running on tests files. + - path: _test\.go + linters: + - gocyclo + - errcheck + - dupl + - gosec + + # Exclude known linters from partially hard-vendored code, + # which is impossible to exclude via `nolint` comments. + # - path: internal/hmac/ + # text: "weak cryptographic primitive" + # linters: + # - gosec + + # Exclude some `staticcheck` messages. + # - linters: + # - staticcheck + # text: "SA9003:" + + # Exclude `lll` issues for long lines with `go:generate`. + - linters: + - lll + source: "^//go:generate " + + # Independently of option `exclude` we use default exclude patterns, + # it can be disabled by this option. + # To list all excluded by default patterns execute `golangci-lint run --help`. + # Default: true. + # exclude-use-default: false + + # If set to true exclude and exclude-rules regular expressions become case-sensitive. + # Default: false + # exclude-case-sensitive: false + + # The list of ids of default excludes to include or disable. + # Default: [] + # include: + # - EXC0002 # disable excluding of issues about comments from golint. + + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + # max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing large codebase. + # It's not practical to fix all existing issues at the moment of integration: + # much better don't allow issues in new code. + # + # Default: false. + new: true + # Show only new issues created after git revision `REV`. + new-from-rev: HEAD + # Show only new issues created in git patch with set file path. + new-from-patch: path/to/patch/file + # Fix found issues (if it's supported by the linter). + fix : true + +# +# ---------------------------- Issues severity manament -------------------------------- # +# +# severity: + # Set the default severity for issues. + # + # If severity rules are defined and the issues do not match or no severity is provided to the rule + # this will be the default severity applied. + # Severities should match the supported severity names of the selected out format. + # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity + # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#severity + # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message + # + # Default value is an empty string. + # default-severity: error + # If set to true `severity-rules` regular expressions become case-sensitive. + # Default: false + # case-sensitive: true + # When a list of severity rules are provided, severity information will be added to lint issues. + # Severity rules have the same filtering capability as exclude rules + # except you are allowed to specify one matcher per severity rule. + # Only affects out formats that support setting severity information. + # + # Default: [] + # rules: + # - linters: + # - dupl + # severity: info + +# +# ---------------------------- Per-linter Configuration -------------------------------- # +# diff --git a/vendor/github.com/reeflective/team/README.md b/vendor/github.com/reeflective/team/README.md new file mode 100644 index 0000000000..d9e926c2e7 --- /dev/null +++ b/vendor/github.com/reeflective/team/README.md @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + +

    +

    Team

    + +

    Transform any Go program into a client of itself, remotely or locally.

    +

    Use, manage teamservers and clients with code, with their CLI, or both.

    +
    + + + + + + +
    + + +----- + +## Summary + +----- + +## CLI examples (users) + +----- + +## API examples (developers) + +----- + +## Documentation + +----- + +## Status + +The Command-Line and Application-Programming Interfaces of this library are unlikely to change +much in the future, and should be considered mostly stable. These might grow a little bit, but +will not shrink, as they been already designed to be as minimal as they could be. + +In particular, `client.Options` and `server.Options` APIs might grow, so that new features/behaviors +can be integrated without the need for the teamclients and teamservers types APIs to change. + +The section **Possible Enhancements** below includes 9 points, which should grossly be equal +to 9 minor releases (`0.1.0`, `0.2.0`, `0.3.0`, etc...), ending up in `v1.0.0`. + +- Please open a PR or an issue if you face any bug, it will be promptly resolved. +- New features and/or PRs are welcome if they are likely to be useful to most users. + +----- + +## Possible enhancements + +The list below is not an indication on the roadmap of this repository, but should be viewed as +things the author of this library would be very glad to merge contributions for, or get ideas. +This teamserver library aims to remain small, with a precise behavior and role. +Overall, contributions and ideas should revolve around strenghening its core/transport code +or around enhancing its interoperability with as much Go code/programs as possible. + +- [ ] Use viper for configs. +- [ ] Use afero filesystem. +- [ ] Add support for encrypted sqlite by default. +- [ ] Encrypt in-memory channels, or add option for it. +- [ ] Simpler/different listener/dialer backend interfaces, if it appears needed. +- [ ] Abstract away the client-side authentication, for pluggable auth/credential models. +- [ ] Replace logrus entirely and restructure behind a single package used by both client/server. +- [ ] Review/refine/strenghen the dialer/listener init/close/start process, if it appears needed. +- [ ] `teamclient update` downloads latest version of the server binary + method to `team.Client` for it. + diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go new file mode 100644 index 0000000000..30097e7fdc --- /dev/null +++ b/vendor/github.com/reeflective/team/client/client.go @@ -0,0 +1,282 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os/user" + "path/filepath" + "sync" + + "github.com/reeflective/team" + "github.com/reeflective/team/internal/assets" + "github.com/sirupsen/logrus" +) + +// Client is the core driver of an application teamclient. +// It provides the core tools needed by any application/program +// to be the client of an local/remote/in-memory teamserver. +// +// This client object is by default not connected to any teamserver, +// and has therefore no way of fulfilling its core duties, on purpose. +// The client also DOES NOT include any teamserver-side code. +// +// This teamclient core job is to: +// - Fetch, configure and use teamserver endpoint configurations. +// - Drive the process of connecting to & disconnecting from a server. +// - Query a teamserver for its version and users information. +// +// Additionally, this client offers: +// - Pre-configured loggers for all client-side related events. +// - Various options to configure its backends and behaviors. +// - A builtin, abstracted and app-specific filesystem (in memory or on disk). +// +// Various combinations of teamclient/teamserver usage are possible. +// Please see the Go module example/ directory for a list of them. +type Client struct { + name string // Name of the teamclient/teamserver application. + homeDir string // APP_ROOT_DIR var, evaluated once when creating the server. + opts *opts // All configurable things for the teamclient. + fileLogger *logrus.Logger // By default, hooked to also provide stdout logging. + stdoutLogger *logrus.Logger // Fallback logger. + fs *assets.FS // Embedded or on-disk application filesystem. + mutex *sync.RWMutex // Sync access. + initOpts sync.Once // Some options can only be set once when creating the server. + + dialer Dialer[any] // Connection backend for the teamclient. + connect *sync.Once // A client can only connect once per run. + + // Client is the implementation of the core teamclient functionality, + // which is to query a server version and its current users. + // This type is either implementated by a teamserver when the client + // is in-memory, or by a user-defined type which is generally a RPC. + client team.Client +} + +// Dialer represents a type using a teamclient core (and its configured teamserver +// remote) to setup, initiate and use a connection to this remote teamserver. +// +// The type parameter `clientConn` of this interface is a purely syntactic sugar +// to indicate that any dialer should/may return a user-defined but specific object +// from its Dial() method. Library users can register hooks to the teamclient.Client +// using this dialer, and this clientConn will be provided to these hooks. +// +// Examples of what this clientConn can be: +// - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). +// - A simple net.Conn over which anything can be done further. +// - Nothing: a dialer might not need to use or even create a client connection. +type Dialer[clientConn any] interface { + // Init is used by any dialer to query the teamclient driving it about: + // - The remote teamserver address and transport credentials + // - The user registered in this remote teamserver configuration. + // - To make use of client-side loggers, filesystem and other utilities. + Init(c *Client) error + + // Dial should connect to the endpoint available in the client configuration. + // Note that the configuration is not required as a function parameter, since + // the dialer has already been provided access to the entire teamclient in Init() + // The c`clientConn` type is then passed to all hook functions registered + // with the dialer when using the client.WithDialer(dialer, hooks...) option. + Dial() (conn clientConn, err error) + + // Close should close the connection or any related component. + Close() error +} + +// New is the required constructor of a new application teamclient. +// Parameters: +// - The name of the application using the teamclient. +// - Variadic options (...Options) which are applied at creation time. +// - A type implementing the team.Client interface. +// +// Depending on constraints and use cases, the client uses different +// backends and/or RPC implementations providing this functionality: +// - When used in-memory and as a client of teamserver. +// - When being provided a specific dialer/client/RPC backend. +// +// The teamclient will only perform a few init things before being returned: +// - Setup its filesystem, either on-disk (default behavior) or in-memory. +// - Initialize loggers and the files they use, if any. +// +// This may return an error if the teamclient is unable to work with the provided +// options (or lack thereof), which may happen if the teamclient cannot use and write +// to its directories and log files. No client is returned if the error is not nil. +func New(app string, client team.Client, options ...Options) (*Client, error) { + teamclient := &Client{ + name: app, + opts: defaultOpts(), + client: client, + connect: &sync.Once{}, + mutex: &sync.RWMutex{}, + fs: &assets.FS{}, + } + + teamclient.apply(options...) + + // Filesystem (in-memory or on disk) + user, _ := user.Current() + root := filepath.Join(user.HomeDir, "."+teamclient.name) + teamclient.fs = assets.NewFileSystem(root, teamclient.opts.inMemory) + + // Logging (if allowed) + if err := teamclient.initLogging(); err != nil { + return nil, err + } + + return teamclient, nil +} + +// Connect uses the default client configurations to connect to the teamserver. +// +// This call might be blocking and expect user input: if multiple server +// configurations are found in the application directory, the application +// will prompt the user to choose one of them. +// If the teamclient was created WithConfig() option, or if passed in this +// call, user input is guaranteed NOT to be needed. +// +// It only connects the teamclient if it has an available dialer. +// If none is available, this function returns no error, as it is +// possible that this client has a teamclient implementation ready. +func (tc *Client) Connect(options ...Options) (err error) { + tc.apply(options...) + + // Don't connect if we don't have the connector. + if tc.dialer == nil { + return nil + } + + tc.connect.Do(func() { + // If we don't have a provided configuration, + // load one from disk, otherwise do nothing. + err = tc.initConfig() + if err != nil { + err = tc.errorf("%w: %w", ErrConfig, err) + return + } + + // Initialize the dialer with our client. + err = tc.dialer.Init(tc) + if err != nil { + err = tc.errorf("%w: %w", ErrConfig, err) + return + } + + // Connect to the teamserver. + var client any + + client, err = tc.dialer.Dial() + if err != nil { + err = tc.errorf("%w: %w", ErrClient, err) + return + } + + // Post-run hooks are used by consumers to further setup/consume + // the connection after the latter was established. In the case + // of RPCs, this client is generally used to register them. + for _, hook := range tc.opts.hooks { + if err = hook(client); err != nil { + err = tc.errorf("%w: %w", ErrClient, err) + return + } + } + }) + + return err +} + +// Disconnect disconnects the client from the server, closing the connection +// and the client log file. Any errors are logged to this file and returned. +// If the teamclient has been passed the WithNoDisconnect() option, it won't +// disconnect. +func (tc *Client) Disconnect() error { + if tc.opts.console { + return nil + } + + // The client can reconnect.. + defer func() { + tc.connect = &sync.Once{} + }() + + if tc.dialer == nil { + return nil + } + + err := tc.dialer.Close() + if err != nil { + tc.log().Error(err) + } + + return err +} + +// Users returns a list of all users registered to the application server. +// If the teamclient has no backend, it returns an ErrNoTeamclient error. +// If the backend returns an error, the latter is returned as is. +func (tc *Client) Users() (users []team.User, err error) { + if tc.client == nil { + return nil, ErrNoTeamclient + } + + res, err := tc.client.Users() + if err != nil && len(res) == 0 { + return nil, err + } + + return res, nil +} + +// ServerVersion returns the version information of the server to which +// the client is connected. +// If the teamclient has no backend, it returns an ErrNoTeamclient error. +// If the backend returns an error, the latter is returned as is. +func (tc *Client) ServerVersion() (ver team.Version, err error) { + if tc.client == nil { + return ver, ErrNoTeamclient + } + + version, err := tc.client.Version() + if err != nil { + return + } + + return version, nil +} + +// Name returns the name of the client application. +func (tc *Client) Name() string { + return tc.name +} + +// Filesystem returns an abstract filesystem used by the teamclient. +// This filesystem can be either of two things: +// - By default, the on-disk filesystem, without any specific bounds. +// - If the teamclient was created with the InMemory() option, a full +// in-memory filesystem (with root `.app/`). +// +// Use cases for this filesystem might include: +// - The wish to have a fully abstracted filesystem to work for testing +// - Ensuring that the filesystem code in your application remains the +// same regardless of the underlying, actual filesystem. +// +// The type returned is currently an internal type because it wraps some +// os.Filesystem methods for working more transparently: this may change +// in the future if the Go stdlib offers write support to its new io/fs.FS. +func (tc *Client) Filesystem() *assets.FS { + return tc.fs +} diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go new file mode 100644 index 0000000000..8c0548d2a6 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -0,0 +1,230 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/style" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Generate returns a command tree to embed in client applications connecting +// to a teamserver. It requires only the client to use its functions. +// +// All commands of the tree include an automatic call to client.Connect() to make +// sure they can reach the server for the stuff they need. Thus no pre-runners are +// bound to them for this purpose, and users of this command tree are free to add any. +// +// This tree is only safe to embed within closed-loop applications provided that the +// client *Client was created with WithNoDisconnect(), so that commands can reuse +// their connections more than once before closing. +func Generate(cli *client.Client) *cobra.Command { + clientCmds := clientCommands(cli) + return clientCmds +} + +// PreRun returns a cobra command runner which connects the client to its teamserver. +// If the client is connected, nothing happens and its current connection reused. +// +// Feel free to use this function as a model for your own teamclient pre-runners. +func PreRun(teamclient *client.Client, opts ...client.Options) command.CobraRunnerE { + return func(cmd *cobra.Command, args []string) error { + teamclient.SetLogWriter(cmd.OutOrStdout(), cmd.ErrOrStderr()) + + // Ensure we are connected or do it. + return teamclient.Connect(opts...) + } +} + +// PreRunNoDisconnect is a pre-runner that will connect the teamclient with the +// client.WithNoDisconnect() option, so that after each execution, the client +// connection is kept open. This pre-runner is thus useful for console apps. +// +// Feel free to use this function as a model for your own teamclient pre-runners. +func PreRunNoDisconnect(teamclient *client.Client, opts ...client.Options) command.CobraRunnerE { + return func(cmd *cobra.Command, args []string) error { + teamclient.SetLogWriter(cmd.OutOrStdout(), cmd.ErrOrStderr()) + + opts = append(opts, client.WithNoDisconnect()) + + // The NoDisconnect will prevent teamclient.Disconnect() to close the conn. + return teamclient.Connect(opts...) + } +} + +// PostRun is a cobra command runner that simply calls client.Disconnect() to close +// the client connection from its teamserver. If the client/commands was configured +// with WithNoDisconnect, this pre-runner will do nothing. +func PostRun(client *client.Client) command.CobraRunnerE { + return func(cmd *cobra.Command, _ []string) error { + return client.Disconnect() + } +} + +func clientCommands(cli *client.Client) *cobra.Command { + teamCmd := &cobra.Command{ + Use: "teamclient", + Short: "Client-only teamserver commands (import configs, show users, etc)", + SilenceUsage: true, + } + + teamFlags := pflag.NewFlagSet("teamserver", pflag.ContinueOnError) + teamFlags.CountP("verbosity", "v", "Counter flag (-vvv) to increase log verbosity on stdout (1:panic -> 7:debug)") + teamCmd.PersistentFlags().AddFlagSet(teamFlags) + + versionCmd := &cobra.Command{ + Use: "version", + Short: "Print teamserver client version", + RunE: versionCmd(cli), + } + + teamCmd.AddCommand(versionCmd) + + importCmd := &cobra.Command{ + Use: "import", + Short: fmt.Sprintf("Import a teamserver client configuration file for %s", cli.Name()), + Run: importCmd(cli), + ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{}, cobra.ShellCompDirectiveDefault + }, + } + + iFlags := pflag.NewFlagSet("import", pflag.ContinueOnError) + iFlags.BoolP("default", "d", false, "Set this config as the default one, if no default config exists already.") + importCmd.Flags().AddFlagSet(iFlags) + + iComps := carapace.Gen(importCmd) + iComps.PositionalCompletion( + carapace.Batch( + carapace.ActionCallback(ConfigsCompleter(cli, "teamclient/configs", ".teamclient.cfg", "other teamserver apps", true)), + carapace.ActionFiles().Tag("server configuration").StyleF(getConfigStyle(".teamclient.cfg")), + ).ToA(), + ) + + teamCmd.AddCommand(importCmd) + + usersCmd := &cobra.Command{ + Use: "users", + Short: "Display a table of teamserver users and their status", + RunE: usersCmd(cli), + } + + teamCmd.AddCommand(usersCmd) + + return teamCmd +} + +// ConfigsCompleter completes file paths to other teamserver application configs (clients/users CA, etc) +// The filepath is the directory between .app/ and the target directory where config files of a certain +// type should be found, ext is the normal/default extension for those target files, and tag is used in comps. +func ConfigsCompleter(cli *client.Client, filePath, ext, tag string, noSelf bool) carapace.CompletionCallback { + return func(ctx carapace.Context) carapace.Action { + var compErrors []carapace.Action + + homeDir, err := os.UserHomeDir() + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to get user home dir: %s", err)) + } + + dirs, err := os.ReadDir(homeDir) + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) + } + + var results []string + + for _, dir := range dirs { + if !isConfigDir(cli, dir, noSelf) { + continue + } + + configPath := filepath.Join(homeDir, dir.Name(), filePath) + + if configs, err := os.Stat(configPath); err == nil { + if !configs.IsDir() { + continue + } + + files, _ := os.ReadDir(configPath) + for _, file := range files { + if !strings.HasSuffix(file.Name(), ext) { + continue + } + + filePath := filepath.Join(configPath, file.Name()) + + cfg, err := cli.ReadConfig(filePath) + if err != nil || cfg == nil { + continue + } + + results = append(results, filePath) + results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) + } + } + } + + configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(ext)) + + if len(compErrors) > 0 { + return carapace.Batch(append(compErrors, configsAction)...).ToA() + } + + return configsAction.Tag(tag) + } +} + +func isConfigDir(cli *client.Client, dir fs.DirEntry, noSelf bool) bool { + if !strings.HasPrefix(dir.Name(), ".") { + return false + } + + if !dir.IsDir() { + return false + } + + if strings.TrimPrefix(dir.Name(), ".") != cli.Name() { + return false + } + + if noSelf { + return false + } + + return true +} + +func getConfigStyle(ext string) func(s string, sc style.Context) string { + return func(s string, sc style.Context) string { + if strings.HasSuffix(s, ext) { + return style.Red + } + + return s + } +} diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go new file mode 100644 index 0000000000..166a86c20a --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -0,0 +1,60 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "fmt" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + cli.SetLogLevel(logLevel + int(logrus.ErrorLevel)) + } + } + + if 0 < len(args) { + for _, arg := range args { + conf, err := cli.ReadConfig(arg) + if jsonErr, ok := err.(*json.SyntaxError); ok { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", jsonErr.Error()) + } else if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", err.Error()) + continue + } + + if err = cli.SaveConfig(conf); err == nil { + fmt.Fprintln(cmd.OutOrStdout(), command.Info+"Saved new client config in ", cli.ConfigsDir()) + } else { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", err.Error()) + } + } + } else { + fmt.Fprintln(cmd.OutOrStdout(), "Missing config file path, see --help") + } + } +} diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go new file mode 100644 index 0000000000..f3045c9794 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -0,0 +1,89 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "time" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + cli.SetLogLevel(logLevel + int(logrus.ErrorLevel)) + } + } + + if err := cli.Connect(); err != nil { + return err + } + + // Server + users, err := cli.Users() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) + } + + tbl := &table.Table{} + tbl.SetStyle(command.TableStyle) + + tbl.AppendHeader(table.Row{ + "Name", + "Status", + "Last seen", + }) + + for _, user := range users { + lastSeen := user.LastSeen.Format(time.RFC1123) + + if !user.LastSeen.IsZero() { + lastSeen = time.Since(user.LastSeen).Round(1 * time.Second).String() + } + + var status string + if user.Online { + status = command.Bold + command.Green + "Online" + command.Normal + } else { + status = command.Bold + command.Red + "Offline" + command.Normal + } + + tbl.AppendRow(table.Row{ + user.Name, + status, + lastSeen, + }) + } + + if len(users) > 0 { + fmt.Fprintln(cmd.OutOrStdout(), tbl.Render()) + } else { + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"The %s teamserver has no users\n", cli.Name()) + } + + return nil + } +} diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go new file mode 100644 index 0000000000..ffd5b9a1b8 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -0,0 +1,63 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/version" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + cli.SetLogLevel(logLevel + int(logrus.ErrorLevel)) + } + } + + if err := cli.Connect(); err != nil { + return err + } + + // Server + serverVer, err := cli.ServerVersion() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) + } + + dirty := "" + if serverVer.Dirty { + dirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) + } + + serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) + + // Client + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client %s\n", version.Full()) + + return nil + } +} diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go new file mode 100644 index 0000000000..f4b4028d35 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/config.go @@ -0,0 +1,256 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/sha256" + "crypto/tls" + "crypto/x509" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "sort" + + "github.com/reeflective/team/internal/certs" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "gopkg.in/AlecAivazis/survey.v1" +) + +const ( + fileWriteModePerm = 0o600 +) + +// Config is a JSON client connection configuration. +// It contains the addresses of a team server, the name of the user +// allowed to connect to it, and cryptographic material to secure and +// authenticate the client-server connection (using Mutual TLS). +type Config struct { + User string `json:"user"` // This value is actually ignored for the most part (cert CN is used instead) + Host string `json:"host"` + Port int `json:"port"` + Token string `json:"token"` + CACertificate string `json:"ca_certificate"` + PrivateKey string `json:"private_key"` + Certificate string `json:"certificate"` +} + +func (tc *Client) initConfig() error { + cfg := tc.opts.config + + // We assume that any configuration passed with WithConfig() + // has a non-empty user name, even if its the server itself. + if cfg.User != "" { + return nil + } + + // Else fetch the unique config or prompt user for which. + if !tc.opts.local { + configs := tc.GetConfigs() + if len(configs) == 0 { + return tc.errorf("no config files found at %s", tc.ConfigsDir()) + } + + cfg = tc.SelectConfig() + } + + // We must have a config. + if cfg == nil { + return ErrNoConfig + } + + tc.opts.config = cfg + + return nil +} + +// GetConfigs returns a list of available configs in the application +// teamclient remote server configs directory (~/.app/teamclient/configs/). +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) GetConfigs() map[string]*Config { + configDir := tc.ConfigsDir() + + configFiles, err := os.ReadDir(configDir) + if err != nil { + tc.log().Errorf("No configs found: %s", err) + return map[string]*Config{} + } + + confs := map[string]*Config{} + + for _, confFile := range configFiles { + confFilePath := filepath.Join(configDir, confFile.Name()) + + conf, err := tc.ReadConfig(confFilePath) + if err != nil { + continue + } + + digest := sha256.Sum256([]byte(conf.Certificate)) + confs[fmt.Sprintf("%s@%s (%x)", conf.User, conf.Host, digest[:8])] = conf + } + + return confs +} + +// ReadConfig loads a client config into a struct. +// Errors are returned as is: users can check directly for JSON/encoding/filesystem errors. +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) ReadConfig(confFilePath string) (*Config, error) { + confFile, err := os.Open(confFilePath) + if err != nil { + return nil, fmt.Errorf("open failed: %w", err) + } + defer confFile.Close() + + data, err := io.ReadAll(confFile) + if err != nil { + return nil, fmt.Errorf("read failed: %w", err) + } + + conf := &Config{} + + err = json.Unmarshal(data, conf) + if err != nil { + return nil, fmt.Errorf("parse failed: %w", err) + } + + return conf, nil +} + +// SaveConfig saves a client config to disk. +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) SaveConfig(config *Config) error { + if config.User == "" { + return ErrConfigNoUser + } + + configDir := tc.ConfigsDir() + + // If we are in-memory, still make the directory. + if _, err := os.Stat(configDir); os.IsNotExist(err) { + if err = os.MkdirAll(configDir, log.DirPerm); err != nil { + return tc.errorf("%w: %w", ErrConfig, err) + } + } + + filename := fmt.Sprintf("%s_%s.%s", filepath.Base(config.User), filepath.Base(config.Host), command.ClientConfigExt) + saveTo, _ := filepath.Abs(filepath.Join(configDir, filename)) + + configJSON, err := json.Marshal(config) + if err != nil { + return fmt.Errorf("%w: %w", ErrConfig, err) + } + + err = os.WriteFile(saveTo, configJSON, fileWriteModePerm) + if err != nil { + return tc.errorf("Failed to write config to: %s (%w)", saveTo, err) + } + + tc.log().Infof("Saved new client config to: %s", saveTo) + + return nil +} + +// SelectConfig either returns the only configuration found in the app +// client remote configs directory, or prompts the user to select one. +// This call might thus be blocking, and expect user input. +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) SelectConfig() *Config { + configs := tc.GetConfigs() + + if len(configs) == 0 { + return nil + } + + if len(configs) == 1 { + for _, config := range configs { + return config + } + } + + answer := struct{ Config string }{} + qs := getPromptForConfigs(configs) + + err := survey.Ask(qs, &answer) + if err != nil { + tc.log().Errorf("config prompt failed: %s", err) + return nil + } + + return configs[answer.Config] +} + +// Config returns the currently used teamclient server configuration. +// This configuration might be empty (not nil), if no specific server +// configuration was loaded by the client yet. +func (tc *Client) Config() *Config { + return tc.opts.config +} + +// NewTLSConfigFrom generates a working client TLS configuration prepared for Mutual TLS. +// It requires the three credential materials presents in any user remote teamserver config. +func (tc *Client) NewTLSConfigFrom(caCert string, cert string, key string) (*tls.Config, error) { + certPEM, err := tls.X509KeyPair([]byte(cert), []byte(key)) + if err != nil { + return nil, fmt.Errorf("Cannot parse client certificate: %w", err) + } + + // Load CA cert + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM([]byte(caCert)) + + // Setup config with custom certificate validation routine + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{certPEM}, + RootCAs: caCertPool, + InsecureSkipVerify: true, // Don't worry I sorta know what I'm doing + VerifyPeerCertificate: func(rawCerts [][]byte, _ [][]*x509.Certificate) error { + return certs.RootOnlyVerifyCertificate(caCert, rawCerts) + }, + } + + return tlsConfig, nil +} + +func getPromptForConfigs(configs map[string]*Config) []*survey.Question { + keys := []string{} + for k := range configs { + keys = append(keys, k) + } + + sort.Strings(keys) + + return []*survey.Question{ + { + Name: "config", + Prompt: &survey.Select{ + Message: "Select a server:", + Options: keys, + Default: keys[0], + }, + }, + } +} diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go new file mode 100644 index 0000000000..0c2129c992 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -0,0 +1,94 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os/user" + "path/filepath" + + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/log" +) + +// HomeDir returns the root application directory (~/.app/ by default). +// This directory can be set with the environment variable _ROOT_DIR. +// This directory is not to be confused with the ~/.app/teamclient directory +// returned by the client.TeamDir(), which is specific to the app teamclient. +func (tc *Client) HomeDir() string { + var dir string + + // Note: very important not to combine the nested if here. + if !tc.opts.inMemory { + if tc.homeDir == "" { + user, _ := user.Current() + dir = filepath.Join(user.HomeDir, "."+tc.name) + } + } else { + dir = "." + tc.name + } + + err := tc.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// TeamDir returns the teamclient directory of the app (named ~/./teamclient/), +// creating the directory if needed, or logging an error event if failing to create it. +// This directory is used to store teamclient logs and remote server configs. +func (tc *Client) TeamDir() string { + dir := filepath.Join(tc.HomeDir(), assets.DirClient) + + err := tc.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// LogsDir returns the directory of the teamclient logs (~/.app/logs), creating +// the directory if needed, or logging a fatal event if failing to create it. +func (tc *Client) LogsDir() string { + logsDir := filepath.Join(tc.TeamDir(), assets.DirLogs) + + err := tc.fs.MkdirAll(logsDir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s root dir: %s", logsDir, err) + } + + return logsDir +} + +// GetConfigDir returns the path to the remote teamserver configs directory +// for this application (~/.app/teamclient/configs), creating the directory +// if needed, or logging a fatal event if failing to create it. +func (tc *Client) ConfigsDir() string { + rootDir, _ := filepath.Abs(tc.TeamDir()) + dir := filepath.Join(rootDir, assets.DirConfigs) + + err := tc.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s configs dir: %s", dir, err) + } + + return dir +} diff --git a/vendor/github.com/reeflective/team/client/errors.go b/vendor/github.com/reeflective/team/client/errors.go new file mode 100644 index 0000000000..d4ccd8f553 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/errors.go @@ -0,0 +1,43 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import "errors" + +var ( + // ErrNoTeamclient indicates that the client cannot remotely query a server + // to get its version or user information, because there is no client RPC + // to do it. Make sure that your team/client.Client has been given one. + ErrNoTeamclient = errors.New("this teamclient has no client implementation") + + // ErrConfig is an error related to the teamclient connection configuration. + ErrConfig = errors.New("client config error") + + // ErrNoConfig indicates that no configuration, default or on file system, was found. + ErrNoConfig = errors.New("no client configuration was selected or parsed") + + // ErrConfigNoUser says that the configuration has no user, + // which is not possible even if the client is an in-memory one. + ErrConfigNoUser = errors.New("client config with empty user") + + // ErrClient indicates an error raised by the client when igniting or connecting. + // Most errors are raised by the underlying transport stack, which can be user-specific, + // so users of this library should unwrap ErrClient errors to check against their owns. + ErrClient = errors.New("teamclient dialer") +) diff --git a/vendor/github.com/reeflective/team/client/log.go b/vendor/github.com/reeflective/team/client/log.go new file mode 100644 index 0000000000..ed602c227e --- /dev/null +++ b/vendor/github.com/reeflective/team/client/log.go @@ -0,0 +1,114 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io" + "path/filepath" + + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" +) + +// NamedLogger returns a new logging "thread" with two fields (optional) +// to indicate the package/general domain, and a more precise flow/stream. +// The events are logged according to the teamclient logging backend setup. +func (tc *Client) NamedLogger(pkg, stream string) *logrus.Entry { + return tc.log().WithFields(logrus.Fields{ + log.PackageFieldKey: pkg, + "stream": stream, + }) +} + +// SetLogWriter sets the stream to which the stdio logger (not the file logger) +// should write to. This option is used by the teamclient cobra command tree to +// synchronize its basic I/O/err with the teamclient backend. +func (tc *Client) SetLogWriter(stdout, stderr io.Writer) { + tc.stdoutLogger.Out = stdout + // TODO: Pass stderr to log internals. +} + +// SetLogLevel sets the logging level of all teamclient loggers. +func (tc *Client) SetLogLevel(level int) { + if tc.stdoutLogger == nil { + return + } + + if uint32(level) > uint32(logrus.TraceLevel) { + level = int(logrus.TraceLevel) + } + + tc.stdoutLogger.SetLevel(logrus.Level(uint32(level))) + + if tc.fileLogger != nil { + tc.fileLogger.SetLevel(logrus.Level(uint32(level))) + } +} + +// log returns a non-nil logger for the client: +// if file logging is disabled, it returns the stdout-only logger, +// otherwise returns the file logger equipped with a stdout hook. +func (tc *Client) log() *logrus.Logger { + if tc.fileLogger != nil { + return tc.fileLogger + } + + if tc.stdoutLogger == nil { + tc.stdoutLogger = log.NewStdio(logrus.WarnLevel) + } + + return tc.stdoutLogger +} + +func (tc *Client) errorf(msg string, format ...any) error { + logged := fmt.Errorf(msg, format...) + tc.log().Error(logged) + + return logged +} + +func (tc *Client) initLogging() (err error) { + // By default, the stdout logger is never nil. + // We might overwrite it below if using our defaults. + tc.stdoutLogger = log.NewStdio(logrus.WarnLevel) + + // Path to our client log file, and open it (in mem or on disk) + logFile := filepath.Join(tc.LogsDir(), log.FileName(tc.Name(), false)) + + // If the teamclient should log to a predefined file. + if tc.opts.logFile != "" { + logFile = tc.opts.logFile + } + + // If user supplied a logger, use it in place of the + // file-based logger, since the file logger is optional. + if tc.opts.logger != nil { + tc.fileLogger = tc.opts.logger + return nil + } + + // Create the loggers writing to this file, and hooked to write to stdout as well. + tc.fileLogger, tc.stdoutLogger, err = log.Init(tc.fs, logFile, logrus.InfoLevel) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go new file mode 100644 index 0000000000..da12a3deb4 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/options.go @@ -0,0 +1,200 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io" + "os" + "strings" + + "github.com/sirupsen/logrus" +) + +// Options are client options. +// You can set or modify the behavior of a teamclient at various +// steps with these options, which are a variadic parameter of +// several client.Client methods. +// Note that some options can only be used once, while others can be +// used multiple times. Examples of the former are log files, while +// the latter includes dialers/hooks. +// Each option will specify this in its description. +type Options func(opts *opts) + +type opts struct { + homeDir string + noLogs bool + logFile string + inMemory bool + console bool + local bool + stdout io.Writer + config *Config + logger *logrus.Logger + dialer Dialer[any] + hooks []func(s any) error +} + +func defaultOpts() *opts { + return &opts{ + config: &Config{}, + } +} + +func (tc *Client) apply(options ...Options) { + for _, optFunc := range options { + optFunc(tc.opts) + } + + // The server will apply options multiple times + // in its lifetime, but some options can only be + // set once when created. + tc.initOpts.Do(func() { + // Application home directory. + homeDir := os.Getenv(fmt.Sprintf("%s_ROOT_DIR", strings.ToUpper(tc.name))) + if homeDir != "" { + tc.homeDir = homeDir + } else { + tc.homeDir = tc.opts.homeDir + } + }) + + if tc.opts.dialer != nil { + tc.dialer = tc.opts.dialer + } + + if tc.opts.stdout != nil { + tc.stdoutLogger.Out = tc.opts.stdout + } +} + +// +// *** General options *** +// + +// WithInMemory deactivates all interactions of the client with the on-disk filesystem. +// This will in effect use in-memory files for all file-based logging and database data. +// This might be useful for testing, or if you happen to embed a teamclient in a program +// without the intent of using it now, etc. +// +// This option can only be used once, and should be passed to server.New(). +func WithInMemory() Options { + return func(opts *opts) { + opts.noLogs = true + opts.inMemory = true + } +} + +// WithConfig sets the client to use a given remote teamserver configuration which +// to connect to, instead of using default on-disk user/application configurations. +func WithConfig(config *Config) Options { + return func(opts *opts) { + opts.config = config + } +} + +// WithHomeDirectory sets the default path (~/.app/) of the application directory. +// This path can still be overridden at the user-level with the env var APP_ROOT_DIR. +// +// This option can only be used once, and must be passed to server.New(). +func WithHomeDirectory(path string) Options { + return func(opts *opts) { + opts.homeDir = path + } +} + +// +// *** Logging options *** +// + +// WithNoLogs deactivates all logging normally done by the teamclient +// if noLogs is set to true, or keeps/reestablishes them if false. +// +// This option can only be used once, and should be passed to server.New(). +func WithNoLogs(noLogs bool) Options { + return func(opts *opts) { + opts.noLogs = noLogs + } +} + +// WithLogFile sets the path to the file where teamclient logging should be done. +// If not specified, the client log file is ~/.app/teamclient/logs/app.teamclient.log. +// +// This option can only be used once, and should be passed to server.New(). +func WithLogFile(filePath string) Options { + return func(opts *opts) { + opts.logFile = filePath + } +} + +// WithLogger sets the teamclient to use a specific logger for logging. +// +// This option can only be used once, and should be passed to server.New(). +func WithLogger(logger *logrus.Logger) Options { + return func(opts *opts) { + opts.logger = logger + } +} + +// +// *** Client network/RPC options *** +// + +// WithDialer sets a custom dialer to connect to the teamserver. +// See the Dialer type documentation for implementation/usage details. +// +// It accepts an optional list of hooks to run on the generic clientConn +// returned by the client.Dialer Dial() method (see Dialer doc for details). +// This client object can be pretty much any client-side conn/RPC object. +// You will have to typecast this conn in your hooks, casting it to the type +// that your teamclient Dialer.Dial() method returns. +// +// This option can be used multiple times, either when using +// team/client.New() or when using the teamclient.Connect() method. +func WithDialer(dialer Dialer[any], hooks ...func(clientConn any) error) Options { + return func(opts *opts) { + opts.dialer = dialer + opts.hooks = append(opts.hooks, hooks...) + } +} + +// WithLocalDialer sets the teamclient to connect with an in-memory dialer +// (provided when creating the teamclient). This in effect only prevents +// the teamclient from looking and loading/prompting remote client configs. +// +// Because this is automatically called by the teamserver.Serve(client) +// function, you should probably not have any reason to use this option. +func WithLocalDialer() Options { + return func(opts *opts) { + opts.local = true + } +} + +// WithNoDisconnect is meant to be used when the teamclient commands are used +// in a closed-loop (readline-style) application, where the connection is used +// more than once in the lifetime of the Go program. +// If this is the case, this option will ensure that any cobra client command +// runners produced by this library will not disconnect after each execution. +// +// This option can only be used once, and should be passed to server.New(). +func WithNoDisconnect() Options { + return func(opts *opts) { + opts.console = true + } +} diff --git a/vendor/github.com/reeflective/team/internal/assets/fs.go b/vendor/github.com/reeflective/team/internal/assets/fs.go new file mode 100644 index 0000000000..d70442b832 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/assets/fs.go @@ -0,0 +1,203 @@ +package assets + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/psanford/memfs" +) + +const ( + FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. + DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. + FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. + + // FileWriteOpenMode is used when opening log files in append/create/write-only mode. + FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY +) + +const ( + // Teamclient. + + DirClient = "teamclient" // DirClient is the name of the teamclient subdirectory. + DirLogs = "logs" // DirLogs subdirectory name + DirConfigs = "configs" // DirConfigs subdirectory name + + // Teamserver. + + DirServer = "teamserver" // DirClient is the name of the teamserver subdirectory. + DirCerts = "certs" // DirCerts subdirectory name +) + +// FS is a filesystem abstraction for teamservers and teamclients. +// When either of them are configured to run in memory only, this +// filesystem is initialized accordingly, otherwise it will forward +// its calls to the on-disk filesystem. +// +// This type currently exists because the stdlib io/fs.FS type is read-only, +// and that in order to provide a unique abstraction to the teamclient/server +// filesystems, this filesystem type adds writing methods. +type FS struct { + mem *memfs.FS + root string +} + +// NewFileSystem returns a new filesystem configured to run on disk or in-memory. +func NewFileSystem(root string, inMemory bool) *FS { + filesystem := &FS{ + root: root, + } + + if inMemory { + filesystem.mem = memfs.New() + } + + return filesystem +} + +// MkdirAll creates a directory named path, along with any necessary parents, +// and returns nil, or else returns an error. +// The permission bits perm (before umask) are used for all directories that MkdirAll creates. +// If path is already a directory, MkdirAll does nothing and returns nil. +// +// If the filesystem is in-memory, the teamclient/server application root +// is trimmed from this path, if the latter contains it. +func (f *FS) MkdirAll(path string, perm fs.FileMode) error { + if f.mem == nil { + return os.MkdirAll(path, perm) + } + + path = strings.TrimPrefix(path, f.root) + + return f.mem.MkdirAll(path, perm) +} + +// Sub returns a file system (an fs.FS) for the tree of files rooted at the directory dir, +// or an error if it failed. When the teamclient fs is on disk, os.Stat() and os.DirFS() are used. +// +// If the filesystem is in-memory, the teamclient/server application root +// is trimmed from this path, if the latter contains it. +func (f *FS) Sub(path string) (fs fs.FS, err error) { + if f.mem == nil { + _, err = os.Stat(path) + + return os.DirFS(path), err + } + + path = strings.TrimPrefix(path, f.root) + + return f.mem.Sub(path) +} + +// Open is like fs.Open(). +// +// If the filesystem is in-memory, the teamclient/server application root +// is trimmed from this path, if the latter contains it. +func (f *FS) Open(name string) (fs.File, error) { + if f.mem == nil { + return os.Open(name) + } + + name = strings.TrimPrefix(name, f.root) + + return f.mem.Open(name) +} + +// OpenFile is like os.OpenFile(), but returns a custom *File type implementing +// the io.WriteCloser interface, so that it can be written to and closed more easily. +func (f *FS) OpenFile(name string, flag int, perm fs.FileMode) (*File, error) { + inFile := &File{ + name: name, + } + + if f.mem != nil { + inFile.mem = f.mem + + return inFile, nil + } + + file, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + + inFile.file = file + + return inFile, nil +} + +// WriteFile is like os.WriteFile(). +func (f *FS) WriteFile(path string, data []byte, perm fs.FileMode) error { + if f.mem == nil { + return os.WriteFile(path, data, perm) + } + + path = strings.TrimPrefix(path, f.root) + + return f.mem.WriteFile(path, data, perm) +} + +// ReadFile is like os.ReadFile(). +func (f *FS) ReadFile(path string) (b []byte, err error) { + if f.mem == nil { + return os.ReadFile(path) + } + + _, err = f.mem.Open(path) + if err != nil { + return + } + + return fs.ReadFile(f.mem, path) +} + +// File wraps the *os.File type with some in-memory helpers, +// so that we can write/read to teamserver application files +// regardless of where they are. +// This should disappear if a Write() method set is added to the io/fs package. +type File struct { + name string + file *os.File + mem *memfs.FS +} + +// Write implements the io.Writer interface by writing data either +// to the file on disk, or to an in-memory file. +func (f *File) Write(data []byte) (written int, err error) { + if f.file != nil { + return f.file.Write(data) + } + + fileName := filepath.Base(f.name) + + return len(data), f.mem.WriteFile(fileName, data, FileWritePerm) +} + +// Close implements io.Closer by closing the file on the filesystem. +func (f *File) Close() error { + if f.file != nil { + return f.file.Close() + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/certs/README.md b/vendor/github.com/reeflective/team/internal/certs/README.md new file mode 100644 index 0000000000..ea7e38806b --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/README.md @@ -0,0 +1,4 @@ +certs +====== + +X.509 certificate generation and management code. diff --git a/vendor/github.com/reeflective/team/internal/certs/ca.go b/vendor/github.com/reeflective/team/internal/certs/ca.go new file mode 100644 index 0000000000..6550626dd0 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/ca.go @@ -0,0 +1,149 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/ecdsa" + "crypto/x509" + "encoding/pem" + "fmt" + "os" + "path/filepath" + + "github.com/reeflective/team/internal/log" +) + +// ----------------------- +// CERTIFICATE AUTHORITY +// ----------------------- + +const ( + certFileExt = "teamserver.pem" +) + +// GetUsersCA returns the certificate authority for teamserver users. +func (c *Manager) GetUsersCA() (*x509.Certificate, *ecdsa.PrivateKey, error) { + return c.getCA(userCA) +} + +// GetUsersCAPEM returns the certificate authority for teamserver users, PEM-encoded. +func (c *Manager) GetUsersCAPEM() ([]byte, []byte, error) { + return c.getCAPEM(userCA) +} + +// SaveUsersCA saves a user certificate authority (may contain several users). +func (c *Manager) SaveUsersCA(cert, key []byte) { + c.saveCA(userCA, cert, key) +} + +// generateCA - Creates a new CA cert for a given type, or die trying. +func (c *Manager) generateCA(caType string, commonName string) (*x509.Certificate, *ecdsa.PrivateKey) { + storageDir := c.getCertDir() + + certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) + if _, err := os.Stat(certFilePath); os.IsNotExist(err) { + c.log.Infof("Generating certificate authority for '%s'", caType) + cert, key := c.GenerateECCCertificate(caType, commonName, true, false) + c.saveCA(caType, cert, key) + } + + cert, key, err := c.getCA(caType) + if err != nil { + c.log.Fatalf("Failed to load CA: %s", err) + } + + return cert, key +} + +// getCA - Get the current CA certificate. +func (c *Manager) getCA(caType string) (*x509.Certificate, *ecdsa.PrivateKey, error) { + certPEM, keyPEM, err := c.getCAPEM(caType) + if err != nil { + return nil, nil, err + } + + certBlock, _ := pem.Decode(certPEM) + if certBlock == nil { + c.log.Error("Failed to parse certificate PEM") + return nil, nil, err + } + + cert, err := x509.ParseCertificate(certBlock.Bytes) + if err != nil { + c.log.Error("Failed to parse certificate: " + err.Error()) + return nil, nil, err + } + + keyBlock, _ := pem.Decode(keyPEM) + if keyBlock == nil { + c.log.Error("Failed to parse certificate PEM") + return nil, nil, err + } + + key, err := x509.ParseECPrivateKey(keyBlock.Bytes) + if err != nil { + c.log.Error(err) + return nil, nil, err + } + + return cert, key, nil +} + +// getCAPEM - Get PEM encoded CA cert/key. +func (c *Manager) getCAPEM(caType string) ([]byte, []byte, error) { + caType = filepath.Base(caType) + caCertPath := filepath.Join(c.getCertDir(), fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) + caKeyPath := filepath.Join(c.getCertDir(), fmt.Sprintf("%s_%s-ca-key.%s", c.appName, caType, certFileExt)) + + certPEM, err := c.fs.ReadFile(caCertPath) + if err != nil { + c.log.Error(err) + return nil, nil, err + } + + keyPEM, err := c.fs.ReadFile(caKeyPath) + if err != nil { + c.log.Error(err) + return nil, nil, err + } + + return certPEM, keyPEM, nil +} + +// saveCA - Save the certificate and the key to the filesystem +// doesn't return an error because errors are fatal. If we can't generate CAs, +// then we can't secure communication and we should die a horrible death. +func (c *Manager) saveCA(caType string, cert []byte, key []byte) { + storageDir := c.getCertDir() + + // CAs get written to the filesystem since we control the names and makes them + // easier to move around/backup + certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) + keyFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-key.%s", c.appName, caType, certFileExt)) + + err := c.fs.WriteFile(certFilePath, cert, log.FileReadPerm) + if err != nil { + c.log.Fatalf("Failed write certificate data to %s, %s", certFilePath, err) + } + + err = c.fs.WriteFile(keyFilePath, key, log.FileReadPerm) + if err != nil { + c.log.Fatalf("Failed write certificate data to %s: %s", keyFilePath, err) + } +} diff --git a/vendor/github.com/reeflective/team/internal/certs/certs.go b/vendor/github.com/reeflective/team/internal/certs/certs.go new file mode 100644 index 0000000000..4f7c7d0242 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/certs.go @@ -0,0 +1,375 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/binary" + "encoding/pem" + "errors" + "fmt" + "math/big" + insecureRand "math/rand" + "net" + "path/filepath" + "time" + + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/db" + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +const ( + // ECCKey - Namespace for ECC keys. + ECCKey = "ecc" + + // RSAKey - Namespace for RSA keys. + RSAKey = "rsa" + + // Internal constants. + daysInYear = 365 + hoursInDay = 24 + validForYears = 3 + serialNumberLen = 128 +) + +// ErrCertDoesNotExist - Returned if a GetCertificate() is called for a cert/cn that does not exist. +var ErrCertDoesNotExist = errors.New("Certificate does not exist") + +// Manager is used to manage the certificate infrastructure for a given teamserver. +// Has access to a given database for storage, a logger and an abstract filesystem. +type Manager struct { + appName string + appDir string + log *logrus.Entry + db *gorm.DB + fs *assets.FS +} + +// NewManager initializes and returns a certificate manager for a given teamserver. +// The returned manager will have ensured that all certificate authorities are initialized +// and working, or will create them if needed. +// Any critical error happening at initialization time will send a log.Fatal event to the +// provided logger. If the latter has no modified log.ExitFunc, this will make the server +// panic and exit. +func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appName, appDir string) *Manager { + certs := &Manager{ + appName: appName, + appDir: appDir, + log: logger, + db: db, + fs: filesystem, + } + + certs.generateCA(userCA, "teamusers") + + return certs +} + +// GetECCCertificate - Get an ECC certificate. +func (c *Manager) GetECCCertificate(caType string, commonName string) ([]byte, []byte, error) { + return c.GetCertificate(caType, ECCKey, commonName) +} + +// GetRSACertificate - Get an RSA certificate. +func (c *Manager) GetRSACertificate(caType string, commonName string) ([]byte, []byte, error) { + return c.GetCertificate(caType, RSAKey, commonName) +} + +// GetCertificate - Get the PEM encoded certificate & key for a host. +func (c *Manager) GetCertificate(caType string, keyType string, commonName string) ([]byte, []byte, error) { + if keyType != ECCKey && keyType != RSAKey { + return nil, nil, fmt.Errorf("Invalid key type '%s'", keyType) + } + + c.log.Infof("Getting certificate ca type = %s, cn = '%s'", caType, commonName) + + certModel := db.Certificate{} + result := c.db.Where(&db.Certificate{ + CAType: caType, + KeyType: keyType, + CommonName: commonName, + }).First(&certModel) + + if errors.Is(result.Error, db.ErrRecordNotFound) { + return nil, nil, ErrCertDoesNotExist + } + + if result.Error != nil { + return nil, nil, result.Error + } + + return []byte(certModel.CertificatePEM), []byte(certModel.PrivateKeyPEM), nil +} + +// RemoveCertificate - Remove a certificate from the cert store. +func (c *Manager) RemoveCertificate(caType string, keyType string, commonName string) error { + if keyType != ECCKey && keyType != RSAKey { + return fmt.Errorf("Invalid key type '%s'", keyType) + } + + c.log.Infof("Deleting certificate for cn = '%s'", commonName) + + err := c.db.Where(&db.Certificate{ + CAType: caType, + KeyType: keyType, + CommonName: commonName, + }).Delete(&db.Certificate{}).Error + + return err +} + +// -------------------------------- +// Generic Certificate Functions +// -------------------------------- + +// GenerateECCCertificate - Generate a TLS certificate with the given parameters +// We choose some reasonable defaults like Curve, Key Size, ValidFor, etc. +// Returns two strings `cert` and `key` (PEM Encoded). +func (c *Manager) GenerateECCCertificate(caType string, commonName string, isCA bool, isClient bool) ([]byte, []byte) { + c.log.Infof("Generating TLS certificate (ECC) for '%s' ...", commonName) + + var privateKey interface{} + var err error + + // Generate private key + curves := []elliptic.Curve{elliptic.P521(), elliptic.P384(), elliptic.P256()} + curve := curves[randomInt(len(curves))] + + privateKey, err = ecdsa.GenerateKey(curve, rand.Reader) + if err != nil { + c.log.Fatalf("Failed to generate private key: %s", err) + } + + subject := pkix.Name{ + CommonName: commonName, + } + + return c.generateCertificate(caType, subject, isCA, isClient, privateKey) +} + +// GenerateRSACertificate - Generates an RSA Certificate. +func (c *Manager) GenerateRSACertificate(caType string, commonName string, isCA bool, isClient bool) ([]byte, []byte) { + c.log.Debugf("Generating TLS certificate (RSA) for '%s' ...", commonName) + + var privateKey interface{} + var err error + + // Generate private key + privateKey, err = rsa.GenerateKey(rand.Reader, rsaKeySize()) + if err != nil { + c.log.Fatalf("Failed to generate private key: %s", err) + } + + subject := pkix.Name{ + CommonName: commonName, + } + + return c.generateCertificate(caType, subject, isCA, isClient, privateKey) +} + +func (c *Manager) generateCertificate(caType string, subject pkix.Name, isCA bool, isClient bool, privateKey interface{}) ([]byte, []byte) { + // Valid times, subtract random days from .Now() + notBefore := time.Now() + days := randomInt(daysInYear) * -1 // Within -1 year + notBefore = notBefore.AddDate(0, 0, days) + notAfter := notBefore.Add(randomValidFor()) + c.log.Debugf("Valid from %v to %v", notBefore, notAfter) + + // Serial number + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), serialNumberLen) + serialNumber, _ := rand.Int(rand.Reader, serialNumberLimit) + c.log.Debugf("Serial Number: %d", serialNumber) + + keyUsage := x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature + var extKeyUsage []x509.ExtKeyUsage + + switch { + case isCA: + c.log.Debugf("Authority certificate") + + keyUsage = x509.KeyUsageCertSign | x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature + extKeyUsage = []x509.ExtKeyUsage{ + x509.ExtKeyUsageServerAuth, + x509.ExtKeyUsageClientAuth, + } + case isClient: + c.log.Debugf("Client authentication certificate") + + extKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth} + default: + c.log.Debugf("Server authentication certificate") + + extKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth} + } + + c.log.Debugf("ExtKeyUsage = %v", extKeyUsage) + + // Certificate template + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: subject, + NotBefore: notBefore, + NotAfter: notAfter, + KeyUsage: keyUsage, + ExtKeyUsage: extKeyUsage, + BasicConstraintsValid: isCA, + } + + if !isClient { + // Host or IP address + if ip := net.ParseIP(subject.CommonName); ip != nil { + c.log.Debugf("Certificate authenticates IP address: %v", ip) + template.IPAddresses = append(template.IPAddresses, ip) + } else { + c.log.Debugf("Certificate authenticates host: %v", subject.CommonName) + template.DNSNames = append(template.DNSNames, subject.CommonName) + } + } else { + c.log.Debugf("Client certificate authenticates CN: %v", subject.CommonName) + } + + // Sign certificate or self-sign if CA + var certErr error + var derBytes []byte + + if isCA { + c.log.Debugf("Certificate is an AUTHORITY") + + template.IsCA = true + template.KeyUsage |= x509.KeyUsageCertSign + derBytes, certErr = x509.CreateCertificate(rand.Reader, &template, &template, publicKey(privateKey), privateKey) + } else { + caCert, caKey, err := c.getCA(caType) // Sign the new certificate with our CA + if err != nil { + c.log.Fatalf("Invalid ca type (%s): %s", caType, err) + } + derBytes, certErr = x509.CreateCertificate(rand.Reader, &template, caCert, publicKey(privateKey), caKey) + } + + if certErr != nil { + // We maybe don't want this to be fatal, but it should basically never happen afaik + c.log.Fatalf("Failed to create certificate: %s", certErr) + } + + // Encode certificate and key + certOut := bytes.NewBuffer([]byte{}) + pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + + keyOut := bytes.NewBuffer([]byte{}) + pem.Encode(keyOut, c.pemBlockForKey(privateKey)) + + return certOut.Bytes(), keyOut.Bytes() +} + +func (c *Manager) saveCertificate(caType string, keyType string, commonName string, cert []byte, key []byte) error { + if keyType != ECCKey && keyType != RSAKey { + return fmt.Errorf("Invalid key type '%s'", keyType) + } + + c.log.Infof("Saving certificate for cn = '%s'", commonName) + + certModel := &db.Certificate{ + CommonName: commonName, + CAType: caType, + KeyType: keyType, + CertificatePEM: string(cert), + PrivateKeyPEM: string(key), + } + + result := c.db.Create(&certModel) + + return result.Error +} + +// getCertDir returns the directory (and makes it if needed) for writing certificate backups. +func (c *Manager) getCertDir() string { + rootDir := c.appDir + certDir := filepath.Join(rootDir, "certs") + + err := c.fs.MkdirAll(certDir, log.DirPerm) + if err != nil { + c.log.Fatalf("Failed to create cert dir: %s", err) + } + + return certDir +} + +func (c *Manager) pemBlockForKey(priv interface{}) *pem.Block { + switch key := priv.(type) { + case *rsa.PrivateKey: + data := x509.MarshalPKCS1PrivateKey(key) + return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: data} + case *ecdsa.PrivateKey: + data, err := x509.MarshalECPrivateKey(key) + if err != nil { + c.log.Fatalf("Unable to marshal ECDSA private key: %v", err) + } + + return &pem.Block{Type: "EC PRIVATE KEY", Bytes: data} + default: + return nil + } +} + +func publicKey(priv interface{}) interface{} { + switch k := priv.(type) { + case *rsa.PrivateKey: + return &k.PublicKey + case *ecdsa.PrivateKey: + return &k.PublicKey + default: + return nil + } +} + +func randomInt(max int) int { + intLen := 4 + buf := make([]byte, intLen) + rand.Read(buf) + i := binary.LittleEndian.Uint32(buf) + + return int(i) % max +} + +func randomValidFor() time.Duration { + validFor := validForYears * (daysInYear * hoursInDay * time.Hour) + + switch insecureRand.Intn(2) { + case 0: + validFor = (validForYears - 1) * (daysInYear * hoursInDay * time.Hour) + case 1: + validFor = validForYears * (daysInYear * hoursInDay * time.Hour) + } + + return validFor +} + +func rsaKeySize() int { + rsaKeySizes := []int{4096, 2048} + return rsaKeySizes[randomInt(len(rsaKeySizes))] +} diff --git a/vendor/github.com/reeflective/team/internal/certs/tls.go b/vendor/github.com/reeflective/team/internal/certs/tls.go new file mode 100644 index 0000000000..eb403be1ca --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/tls.go @@ -0,0 +1,87 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/x509" + "fmt" + "log" + "os" + + teamlog "github.com/reeflective/team/internal/log" +) + +const ( + // Should be 31415, but... go to hell with your endless limits. + DefaultPort = 31416 +) + +// OpenTLSKeyLogFile returns an open file to the TLS keys log file, +// if the environment variable SSLKEYLOGFILE is defined. +func (c *Manager) OpenTLSKeyLogFile() *os.File { + keyFilePath, present := os.LookupEnv("SSLKEYLOGFILE") + if present { + keyFile, err := os.OpenFile(keyFilePath, teamlog.FileWriteOpenMode, teamlog.FileReadPerm) + if err != nil { + c.log.Errorf("Failed to open TLS key file %v", err) + return nil + } + + c.log.Warnf("NOTICE: TLS Keys logged to '%s'\n", keyFilePath) + + return keyFile + } + + return nil +} + +// RootOnlyVerifyCertificate - Go doesn't provide a method for only skipping hostname validation so +// we have to disable all of the certificate validation and re-implement everything. +// https://github.com/golang/go/issues/21971 +func RootOnlyVerifyCertificate(caCertificate string, rawCerts [][]byte) error { + roots := x509.NewCertPool() + + ok := roots.AppendCertsFromPEM([]byte(caCertificate)) + if !ok { + fmt.Errorf("Failed to parse root certificate") + } + + cert, err := x509.ParseCertificate(rawCerts[0]) // We should only get one cert + if err != nil { + log.Printf("Failed to parse certificate: " + err.Error()) + return err + } + + // Basically we only care if the certificate was signed by our authority + // Go selects sensible defaults for time and EKU, basically we're only + // skipping the hostname check, I think? + options := x509.VerifyOptions{ + Roots: roots, + } + + if options.Roots == nil { + return fmt.Errorf("Certificate root is nil") + } + + if _, err := cert.Verify(options); err != nil { + return fmt.Errorf("Failed to verify certificate: " + err.Error()) + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/certs/users.go b/vendor/github.com/reeflective/team/internal/certs/users.go new file mode 100644 index 0000000000..c28dac693a --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/users.go @@ -0,0 +1,100 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/x509" + "encoding/pem" + "fmt" + + "github.com/reeflective/team/internal/db" +) + +const ( + // userCA - Directory containing user certificates. + userCA = "user" + + clientNamespace = "client" // User clients + serverNamespace = "server" // User servers + userCertHostname = "teamusers" // Hostname used on certificate +) + +// UserClientGenerateCertificate - Generate a certificate signed with a given CA. +func (c *Manager) UserClientGenerateCertificate(user string) ([]byte, []byte, error) { + cert, key := c.GenerateECCCertificate(userCA, user, false, true) + err := c.saveCertificate(userCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, user), cert, key) + + return cert, key, err +} + +// UserClientGetCertificate - Helper function to fetch a client cert. +func (c *Manager) UserClientGetCertificate(user string) ([]byte, []byte, error) { + return c.GetECCCertificate(userCA, fmt.Sprintf("%s.%s", clientNamespace, user)) +} + +// UserClientRemoveCertificate - Helper function to remove a client cert. +func (c *Manager) UserClientRemoveCertificate(user string) error { + return c.RemoveCertificate(userCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, user)) +} + +// UserServerGetCertificate - Helper function to fetch a server cert. +func (c *Manager) UserServerGetCertificate() ([]byte, []byte, error) { + return c.GetECCCertificate(userCA, fmt.Sprintf("%s.%s", serverNamespace, userCertHostname)) +} + +// UserServerGenerateCertificate - Generate a certificate signed with a given CA. +func (c *Manager) UserServerGenerateCertificate() ([]byte, []byte, error) { + cert, key := c.GenerateECCCertificate(userCA, userCertHostname, false, false) + err := c.saveCertificate(userCA, ECCKey, fmt.Sprintf("%s.%s", serverNamespace, userCertHostname), cert, key) + + return cert, key, err +} + +// UserClientListCertificates - Get all client certificates. +func (c *Manager) UserClientListCertificates() []*x509.Certificate { + userCerts := []*db.Certificate{} + + result := c.db.Where(&db.Certificate{CAType: userCA}).Find(&userCerts) + if result.Error != nil { + c.log.Error(result.Error) + return []*x509.Certificate{} + } + + c.log.Infof("Found %d user certs ...", len(userCerts)) + + certs := []*x509.Certificate{} + + for _, user := range userCerts { + block, _ := pem.Decode([]byte(user.CertificatePEM)) + if block == nil { + c.log.Warn("failed to parse certificate PEM") + continue + } + + cert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + c.log.Warnf("failed to parse x.509 certificate %v", err) + continue + } + + certs = append(certs, cert) + } + + return certs +} diff --git a/vendor/github.com/reeflective/team/internal/command/command.go b/vendor/github.com/reeflective/team/internal/command/command.go new file mode 100644 index 0000000000..e763f8b0b1 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/command/command.go @@ -0,0 +1,108 @@ +package command + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/jedib0t/go-pretty/v6/table" + "github.com/jedib0t/go-pretty/v6/text" + "github.com/spf13/cobra" +) + +type ( + CobraRunnerE func(*cobra.Command, []string) error + CobraRunner func(*cobra.Command, []string) +) + +const ( + ClientConfigExt = "teamclient.cfg" // Client remote server config file extension. + ServerConfigExt = "teamserver.json" // Server backend config file extension. +) + +const ( + TeamServerGroup = "teamserver control" // TeamServerGroup is the group of all server/client control commands. + UserManagementGroup = "user management" // UserManagementGroup is the group to manage teamserver users. +) + +// Colors / effects. +const ( + // ANSI Colors. + Normal = "\033[0m" + Black = "\033[30m" + Red = "\033[31m" + Green = "\033[32m" + Orange = "\033[33m" + Blue = "\033[34m" + Purple = "\033[35m" + Cyan = "\033[36m" + Gray = "\033[37m" + Bold = "\033[1m" + Clearln = "\r\x1b[2K" + UpN = "\033[%dA" + DownN = "\033[%dB" + Underline = "\033[4m" + + // info - Display colorful information. + Info = Cyan + "[*] " + Normal + // warn - warn a user. + Warn = Red + "[!] " + Normal + // debugl - Display debugl information. + Debugl = Purple + "[-] " + Normal +) + +// TableStyle is a default table style for users and listeners. +var TableStyle = table.Style{ + Name: "TeamServerDefault", + Box: table.BoxStyle{ + BottomLeft: " ", + BottomRight: " ", + BottomSeparator: " ", + Left: " ", + LeftSeparator: " ", + MiddleHorizontal: "=", + MiddleSeparator: " ", + MiddleVertical: " ", + PaddingLeft: " ", + PaddingRight: " ", + Right: " ", + RightSeparator: " ", + TopLeft: " ", + TopRight: " ", + TopSeparator: " ", + UnfinishedRow: "~~", + }, + Color: table.ColorOptions{ + IndexColumn: text.Colors{}, + Footer: text.Colors{}, + Header: text.Colors{}, + Row: text.Colors{}, + RowAlternate: text.Colors{}, + }, + Format: table.FormatOptions{ + Footer: text.FormatDefault, + Header: text.FormatTitle, + Row: text.FormatDefault, + }, + Options: table.Options{ + DrawBorder: false, + SeparateColumns: true, + SeparateFooter: false, + SeparateHeader: true, + SeparateRows: false, + }, +} diff --git a/vendor/github.com/reeflective/team/internal/db/certificates.go b/vendor/github.com/reeflective/team/internal/db/certificates.go new file mode 100644 index 0000000000..adb9a2721e --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/certificates.go @@ -0,0 +1,47 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "time" + + "github.com/gofrs/uuid" + "gorm.io/gorm" +) + +// Certificate - Certificate database model. +type Certificate struct { + ID uuid.UUID `gorm:"primaryKey;->;<-:create;type:uuid;"` + CreatedAt time.Time `gorm:"->;<-:create;"` + CommonName string + CAType string + KeyType string + CertificatePEM string + PrivateKeyPEM string +} + +// BeforeCreate - GORM hook to automatically set values. +func (c *Certificate) BeforeCreate(tx *gorm.DB) (err error) { + c.ID, err = uuid.NewV4() + if err != nil { + return err + } + c.CreatedAt = time.Now() + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/db/config.go b/vendor/github.com/reeflective/team/internal/db/config.go new file mode 100644 index 0000000000..6b95e61591 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/config.go @@ -0,0 +1,93 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "net/url" +) + +const ( + // Sqlite - SQLite protocol. + Sqlite = "sqlite3" + // Postgres - Postgresql protocol. + Postgres = "postgresql" + // MySQL - MySQL protocol. + MySQL = "mysql" +) + +// Config - Server database configuration. +type Config struct { + Dialect string `json:"dialect"` + Database string `json:"database"` + Username string `json:"username"` + Password string `json:"password"` + Host string `json:"host"` + Port uint16 `json:"port"` + + Params map[string]string `json:"params"` + + MaxIdleConns int `json:"max_idle_conns"` + MaxOpenConns int `json:"max_open_conns"` + + LogLevel string `json:"log_level"` +} + +// DSN - Get the db connections string +// https://github.com/go-sql-driver/mysql#examples +func (c *Config) DSN() (string, error) { + switch c.Dialect { + case Sqlite: + filePath := c.Database + params := encodeParams(c.Params) + + return fmt.Sprintf("file:%s?%s", filePath, params), nil + + case MySQL: + user := url.QueryEscape(c.Username) + password := url.QueryEscape(c.Password) + db := url.QueryEscape(c.Database) + host := fmt.Sprintf("%s:%d", url.QueryEscape(c.Host), c.Port) + params := encodeParams(c.Params) + + return fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", user, password, host, db, params), nil + + case Postgres: + user := url.QueryEscape(c.Username) + password := url.QueryEscape(c.Password) + db := url.QueryEscape(c.Database) + host := url.QueryEscape(c.Host) + port := c.Port + params := encodeParams(c.Params) + + return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s %s", host, port, user, password, db, params), nil + + default: + return "", ErrUnsupportedDialect + } +} + +func encodeParams(rawParams map[string]string) string { + params := url.Values{} + for key, value := range rawParams { + params.Add(key, value) + } + + return params.Encode() +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go new file mode 100644 index 0000000000..aaedce9e39 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go @@ -0,0 +1,35 @@ +//go:build cgo_sqlite + +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + _ "github.com/mattn/go-sqlite3" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(sqlite.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql-go.go b/vendor/github.com/reeflective/team/internal/db/sql-go.go new file mode 100644 index 0000000000..5b35246b4c --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql-go.go @@ -0,0 +1,34 @@ +//go:build !(wasm_sqlite || cgo_sqlite) + +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + gosqlite "github.com/glebarez/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(gosqlite.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql-wasm.go b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go new file mode 100644 index 0000000000..558d642d13 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go @@ -0,0 +1,38 @@ +//go:build wasm_sqlite + +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + _ "github.com/ncruces/go-sqlite3" + _ "github.com/ncruces/go-sqlite3/driver" + _ "github.com/ncruces/go-sqlite3/embed" + "gorm.io/gorm" + "gorm.io/gorm/logger" + + "github.com/reeflective/team/internal/db/wasmsqlite" +) + +func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(wasmsqlite.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go new file mode 100644 index 0000000000..27f589d5a5 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -0,0 +1,126 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "fmt" + "time" + + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +const ( + SQLiteInMemoryHost = ":memory:" +) + +var ( + // ErrRecordNotFound - Record not found error. + ErrRecordNotFound = gorm.ErrRecordNotFound + + // ErrUnsupportedDialect - An invalid dialect was specified. + ErrUnsupportedDialect = errors.New("Unknown/unsupported DB Dialect") +) + +// NewClient initializes a database client connection to a backend specified in config. +func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { + var dbClient *gorm.DB + + dsn, err := dbConfig.DSN() + if err != nil { + return nil, fmt.Errorf("Failed to marshal database DSN: %w", err) + } + + // Logging middleware (queries) + dbLog := log.NewDatabase(dbLogger, dbConfig.LogLevel) + + switch dbConfig.Dialect { + case Sqlite: + dbLogger.Infof("Connecting to SQLite database %s", dsn) + + dbClient, err = sqliteClient(dsn, dbLog) + if err != nil { + return nil, fmt.Errorf("Database connection failed: %w", err) + } + + case Postgres: + dbLogger.Infof("Connecting to PostgreSQL database %s", dsn) + + dbClient, err = postgresClient(dsn, dbLog) + if err != nil { + return nil, fmt.Errorf("Database connection failed: %w", err) + } + + case MySQL: + dbLogger.Infof("Connecting to MySQL database %s", dsn) + + dbClient, err = mySQLClient(dsn, dbLog) + if err != nil { + return nil, fmt.Errorf("Database connection failed: %w", err) + } + default: + return nil, fmt.Errorf("%w: '%s'", ErrUnsupportedDialect, dbConfig.Dialect) + } + + err = dbClient.AutoMigrate( + &Certificate{}, + &User{}, + ) + if err != nil { + dbLogger.Error(err) + } + + // Get generic database object sql.DB to use its functions + sqlDB, err := dbClient.DB() + if err != nil { + dbLogger.Error(err) + } + + // SetMaxIdleConns sets the maximum number of connections in the idle connection pool. + sqlDB.SetMaxIdleConns(dbConfig.MaxIdleConns) + + // SetMaxOpenConns sets the maximum number of open connections to the database. + sqlDB.SetMaxOpenConns(dbConfig.MaxOpenConns) + + // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. + sqlDB.SetConnMaxLifetime(time.Hour) + + return dbClient.Session(&gorm.Session{ + FullSaveAssociations: true, + }), nil +} + +func postgresClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(postgres.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} + +func mySQLClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(mysql.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/user.go b/vendor/github.com/reeflective/team/internal/db/user.go new file mode 100644 index 0000000000..de220b7b75 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/user.go @@ -0,0 +1,47 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "time" + + "github.com/gofrs/uuid" + "gorm.io/gorm" +) + +// User - A teamserver user. +type User struct { + ID uuid.UUID `gorm:"primaryKey;->;<-:create;type:uuid;"` + CreatedAt time.Time `gorm:"->;<-:create;"` + LastSeen time.Time + Name string + Token string `gorm:"uniqueIndex"` +} + +// BeforeCreate - GORM hook. +func (o *User) BeforeCreate(tx *gorm.DB) (err error) { + o.ID, err = uuid.NewV4() + if err != nil { + return err + } + + o.CreatedAt = time.Now() + + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/License b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/License new file mode 100644 index 0000000000..037e1653e6 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/License @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-NOW Jinzhu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md new file mode 100644 index 0000000000..7ffa285949 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md @@ -0,0 +1,56 @@ +![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/glebarez/fb4d23f63d866b3e1e58b26d2f5ed01f/raw/badge-gorm-tests.json) +![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/glebarez/fb4d23f63d866b3e1e58b26d2f5ed01f/raw/badge-sqlite-version.json) +
    [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fglebarez%2Fsqlite&count_bg=%2379C83D&title_bg=%23555555&icon=baidu.svg&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com) +# Pure-Go SQLite driver for GORM +Pure-go (without cgo) implementation of SQLite driver for [GORM](https://gorm.io/)

    +This driver has SQLite embedded, you don't need to install one separately. + +# Usage + +```go +import ( + "github.com/glebarez/sqlite" + "gorm.io/gorm" +) + +db, err := gorm.Open(sqlite.Open("sqlite.db"), &gorm.Config{}) +``` + +### In-memory DB example +```go +db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) +``` + +### Foreign-key constraint activation +Foreign-key constraint is disabled by default in SQLite. To activate it, use connection URL parameter: +```go +db, err := gorm.Open(sqlite.Open(":memory:?_pragma=foreign_keys(1)"), &gorm.Config{}) +``` +More info: [https://www.sqlite.org/foreignkeys.html](https://www.sqlite.org/foreignkeys.html) + +# FAQ +## How is this better than standard GORM SQLite driver? +The [standard GORM driver for SQLite](https://github.com/go-gorm/sqlite) has one major drawback: it is based on a [Go-bindings of SQLite C-source](https://github.com/mattn/go-sqlite3) (this is called [cgo](https://go.dev/blog/cgo)). This fact imposes following restrictions on Go developers: +- to build and run your code, you will need a C compiler installed on a machine +- SQLite has many features that need to be enabled at compile time (e.g. [json support](https://www.sqlite.org/json1.html)). If you plan to use those, you will have to include proper build tags for every ```go``` command to work properly (```go run```, ```go test```, etc.). +- Because of C-compiler requirement, you can't build your Go code inside tiny stripped containers like (golang-alpine) +- Building on GCP is not possible because Google Cloud Platform does not allow gcc to be executed. + +**Instead**, this driver is based on pure-Go implementation of SQLite (https://gitlab.com/cznic/sqlite), which is basically an original SQLite C-source AST, translated into Go! So, you may be sure you're using the original SQLite implementation under the hood. + +## Is this tested good ? +Yes, The CI pipeline of this driver employs [whole test base](https://github.com/go-gorm/gorm/tree/master/tests) of GORM, which includes more than **12k** tests (see badge on the page-top). Testing is run against latest major releases of Go: +- 1.18 +- 1.19 + +In following environments: +- Linux +- Windows +- MacOS + +## Is it fast? +Well, it's slower than CGo implementation, but not terribly. See the [bechmark of underlying pure-Go driver vs CGo implementation](https://github.com/glebarez/go-sqlite/tree/master/benchmark). + +## Included features +- JSON1 (https://www.sqlite.org/json1.html) +- Math functions (https://www.sqlite.org/lang_mathfunc.html) diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go new file mode 100644 index 0000000000..84260800cb --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go @@ -0,0 +1,234 @@ +package wasmsqlite + +import ( + "database/sql" + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "gorm.io/gorm/migrator" +) + +var ( + sqliteSeparator = "`|\"|'|\t" + indexRegexp = regexp.MustCompile(fmt.Sprintf("(?is)CREATE(?: UNIQUE)? INDEX [%v]?[\\w\\d-]+[%v]? ON (.*)$", sqliteSeparator, sqliteSeparator)) + tableRegexp = regexp.MustCompile(fmt.Sprintf("(?is)(CREATE TABLE [%v]?[\\w\\d-]+[%v]?)(?: \\((.*)\\))?", sqliteSeparator, sqliteSeparator)) + separatorRegexp = regexp.MustCompile(fmt.Sprintf("[%v]", sqliteSeparator)) + columnsRegexp = regexp.MustCompile(fmt.Sprintf("\\([%v]?([\\w\\d]+)[%v]?(?:,[%v]?([\\w\\d]+)[%v]){0,}\\)", sqliteSeparator, sqliteSeparator, sqliteSeparator, sqliteSeparator)) + columnRegexp = regexp.MustCompile(fmt.Sprintf("^[%v]?([\\w\\d]+)[%v]?\\s+([\\w\\(\\)\\d]+)(.*)$", sqliteSeparator, sqliteSeparator)) + defaultValueRegexp = regexp.MustCompile("(?i) DEFAULT \\(?(.+)?\\)?( |COLLATE|GENERATED|$)") + regRealDataType = regexp.MustCompile(`[^\d](\d+)[^\d]?`) +) + +type ddl struct { + head string + fields []string + columns []migrator.ColumnType +} + +func parseDDL(strs ...string) (*ddl, error) { + var result ddl + for _, str := range strs { + if sections := tableRegexp.FindStringSubmatch(str); len(sections) > 0 { + var ( + ddlBody = sections[2] + ddlBodyRunes = []rune(ddlBody) + bracketLevel int + quote rune + buf string + ) + ddlBodyRunesLen := len(ddlBodyRunes) + + result.head = sections[1] + + for idx := 0; idx < ddlBodyRunesLen; idx++ { + var ( + next rune = 0 + c = ddlBodyRunes[idx] + ) + if idx+1 < ddlBodyRunesLen { + next = ddlBodyRunes[idx+1] + } + + if sc := string(c); separatorRegexp.MatchString(sc) { + if c == next { + buf += sc // Skip escaped quote + idx++ + } else if quote > 0 { + quote = 0 + } else { + quote = c + } + } else if quote == 0 { + if c == '(' { + bracketLevel++ + } else if c == ')' { + bracketLevel-- + } else if bracketLevel == 0 { + if c == ',' { + result.fields = append(result.fields, strings.TrimSpace(buf)) + buf = "" + continue + } + } + } + + if bracketLevel < 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + buf += string(c) + } + + if bracketLevel != 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + if buf != "" { + result.fields = append(result.fields, strings.TrimSpace(buf)) + } + + for _, f := range result.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") { + continue + } + + if strings.HasPrefix(fUpper, "PRIMARY KEY") { + matches := columnsRegexp.FindStringSubmatch(f) + if len(matches) > 1 { + for _, name := range matches[1:] { + for idx, column := range result.columns { + if column.NameValue.String == name { + column.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = column + break + } + } + } + } + } else if matches := columnRegexp.FindStringSubmatch(f); len(matches) > 0 { + columnType := migrator.ColumnType{ + NameValue: sql.NullString{String: matches[1], Valid: true}, + DataTypeValue: sql.NullString{String: matches[2], Valid: true}, + ColumnTypeValue: sql.NullString{String: matches[2], Valid: true}, + PrimaryKeyValue: sql.NullBool{Valid: true}, + UniqueValue: sql.NullBool{Valid: true}, + NullableValue: sql.NullBool{Valid: true}, + DefaultValueValue: sql.NullString{Valid: false}, + } + + matchUpper := strings.ToUpper(matches[3]) + if strings.Contains(matchUpper, " NOT NULL") { + columnType.NullableValue = sql.NullBool{Bool: false, Valid: true} + } else if strings.Contains(matchUpper, " NULL") { + columnType.NullableValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " UNIQUE") { + columnType.UniqueValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " PRIMARY") { + columnType.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + } + if defaultMatches := defaultValueRegexp.FindStringSubmatch(matches[3]); len(defaultMatches) > 1 { + if strings.ToLower(defaultMatches[1]) != "null" { + columnType.DefaultValueValue = sql.NullString{String: strings.Trim(defaultMatches[1], `"`), Valid: true} + } + } + + // data type length + matches := regRealDataType.FindAllStringSubmatch(columnType.DataTypeValue.String, -1) + if len(matches) == 1 && len(matches[0]) == 2 { + size, _ := strconv.Atoi(matches[0][1]) + columnType.LengthValue = sql.NullInt64{Valid: true, Int64: int64(size)} + columnType.DataTypeValue.String = strings.TrimSuffix(columnType.DataTypeValue.String, matches[0][0]) + } + + result.columns = append(result.columns, columnType) + } + } + } else if matches := indexRegexp.FindStringSubmatch(str); len(matches) > 0 { + if columns := columnsRegexp.FindStringSubmatch(matches[1]); len(columns) == 1 { + for idx, c := range result.columns { + if c.NameValue.String == columns[0] { + c.UniqueValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = c + } + } + } + } else { + return nil, errors.New("invalid DDL") + } + } + + return &result, nil +} + +func (d *ddl) compile() string { + if len(d.fields) == 0 { + return d.head + } + + return fmt.Sprintf("%s (%s)", d.head, strings.Join(d.fields, ",")) +} + +func (d *ddl) addConstraint(name string, sql string) { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields[i] = sql + return + } + } + + d.fields = append(d.fields, sql) +} + +func (d *ddl) removeConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields = append(d.fields[:i], d.fields[i+1:]...) + return true + } + } + return false +} + +func (d *ddl) hasConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for _, f := range d.fields { + if reg.MatchString(f) { + return true + } + } + return false +} + +func (d *ddl) getColumns() []string { + res := []string{} + + for _, f := range d.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "PRIMARY KEY") || + strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") || + strings.Contains(fUpper, "GENERATED ALWAYS AS") { + continue + } + + reg := regexp.MustCompile("^[\"`']?([\\w\\d]+)[\"`']?") + match := reg.FindStringSubmatch(f) + + if match != nil { + res = append(res, "`"+match[1]+"`") + } + } + return res +} diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go new file mode 100644 index 0000000000..cb6c61b035 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go @@ -0,0 +1,7 @@ +package wasmsqlite + +import "errors" + +var ( + ErrConstraintsNotImplemented = errors.New("constraints not implemented on sqlite, consider using DisableForeignKeyConstraintWhenMigrating, more details https://github.com/go-gorm/gorm/wiki/GORM-V2-Release-Note-Draft#all-new-migrator") +) diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go new file mode 100644 index 0000000000..0ea6eef487 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go @@ -0,0 +1,423 @@ +package wasmsqlite + +import ( + "database/sql" + "fmt" + "regexp" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +type Migrator struct { + migrator.Migrator +} + +func (m *Migrator) RunWithoutForeignKey(fc func() error) error { + var enabled int + m.DB.Raw("PRAGMA foreign_keys").Scan(&enabled) + if enabled == 1 { + m.DB.Exec("PRAGMA foreign_keys = OFF") + defer m.DB.Exec("PRAGMA foreign_keys = ON") + } + + return fc() +} + +func (m Migrator) HasTable(value interface{}) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + return m.DB.Raw("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", stmt.Table).Row().Scan(&count) + }) + return count > 0 +} + +func (m Migrator) DropTable(values ...interface{}) error { + return m.RunWithoutForeignKey(func() error { + values = m.ReorderModels(values, false) + tx := m.DB.Session(&gorm.Session{}) + + for i := len(values) - 1; i >= 0; i-- { + if err := m.RunWithValue(values[i], func(stmt *gorm.Statement) error { + return tx.Exec("DROP TABLE IF EXISTS ?", clause.Table{Name: stmt.Table}).Error + }); err != nil { + return err + } + } + + return nil + }) +} + +func (m Migrator) GetTables() (tableList []string, err error) { + return tableList, m.DB.Raw("SELECT name FROM sqlite_master where type=?", "table").Scan(&tableList).Error +} + +func (m Migrator) HasColumn(value interface{}, name string) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", stmt.Table, `%"`+name+`" %`, `%`+name+` %`, "%`"+name+"`%", "%["+name+"]%", "%\t"+name+"\t%", + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) AlterColumn(value interface{}, name string) error { + return m.RunWithoutForeignKey(func() error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + // lookup field from table definition, ddl might looks like `'name' int,` or `'name' int)` + reg, err := regexp.Compile("(`|'|\"| )" + field.DBName + "(`|'|\"| ) .*?(,|\\)\\s*$)") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, fmt.Sprintf("`%v` ?$3", field.DBName)) + + if createSQL == rawDDL { + return "", nil, fmt.Errorf("failed to look up field %v from DDL %v", field.DBName, rawDDL) + } + + return createSQL, []interface{}{m.FullDataTypeOf(field)}, nil + } + return "", nil, fmt.Errorf("failed to alter field with name %v", name) + }) + }) +} + +// ColumnTypes return columnTypes []gorm.ColumnType and execErr error +func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { + columnTypes := make([]gorm.ColumnType, 0) + execErr := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { + var ( + sqls []string + sqlDDL *ddl + ) + + if err := m.DB.Raw("SELECT sql FROM sqlite_master WHERE type IN ? AND tbl_name = ? AND sql IS NOT NULL order by type = ? desc", []string{"table", "index"}, stmt.Table, "table").Scan(&sqls).Error; err != nil { + return err + } + + if sqlDDL, err = parseDDL(sqls...); err != nil { + return err + } + + rows, err := m.DB.Session(&gorm.Session{}).Table(stmt.Table).Limit(1).Rows() + if err != nil { + return err + } + defer func() { + err = rows.Close() + }() + + var rawColumnTypes []*sql.ColumnType + rawColumnTypes, err = rows.ColumnTypes() + if err != nil { + return err + } + + for _, c := range rawColumnTypes { + columnType := migrator.ColumnType{SQLColumnType: c} + for _, column := range sqlDDL.columns { + if column.NameValue.String == c.Name() { + column.SQLColumnType = c + columnType = column + break + } + } + columnTypes = append(columnTypes, columnType) + } + + return err + }) + + return columnTypes, execErr +} + +func (m Migrator) DropColumn(value interface{}, name string) error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + + reg, err := regexp.Compile("(`|'|\"| |\\[)" + name + "(`|'|\"| |\\]) .*?,") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, "") + + return createSQL, nil, nil + }) +} + +func (m Migrator) CreateConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + var ( + constraintName string + constraintSql string + constraintValues []interface{} + ) + + if constraint != nil { + constraintName = constraint.Name + constraintSql, constraintValues = buildConstraint(constraint) + } else if chk != nil { + constraintName = chk.Name + constraintSql = "CONSTRAINT ? CHECK (?)" + constraintValues = []interface{}{clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}} + } else { + return "", nil, nil + } + + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.addConstraint(constraintName, constraintSql) + createSQL := createDDL.compile() + + return createSQL, constraintValues, nil + }) + }) +} + +func (m Migrator) DropConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.removeConstraint(name) + createSQL := createDDL.compile() + + return createSQL, nil, nil + }) + }) +} + +func (m Migrator) HasConstraint(value interface{}, name string) bool { + var count int64 + m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", table, `%CONSTRAINT "`+name+`" %`, `%CONSTRAINT `+name+` %`, "%CONSTRAINT `"+name+"`%", "%CONSTRAINT ["+name+"]%", "%CONSTRAINT \t"+name+"\t%", + ).Row().Scan(&count) + + return nil + }) + + return count > 0 +} + +func (m Migrator) CurrentDatabase() (name string) { + var null interface{} + m.DB.Raw("PRAGMA database_list").Row().Scan(&null, &name, &null) + return +} + +func (m Migrator) BuildIndexOptions(opts []schema.IndexOption, stmt *gorm.Statement) (results []interface{}) { + for _, opt := range opts { + str := stmt.Quote(opt.DBName) + if opt.Expression != "" { + str = opt.Expression + } + + if opt.Collate != "" { + str += " COLLATE " + opt.Collate + } + + if opt.Sort != "" { + str += " " + opt.Sort + } + results = append(results, clause.Expr{SQL: str}) + } + return +} + +func (m Migrator) CreateIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if idx := stmt.Schema.LookIndex(name); idx != nil { + opts := m.BuildIndexOptions(idx.Fields, stmt) + values := []interface{}{clause.Column{Name: idx.Name}, clause.Table{Name: stmt.Table}, opts} + + createIndexSQL := "CREATE " + if idx.Class != "" { + createIndexSQL += idx.Class + " " + } + createIndexSQL += "INDEX ?" + + if idx.Type != "" { + createIndexSQL += " USING " + idx.Type + } + createIndexSQL += " ON ??" + + if idx.Where != "" { + createIndexSQL += " WHERE " + idx.Where + } + + return m.DB.Exec(createIndexSQL, values...).Error + } + + return fmt.Errorf("failed to create index with name %v", name) + }) +} + +func (m Migrator) HasIndex(value interface{}, name string) bool { + var count int + m.RunWithValue(value, func(stmt *gorm.Statement) error { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, name, + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) RenameIndex(value interface{}, oldName, newName string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + var sql string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, oldName).Row().Scan(&sql) + if sql != "" { + return m.DB.Exec(strings.Replace(sql, oldName, newName, 1)).Error + } + return fmt.Errorf("failed to find index with name %v", oldName) + }) +} + +func (m Migrator) DropIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + + return m.DB.Exec("DROP INDEX ?", clause.Column{Name: name}).Error + }) +} + +func buildConstraint(constraint *schema.Constraint) (sql string, results []interface{}) { + sql = "CONSTRAINT ? FOREIGN KEY ? REFERENCES ??" + if constraint.OnDelete != "" { + sql += " ON DELETE " + constraint.OnDelete + } + + if constraint.OnUpdate != "" { + sql += " ON UPDATE " + constraint.OnUpdate + } + + var foreignKeys, references []interface{} + for _, field := range constraint.ForeignKeys { + foreignKeys = append(foreignKeys, clause.Column{Name: field.DBName}) + } + + for _, field := range constraint.References { + references = append(references, clause.Column{Name: field.DBName}) + } + results = append(results, clause.Table{Name: constraint.Name}, foreignKeys, clause.Table{Name: constraint.ReferenceSchema.Table}, references) + return +} + +func (m Migrator) getRawDDL(table string) (string, error) { + var createSQL string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "table", table, table).Row().Scan(&createSQL) + + if m.DB.Error != nil { + return "", m.DB.Error + } + return createSQL, nil +} + +func (m Migrator) recreateTable(value interface{}, tablePtr *string, + getCreateSQL func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error)) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + table := stmt.Table + if tablePtr != nil { + table = *tablePtr + } + + rawDDL, err := m.getRawDDL(table) + if err != nil { + return err + } + + newTableName := table + "__temp" + + createSQL, sqlArgs, err := getCreateSQL(rawDDL, stmt) + if err != nil { + return err + } + if createSQL == "" { + return nil + } + + tableReg, err := regexp.Compile(" ('|`|\"| )" + table + "('|`|\"| ) ") + if err != nil { + return err + } + createSQL = tableReg.ReplaceAllString(createSQL, fmt.Sprintf(" `%v` ", newTableName)) + + createDDL, err := parseDDL(createSQL) + if err != nil { + return err + } + columns := createDDL.getColumns() + + return m.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Exec(createSQL, sqlArgs...).Error; err != nil { + return err + } + + queries := []string{ + fmt.Sprintf("INSERT INTO `%v`(%v) SELECT %v FROM `%v`", newTableName, strings.Join(columns, ","), strings.Join(columns, ","), table), + fmt.Sprintf("DROP TABLE `%v`", table), + fmt.Sprintf("ALTER TABLE `%v` RENAME TO `%v`", newTableName, table), + } + for _, query := range queries { + if err := tx.Exec(query).Error; err != nil { + return err + } + } + return nil + }) + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go new file mode 100644 index 0000000000..2368ce791a --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go @@ -0,0 +1,224 @@ +package wasmsqlite + +import ( + "context" + "database/sql" + "strconv" + "strings" + + "gorm.io/gorm/callbacks" + + _ "github.com/ncruces/go-sqlite3" + _ "github.com/ncruces/go-sqlite3/driver" + _ "github.com/ncruces/go-sqlite3/embed" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/logger" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +// DriverName is the default driver name for SQLite. +const DriverName = "sqlite3" + +type Dialector struct { + DriverName string + DSN string + Conn gorm.ConnPool +} + +func Open(dsn string) gorm.Dialector { + return &Dialector{DSN: dsn} +} + +func (dialector Dialector) Name() string { + return "sqlite" +} + +func (dialector Dialector) Initialize(db *gorm.DB) (err error) { + if dialector.DriverName == "" { + dialector.DriverName = DriverName + } + + if dialector.Conn != nil { + db.ConnPool = dialector.Conn + } else { + conn, err := sql.Open(dialector.DriverName, dialector.DSN) + if err != nil { + return err + } + db.ConnPool = conn + } + + var version string + if err := db.ConnPool.QueryRowContext(context.Background(), "select sqlite_version()").Scan(&version); err != nil { + return err + } + // https://www.sqlite.org/releaselog/3_35_0.html + if compareVersion(version, "3.35.0") >= 0 { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + CreateClauses: []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, + UpdateClauses: []string{"UPDATE", "SET", "WHERE", "RETURNING"}, + DeleteClauses: []string{"DELETE", "FROM", "WHERE", "RETURNING"}, + LastInsertIDReversed: true, + }) + } else { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + LastInsertIDReversed: true, + }) + } + + for k, v := range dialector.ClauseBuilders() { + db.ClauseBuilders[k] = v + } + return +} + +func (dialector Dialector) ClauseBuilders() map[string]clause.ClauseBuilder { + return map[string]clause.ClauseBuilder{ + "INSERT": func(c clause.Clause, builder clause.Builder) { + if insert, ok := c.Expression.(clause.Insert); ok { + if stmt, ok := builder.(*gorm.Statement); ok { + stmt.WriteString("INSERT ") + if insert.Modifier != "" { + stmt.WriteString(insert.Modifier) + stmt.WriteByte(' ') + } + + stmt.WriteString("INTO ") + if insert.Table.Name == "" { + stmt.WriteQuoted(stmt.Table) + } else { + stmt.WriteQuoted(insert.Table) + } + return + } + } + + c.Build(builder) + }, + "LIMIT": func(c clause.Clause, builder clause.Builder) { + if limit, ok := c.Expression.(clause.Limit); ok { + var lmt = -1 + if limit.Limit != nil && *limit.Limit >= 0 { + lmt = *limit.Limit + } + if lmt >= 0 || limit.Offset > 0 { + builder.WriteString("LIMIT ") + builder.WriteString(strconv.Itoa(lmt)) + } + if limit.Offset > 0 { + builder.WriteString(" OFFSET ") + builder.WriteString(strconv.Itoa(limit.Offset)) + } + } + }, + "FOR": func(c clause.Clause, builder clause.Builder) { + if _, ok := c.Expression.(clause.Locking); ok { + // SQLite3 does not support row-level locking. + return + } + c.Build(builder) + }, + } +} + +func (dialector Dialector) DefaultValueOf(field *schema.Field) clause.Expression { + if field.AutoIncrement { + return clause.Expr{SQL: "NULL"} + } + + // doesn't work, will raise error + return clause.Expr{SQL: "DEFAULT"} +} + +func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator { + return Migrator{migrator.Migrator{Config: migrator.Config{ + DB: db, + Dialector: dialector, + CreateIndexAfterCreateTable: true, + }}} +} + +func (dialector Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v interface{}) { + writer.WriteByte('?') +} + +func (dialector Dialector) QuoteTo(writer clause.Writer, str string) { + writer.WriteByte('`') + if strings.Contains(str, ".") { + for idx, str := range strings.Split(str, ".") { + if idx > 0 { + writer.WriteString(".`") + } + writer.WriteString(str) + writer.WriteByte('`') + } + } else { + writer.WriteString(str) + writer.WriteByte('`') + } +} + +func (dialector Dialector) Explain(sql string, vars ...interface{}) string { + return logger.ExplainSQL(sql, nil, `"`, vars...) +} + +func (dialector Dialector) DataTypeOf(field *schema.Field) string { + switch field.DataType { + case schema.Bool: + return "numeric" + case schema.Int, schema.Uint: + if field.AutoIncrement && !field.PrimaryKey { + // https://www.sqlite.org/autoinc.html + return "integer PRIMARY KEY AUTOINCREMENT" + } else { + return "integer" + } + case schema.Float: + return "real" + case schema.String: + return "text" + case schema.Time: + return "datetime" + case schema.Bytes: + return "blob" + } + + return string(field.DataType) +} + +func (dialectopr Dialector) SavePoint(tx *gorm.DB, name string) error { + tx.Exec("SAVEPOINT " + name) + return nil +} + +func (dialectopr Dialector) RollbackTo(tx *gorm.DB, name string) error { + tx.Exec("ROLLBACK TO SAVEPOINT " + name) + return nil +} + +func compareVersion(version1, version2 string) int { + n, m := len(version1), len(version2) + i, j := 0, 0 + for i < n || j < m { + x := 0 + for ; i < n && version1[i] != '.'; i++ { + x = x*10 + int(version1[i]-'0') + } + i++ + y := 0 + for ; j < m && version2[j] != '.'; j++ { + y = y*10 + int(version2[j]-'0') + } + j++ + if x > y { + return 1 + } + if x < y { + return -1 + } + } + return 0 +} diff --git a/vendor/github.com/reeflective/team/internal/log/cli.go b/vendor/github.com/reeflective/team/internal/log/cli.go new file mode 100644 index 0000000000..98aaf6a633 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/cli.go @@ -0,0 +1,300 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "fmt" + "os" + "strings" + + "github.com/rsteube/carapace/pkg/style" + "github.com/sirupsen/logrus" +) + +// Text effects. +const ( + SGRStart = "\x1b[" + Fg = "38;05;" + Bg = "48;05;" + SGREnd = "m" +) + +const ( + FieldTimestamp = "timestamp" + FieldPackage = "logger" + FieldMessage = "message" + + PackageFieldKey = "teamserver_pkg" + + MinimumPackagePad = 11 +) + +// stdioHook combines a stdout hook (info/debug/trace), +// and a stderr hook (warn/error/fatal/panic). +type stdioHook struct { + logger *logrus.Logger +} + +func newStdioHook() *stdioHook { + hook := &stdioHook{ + logger: NewStdio(logrus.WarnLevel), + } + + return hook +} + +// The stdout hooks only outputs info, debug and trace. +func (hook *stdioHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *stdioHook) Fire(entry *logrus.Entry) error { + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panic(entry.Message) + case logrus.FatalLevel: + hook.logger.Fatal(entry.Message) + case logrus.ErrorLevel: + hook.logger.Error(entry.Message) + case logrus.WarnLevel: + hook.logger.Warn(entry.Message) + case logrus.InfoLevel: + hook.logger.Info(entry.Message) + case logrus.DebugLevel: + hook.logger.Debug(entry.Message) + case logrus.TraceLevel: + hook.logger.Trace(entry.Message) + } + + return nil +} + +func newLoggerStdout() *stdoutHook { + stdLogger := logrus.New() + stdLogger.SetReportCaller(true) + stdLogger.Out = os.Stdout + + stdLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + + hook := &stdoutHook{ + logger: stdLogger, + } + + return hook +} + +// stderrHook only logs info events and less. +type stdoutHook struct { + DisableColors bool + ShowTimestamp bool + TimestampFormat string + Colors map[string]string + logger *logrus.Logger +} + +// The stdout hooks only outputs info, debug and trace. +func (hook *stdoutHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.InfoLevel, + logrus.DebugLevel, + logrus.TraceLevel, + } +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *stdoutHook) Fire(entry *logrus.Entry) error { + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panic(entry.Message) + case logrus.FatalLevel: + hook.logger.Fatal(entry.Message) + case logrus.ErrorLevel: + hook.logger.Error(entry.Message) + case logrus.WarnLevel: + hook.logger.Warn(entry.Message) + case logrus.InfoLevel: + hook.logger.Info(entry.Message) + case logrus.DebugLevel: + hook.logger.Debug(entry.Message) + case logrus.TraceLevel: + hook.logger.Trace(entry.Message) + } + + return nil +} + +// Format is a custom formatter for all stdout/text logs, with better format and coloring. +func (hook *stdoutHook) Format(entry *logrus.Entry) ([]byte, error) { + // Basic information. + sign, signColor := hook.getLevelFieldColor(entry.Level) + levelLog := fmt.Sprintf("%s%s%s", color(signColor), sign, color(style.Default)) + + timestamp := entry.Time.Format(hook.TimestampFormat) + timestampLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldTimestamp]), timestamp, color(style.Default)) + + var pkgLogF string + + pkg := entry.Data[PackageFieldKey] + if pkg != nil { + pkgLog := fmt.Sprintf(" %v ", pkg) + pkgLog = fmt.Sprintf("%-*s", MinimumPackagePad, pkgLog) + pkgLogF = strings.ReplaceAll(pkgLog, fmt.Sprintf("%s", pkg), fmt.Sprintf("%s%s%s", color(hook.Colors[FieldPackage]), pkg, color(style.Default))) + } + + // Always try to unwrap the error at least once, and colorize it. + message := entry.Message + if err := errors.Unwrap(errors.New(message)); err != nil { + if err.Error() != message { + message = color(style.Red) + message + color(style.Of(style.Default, style.White)) + err.Error() + color(style.Default) + } + } + + messageLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldMessage]), message, color(style.Default)) + + // Assemble the log message + var logMessage string + + if hook.ShowTimestamp { + logMessage += timestampLog + " " + } + + logMessage += pkgLogF + " " + logMessage += levelLog + " " + logMessage += messageLog + "\n" + + return []byte(logMessage), nil +} + +func (hook *stdoutHook) getLevelFieldColor(level logrus.Level) (string, string) { + // Builtin configurations. + signs := defaultLevelFields() + colors := defaultLevelFieldsColored() + + if sign, ok := signs[level]; ok { + if color, ok := colors[sign]; ok { + return sign, color + } + + return sign, style.Default + } + + return signs[logrus.InfoLevel], style.Default +} + +// stderrHook only logs warning events and worst. +type stderrHook struct { + DisableColors bool + ShowTimestamp bool + TimestampFormat string + Colors map[string]string + logger *logrus.Logger +} + +func newLoggerStderr() *stderrHook { + stdLogger := logrus.New() + stdLogger.SetLevel(logrus.WarnLevel) + stdLogger.SetReportCaller(true) + stdLogger.Out = os.Stderr + + stdLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + + hook := &stderrHook{ + logger: stdLogger, + } + + return hook +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *stderrHook) Fire(entry *logrus.Entry) error { + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panic(entry.Message) + case logrus.FatalLevel: + hook.logger.Fatal(entry.Message) + case logrus.ErrorLevel: + hook.logger.Error(entry.Message) + case logrus.WarnLevel: + hook.logger.Warn(entry.Message) + case logrus.InfoLevel: + hook.logger.Info(entry.Message) + case logrus.DebugLevel: + hook.logger.Debug(entry.Message) + case logrus.TraceLevel: + hook.logger.Trace(entry.Message) + } + + return nil +} + +// The stderr hooks only outputs errors and worst. +func (hook *stderrHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.WarnLevel, + logrus.ErrorLevel, + logrus.FatalLevel, + logrus.PanicLevel, + } +} + +func defaultFieldsFormat() map[string]string { + return map[string]string{ + FieldTimestamp: style.BrightBlack, + FieldPackage: style.Dim, + FieldMessage: style.BrightWhite, + } +} + +func defaultLevelFields() map[logrus.Level]string { + return map[logrus.Level]string{ + logrus.TraceLevel: "▪", + logrus.DebugLevel: "▫", + logrus.InfoLevel: "○", + logrus.WarnLevel: "▲", + logrus.ErrorLevel: "✖", + logrus.FatalLevel: "☠", + logrus.PanicLevel: "!!", + } +} + +func defaultLevelFieldsColored() map[string]string { + return map[string]string{ + "▪": style.BrightBlack, + "▫": style.Dim, + "○": style.BrightBlue, + "▲": style.Yellow, + "✖": style.BrightRed, + "☠": style.BgBrightCyan, + "!!": style.BgBrightMagenta, + } +} + +func color(color string) string { + return SGRStart + style.SGR(color) + SGREnd +} diff --git a/vendor/github.com/reeflective/team/internal/log/db.go b/vendor/github.com/reeflective/team/internal/log/db.go new file mode 100644 index 0000000000..3b43e1a4ec --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/db.go @@ -0,0 +1,63 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "strings" + "time" + + "github.com/sirupsen/logrus" + "gorm.io/gorm/logger" +) + +// gorm middleware for database queries/results logging. +type gormWriter struct { + log *logrus.Entry +} + +func (w gormWriter) Printf(format string, args ...interface{}) { + w.log.Printf(format, args...) +} + +// NewDatabase returns a logger suitable as logrus database logging middleware. +func NewDatabase(log *logrus.Entry, level string) logger.Interface { + logConfig := logger.Config{ + SlowThreshold: time.Second, + Colorful: true, + LogLevel: logger.Info, + } + switch strings.ToLower(level) { + case "silent": + logConfig.LogLevel = logger.Silent + case "err": + fallthrough + case "error": + logConfig.LogLevel = logger.Error + case "warning": + fallthrough + case "warn": + logConfig.LogLevel = logger.Warn + case "info": + fallthrough + default: + logConfig.LogLevel = logger.Info + } + + return logger.New(gormWriter{log: log}, logConfig) +} diff --git a/vendor/github.com/reeflective/team/internal/log/log.go b/vendor/github.com/reeflective/team/internal/log/log.go new file mode 100644 index 0000000000..fdf5f1a298 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/log.go @@ -0,0 +1,181 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "github.com/reeflective/team/internal/assets" + "github.com/sirupsen/logrus" +) + +const ( + FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. + DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. + FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. + + FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY // Opening log files in append/create/write-only mode. + + ClientLogFileExt = "teamclient.log" // Log files of all teamclients have this extension by default. + ServerLogFileExt = "teamserver.log" // Log files of all teamserver have this extension by default. +) + +// Init is the main constructor that is (and should be) used for teamserver and teamclient logging. +// It hooks a normal logger with a sublogger writing to a file in text version, and another logger +// writing to stdout/stderr with enhanced formatting/coloring support. +func Init(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, *logrus.Logger, error) { + logFile, err := fs.OpenFile(file, FileWriteOpenMode, FileWritePerm) + if err != nil { + return nil, nil, fmt.Errorf("Failed to open log file %w", err) + } + + // Text-format logger, writing to file. + textLogger := logrus.New() + textLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + textLogger.Out = io.Discard + + textLogger.SetLevel(logrus.InfoLevel) + textLogger.SetReportCaller(true) + + // File output + textLogger.AddHook(newTxtHook(logFile, level, textLogger)) + + // Stdout/err output, with special formatting. + stdioHook := newStdioHook() + textLogger.AddHook(stdioHook) + + return textLogger, stdioHook.logger, nil +} + +// NewStdio returns a logger configured to output its events to the system stdio: +// - Info/Debug/Trace logs are written to os.Stdout. +// - Warn/Error/Fatal/Panic are written to os.Stderr. +func NewStdio(level logrus.Level) *logrus.Logger { + stdLogger := logrus.New() + stdLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + + stdLogger.SetLevel(level) + stdLogger.SetReportCaller(true) + stdLogger.Out = io.Discard + + // Info/debug/trace is given to a stdout logger. + stdoutHook := newLoggerStdout() + stdLogger.AddHook(stdoutHook) + + // Warn/error/panics/fatals are given to stderr. + stderrHook := newLoggerStderr() + stdLogger.AddHook(stderrHook) + + return stdLogger +} + +// NewJSON returns a logger writing to the central log file of the teamserver, JSON-encoded. +func NewJSON(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, error) { + rootLogger := logrus.New() + rootLogger.Formatter = &logrus.JSONFormatter{} + jsonFilePath := fmt.Sprintf("%s.json", file) + + logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + if err != nil { + return nil, fmt.Errorf("Failed to open log file %w", err) + } + + rootLogger.Out = logFile + rootLogger.SetLevel(logrus.InfoLevel) + rootLogger.SetReportCaller(true) + rootLogger.AddHook(newTxtHook(logFile, level, rootLogger)) + + return rootLogger, nil +} + +// NewAudit returns a logger writing to an audit file in JSON format. +func NewAudit(fs *assets.FS, logDir string) (*logrus.Logger, error) { + auditLogger := logrus.New() + auditLogger.Formatter = &logrus.JSONFormatter{} + jsonFilePath := filepath.Join(logDir, "audit.json") + + logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + if err != nil { + return nil, fmt.Errorf("Failed to open log file %w", err) + } + + auditLogger.Out = logFile + auditLogger.SetLevel(logrus.DebugLevel) + + return auditLogger, nil +} + +// NewText returns a new logger writing to a given file. +// The formatting is enhanced for informative debugging and call +// stack reporting, but without any special coloring/formatting. +func NewText(file io.Writer) (*logrus.Logger, error) { + txtLogger := logrus.New() + txtLogger.Formatter = &logrus.TextFormatter{ + ForceColors: true, + FullTimestamp: true, + } + + txtLogger.Out = file + txtLogger.SetLevel(logrus.InfoLevel) + + return txtLogger, nil +} + +// LevelFrom - returns level from int. +func LevelFrom(level int) logrus.Level { + switch level { + case int(logrus.PanicLevel): + return logrus.PanicLevel + case int(logrus.FatalLevel): + return logrus.FatalLevel + case int(logrus.ErrorLevel): + return logrus.ErrorLevel + case int(logrus.WarnLevel): + return logrus.WarnLevel + case int(logrus.InfoLevel): + return logrus.InfoLevel + case int(logrus.DebugLevel): + return logrus.DebugLevel + case int(logrus.TraceLevel): + return logrus.TraceLevel + } + + return logrus.DebugLevel +} + +// FileName take a filename without extension and adds +// the corresponding teamserver/teamclient logfile extension. +func FileName(name string, server bool) string { + if server { + return fmt.Sprintf("%s.%s", name, ServerLogFileExt) + } + + return fmt.Sprintf("%s.%s", name, ClientLogFileExt) +} diff --git a/vendor/github.com/reeflective/team/internal/log/perms.go b/vendor/github.com/reeflective/team/internal/log/perms.go new file mode 100644 index 0000000000..b56f909eb7 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/perms.go @@ -0,0 +1,60 @@ +//go:build !windows +// +build !windows + +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" + "syscall" +) + +// IsWritable checks that the given path can be created. +func IsWritable(path string) (isWritable bool, err error) { + isWritable = false + info, err := os.Stat(path) + if err != nil { + return + } + + err = nil + if !info.IsDir() { + return false, fmt.Errorf("Path isn't a directory") + } + + // Check if the user bit is enabled in file permission + if info.Mode().Perm()&(1<<(uint(7))) == 0 { + return false, fmt.Errorf("Write permission bit is not set on this file for user") + } + + var stat syscall.Stat_t + if err = syscall.Stat(path, &stat); err != nil { + return false, fmt.Errorf("Unable to get stat") + } + + err = nil + if uint32(os.Geteuid()) != stat.Uid { + return isWritable, fmt.Errorf("User doesn't have permission to write to this directory") + } + + isWritable = true + return +} diff --git a/vendor/github.com/reeflective/team/internal/log/perms_windows.go b/vendor/github.com/reeflective/team/internal/log/perms_windows.go new file mode 100644 index 0000000000..1ccb9bd5cf --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/perms_windows.go @@ -0,0 +1,46 @@ +package log + +/* + team - Embeded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" +) + +// IsWritable checks that the given path can be created, on Windows. +func IsWritable(path string) (isWritable bool, err error) { + isWritable = false + info, err := os.Stat(path) + if err != nil { + return false, err + } + + err = nil + if !info.IsDir() { + return false, fmt.Errorf("Path isn't a directory") + } + + // Check if the user bit is enabled in file permission + if info.Mode().Perm()&(1<<(uint(7))) == 0 { + return false, fmt.Errorf("Write permission bit is not set on this file for user") + } + + isWritable = true + return +} diff --git a/vendor/github.com/reeflective/team/internal/log/text.go b/vendor/github.com/reeflective/team/internal/log/text.go new file mode 100644 index 0000000000..e4a81ce801 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/text.go @@ -0,0 +1,97 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "io" + "path/filepath" + "strings" + + "github.com/sirupsen/logrus" +) + +// txtHook - Hook in a textual version of the logs. +type txtHook struct { + Name string + app string + logger *logrus.Logger +} + +// newTxtHook - returns a new txt hook. +func newTxtHook(fs io.Writer, level logrus.Level, log *logrus.Logger) *txtHook { + hook := &txtHook{} + + logger, err := NewText(fs) + if err != nil { + log.Error(err) + } + + hook.logger = logger + hook.logger.SetLevel(level) + + return hook +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *txtHook) Fire(entry *logrus.Entry) error { + if hook.logger == nil { + return errors.New("no txt logger") + } + + // Determine the caller (filename/line number) + srcFile := "" + if entry.HasCaller() { + wiregostIndex := strings.Index(entry.Caller.File, hook.app) + srcFile = entry.Caller.File + if wiregostIndex != -1 { + srcFile = srcFile[wiregostIndex:] + } + } + + // Tream the useless prefix path, containing where it was compiled on the host... + paths := strings.Split(srcFile, "/mod/") + if len(paths) > 1 && paths[1] != "" { + srcFile = filepath.Join(paths[1:]...) + } + + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panicf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.FatalLevel: + hook.logger.Fatalf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.ErrorLevel: + hook.logger.Errorf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.WarnLevel: + hook.logger.Warnf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.InfoLevel: + hook.logger.Infof(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.DebugLevel: + hook.logger.Debugf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.TraceLevel: + hook.logger.Tracef(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + } + + return nil +} + +// Levels - Hook all levels. +func (hook *txtHook) Levels() []logrus.Level { + return logrus.AllLevels +} diff --git a/vendor/github.com/reeflective/team/internal/systemd/config.go b/vendor/github.com/reeflective/team/internal/systemd/config.go new file mode 100644 index 0000000000..705acf0da1 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/systemd/config.go @@ -0,0 +1,110 @@ +package systemd + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bytes" + _ "embed" + "fmt" + "log" + "os" + "os/user" + "strings" + "text/template" + + "github.com/reeflective/team/internal/version" +) + +// Config is a stub to generate systemd configuration files. +type Config struct { + User string // User to configure systemd for, default is current user. + Binpath string // Path to binary + Args []string // The command is the position of the daemon command in the application command tree. +} + +//go:embed teamserver.service +var systemdServiceTemplate string + +func NewFrom(name string, userCfg *Config) string { + cfg := NewDefaultConfig() + + if userCfg != nil { + cfg.User = userCfg.User + cfg.Binpath = userCfg.Binpath + cfg.Args = userCfg.Args + } + + // Prepare all values before running templates + ver := version.Semantic() + version := fmt.Sprintf("%d.%d.%d", ver[0], ver[1], ver[2]) + desc := fmt.Sprintf("%s Teamserver daemon (v%s)", name, version) + + systemdUser := cfg.User + if systemdUser == "" { + systemdUser = "root" + } + + // Command + command := strings.Join(cfg.Args, " ") + + TemplateValues := struct { + Application string + Description string + User string + Command string + }{ + Application: name, + Description: desc, + User: systemdUser, + Command: command, + } + + var config bytes.Buffer + + templ := template.New(name) + parsed, err := templ.Parse(systemdServiceTemplate) + if err != nil { + log.Fatalf("Failed to parse: %s", err) + } + + parsed.Execute(&config, TemplateValues) + + systemdFile := config.String() + + return systemdFile +} + +// NewDefaultConfig returns a default Systemd service file configuration. +func NewDefaultConfig() *Config { + c := &Config{} + + user, _ := user.Current() + if user != nil { + c.User = user.Username + } + + currentPath, err := os.Executable() + if err != nil { + return c + } + + c.Binpath = currentPath + + return c +} diff --git a/vendor/github.com/reeflective/team/internal/systemd/teamserver.service b/vendor/github.com/reeflective/team/internal/systemd/teamserver.service new file mode 100644 index 0000000000..eecc056312 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/systemd/teamserver.service @@ -0,0 +1,17 @@ +## [ {{.Application}} Systemd Service ] + +[Unit] +Description={{.Description}} +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=on-failure +RestartSec=3 +User={{.User}} +ExecStart={{.Command}} + +[Install] +WantedBy=multi-user.target + diff --git a/vendor/github.com/reeflective/team/internal/version/.gitignore b/vendor/github.com/reeflective/team/internal/version/.gitignore new file mode 100644 index 0000000000..1d65b47378 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/version/.gitignore @@ -0,0 +1 @@ +*.compiled diff --git a/vendor/github.com/reeflective/team/internal/version/teamserver_version_info b/vendor/github.com/reeflective/team/internal/version/teamserver_version_info new file mode 100644 index 0000000000..25a898d32b --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/version/teamserver_version_info @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +outfile="_version.compiled" + +git describe --abbrev=0 --always > "client${outfile}" +go version > "go${outfile}" +git rev-parse HEAD > "commit${outfile}" + +# Dirty (ensure file exists for github actions) +touch "dirty${outfile}" +git diff --quiet || echo 'Dirty' > "dirty${outfile}" + +# Compilation time +date +%s > "compiled${outfile}" diff --git a/vendor/github.com/reeflective/team/internal/version/version.go b/vendor/github.com/reeflective/team/internal/version/version.go new file mode 100644 index 0000000000..67a700668c --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/version/version.go @@ -0,0 +1,96 @@ +package version + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + _ "embed" + "fmt" + "strconv" + "strings" + "time" +) + +//go:generate bash teamserver_version_info +var ( + // Version - The semantic version in string form + //go:embed client_version.compiled + Version string + + // GoVersion - Go compiler version + //go:embed go_version.compiled + GoVersion string + + // GitCommit - The commit id at compile time + //go:embed commit_version.compiled + GitCommit string + + // GitDirty - Was the commit dirty at compile time + //go:embed dirty_version.compiled + GitDirty string + + // CompiledAt - When was this binary compiled + //go:embed compiled_version.compiled + CompiledAt string +) + +const ( + semVerLen = 3 +) + +// Semantic - Get the structured semantic +// version of the application binary. +func Semantic() []int { + semVer := make([]int, semVerLen) + version := strings.TrimSuffix(Version, "\n") + version = strings.TrimPrefix(version, "v") + + for i, part := range strings.Split(version, ".") { + number, _ := strconv.ParseInt(part, 10, 32) + semVer[i] = int(number) + } + + return semVer +} + +// Compiled - Get time this binary was compiled. +func Compiled() (time.Time, error) { + compiledAt := strings.TrimSuffix(CompiledAt, "\n") + + compiled, err := strconv.ParseInt(compiledAt, 10, 64) + if err != nil { + return time.Unix(0, 0), err + } + + return time.Unix(compiled, 0), nil +} + +// Full - Full version string. +func Full() string { + ver := strings.TrimSuffix(Version, "\n") + if GitCommit != "" { + ver += fmt.Sprintf(" - %s", GitCommit) + } + + compiled, err := Compiled() + if err == nil { + ver += fmt.Sprintf(" - Compiled %s", compiled.String()) + } + + return ver +} diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go new file mode 100644 index 0000000000..f8ea077d17 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -0,0 +1,260 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/reeflective/team/client" + cli "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/server" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. +// It requires a teamclient so as to bind its "teamclient" tree as a subcommand of the server root. +// This is so that all CLI applications which can be a teamserver can also be a client of their own. +// +// ** Commands do: +// - Ensure they are connected to a server instance (in memory). +// - Work even if the teamserver/client returns errors: those are returned &| printed &| logged. +// - Use the cobra utilities OutOrStdout(), ErrOrStdErr(), ... for all and every command output. +// - Have attached completions for users/listeners/config files of all sorts, and other things. +// - Have the ability to be ran in closed-loop console applications ("single runtime shell"). +// +// ** Commands do NOT: +// - Call os.Exit() anywhere, thus will not exit the program embedding them. +// - Ignite/start the teamserver core/filesystem/backends before they absolutely need to. +// Consequently, do not touch the filesystem until they absolutely need to. +// - Connect the client more than once to the teamserver. +// - Start persistent listeners, excluding the daemon command. +func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Command { + // Server-only commands always need to have open log + // files, most of the time access to the database, etc. + // On top, they need a listener in memory. + servCmds := serverCommands(teamserver, teamclient) + + for _, cmd := range servCmds.Commands() { + cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + return teamserver.Serve(teamclient) + } + } + + // We bind the same runners to the client-side commands. + cliCmds := cli.Generate(teamclient) + cliCmds.Use = "client" + cliCmds.GroupID = command.TeamServerGroup + + for _, cmd := range cliCmds.Commands() { + cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + return teamserver.Serve(teamclient) + } + } + + servCmds.AddCommand(cliCmds) + + return servCmds +} + +func serverCommands(server *server.Server, client *client.Client) *cobra.Command { + teamCmd := &cobra.Command{ + Use: "teamserver", + Short: "Manage the application server-side teamserver and users", + SilenceUsage: true, + } + + // Groups + teamCmd.AddGroup( + &cobra.Group{ID: command.TeamServerGroup, Title: command.TeamServerGroup}, + &cobra.Group{ID: command.UserManagementGroup, Title: command.UserManagementGroup}, + ) + + teamFlags := pflag.NewFlagSet("teamserver", pflag.ContinueOnError) + teamFlags.CountP("verbosity", "v", "Counter flag (-vvv) to increase log verbosity on stdout (1:info-> 3:trace)") + teamCmd.PersistentFlags().AddFlagSet(teamFlags) + + // [ Listeners and servers control commands ] ------------------------------------------ + + // Start a listener + listenCmd := &cobra.Command{ + Use: "listen", + Short: "Start a teamserver listener (non-blocking)", + GroupID: command.TeamServerGroup, + RunE: startListenerCmd(server), + } + + lnFlags := pflag.NewFlagSet("listener", pflag.ContinueOnError) + lnFlags.StringP("host", "H", "", "interface to bind server to") + lnFlags.StringP("listener", "l", "", "listener stack to use instead of default (completed)") + lnFlags.Uint16P("port", "P", 31337, "tcp listen port") + lnFlags.BoolP("persistent", "p", false, "make listener persistent across restarts") + listenCmd.Flags().AddFlagSet(lnFlags) + + listenComps := make(carapace.ActionMap) + listenComps["host"] = interfacesCompleter() + listenComps["listener"] = carapace.ActionCallback(listenerTypeCompleter(client, server)) + carapace.Gen(listenCmd).FlagCompletion(listenComps) + + teamCmd.AddCommand(listenCmd) + + // Close a listener + closeCmd := &cobra.Command{ + Use: "close", + Short: "Close a listener and remove it from persistent ones if it's one", + Args: cobra.MinimumNArgs(1), + GroupID: command.TeamServerGroup, + Run: closeCmd(server), + } + + closeComps := carapace.Gen(closeCmd) + closeComps.PositionalAnyCompletion(carapace.ActionCallback(listenerIDCompleter(client, server))) + + closeComps.PreRun(func(cmd *cobra.Command, args []string) { + cmd.PersistentPreRunE(cmd, args) + }) + + teamCmd.AddCommand(closeCmd) + + // Daemon (blocking listener and persistent jobs) + daemonCmd := &cobra.Command{ + Use: "daemon", + Short: "Start the teamserver in daemon mode (blocking)", + GroupID: command.TeamServerGroup, + RunE: daemoncmd(server), + } + daemonCmd.Flags().StringP("host", "l", "-", "multiplayer listener host") + daemonCmd.Flags().Uint16P("port", "p", uint16(0), "multiplayer listener port") + + daemonComps := make(carapace.ActionMap) + daemonComps["host"] = interfacesCompleter() + carapace.Gen(daemonCmd).FlagCompletion(daemonComps) + + teamCmd.AddCommand(daemonCmd) + + // Systemd configuration output + systemdCmd := &cobra.Command{ + Use: "systemd", + Short: "Print a systemd unit file for the application teamserver, with options", + GroupID: command.TeamServerGroup, + RunE: systemdConfigCmd(server), + } + + sFlags := pflag.NewFlagSet("systemd", pflag.ContinueOnError) + sFlags.StringP("binpath", "b", "", "Specify the path of the teamserver application binary") + sFlags.StringP("user", "u", "", "Specify the user for the systemd file to run with") + sFlags.StringP("save", "s", "", "Directory/file in which to save config, instead of stdout") + sFlags.StringP("host", "l", "", "Listen host to use in the systemd command line") + sFlags.Uint16P("port", "p", 0, "Listen port in the systemd command line") + systemdCmd.Flags().AddFlagSet(sFlags) + + sComps := make(carapace.ActionMap) + sComps["save"] = carapace.ActionFiles() + sComps["binpath"] = carapace.ActionFiles() + sComps["host"] = interfacesCompleter() + carapace.Gen(systemdCmd).FlagCompletion(sComps) + + teamCmd.AddCommand(systemdCmd) + + statusCmd := &cobra.Command{ + Use: "status", + Short: "Show the status of the teamserver (listeners, configurations, health...)", + GroupID: command.TeamServerGroup, + Run: statusCmd(server), + } + + teamCmd.AddCommand(statusCmd) + + // [ Users and data control commands ] ------------------------------------------------- + + // Add user + userCmd := &cobra.Command{ + Use: "user", + Short: "Create a user for this teamserver and generate its client configuration file", + GroupID: command.UserManagementGroup, + Run: createUserCmd(server, client), + } + + teamCmd.AddCommand(userCmd) + + userFlags := pflag.NewFlagSet("user", pflag.ContinueOnError) + userFlags.StringP("host", "l", "", "listen host") + userFlags.Uint16P("port", "p", 0, "listen port") + userFlags.StringP("save", "s", "", "directory/file in which to save config") + userFlags.StringP("name", "n", "", "user name") + userFlags.BoolP("system", "U", false, "Use the current OS user, and save its configuration directly in client dir") + userCmd.Flags().AddFlagSet(userFlags) + + userComps := make(carapace.ActionMap) + userComps["save"] = carapace.ActionDirectories() + userComps["host"] = interfacesCompleter() + carapace.Gen(userCmd).FlagCompletion(userComps) + + // Delete and kick user + rmUserCmd := &cobra.Command{ + Use: "delete", + Short: "Remove a user from the teamserver, and revoke all its current tokens", + GroupID: command.UserManagementGroup, + Args: cobra.ExactArgs(1), + Run: rmUserCmd(server), + } + + teamCmd.AddCommand(rmUserCmd) + + rmUserComps := carapace.Gen(rmUserCmd) + + rmUserComps.PositionalCompletion(carapace.ActionCallback(userCompleter(client, server))) + + rmUserComps.PreRun(func(cmd *cobra.Command, args []string) { + cmd.PersistentPreRunE(cmd, args) + }) + + // Import a list of users and their credentials. + cmdImportCA := &cobra.Command{ + Use: "import", + Short: "Import a certificate Authority file containing teamserver users", + GroupID: command.UserManagementGroup, + Args: cobra.ExactArgs(1), + Run: importCACmd(server), + } + + iComps := carapace.Gen(cmdImportCA) + iComps.PositionalCompletion( + carapace.Batch( + carapace.ActionCallback(cli.ConfigsCompleter(client, "teamserver/certs", ".teamserver.pem", "other teamservers user CAs", true)), + carapace.ActionFiles().Tag("teamserver user CAs"), + ).ToA(), + ) + + teamCmd.AddCommand(cmdImportCA) + + // Export the list of users and their credentials. + cmdExportCA := &cobra.Command{ + Use: "export", + Short: "Export a Certificate Authority file containing the teamserver users", + GroupID: command.UserManagementGroup, + Args: cobra.RangeArgs(0, 1), + Run: exportCACmd(server), + } + + carapace.Gen(cmdExportCA).PositionalCompletion(carapace.ActionFiles()) + teamCmd.AddCommand(cmdExportCA) + + return teamCmd +} diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go new file mode 100644 index 0000000000..40c2d12af3 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -0,0 +1,140 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "net" + "strings" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/server" + "github.com/rsteube/carapace" +) + +// interfacesCompleter completes interface addresses on the client host. +func interfacesCompleter() carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + ifaces, err := net.Interfaces() + if err != nil { + return carapace.ActionMessage("failed to get net interfaces: %s", err.Error()) + } + + results := make([]string, 0) + + for _, i := range ifaces { + addrs, err := i.Addrs() + if err != nil { + continue + } + + for _, a := range addrs { + switch ipType := a.(type) { + case *net.IPAddr: + results = append(results, ipType.IP.String()) + case *net.IPNet: + results = append(results, ipType.IP.String()) + default: + results = append(results, ipType.String()) + } + } + } + + return carapace.ActionValues(results...).Tag("client interfaces").NoSpace(':') + }) +} + +// userCompleter completes usernames of the application teamserver. +func userCompleter(client *client.Client, server *server.Server) carapace.CompletionCallback { + return func(c carapace.Context) carapace.Action { + users, err := client.Users() + if err != nil { + return carapace.ActionMessage("Failed to get users: %s", err) + } + + results := make([]string, len(users)) + for i, user := range users { + results[i] = strings.TrimSpace(user.Name) + } + + if len(results) == 0 { + return carapace.ActionMessage(fmt.Sprintf("%s teamserver has no users", server.Name())) + } + + return carapace.ActionValues(results...).Tag(fmt.Sprintf("%s teamserver users", server.Name())) + } +} + +// listenerIDCompleter completes ID for running teamserver listeners. +func listenerIDCompleter(client *client.Client, server *server.Server) carapace.CompletionCallback { + return func(c carapace.Context) carapace.Action { + listeners := server.Listeners() + cfg := server.GetConfig() + + var results []string + for _, ln := range listeners { + results = append(results, strings.TrimSpace(formatSmallID(ln.ID))) + results = append(results, fmt.Sprintf("[%s] (%s)", ln.Description, "Up")) + } + + var persistents []string + next: + for _, saved := range cfg.Listeners { + + for _, ln := range listeners { + if saved.ID == ln.ID { + continue next + } + } + + persistents = append(persistents, strings.TrimSpace(formatSmallID(saved.ID))) + + host := fmt.Sprintf("%s:%d", saved.Host, saved.Port) + persistents = append(persistents, fmt.Sprintf("[%s] (%s)", host, "Up")) + } + + if len(results) == 0 && len(persistents) == 0 { + return carapace.ActionMessage(fmt.Sprintf("no listeners running/saved for %s teamserver", server.Name())) + } + + // return carapace. + return carapace.Batch( + carapace.ActionValuesDescribed(results...).Tag("active teamserver listeners"), + carapace.ActionValuesDescribed(persistents...).Tag("saved teamserver listeners"), + ).ToA() + } +} + +// listenerTypeCompleter completes the different types of teamserver listener/handler stacks available. +func listenerTypeCompleter(client *client.Client, server *server.Server) carapace.CompletionCallback { + return func(c carapace.Context) carapace.Action { + listeners := server.Handlers() + + var results []string + for _, ln := range listeners { + results = append(results, strings.TrimSpace(ln.Name())) + } + + if len(results) == 0 { + return carapace.ActionMessage(fmt.Sprintf("no additional listener types for %s teamserver", server.Name())) + } + + return carapace.ActionValues(results...).Tag(fmt.Sprintf("%s teamserver listener types", server.Name())) + } +} diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go new file mode 100644 index 0000000000..f5fe3f288e --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -0,0 +1,372 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + "runtime/debug" + "strconv" + "strings" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/internal/systemd" + "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + lhost, err := cmd.Flags().GetString("host") + if err != nil { + return fmt.Errorf("Failed to get --host flag: %w", err) + } + + lport, err := cmd.Flags().GetUint16("port") + if err != nil { + return fmt.Errorf("Failed to get --port (%d) flag: %w", lport, err) + } + + // Also written to logs in the teamserver code. + defer func() { + if r := recover(); r != nil { + fmt.Fprintf(cmd.OutOrStdout(), "stacktrace from panic: \n"+string(debug.Stack())) + } + }() + + // Blocking call, your program will only exit/resume on Ctrl-C/SIGTERM + return serv.ServeDaemon(lhost, lport) + } +} + +func startListenerCmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + lhost, _ := cmd.Flags().GetString("host") + lport, _ := cmd.Flags().GetUint16("port") + persistent, _ := cmd.Flags().GetBool("persistent") + ltype, _ := cmd.Flags().GetString("listener") + + _, err := serv.ServeAddr(ltype, lhost, lport) + if err == nil { + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Teamserver listener started on %s:%d\n", lhost, lport) + + if persistent { + serv.ListenerAdd(ltype, lhost, lport) + } + } else { + return fmt.Errorf(command.Warn+"Failed to start job %w", err) + } + + return nil + } +} + +func closeCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + listeners := serv.Listeners() + cfg := serv.GetConfig() + + for _, arg := range args { + if arg == "" { + continue + } + + for _, ln := range listeners { + if strings.HasPrefix(ln.ID, arg) { + err := serv.ListenerClose(arg) + if err != nil { + fmt.Fprintln(cmd.ErrOrStderr(), command.Warn, err) + } else { + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Closed %s listener (%s) [%s]\n", ln.Name, formatSmallID(ln.ID), ln.Description) + } + } + } + } + + for _, arg := range args { + if arg == "" { + continue + } + + for _, saved := range cfg.Listeners { + if strings.HasPrefix(saved.ID, arg) { + serv.ListenerRemove(saved.ID) + id := formatSmallID(saved.ID) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Deleted %s listener (%s) from saved jobs\n", saved.Name, id) + + continue + } + } + } + } +} + +func systemdConfigCmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + config := systemd.NewDefaultConfig() + + userf, _ := cmd.Flags().GetString("user") + if userf != "" { + config.User = userf + } + + binPath, _ := cmd.Flags().GetString("binpath") + if binPath != "" { + config.Binpath = binPath + } + + host, hErr := cmd.Flags().GetString("host") + if hErr != nil { + return hErr + } + + port, pErr := cmd.Flags().GetUint16("port") + if pErr != nil { + return pErr + } + + // The last argument is the systemd command: + // its parent is the teamserver one, to which + // should be attached the daemon command. + daemonCmd, _, err := cmd.Parent().Find([]string{"daemon"}) + if err != nil { + return fmt.Errorf("Failed to find teamserver daemon command in tree: %w", err) + } + + config.Args = append(callerArgs(cmd.Parent()), daemonCmd.Name()) + if len(config.Args) > 0 && binPath != "" { + config.Args[0] = binPath + } + + if host != "" { + config.Args = append(config.Args, strings.Join([]string{"--host", host}, " ")) + } + + if port != 0 { + config.Args = append(config.Args, strings.Join([]string{"--port", strconv.Itoa(int(port))}, " ")) + } + + systemdConfig := systemd.NewFrom(serv.Name(), config) + fmt.Fprint(cmd.OutOrStdout(), systemdConfig) + + return nil + } +} + +func statusCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, _ []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + cfg := serv.GetConfig() + + dbCfg := serv.DatabaseConfig() + database := fmt.Sprintf("%s - %s [%s:%d] ", dbCfg.Dialect, dbCfg.Database, dbCfg.Host, dbCfg.Port) + + // General options, in-memory, default port, config path, database, etc + fmt.Fprintln(cmd.OutOrStdout(), formatSection("General")) + fmt.Fprint(cmd.OutOrStdout(), displayGroup([]string{ + "Home", serv.HomeDir(), + "Port", strconv.Itoa(cfg.DaemonMode.Port), + "Database", database, + "Config", serv.ConfigPath(), + })) + + // Logging files/level/status + fakeLog := serv.NamedLogger("", "") + + fmt.Fprintln(cmd.OutOrStdout(), formatSection("Logging")) + fmt.Fprint(cmd.OutOrStdout(), displayGroup([]string{ + "Level", fakeLog.Level.String(), + "Root", log.FileName(filepath.Join(serv.LogsDir(), serv.Name()), true), + "Audit", filepath.Join(serv.LogsDir(), "audit.json"), + })) + + // Certificate files. + certsPath := serv.CertificatesDir() + if dir, err := os.Stat(certsPath); err == nil && dir.IsDir() { + files, err := fs.ReadDir(os.DirFS(certsPath), ".") + if err == nil || len(files) > 0 { + fmt.Fprintln(cmd.OutOrStdout(), formatSection("Certificate files")) + + for _, file := range files { + fmt.Fprintln(cmd.OutOrStdout(), filepath.Join(certsPath, file.Name())) + } + } + } + + // Listeners + listenersTable := listenersTable(serv, cfg) + + if listenersTable != "" { + fmt.Fprintln(cmd.OutOrStdout(), formatSection("Listeners")) + fmt.Fprintln(cmd.OutOrStdout(), listenersTable) + } + } +} + +func listenersTable(serv *server.Server, cfg *server.Config) string { + listeners := serv.Listeners() + + tbl := &table.Table{} + tbl.SetStyle(command.TableStyle) + + tbl.AppendHeader(table.Row{ + "ID", + "Name", + "Description", + "State", + "Persistent", + }) + + for _, listener := range listeners { + persist := false + + for _, saved := range cfg.Listeners { + if saved.ID == listener.ID { + persist = true + } + } + + tbl.AppendRow(table.Row{ + formatSmallID(listener.ID), + listener.Name, + listener.Description, + command.Green + command.Bold + "Up" + command.Normal, + persist, + }) + } + +next: + for _, saved := range cfg.Listeners { + + for _, ln := range listeners { + if saved.ID == ln.ID { + continue next + } + } + + tbl.AppendRow(table.Row{ + formatSmallID(saved.ID), + saved.Name, + fmt.Sprintf("%s:%d", saved.Host, saved.Port), + command.Red + command.Bold + "Down" + command.Normal, + true, + }) + } + + if len(listeners) > 0 { + return tbl.Render() + } + + return "" +} + +func fieldName(name string) string { + return command.Blue + command.Bold + name + command.Normal +} + +func callerArgs(cmd *cobra.Command) []string { + var args []string + + if cmd.HasParent() { + args = callerArgs(cmd.Parent()) + } + + args = append(args, cmd.Name()) + + return args +} + +func formatSection(msg string, args ...any) string { + return "\n" + command.Bold + command.Orange + fmt.Sprintf(msg, args...) + command.Normal +} + +// formatSmallID returns a smallened ID for table/completion display. +func formatSmallID(id string) string { + if len(id) <= 8 { + return id + } + + return id[:8] +} + +func displayGroup(values []string) string { + var maxLength int + var group string + + // Get the padding for headers + for i, head := range values { + if i%2 != 0 { + continue + } + + if len(head) > maxLength { + maxLength = len(head) + } + } + + for i := 0; i < len(values)-1; i += 2 { + field := values[i] + value := values[i+1] + + headName := fmt.Sprintf("%*s", maxLength, field) + fieldName := command.Blue + command.Bold + headName + command.Normal + " " + group += fmt.Sprintf("%s: %s\n", fieldName, value) + } + + return group +} diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go new file mode 100644 index 0000000000..07eae7200f --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -0,0 +1,216 @@ +package commands + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "os/user" + "path/filepath" + "strings" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, _ []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + name, _ := cmd.Flags().GetString("name") + lhost, _ := cmd.Flags().GetString("host") + lport, _ := cmd.Flags().GetUint16("port") + save, _ := cmd.Flags().GetString("save") + system, _ := cmd.Flags().GetBool("system") + + if save == "" { + save, _ = os.Getwd() + } + + var filename string + var saveTo string + + if system { + user, err := user.Current() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to get current OS user: %s\n", err) + return + } + + name = user.Username + filename = fmt.Sprintf("%s_%s_default", serv.Name(), user.Username) + saveTo = cli.ConfigsDir() + + err = os.MkdirAll(saveTo, log.DirPerm) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"cannot write to %s root dir: %s\n", saveTo, err) + return + } + } else { + saveTo, _ = filepath.Abs(save) + userFile, err := os.Stat(saveTo) + if !os.IsNotExist(err) && !userFile.IsDir() { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"File already exists %s\n", err) + return + } + + if !os.IsNotExist(err) && userFile.IsDir() { + filename = fmt.Sprintf("%s_%s", filepath.Base(name), filepath.Base(lhost)) + } + } + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Generating new client certificate, please wait ... \n") + + config, err := serv.UserCreate(name, lhost, lport) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", err) + return + } + + configJSON, err := json.Marshal(config) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"JSON marshaling error: %s\n", err) + return + } + + saveTo = filepath.Join(saveTo, filename+".teamclient.cfg") + + err = ioutil.WriteFile(saveTo, configJSON, log.FileReadPerm) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to write config to %s: %s\n", saveTo, err) + return + } + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Saved new client config to: %s\n", saveTo) + } +} + +func rmUserCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + user := args[0] + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Removing client certificate(s)/token(s) for %s, please wait ... \n", user) + + err := serv.UserDelete(user) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to remove the user certificate: %v\n", err) + return + } + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"User %s has been deleted from the teamserver, and kicked out.\n", user) + } +} + +func importCACmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + load := args[0] + + fi, err := os.Stat(load) + if os.IsNotExist(err) || fi.IsDir() { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Cannot load file %s\n", load) + } + + data, err := os.ReadFile(load) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Cannot read file: %v\n", err) + } + + // CA - Exported CA format + type CA struct { + Certificate string `json:"certificate"` + PrivateKey string `json:"private_key"` + } + + importCA := &CA{} + err = json.Unmarshal(data, importCA) + + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to parse file: %s\n", err) + } + + cert := []byte(importCA.Certificate) + key := []byte(importCA.PrivateKey) + serv.UsersSaveCA(cert, key) + } +} + +func exportCACmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + var save string + if len(args) == 1 { + save = args[0] + } + + if strings.TrimSpace(save) == "" { + save, _ = os.Getwd() + } + + certificateData, privateKeyData, err := serv.UsersGetCA() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Error reading CA %s\n", err) + return + } + + // CA - Exported CA format + type CA struct { + Certificate string `json:"certificate"` + PrivateKey string `json:"private_key"` + } + + exportedCA := &CA{ + Certificate: string(certificateData), + PrivateKey: string(privateKeyData), + } + + saveTo, _ := filepath.Abs(save) + + caFile, err := os.Stat(saveTo) + if !os.IsNotExist(err) && !caFile.IsDir() { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"File already exists: %s\n", err) + return + } + + if !os.IsNotExist(err) && caFile.IsDir() { + filename := fmt.Sprintf("%s-%s.teamserver.ca", serv.Name(), "users") + saveTo = filepath.Join(saveTo, filename) + } + + data, _ := json.Marshal(exportedCA) + + err = os.WriteFile(saveTo, data, log.FileWritePerm) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Write failed: %s (%s)\n", saveTo, err) + return + } + } +} diff --git a/vendor/github.com/reeflective/team/server/config.go b/vendor/github.com/reeflective/team/server/config.go new file mode 100644 index 0000000000..a1553844ca --- /dev/null +++ b/vendor/github.com/reeflective/team/server/config.go @@ -0,0 +1,205 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/hex" + "encoding/json" + "fmt" + insecureRand "math/rand" + "os" + "path/filepath" + "time" + + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" +) + +const ( + blankHost = "-" + blankPort = uint16(0) + tokenLength = 32 + defaultPort = 31416 // Should be 31415, but... go to hell with limits. +) + +// Config represents the configuration of a given application teamserver. +// It contains anonymous embedded structs as subsections, for logging, +// daemon mode bind addresses, and persistent teamserver listeners +// +// Its default path is ~/.app/teamserver/configs/app.teamserver.cfg. +// It uses the following default values: +// - Daemon host: "" +// - Daemon port: 31416 +// - logging file level: Info. +type Config struct { + // When the teamserver command `app teamserver daemon` is executed + // without --host/--port flags, the teamserver will use the config. + DaemonMode struct { + Host string `json:"host"` + Port int `json:"port"` + } `json:"daemon_mode"` + + // Logging controls the file-based logging level, whether or not + // to log TLS keys to file, and whether to log specific gRPC payloads. + Log struct { + Level int `json:"level"` + GRPCUnaryPayloads bool `json:"grpc_unary_payloads"` + GRPCStreamPayloads bool `json:"grpc_stream_payloads"` + TLSKeyLogger bool `json:"tls_key_logger"` + } `json:"log"` + + // Listeners is a list of persistent teamserver listeners. + // They are started when the teamserver daemon command/mode is. + Listeners []struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + } `json:"listeners"` +} + +// ConfigPath returns the path to the server config.json file, on disk or in-memory. +func (ts *Server) ConfigPath() string { + appDir := ts.TeamDir() + configDir := filepath.Join(appDir, "configs") + + err := ts.fs.MkdirAll(configDir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s config dir: %s", configDir, err) + } + + serverConfigPath := filepath.Join(configDir, fmt.Sprintf("%s.%s", ts.Name(), command.ServerConfigExt)) + + return serverConfigPath +} + +// GetConfig returns the team server configuration as a struct. +// If no server configuration file is found on disk, the default one is used. +func (ts *Server) GetConfig() *Config { + cfgLog := ts.NamedLogger("config", "server") + + if ts.opts.inMemory { + return ts.opts.config + } + + configPath := ts.ConfigPath() + if _, err := os.Stat(configPath); !os.IsNotExist(err) { + cfgLog.Debugf("Loading config from %s", configPath) + + data, err := os.ReadFile(configPath) + if err != nil { + cfgLog.Errorf("Failed to read config file %s", err) + return ts.opts.config + } + + err = json.Unmarshal(data, ts.opts.config) + if err != nil { + cfgLog.Errorf("Failed to parse config file %s", err) + return ts.opts.config + } + } else { + cfgLog.Warnf("Teamserver: no config file found, using and saving defaults") + } + + if ts.opts.config.Log.Level < 0 { + ts.opts.config.Log.Level = 0 + } + + if int(logrus.TraceLevel) < ts.opts.config.Log.Level { + ts.opts.config.Log.Level = int(logrus.TraceLevel) + } + + // This updates the config with any missing fields + err := ts.SaveConfig(ts.opts.config) + if err != nil { + cfgLog.Errorf("Failed to save default config %s", err) + } + + return ts.opts.config +} + +// Save saves config file to disk. +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (ts *Server) SaveConfig(cfg *Config) error { + cfgLog := ts.NamedLogger("config", "server") + + if ts.opts.inMemory { + return nil + } + + configPath := ts.ConfigPath() + configDir := filepath.Dir(configPath) + + if _, err := os.Stat(configDir); os.IsNotExist(err) { + cfgLog.Debugf("Creating config dir %s", configDir) + + err := os.MkdirAll(configDir, log.DirPerm) + if err != nil { + return ts.errorf("%w: %w", ErrConfig, err) + } + } + + data, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return err + } + + cfgLog.Debugf("Saving config to %s", configPath) + + err = os.WriteFile(configPath, data, log.FileReadPerm) + if err != nil { + return ts.errorf("%w: failed to write config: %s", ErrConfig, err) + } + + return nil +} + +func getDefaultServerConfig() *Config { + return &Config{ + DaemonMode: struct { + Host string `json:"host"` + Port int `json:"port"` + }{ + Port: defaultPort, // 31416 + }, + Log: struct { + Level int `json:"level"` + GRPCUnaryPayloads bool `json:"grpc_unary_payloads"` + GRPCStreamPayloads bool `json:"grpc_stream_payloads"` + TLSKeyLogger bool `json:"tls_key_logger"` + }{ + Level: int(logrus.InfoLevel), + }, + Listeners: []struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + }{}, + } +} + +func getRandomID() string { + seededRand := insecureRand.New(insecureRand.NewSource(time.Now().UnixNano())) + buf := make([]byte, tokenLength) + seededRand.Read(buf) + + return hex.EncodeToString(buf) +} diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go new file mode 100644 index 0000000000..7c5e9390e3 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/core.go @@ -0,0 +1,240 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os/user" + "path/filepath" + "runtime" + "strings" + "sync" + + "github.com/reeflective/team" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/certs" + "github.com/reeflective/team/internal/db" + "github.com/reeflective/team/internal/version" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +// Server is the core driver of an application teamserver. +// It is the counterpart to and plays a similar role than that +// of the team/client.Client type, ie. that it provides tools +// to any application/program to become a teamserver of itself. +// +// The server object can run on its own, without any teamclient attached +// or connected: it fulfills the reeflective/team.Client interface, and +// any teamserver can also be a client of itself, without configuration. +// +// The core job of the Server is to, non-exhaustively: +// - Store and manage a list of users with a zero-trust identity system +// (ie. public-key based), with ways to import/export these lists. +// - Register, start and control teamserver listener/server stacks, for +// many application clients to connect and consume the teamserver app. +// - Offer version and user information to all teamclients. +// +// Additionally and similarly to the team/client.Client, it gives: +// - Pre-configured loggers that listener stacks and server consumers +// can use at any step of their application. +// - Various options to configure its backends and behaviors. +// - A builtin, app-specific abstracted filesystem (in-memory or on-disk). +// - Additionally, an API to further register and control listeners. +// +// Various combinations of teamclient/teamserver usage are possible. +// Please see the Go module example/ directory for a list of them. +type Server struct { + // Core + name string // Name of the application using the teamserver. + homeDir string // APP_ROOT_DIR var, evaluated once when creating the server. + opts *opts // Server options + fs *assets.FS // Server filesystem, on-disk or embedded + initOpts sync.Once // Some options can only be set once when creating the server. + + // Logging + fileLog *logrus.Logger // Can be in-memory if the teamserver is configured. + stdioLog *logrus.Logger // Logging level independent from the file logger. + + // Users + userTokens *sync.Map // Refreshed entirely when a user is kicked. + certs *certs.Manager // Manages all the certificate infrastructure. + db *gorm.DB // Stores certificates and users data. + dbInit sync.Once // A single database can be used in a teamserver lifetime. + + // Listeners and job control + initServe sync.Once // Some options can only have an effect at first start. + self Listener // The default listener stack used by the teamserver. + handlers map[string]Listener // Other listeners available by name. + jobs *jobs // Listeners job control +} + +// New creates a new teamserver for the provided application name. +// Only one such teamserver should be created an application of any given name. +// Since by default, any teamserver can have any number of runtime clients, you +// are not required to provide any specific server.Listener type to serve clients. +// +// This call to create the server only creates the application default directory. +// No files, logs, connections or any interaction with the os/filesystem are made. +// +// Errors: +// - All errors returned from this call are critical, in that the server could not +// run properly in its most basic state, which may happen if the teamclient cannot +// use and write to its on-disk directories/backends and log files. +// No server is returned if the error is not nil. +// - All methods of the teamserver core which return an error will always log this +// error to the various teamserver log files/output streams, so that all actions +// of teamserver can be recorded and watched out in various places. +func New(application string, options ...Options) (*Server, error) { + server := &Server{ + name: application, + opts: newDefaultOpts(), + userTokens: &sync.Map{}, + jobs: newJobs(), + handlers: make(map[string]Listener), + } + + server.apply(options...) + + // Filesystem + user, _ := user.Current() + root := filepath.Join(user.HomeDir, "."+server.name) + server.fs = assets.NewFileSystem(root, server.opts.inMemory) + + // Logging (if allowed) + if err := server.initLogging(); err != nil { + return nil, err + } + + // Ensure we have a working database configuration, + // and at least an in-memory sqlite database. + if server.opts.dbConfig == nil { + server.opts.dbConfig = server.getDefaultDatabaseConfig() + } + + if server.opts.dbConfig.Database == db.SQLiteInMemoryHost && server.db == nil { + if err := server.initDatabase(); err != nil { + return nil, server.errorf("%w: %w", ErrDatabase, err) + } + } + + return server, nil +} + +// Name returns the name of the application handled by the teamserver. +// Since you can embed multiple teamservers (one for each application) +// into a single binary, this is different from the program binary name +// running this teamserver. +func (ts *Server) Name() string { + return ts.name +} + +// Self returns a new application team/client.Client (with the same app name), +// using any provided options for client behavior. +// +// This teamclient implements by default the root team/Teamclient interface +// (directly through the server), but passing user-specific dialer stack options +// to this function and by providing the corresponding server options for your +// pair, you can use in-memory clients which will use the complete RPC stack +// of the application using this teamserver. +// See the server.Listener and client.Dialer types documentation for more. +func (ts *Server) Self(opts ...client.Options) *client.Client { + opts = append(opts, client.WithLocalDialer()) + + teamclient, _ := client.New(ts.Name(), ts, opts...) + + return teamclient +} + +// Version returns the teamserver binary version information. +func (ts *Server) Version() (team.Version, error) { + dirty := version.GitDirty != "" + semVer := version.Semantic() + compiled, _ := version.Compiled() + + var major, minor, patch int32 + + if len(semVer) == 3 { + major = int32(semVer[0]) + minor = int32(semVer[1]) + patch = int32(semVer[2]) + } + + return team.Version{ + Major: major, + Minor: minor, + Patch: patch, + Commit: strings.TrimSuffix(version.GitCommit, "\n"), + Dirty: dirty, + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil +} + +// Users returns the list of users in the teamserver database, and their information. +// Any error raised during querying the database is returned, along with all users. +func (ts *Server) Users() ([]team.User, error) { + if err := ts.initDatabase(); err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + usersDB := []*db.User{} + err := ts.dbSession().Find(&usersDB).Error + + users := make([]team.User, len(usersDB)) + + if err != nil && len(usersDB) == 0 { + return users, ts.errorf("%w: %w", ErrDatabase, err) + } + + for i, user := range usersDB { + users[i] = team.User{ + Name: user.Name, + LastSeen: user.LastSeen, + } + + if _, ok := ts.userTokens.Load(user.Token); ok { + users[i].Online = true + } + } + + return users, nil +} + +// Filesystem returns an abstract filesystem used by the teamserver. +// This filesystem can be either of two things: +// - By default, the on-disk filesystem, without any specific bounds. +// - If the teamserver was created with the InMemory() option, a full +// in-memory filesystem (with root `.app/`). +// +// Use cases for this filesystem might include: +// - The wish to have a fully abstracted filesystem to work for testing +// - Ensuring that the filesystem code in your application remains the +// same regardless of the underlying, actual filesystem. +// +// The type returned is currently an internal type because it wraps some +// os.Filesystem methods for working more transparently: this may change +// in the future if the Go stdlib offers write support to its new io/fs.FS. +// +// SERVER note: Runtime clients can run with the client.InMemory() option, +// without any impact on the teamserver filesystem and its behavior. +func (ts *Server) Filesystem() *assets.FS { + return ts.fs +} diff --git a/vendor/github.com/reeflective/team/server/db.go b/vendor/github.com/reeflective/team/server/db.go new file mode 100644 index 0000000000..b8bb61a0ff --- /dev/null +++ b/vendor/github.com/reeflective/team/server/db.go @@ -0,0 +1,193 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "fmt" + "os" + "path" + "path/filepath" + + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/db" + "github.com/reeflective/team/internal/log" + "gorm.io/gorm" +) + +const ( + maxIdleConns = 10 + maxOpenConns = 100 +) + +// Database returns a new teamserver database session, which may not be nil: +// at worst, this database will be an in-memory one. The default is a file- +// based Sqlite database in the teamserver directory, but it might be a +// specific database passed through options. +func (ts *Server) Database() *gorm.DB { + return ts.db.Session(&gorm.Session{ + FullSaveAssociations: true, + }) +} + +// DatabaseConfig returns the server database backend configuration struct. +// If configuration could be found on disk, the default Sqlite file-based +// database is returned, with app-corresponding file paths. +func (ts *Server) DatabaseConfig() *db.Config { + cfg, err := ts.getDatabaseConfig() + if err != nil { + return cfg + } + + return cfg +} + +// GetDatabaseConfigPath - File path to config.json. +func (ts *Server) dbConfigPath() string { + appDir := ts.TeamDir() + log := ts.NamedLogger("config", "database") + databaseConfigPath := filepath.Join(appDir, "configs", fmt.Sprintf("%s.%s", ts.Name()+"_database", command.ServerConfigExt)) + log.Debugf("Loading config from %s", databaseConfigPath) + + return databaseConfigPath +} + +// Save - Save config file to disk. If the server is configured +// to run in-memory only, the config is not saved. +func (ts *Server) saveDatabaseConfig(cfg *db.Config) error { + if ts.opts.inMemory { + return nil + } + + dblog := ts.NamedLogger("config", "database") + + configPath := ts.dbConfigPath() + configDir := path.Dir(configPath) + + if _, err := os.Stat(configDir); os.IsNotExist(err) { + dblog.Debugf("Creating config dir %s", configDir) + + err := os.MkdirAll(configDir, log.DirPerm) + if err != nil { + return err + } + } + + data, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return err + } + + dblog.Debugf("Saving config to %s", configPath) + + return os.WriteFile(configPath, data, log.FileReadPerm) +} + +// getDatabaseConfig returns a working database configuration, +// either fetched from the file system, adjusted with in-code +// options, or a default one. +// If an error happens, it is returned with a nil configuration. +func (ts *Server) getDatabaseConfig() (*db.Config, error) { + log := ts.NamedLogger("config", "database") + + // Don't fetch anything if running in-memory only. + config := ts.opts.dbConfig + if config.Database == db.SQLiteInMemoryHost { + return config, nil + } + + configPath := ts.dbConfigPath() + if _, err := os.Stat(configPath); !os.IsNotExist(err) { + data, err := os.ReadFile(configPath) + if err != nil { + return nil, fmt.Errorf("Failed to read config file %w", err) + } + + err = json.Unmarshal(data, config) + if err != nil { + return nil, fmt.Errorf("Failed to parse config file %w", err) + } + } else { + log.Warnf("Database: no config file found, using and saving defaults") + } + + if config.MaxIdleConns < 1 { + config.MaxIdleConns = 1 + } + + if config.MaxOpenConns < 1 { + config.MaxOpenConns = 1 + } + + // This updates the config with any missing fields, + // failing to save is not critical for operation. + err := ts.saveDatabaseConfig(config) + if err != nil { + log.Errorf("Failed to save default config %s", err) + } + + return config, nil +} + +func (ts *Server) getDefaultDatabaseConfig() *db.Config { + cfg := &db.Config{ + Dialect: db.Sqlite, + MaxIdleConns: maxIdleConns, + MaxOpenConns: maxOpenConns, + + LogLevel: "warn", + } + + if ts.opts.inMemory { + cfg.Database = db.SQLiteInMemoryHost + } else { + cfg.Database = filepath.Join(ts.TeamDir(), fmt.Sprintf("%s.teamserver.db", ts.name)) + } + + return cfg +} + +// initDatabase should be called once when a teamserver is created. +func (ts *Server) initDatabase() (err error) { + ts.dbInit.Do(func() { + dbLogger := ts.NamedLogger("database", "database") + + if ts.db != nil { + return + } + + ts.opts.dbConfig, err = ts.getDatabaseConfig() + if err != nil { + return + } + + ts.db, err = db.NewClient(ts.opts.dbConfig, dbLogger) + if err != nil { + return + } + }) + + return nil +} + +func (ts *Server) dbSession() *gorm.DB { + return ts.db.Session(&gorm.Session{ + FullSaveAssociations: true, + }) +} diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go new file mode 100644 index 0000000000..fb04e064f9 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -0,0 +1,124 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" + "os/user" + "path" + "path/filepath" + + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/log" +) + +// HomeDir returns the root application directory (~/.app/ by default). +// This directory can be set with the environment variable _ROOT_DIR. +// This directory is not to be confused with the ~/.app/teamserver directory +// returned by the server.TeamDir(), which is specific to the app teamserver. +func (ts *Server) HomeDir() string { + var dir string + + // Note: very important not to combine the nested if here. + if !ts.opts.inMemory { + if ts.homeDir == "" { + user, _ := user.Current() + dir = filepath.Join(user.HomeDir, "."+ts.name) + } + } else { + dir = "." + ts.name + } + + err := ts.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// TeamDir returns the teamserver directory of the app (named ~/./teamserver/), +// creating the directory if needed, or logging an error event if failing to create it. +// This directory is used to store teamserver certificates, database, logs, and configs. +func (ts *Server) TeamDir() string { + dir := path.Join(ts.HomeDir(), assets.DirServer) + + err := ts.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// LogsDir returns the directory of the client (~/.app-server/logs), creating +// the directory if needed, or logging a fatal event if failing to create it. +func (ts *Server) LogsDir() string { + logDir := path.Join(ts.TeamDir(), assets.DirLogs) + + err := ts.fs.MkdirAll(logDir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", logDir, err) + } + + return logDir +} + +// CertificatesDir returns the directory storing users CA PEM files as backup, +// (~/.app/teamserver/certs), either on-disk or in-memory if the teamserver is. +func (ts *Server) CertificatesDir() string { + certDir := path.Join(ts.TeamDir(), assets.DirCerts) + + err := ts.fs.MkdirAll(certDir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", certDir, err) + } + + return certDir +} + +// When creating a new server, don't write anything to anywhere yet, +// but ensure that at least all directories to which we are supposed +// to write do indeed exist, and make them anyway. +// If any error happens it will returned right away and the creator +// of the teamserver will know right away that it can't work correctly. +func (ts *Server) checkWritableFiles() error { + if ts.opts.inMemory { + return nil + } + + // Check home application directory. + // If it does not exist but we don't have write permission + // on /user/home, we return an error as we can't work. + appDirWrite, err := log.IsWritable(ts.TeamDir()) + + switch { + case os.IsNotExist(err): + if homeWritable, err := log.IsWritable(os.Getenv("HOME")); !homeWritable { + return fmt.Errorf("Cannot create %w", err) + } + case err != nil: + return fmt.Errorf("Cannot write to %w", err) + case !appDirWrite: + return ErrDirectoryUnwritable + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/server/errors.go b/vendor/github.com/reeflective/team/server/errors.go new file mode 100644 index 0000000000..e050c35e00 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/errors.go @@ -0,0 +1,83 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import "errors" + +var ( + // + // Filesystem errors. + // + + // ErrDirectory is an error related to directories used by the teamserver. + ErrDirectory = errors.New("teamserver directory") + + // ErrDirectoryUnwritable is an error returned when the teamserver checked for write permissions + // on a directory path it needs, and that the Go code of the teamserver has determined that the + // file is really non-user writable. This error is NEVER returned "because the path does not exist". + ErrDirectoryUnwritable = errors.New("The directory seems to be unwritable (to the app runtime)") + + // ErrLogging is an error related with the logging backend. + // Some errors can be about writable files/directories. + ErrLogging = errors.New("logging") + + // ErrSecureRandFailed indicates that the teamserver could not read from the system secure random source. + ErrSecureRandFailed = errors.New("failed to read from secure rand") + + // + // Teamserver core errors. + // + + // ErrConfig is an error related to the teamserver configuration. + ErrConfig = errors.New("teamserver config") + + // ErrDatabaseConfig is an error related to the database configuration. + ErrDatabaseConfig = errors.New("teamserver database configuration") + + // ErrDatabase is an error raised by the database backend. + ErrDatabase = errors.New("database") + + // ErrTeamServer is an error raised by the teamserver core code. + ErrTeamServer = errors.New("teamserver") + + // ErrCertificate is an error related to the certificate infrastructure. + ErrCertificate = errors.New("certificates") + + // ErrUserConfig is an error related to users (teamclients) configuration files. + ErrUserConfig = errors.New("user configuration") + + // ErrUnauthenticated indicates that a client user could not authenticate itself, + // whether at connection time, or when requesting server-side features/info. + ErrUnauthenticated = errors.New("User authentication failure") + + // + // Listener errors. + // + + // ErrNoListener indicates that the server could not find any listener/server + // stack to run when one of its .Serve*() methods were invoked. If such an error + // is raised, make sure you passed a server.Listener type with WithListener() option. + ErrNoListener = errors.New("the teamserver has no listeners to start") + + // ErrListenerNotFound indicates that for a given ID, no running or persistent listener could be found. + ErrListenerNotFound = errors.New("no listener exists with ID") + + // ErrListener indicates an error raised by a listener stack/implementation. + ErrListener = errors.New("teamserver listener") +) diff --git a/vendor/github.com/reeflective/team/server/jobs.go b/vendor/github.com/reeflective/team/server/jobs.go new file mode 100644 index 0000000000..3841dec05d --- /dev/null +++ b/vendor/github.com/reeflective/team/server/jobs.go @@ -0,0 +1,227 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "fmt" + "net" + "sync" +) + +// job - Manages background jobs. +type job struct { + ID string + Name string + Description string + kill chan bool + Persistent bool +} + +// jobs - Holds refs to all active jobs. +type jobs struct { + active *sync.Map +} + +func newJobs() *jobs { + return &jobs{ + active: &sync.Map{}, + } +} + +// Add - Add a job to the hive (atomically). +func (j *jobs) Add(listener *job) { + j.active.Store(listener.ID, listener) +} + +// Get - Get a Job. +func (j *jobs) Get(jobID string) *job { + if jobID == "" { + return nil + } + + val, ok := j.active.Load(jobID) + if ok { + return val.(*job) + } + + return nil +} + +// Listeners returns a list of all running listener jobs. +// If you also want the list of the non-running, persistent +// ones, use the teamserver Config(). +func (ts *Server) Listeners() []*job { + all := []*job{} + + // Active listeners + ts.jobs.active.Range(func(key, value interface{}) bool { + all = append(all, value.(*job)) + return true + }) + + return all +} + +// AddListenerJob adds a teamserver listener job to the teamserver configuration. +// This function does not start the given listener, and you must call the server +// ServeAddr(name, host, port) function for this. +func (ts *Server) ListenerAdd(name, host string, port uint16) error { + listener := struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + }{ + Name: name, + Host: host, + Port: port, + ID: getRandomID(), + } + + if listener.Name == "" && ts.self != nil { + listener.Name = ts.self.Name() + } + + ts.opts.config.Listeners = append(ts.opts.config.Listeners, listener) + + return ts.SaveConfig(ts.opts.config) +} + +// RemoveListenerJob removes a server listener job from the configuration. +// This function does not stop any running listener for the given ID: you +// must call server.CloseListener(id) for this. +func (ts *Server) ListenerRemove(listenerID string) { + if ts.opts.config.Listeners == nil { + return + } + + defer ts.SaveConfig(ts.opts.config) + + var listeners []struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + } + + for _, listener := range ts.opts.config.Listeners { + if listener.ID != listenerID { + listeners = append(listeners, listener) + } + } + + ts.opts.config.Listeners = listeners +} + +// ListenerClose closes/stops an active teamserver listener by ID. +// This function can only return an ErrListenerNotFound if the ID +// is invalid: all listener-specific options are logged instead. +func (ts *Server) ListenerClose(id string) error { + listener := ts.jobs.Get(id) + if listener == nil { + return ts.errorf("%w: %s", ErrListenerNotFound, id) + } + + listener.kill <- true + + return nil +} + +// ListenerStartPersistents attempts to start all listeners saved in the teamserver +// configuration file, looking up the listener stacks in its map and starting them +// for each bind target. +// If the teamserver has been passed the WithContinueOnError() option at some point, +// it will log all errors raised by listener stacks will still try to start them all. +func (ts *Server) ListenerStartPersistents() error { + var listenerErrors error + + log := ts.NamedLogger("teamserver", "listeners") + + if ts.opts.config.Listeners == nil { + return nil + } + + for _, ln := range ts.opts.config.Listeners { + handler := ts.handlers[ln.Name] + if handler == nil { + handler = ts.self + } + + if handler == nil { + if !ts.opts.continueOnError { + return ts.errorf("Failed to find handler for `%s` listener (%s:%d)", ln.Name, ln.Host, ln.Port) + } + + continue + } + + err := ts.serve(handler, ln.ID, ln.Host, ln.Port) + + if err == nil { + continue + } + + log.Errorf("Failed to start %s listener (%s:%d): %s", ln.Name, ln.Host, ln.Port, err) + + if !ts.opts.continueOnError { + return err + } + + listenerErrors = errors.Join(listenerErrors, err) + } + + return nil +} + +func (ts *Server) addListenerJob(listenerID, name, host string, port int, ln net.Listener) { + log := ts.NamedLogger("teamserver", "listeners") + + if listenerID == "" { + listenerID = getRandomID() + } + + laddr := host + if port != 0 { + laddr = fmt.Sprintf("%s:%d", laddr, port) + } + + if laddr == "" { + laddr = "runtime" + } + + listener := &job{ + ID: listenerID, + Name: name, + Description: laddr, + kill: make(chan bool), + } + + go func() { + <-listener.kill + + // Kills listener goroutines but NOT connections. + log.Infof("Stopping teamserver %s listener (%s)", name, listener.ID) + ln.Close() + + ts.jobs.active.LoadAndDelete(listener.ID) + }() + + ts.jobs.active.Store(listener.ID, listener) +} diff --git a/vendor/github.com/reeflective/team/server/log.go b/vendor/github.com/reeflective/team/server/log.go new file mode 100644 index 0000000000..24a81c60c4 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/log.go @@ -0,0 +1,141 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "path/filepath" + + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" +) + +// NamedLogger returns a new logging "thread" with two fields (optional) +// to indicate the package/general domain, and a more precise flow/stream. +// The events are logged according to the teamclient logging backend setup. +func (ts *Server) NamedLogger(pkg, stream string) *logrus.Entry { + return ts.log().WithFields(logrus.Fields{ + log.PackageFieldKey: pkg, + "stream": stream, + }) +} + +// SetLogLevel sets the logging level of teamserver loggers (excluding audit ones). +func (ts *Server) SetLogLevel(level int) { + if ts.stdioLog == nil { + return + } + + if uint32(level) > uint32(logrus.TraceLevel) { + level = int(logrus.TraceLevel) + } + + ts.stdioLog.SetLevel(logrus.Level(uint32(level))) + + // Also Change the file-based logging level: + // - If they app runs a memfs, this wont have any effect. + // - If the user wants to debug anyway, better two sources than one. + if ts.fileLog != nil { + ts.fileLog.SetLevel(logrus.Level(uint32(level))) + } +} + +// AuditLogger returns a special logger writing its event entries to an audit +// log file (default audit.json), distinct from other teamserver log files. +// Listener implementations will want to use this for logging various teamclient +// application requests, with this logger used somewhere in your listener middleware. +func (ts *Server) AuditLogger() (*logrus.Logger, error) { + if ts.opts.inMemory || ts.opts.noLogs { + return ts.log(), nil + } + + // Generate a new audit logger + auditLog, err := log.NewAudit(ts.fs, ts.LogsDir()) + if err != nil { + return nil, ts.errorf("%w: %w", ErrLogging, err) + } + + return auditLog, nil +} + +// Initialize loggers in files/stdout according to options. +func (ts *Server) initLogging() (err error) { + // By default, the stdout logger is never nil. + // We might overwrite it below if using our defaults. + // ts.stdoutLogger = log.NewStdio(logrus.WarnLevel) + + logFile := filepath.Join(ts.LogsDir(), log.FileName(ts.Name(), true)) + + // If the teamserver should log to a given file. + if ts.opts.logFile != "" { + logFile = ts.opts.logFile + } + + // Ensure all teamserver-specific directories are writable. + // if err := ts.checkWritableFiles(); err != nil { + // return fmt.Errorf("%w: %w", ErrDirectory, err) + // } + + // If user supplied a logger, use it in place of the + // file-based logger, since the file logger is optional. + if ts.opts.logger != nil { + ts.fileLog = ts.opts.logger + return nil + } + + level := logrus.Level(ts.opts.config.Log.Level) + + // Create any additional/configured logger and related/missing hooks. + ts.fileLog, ts.stdioLog, err = log.Init(ts.fs, logFile, level) + if err != nil { + return err + } + + return nil +} + +// log returns a non-nil logger for the server: +// if file logging is disabled, it returns the stdout-only logger, +// otherwise returns the file logger equipped with a stdout hook. +func (ts *Server) log() *logrus.Logger { + if ts.fileLog == nil { + return ts.stdioLog + } + + return ts.fileLog +} + +func (ts *Server) errorf(msg string, format ...any) error { + logged := fmt.Errorf(msg, format...) + ts.log().Error(logged) + + return logged +} + +func (ts *Server) errorWith(log *logrus.Entry, msg string, format ...any) error { + logged := fmt.Errorf(msg, format...) + + if log != nil { + log.Error(logged) + } else { + ts.log().Error(logged) + } + + return logged +} diff --git a/vendor/github.com/reeflective/team/server/options.go b/vendor/github.com/reeflective/team/server/options.go new file mode 100644 index 0000000000..97a26e7f16 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/options.go @@ -0,0 +1,236 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" + "strings" + + "github.com/reeflective/team/internal/db" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +// Options are server options. +// With these you can set/reset or modify the behavior of a teamserver +// at various stages of its lifetime, or when performing some specific +// actions. +// Note that some options can only be used once, while others can be +// used multiple times. Examples of the former are log files and database +// backends, while the latter includes listeners/hooks. +// Each option will specify this in its description. +type Options func(opts *opts) + +type opts struct { + homeDir string + logFile string + local bool + noLogs bool + inMemory bool + continueOnError bool + + config *Config + dbConfig *db.Config + db *gorm.DB + logger *logrus.Logger + listeners []Listener +} + +// default in-memory configuration, ready to run. +func newDefaultOpts() *opts { + options := &opts{ + config: getDefaultServerConfig(), + local: false, + } + + return options +} + +func (ts *Server) apply(options ...Options) { + for _, optFunc := range options { + optFunc(ts.opts) + } + + // The server will apply options multiple times + // in its lifetime, but some options can only be + // set once when created. + ts.initOpts.Do(func() { + // Application home directory. + homeDir := os.Getenv(fmt.Sprintf("%s_ROOT_DIR", strings.ToUpper(ts.name))) + if homeDir != "" { + ts.homeDir = homeDir + } else { + ts.homeDir = ts.opts.homeDir + } + + // User-defined database. + if ts.opts.db != nil { + ts.db = ts.opts.db + } + }) + + // Load any listener backends any number of times. + for _, listener := range ts.opts.listeners { + ts.handlers[listener.Name()] = listener + } + + // Make the first one as the default if needed. + if len(ts.opts.listeners) > 0 && ts.self == nil { + ts.self = ts.opts.listeners[0] + } + + // And clear the most recent listeners passed via options. + ts.opts.listeners = make([]Listener, 0) +} + +// +// *** General options *** +// + +// WithInMemory deactivates all interactions of the client with the filesystem. +// This applies to logging, but will also to any forward feature using files. +// +// Implications on database backends: +// By default, all teamservers use sqlite3 as a backend, and thus will run a +// database in memory. All other databases are assumed to be unable to do so, +// and this option will thus trigger an error whenever the option is applied, +// whether it be at teamserver creation, or when it does start listeners. +// +// This option can only be used once, and must be passed to server.New(). +func WithInMemory() Options { + return func(opts *opts) { + opts.noLogs = true + opts.inMemory = true + } +} + +// WithDefaultPort sets the default port on which the teamserver should start listeners. +// This default is used in the default daemon configuration, and as command flags defaults. +// The default port set for teamserver applications is port 31416. +// +// This option can only be used once, and must be passed to server.New(). +func WithDefaultPort(port uint16) Options { + return func(opts *opts) { + opts.config.DaemonMode.Port = int(port) + } +} + +// WithDatabase sets the server database to an existing database. +// Note that it will run an automigration of the teamserver types (certificates and users). +// +// This option can only be used once, and must be passed to server.New(). +func WithDatabase(db *gorm.DB) Options { + return func(opts *opts) { + opts.db = db + } +} + +// WithDatabaseConfig sets the server to use a database backend with a given configuration. +// +// This option can only be used once, and must be passed to server.New(). +func WithDatabaseConfig(config *db.Config) Options { + return func(opts *opts) { + opts.dbConfig = config + } +} + +// WithHomeDirectory sets the default path (~/.app/) of the application directory. +// This path can still be overridden at the user-level with the env var APP_ROOT_DIR. +// +// This option can only be used once, and must be passed to server.New(). +func WithHomeDirectory(path string) Options { + return func(opts *opts) { + opts.homeDir = path + } +} + +// +// *** Logging options *** +// + +// WithNoLogs deactivates all logging normally done by the teamserver +// if noLogs is set to true, or keeps/reestablishes them if false. +// +// This option can only be used once, and must be passed to server.New(). +func WithNoLogs(noLogs bool) Options { + return func(opts *opts) { + opts.noLogs = noLogs + } +} + +// WithLogFile sets the path to the file where teamserver logging should be done. +// The default path is ~/.app/teamserver/logs/app.teamserver.log. +// +// This option can only be used once, and must be passed to server.New(). +func WithLogFile(filePath string) Options { + return func(opts *opts) { + opts.logFile = filePath + } +} + +// WithLogger sets the teamserver to use a specific logger for +// all logging, except the audit log which is indenpendent. +// +// This option can only be used once, and must be passed to server.New(). +func WithLogger(logger *logrus.Logger) Options { + return func(opts *opts) { + opts.logger = logger + } +} + +// +// *** Server network/RPC options *** +// + +// WithListener registers a listener/server stack with the teamserver. +// The teamserver can then serve this listener stack for any number of bind +// addresses, which users can trigger through the various server.Serve*() methods. +// +// It accepts an optional list of pre-serve hook functions: +// These should accept a generic object parameter which is none other than the +// serverConn returned by the listener.Serve(ln) method. These hooks will +// be very useful- if not necessary- for library users to manipulate their server. +// See the server.Listener type documentation for details. +// +// This option can be used multiple times, either when using +// team/server.New() or with the different server.Serve*() methods. +func WithListener(ln Listener) Options { + return func(opts *opts) { + if ln == nil { + return + } + + opts.listeners = append(opts.listeners, ln) + } +} + +// WithContinueOnError sets the server behavior when starting persistent listeners +// (either automatically when calling teamserver.ServeDaemon(), or when using +// teamserver.StartPersistentListeners()). +// If true, an error raised by a listener will not prevent others to try starting, and +// errors will be joined into a single one, separated with newlines and logged by default. +// The teamserver has this set to false by default. +// +// This option can be used multiple times. +func WithContinueOnError(continueOnError bool) Options { + return func(opts *opts) { + opts.continueOnError = continueOnError + } +} diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go new file mode 100644 index 0000000000..27f04b743d --- /dev/null +++ b/vendor/github.com/reeflective/team/server/server.go @@ -0,0 +1,263 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "net" + "os" + "os/signal" + "regexp" + "runtime/debug" + "syscall" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/certs" +) + +// Listener represents a teamserver listener stack. +// Any type implementing this interface can be served and controlled +// by a team/server.Server core, and remote clients can connect to it +// with the appropriate/corresponding team/client.Dialer backend. +// +// Errors: all errors returned by the listener interface methods are considered critical, +// (except the Close() error one), and thus will stop the listener start/server process +// when raised. Thus, you should only return errors that are critical to the operation +// of your listener. You can use the teamserver loggers to log/print non-critical ones. +type Listener interface { + // Name returns the name of the "listener/server/RPC" stack + // of this listener, eg. "gRPC" for a gRPC listener, "myCustomHTTP" + // for your quick-and-dirty custom stack, etc. + // Note that this name is used as a key by the teamserver to store the + // different listener stacks it may use, so this name should be unique + // among all listener stacks registered to a given teamserver runtime. + Name() string + + // Init is used by the listener to access the core teamserver, needed for: + // - Fetching server-side transport/session-level credentials. + // - Authenticating users connections/requests. + // - Using the builtin teamserver loggers, filesystem and other utilities. + // Any non-nil error returned will abort the listener starting process. + Init(s *Server) error + + // Listen is used to create and bind a network listener to some address + // Implementations are free to handle incoming connections the way they + // want, since they have had access to the server in Init() for anything + // related they might need. + // As an example, the gRPC default transport serves a gRPC server on this + // listener, registers its RPC services, and returns the listener for the + // teamserver to wrap it in job control. + // This call MUST NOT block, just like the normal usage of net.Listeners. + Listen(addr string) (ln net.Listener, err error) + + // Close should close the listener stack. + // This can mean different things depending on use case, but some are not recommended. + // - It can simply close the "listener" layer without shutting down the "server/RPC" layer. + // - It can shutdown anything, thus in effect disconnecting all of its clients from server. + Close() error +} + +// Serve attempts the default listener of the teamserver (which is either +// the first one to have been registered, or the only one registered at all). +// It the responsibility of any teamclients produced by the teamserver.Self() +// method to call their Connect() method: the server will answer. +func (ts *Server) Serve(cli *client.Client, opts ...Options) error { + if ts.self == nil { + return ErrNoListener + } + + // Some errors might come from user-provided hooks, + // so we don't wrap errors again, our own errors + // have been prepared accordingly in this call. + err := ts.serve(ts.self, "", "", 0, opts...) + if err != nil { + return err + } + + return cli.Connect(client.WithLocalDialer()) +} + +// ServeDaemon is a blocking call which starts the teamserver as daemon process, using +// either the provided host:port arguments, or the ones found in the teamserver config. +// This function will also (and is the only one to) start all persistent team listeners. +// +// It blocks by waiting for a syscal.SIGTERM (eg. CtrlC on Linux) signal. Upon receival, +// the teamserver will close the main listener (the daemon one), but not persistent ones. +// +// Errors raised by closing the listener are wrapped in an ErrListener, logged and returned. +func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err error) { + log := ts.NamedLogger("daemon", "main") + + // cli args take president over config + if host == blankHost { + host = ts.opts.config.DaemonMode.Host + log.Debugf("No host specified, using config file default: %s", host) + } + + if port == blankPort { + port = uint16(ts.opts.config.DaemonMode.Port) + log.Debugf("No port specified, using config file default: %d", port) + } + + defer func() { + if r := recover(); r != nil { + log.Errorf("panic:\n%s", debug.Stack()) + } + }() + + // Start the listener. + log.Infof("Starting %s teamserver daemon on %s:%d ...", ts.Name(), host, port) + + listenerID, err := ts.ServeAddr(ts.self.Name(), host, port, opts...) + if err != nil { + return err + } + + // Now that the main teamserver listener is started, + // we can start all our persistent teamserver listeners. + // That way, if any of them collides with our current bind, + // we just serve it for him + hostPort := regexp.MustCompile(fmt.Sprintf("%s:%d", host, port)) + + err = ts.ListenerStartPersistents() + if err != nil && hostPort.MatchString(err.Error()) { + log.Errorf("Error starting persistent listeners: %s", err) + } + + done := make(chan bool) + signals := make(chan os.Signal, 1) + signal.Notify(signals, syscall.SIGTERM) + + go func() { + <-signals + log.Infof("Received SIGTERM, exiting ...") + + err = ts.ListenerClose(listenerID) + if err != nil { + log.Errorf("%s: %s", ErrListener, err) + } + done <- true + }() + <-done + + return err +} + +// ServeAddr attempts to serve a listener stack identified by "name" (the listener should be registered +// with the teamserver with WithListener() option), on a given host:port address, with any provided option. +// If returns either a critical error raised by the listener, or the ID of the listener job, for control. +func (ts *Server) ServeAddr(name string, host string, port uint16, opts ...Options) (id string, err error) { + // If server was not initialized yet, do it. + // This at least will update any listener/server-specific options. + err = ts.init(opts...) + if err != nil { + return "", ts.errorf("%w: %w", ErrTeamServer, err) + } + + // Ensure we have at least one available listener. + handler := ts.handlers[name] + + if handler == nil { + handler = ts.self + } + + if handler == nil { + return "", ErrNoListener + } + + // Generate the listener ID now so we can return it. + listenerID := getRandomID() + + err = ts.serve(handler, listenerID, host, port, opts...) + + return listenerID, err +} + +// serve will attempt to serve a given listener/server stack to a given (host:port) address. +// If the ID parameter is empty, a job ID for this listener will be automatically generated. +// Any errors raised by the listener itself are considered critical and returned wrapped in a ListenerErr. +func (ts *Server) serve(ln Listener, ID, host string, port uint16, opts ...Options) error { + log := ts.NamedLogger("teamserver", "handler") + + // If server was not initialized yet, do it. + // This has no effect redundant with the ServeAddr() method. + err := ts.init(opts...) + if err != nil { + return ts.errorf("%w: %w", ErrTeamServer, err) + } + + // Let the handler initialize itself: load everything it needs from + // the server, configuration, fetch certificates, log stuff, etc. + err = ln.Init(ts) + if err != nil { + return ts.errorWith(log, "%w: %w", ErrListener, err) + } + + // Now let the handler start listening on somewhere. + laddr := fmt.Sprintf("%s:%d", host, port) + + // This call should not block, serve the listener immediately. + listener, err := ln.Listen(laddr) + if err != nil { + return ts.errorWith(log, "%w: %w", ErrListener, err) + } + + // The server is running, so add a job anyway. + ts.addListenerJob(ID, ln.Name(), host, int(port), listener) + + return nil +} + +// Handlers returns a copy of its teamserver listeners map. +// This can be useful if you want to start them with the server ServeListener() method. +// Or -but this is not recommended by this library- to use those listeners without the +// teamserver driving the init/start/serve/stop process. +func (ts *Server) Handlers() map[string]Listener { + handlers := make(map[string]Listener, len(ts.handlers)) + + for name, handler := range ts.handlers { + handlers[name] = handler + } + + return handlers +} + +func (ts *Server) init(opts ...Options) error { + var err error + + // Always reaply options, since it could be used by different listeners. + ts.apply(opts...) + + ts.initServe.Do(func() { + // Database configuration. + if err = ts.initDatabase(); err != nil { + return + } + + // Load any relevant server configuration: on disk, + // contained in options, or the default one. + ts.opts.config = ts.GetConfig() + + // Certificate infrastructure, will make the code panic if unable to work properly. + certsLog := ts.NamedLogger("certs", "certificates") + ts.certs = certs.NewManager(ts.fs, ts.dbSession(), certsLog, ts.Name(), ts.TeamDir()) + }) + + return err +} diff --git a/vendor/github.com/reeflective/team/server/users.go b/vendor/github.com/reeflective/team/server/users.go new file mode 100644 index 0000000000..f1ec242520 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/users.go @@ -0,0 +1,279 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/rand" + "crypto/sha256" + "crypto/tls" + "crypto/x509" + "encoding/hex" + "errors" + "fmt" + "regexp" + "sync" + "time" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/certs" + "github.com/reeflective/team/internal/db" +) + +var namePattern = regexp.MustCompile("^[a-zA-Z0-9_-]*$") // Only allow alphanumeric chars + +// UserCreate creates a new teamserver user, with all cryptographic material and server remote +// endpoints needed by this user to connect to us. +// +// Certificate files and the API authentication token are saved into the teamserver database, +// conformingly to its configured backend/filesystem (can be in-memory or on filesystem). +func (ts *Server) UserCreate(name string, lhost string, lport uint16) (*client.Config, error) { + if err := ts.initDatabase(); err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + if !namePattern.MatchString(name) { + return nil, ts.errorf("%w: invalid user name (alphanumerics only)", ErrUserConfig) + } + + if name == "" { + return nil, ts.errorf("%w: user name required ", ErrUserConfig) + } + + if lhost == "" { + return nil, ts.errorf("%w: invalid team server host (empty)", ErrUserConfig) + } + + if lport == blankPort { + lport = uint16(ts.opts.config.DaemonMode.Port) + } + + rawToken, err := ts.newUserToken() + if err != nil { + return nil, ts.errorf("%w: %w", ErrUserConfig, err) + } + + digest := sha256.Sum256([]byte(rawToken)) + dbuser := &db.User{ + Name: name, + Token: hex.EncodeToString(digest[:]), + } + + err = ts.dbSession().Save(dbuser).Error + if err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + publicKey, privateKey, err := ts.certs.UserClientGenerateCertificate(name) + if err != nil { + return nil, ts.errorf("%w: failed to generate certificate %w", ErrCertificate, err) + } + + caCertPEM, _, _ := ts.certs.GetUsersCAPEM() + config := client.Config{ + User: name, + Token: rawToken, + Host: lhost, + Port: int(lport), + CACertificate: string(caCertPEM), + PrivateKey: string(privateKey), + Certificate: string(publicKey), + } + + return &config, nil +} + +// UserDelete deletes a user and its cryptographic materials from +// the teamserver database, clearing the API auth tokens cache. +// +// WARN: This function has two very precise effects/consequences: +// 1. The server-side Mutual TLS configuration obtained with server.GetUserTLSConfig() +// will refuse all connections using the deleted user TLS credentials, returning +// an authentication failure. +// 2. The server.AuthenticateUser(token) method will always return an ErrUnauthenticated +// error from the call, because the delete user is not in the database anymore. +// +// Thus, it is up to the users of this library to use the builting teamserver TLS +// configurations in their teamserver listener / teamclient dialer implementations. +// +// Certificate files, API authentication token are deleted from the teamserver database, +// conformingly to its configured backend/filesystem (can be in-memory or on filesystem). +func (ts *Server) UserDelete(name string) error { + if err := ts.initDatabase(); err != nil { + return ts.errorf("%w: %w", ErrDatabase, err) + } + + err := ts.dbSession().Where(&db.User{ + Name: name, + }).Delete(&db.User{}).Error + if err != nil { + return err + } + + // Clear the token cache so that all requests from + // connected clients of this user are now refused. + ts.userTokens = &sync.Map{} + + return ts.certs.UserClientRemoveCertificate(name) +} + +// UserAuthenticate accepts a raw 128-bits long API Authentication token belonging to the +// user of a connected/connecting teamclient. The token is hashed and checked against the +// teamserver users database for the matching user. +// This function shall alternatively return: +// - The name of the authenticated user, true for authenticated and no error. +// - No name, false for authenticated, and an ErrUnauthenticated error. +// - No name, false for authenticated, and a database error, if was ignited now. +// +// This call updates the last time the user has been seen by the server. +func (ts *Server) UserAuthenticate(rawToken string) (name string, authorized bool, err error) { + if err := ts.initDatabase(); err != nil { + return "", false, ts.errorf("%w: %w", ErrDatabase, err) + } + + log := ts.NamedLogger("server", "auth") + log.Debugf("Authorization-checking user token ...") + + // Check auth cache + digest := sha256.Sum256([]byte(rawToken)) + token := hex.EncodeToString(digest[:]) + + if name, ok := ts.userTokens.Load(token); ok { + log.Debugf("Token in cache!") + ts.updateLastSeen(name.(string)) + return name.(string), true, nil + } + + user, err := ts.userByToken(token) + if err != nil || user == nil { + return "", false, ts.errorf("%w: %w", ErrUnauthenticated, err) + } + + ts.updateLastSeen(user.Name) + + log.Debugf("Valid user token for %s", user.Name) + ts.userTokens.Store(token, user.Name) + + return user.Name, true, nil +} + +// UsersTLSConfig returns a server-side Mutual TLS configuration struct, ready to run. +// The configuration performs all and every verifications that the teamserver should do, +// and peer TLS clients (teamclient.Config) are not allowed to choose any TLS parameters. +// +// This should be used by team/server.Listeners at the net.Listener/net.Conn level. +// As for all errors of the teamserver API, any error returned here is defered-logged. +func (ts *Server) UsersTLSConfig() (*tls.Config, error) { + log := ts.NamedLogger("certs", "mtls") + + if err := ts.initDatabase(); err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + caCertPtr, _, err := ts.certs.GetUsersCA() + if err != nil { + return nil, ts.errorWith(log, "%w: failed to get users certificate authority: %w", ErrCertificate, err) + } + + caCertPool := x509.NewCertPool() + caCertPool.AddCert(caCertPtr) + + _, _, err = ts.certs.UserServerGetCertificate() + if errors.Is(err, certs.ErrCertDoesNotExist) { + if _, _, err := ts.certs.UserServerGenerateCertificate(); err != nil { + return nil, ts.errorWith(log, err.Error()) + } + } + + certPEM, keyPEM, err := ts.certs.UserServerGetCertificate() + if err != nil { + return nil, ts.errorWith(log, "%w: failed to generated or fetch user certificate: %w", ErrCertificate, err) + } + + cert, err := tls.X509KeyPair(certPEM, keyPEM) + if err != nil { + return nil, ts.errorWith(log, "%w: failed to load server certificate: %w", ErrCertificate, err) + } + + tlsConfig := &tls.Config{ + RootCAs: caCertPool, + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: caCertPool, + Certificates: []tls.Certificate{cert}, + MinVersion: tls.VersionTLS13, + } + + if keyLogger := ts.certs.OpenTLSKeyLogFile(); keyLogger != nil { + tlsConfig.KeyLogWriter = ts.certs.OpenTLSKeyLogFile() + } + + return tlsConfig, nil +} + +// UsersGetCA returns the bytes of a PEM-encoded certificate authority, +// which contains certificates of all users of this teamserver. +func (ts *Server) UsersGetCA() ([]byte, []byte, error) { + if err := ts.initDatabase(); err != nil { + return nil, nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + return ts.certs.GetUsersCAPEM() +} + +// UsersSaveCA accepts the public and private parts of a Certificate +// Authority containing one or more users to add to the teamserver. +func (ts *Server) UsersSaveCA(cert, key []byte) { + if err := ts.initDatabase(); err != nil { + return + } + + ts.certs.SaveUsersCA(cert, key) +} + +// newUserToken - Generate a new user authentication token. +func (ts *Server) newUserToken() (string, error) { + buf := make([]byte, tokenLength) + + n, err := rand.Read(buf) + if err != nil || n != len(buf) { + return "", fmt.Errorf("%w: %w", ErrSecureRandFailed, err) + } else if n != len(buf) { + return "", ErrSecureRandFailed + } + + return hex.EncodeToString(buf), nil +} + +// userByToken - Select a teamserver user by token value. +func (ts *Server) userByToken(value string) (*db.User, error) { + if len(value) < 1 { + return nil, db.ErrRecordNotFound + } + + user := &db.User{} + err := ts.dbSession().Where(&db.User{ + Token: value, + }).First(user).Error + + return user, err +} + +func (ts *Server) updateLastSeen(name string) { + lastSeen := time.Now().Round(1 * time.Second) + ts.dbSession().Model(&db.User{}).Where("name", name).Update("LastSeen", lastSeen) +} diff --git a/vendor/github.com/reeflective/team/teamclient.go b/vendor/github.com/reeflective/team/teamclient.go new file mode 100644 index 0000000000..9a58747bb0 --- /dev/null +++ b/vendor/github.com/reeflective/team/teamclient.go @@ -0,0 +1,66 @@ +package team + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import "time" + +// Client is the smallest interface which should be implemented by all +// teamclients of any sort, regardless of their use of the client/server +// packages in the reeflective/team Go module. +// This interface has been declared with various aims in mind: +// - To provide a base reference/hint about what minimum functionality +// is to be provided by the teamclients and teamservers alike. +// - To harmonize the use of team/client and team/server core drivers. +type Client interface { + Users() ([]User, error) + Version() (Version, error) +} + +// User represents a teamserver user. +// This user shall be registered to a teamserver (ie. the teamserver should +// be in possession of the user cryptographic materials required to serve him) +// This type is returned by both team/clients and team/servers. +type User struct { + Name string + Online bool + LastSeen time.Time + Clients int +} + +// Version returns complete version/compilation information for a given binary. +// Therefore, two distinct version information can be provided by a teamclient +// connected to a remote (distinct runtime) server: the client binary version, +// and the server binary version. +// When a teamserver is serving itself in-memory, both versions will thus be identical. +// +// Note to developers: updating your teamserver/teamclient version information +// requires you to use `go generate ./...` at the root of your Go module code. +// The team/server and team/client will thus embed their respective version +// informations thanks to an automatic shell script generation. +// See the https://github.com/reeflective/team README/doc for more details. +type Version struct { + Major int32 + Minor int32 + Patch int32 + Commit string + Dirty bool + CompiledAt int64 + OS string + Arch string +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/client.go b/vendor/github.com/reeflective/team/transports/grpc/client/client.go new file mode 100644 index 0000000000..4cdbafe95f --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/client/client.go @@ -0,0 +1,189 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/reeflective/team" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. + ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte + + defaultTimeout = 10 * time.Second +) + +var ( + // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client + // connection is available. The error is raised when the handler hasn't connected. + ErrNoRPC = errors.New("no working grpc.Teamclient available") + + // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try + // connecting with, TLS credentials. If such an error is raised, make sure your team + // client has correctly fetched -using client.Config()- a remote teamserver config. + ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") +) + +// Teamclient is a simple example gRPC teamclient and dialer backend. +// It comes correctly configured with Mutual TLS authentication and +// RPC connection/registration/use when created with NewTeamClient(). +// +// This teamclient embeds a team/client.Client core driver and uses +// it for fetching/setting up the transport credentials, dialers, etc... +// It also has a few internal types (clientConns, options) for working. +// +// Note that this teamclient is not able to be used as an in-memory dialer. +// See the counterpart `team/transports/grpc/server` package for creating one. +// Also note that this example transport has been made for a single use-case, +// and that your program might require more elaborated behavior. +// In this case, please use this simple code as a reference for what/not to do. +type Teamclient struct { + *client.Client + conn *grpc.ClientConn + rpc proto.TeamClient + options []grpc.DialOption +} + +// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. +// This client has by default only a few options, like max message buffer size. +// All options passed to this call are stored as is and will be used later. +func NewTeamClient(opts ...grpc.DialOption) *Teamclient { + client := &Teamclient{ + options: opts, + } + + client.options = append(client.options, + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), + ) + + return client +} + +// Init implements team/client.Dialer.Init(c). +// This implementation asks the teamclient core for its remote server +// configuration, and uses it to load a set of Mutual TLS dialing options. +func (h *Teamclient) Init(cli *client.Client) error { + h.Client = cli + config := cli.Config() + + options := LogMiddlewareOptions(cli) + + // If the configuration has no credentials, we are most probably + // an in-memory dialer, don't authenticate and encrypt the conn. + if config.PrivateKey != "" { + tlsOpts, err := tlsAuthMiddleware(cli) + if err != nil { + return err + } + + h.options = append(h.options, tlsOpts...) + } + + h.options = append(h.options, options...) + + return nil +} + +// Dial implements team/client.Dialer.Dial(). +// It uses the teamclient remote server configuration as a target of a dial call. +// If the connection is successful, the teamclient registers a proto.Teamclient +// RPC around its client connection, to provide the core teamclient functionality. +func (h *Teamclient) Dial() (rpcClient any, err error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) + + h.conn, err = grpc.DialContext(ctx, host, h.options...) + if err != nil { + return nil, err + } + + h.rpc = proto.NewTeamClient(h.conn) + + return h.conn, nil +} + +// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. +func (h *Teamclient) Close() error { + return h.conn.Close() +} + +// Users returns a list of all users registered with the app teamserver. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Users() (users []team.User, err error) { + if h.rpc == nil { + return nil, ErrNoRPC + } + + res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) + if err != nil { + return nil, err + } + + for _, user := range res.GetUsers() { + users = append(users, team.User{ + Name: user.Name, + Online: user.Online, + LastSeen: time.Unix(user.LastSeen, 0), + }) + } + + return +} + +// ServerVersion returns the version information of the server to which +// the client is connected, or nil and an error if it could not retrieve it. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Version() (version team.Version, err error) { + if h.rpc == nil { + return version, ErrNoRPC + } + + ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) + if err != nil { + return version, errors.New(status.Convert(err).Message()) + } + + return team.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, nil +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go new file mode 100644 index 0000000000..e0f0f37619 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go @@ -0,0 +1,99 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "encoding/json" + + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/common" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// TokenAuth extracts authentication metadata from contexts, +// specifically the "Authorization": "Bearer" key:value pair. +type TokenAuth string + +// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// This function uses the core teamclient loggers to log the gRPC stack/requests events. +// The Teamclient of this package uses them by default. +func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { + logrusEntry := cli.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(common.CodeToLevel), + } + + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + + // Intercepting client requests. + requestIntercept := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + rawRequest, err := json.Marshal(req) + if err != nil { + logrusEntry.Errorf("Failed to serialize: %s", err) + return invoker(ctx, method, req, reply, cc, opts...) + } + + logrusEntry.Debugf("Raw request: %s", string(rawRequest)) + + return invoker(ctx, method, req, reply, cc, opts...) + } + + options := []grpc.DialOption{ + grpc.WithBlock(), + grpc.WithUnaryInterceptor(grpc_logrus.UnaryClientInterceptor(logrusEntry, logrusOpts...)), + grpc.WithUnaryInterceptor(requestIntercept), + } + + return options +} + +func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { + config := cli.Config() + if config.PrivateKey == "" { + return nil, ErrNoTLSCredentials + } + + tlsConfig, err := cli.NewTLSConfigFrom(config.CACertificate, config.Certificate, config.PrivateKey) + if err != nil { + return nil, err + } + + transportCreds := credentials.NewTLS(tlsConfig) + callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) + + return []grpc.DialOption{ + grpc.WithTransportCredentials(transportCreds), + grpc.WithPerRPCCredentials(callCreds), + }, nil +} + +// Return value is mapped to request headers. +func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { + return map[string]string{ + "Authorization": "Bearer " + string(t), + }, nil +} + +// RequireTransportSecurity always return true. +func (TokenAuth) RequireTransportSecurity() bool { + return true +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/common/log.go b/vendor/github.com/reeflective/team/transports/grpc/common/log.go new file mode 100644 index 0000000000..476805ca89 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/common/log.go @@ -0,0 +1,66 @@ +package common + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" +) + +// Maps a grpc response code to a logging level. +func CodeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.DebugLevel + case codes.Canceled: + return logrus.DebugLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.WarnLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.DebugLevel + case codes.AlreadyExists: + return logrus.DebugLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.WarnLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml new file mode 100644 index 0000000000..3db65777d2 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml @@ -0,0 +1,13 @@ +version: v1 +managed: + enabled: true + go_package_prefix: + default: github.com/reeflective/team/transports/grpc/proto + +plugins: + - name: go + out: . + opt: paths=source_relative + - name: go-grpc + out: . + opt: paths=source_relative diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml new file mode 100644 index 0000000000..f5a48a2395 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml @@ -0,0 +1,3 @@ +version: v1 +directories: + - . diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml new file mode 100644 index 0000000000..65d1ddbac4 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml @@ -0,0 +1,12 @@ +version: v1 +name: buf.build/reeflective/team +lint: + use: + - BASIC + except: + - FIELD_LOWER_SNAKE_CASE + - ENUM_VALUE_UPPER_SNAKE_CASE +breaking: + use: + - FILE + diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go new file mode 100644 index 0000000000..50e85c77dd --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go @@ -0,0 +1,505 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.18.1 +// source: client.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// [ Client & User ] +type Client struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID uint32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` + User *User `protobuf:"bytes,3,opt,name=User,proto3" json:"User,omitempty"` +} + +func (x *Client) Reset() { + *x = Client{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Client) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Client) ProtoMessage() {} + +func (x *Client) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Client.ProtoReflect.Descriptor instead. +func (*Client) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{0} +} + +func (x *Client) GetID() uint32 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *Client) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Client) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +type Users struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` +} + +func (x *Users) Reset() { + *x = Users{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Users) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Users) ProtoMessage() {} + +func (x *Users) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Users.ProtoReflect.Descriptor instead. +func (*Users) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{1} +} + +func (x *Users) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` + LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` + Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetOnline() bool { + if x != nil { + return x.Online + } + return false +} + +func (x *User) GetLastSeen() int64 { + if x != nil { + return x.LastSeen + } + return 0 +} + +func (x *User) GetClients() int32 { + if x != nil { + return x.Clients + } + return 0 +} + +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Major int32 `protobuf:"varint,1,opt,name=Major,proto3" json:"Major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=Minor,proto3" json:"Minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=Patch,proto3" json:"Patch,omitempty"` + Commit string `protobuf:"bytes,4,opt,name=Commit,proto3" json:"Commit,omitempty"` + Dirty bool `protobuf:"varint,5,opt,name=Dirty,proto3" json:"Dirty,omitempty"` + CompiledAt int64 `protobuf:"varint,6,opt,name=CompiledAt,proto3" json:"CompiledAt,omitempty"` + OS string `protobuf:"bytes,7,opt,name=OS,proto3" json:"OS,omitempty"` + Arch string `protobuf:"bytes,8,opt,name=Arch,proto3" json:"Arch,omitempty"` +} + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{3} +} + +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major + } + return 0 +} + +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor + } + return 0 +} + +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch + } + return 0 +} + +func (x *Version) GetCommit() string { + if x != nil { + return x.Commit + } + return "" +} + +func (x *Version) GetDirty() bool { + if x != nil { + return x.Dirty + } + return false +} + +func (x *Version) GetCompiledAt() int64 { + if x != nil { + return x.CompiledAt + } + return 0 +} + +func (x *Version) GetOS() string { + if x != nil { + return x.OS + } + return "" +} + +func (x *Version) GetArch() string { + if x != nil { + return x.Arch + } + return "" +} + +// [ Others ] +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{4} +} + +var File_client_proto protoreflect.FileDescriptor + +var file_client_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x22, 0x2b, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x22, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbd, 0x01, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x4d, 0x61, 0x6a, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x84, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, + 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_client_proto_rawDescOnce sync.Once + file_client_proto_rawDescData = file_client_proto_rawDesc +) + +func file_client_proto_rawDescGZIP() []byte { + file_client_proto_rawDescOnce.Do(func() { + file_client_proto_rawDescData = protoimpl.X.CompressGZIP(file_client_proto_rawDescData) + }) + return file_client_proto_rawDescData +} + +var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_client_proto_goTypes = []interface{}{ + (*Client)(nil), // 0: client.Client + (*Users)(nil), // 1: client.Users + (*User)(nil), // 2: client.User + (*Version)(nil), // 3: client.Version + (*Empty)(nil), // 4: client.Empty +} +var file_client_proto_depIdxs = []int32{ + 2, // 0: client.Client.User:type_name -> client.User + 2, // 1: client.Users.Users:type_name -> client.User + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_client_proto_init() } +func file_client_proto_init() { + if File_client_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_client_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Client); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Users); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_client_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_client_proto_goTypes, + DependencyIndexes: file_client_proto_depIdxs, + MessageInfos: file_client_proto_msgTypes, + }.Build() + File_client_proto = out.File + file_client_proto_rawDesc = nil + file_client_proto_goTypes = nil + file_client_proto_depIdxs = nil +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto new file mode 100644 index 0000000000..21a855b2f3 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +package client; + +// [ Client & User ] +message Client { + uint32 ID = 1; + string Name = 2; + + User User = 3; +} + +message Users { repeated User Users = 1; } + +message User { + string Name = 1; + bool Online = 2; + int64 LastSeen = 3; + int32 Clients = 4; +} + + +// [ Version ] + +message Version { + int32 Major = 1; + int32 Minor = 2; + int32 Patch = 3; + + string Commit = 4; + bool Dirty = 5; + int64 CompiledAt = 6; + + string OS = 7; + string Arch = 8; +} + +// [ Others ] +message Empty {} + diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go new file mode 100644 index 0000000000..7ba84d01ec --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go @@ -0,0 +1,85 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.18.1 +// source: service.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var File_service_proto protoreflect.FileDescriptor + +var file_service_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x5e, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x42, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, + 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_service_proto_goTypes = []interface{}{ + (*Empty)(nil), // 0: client.Empty + (*Version)(nil), // 1: client.Version + (*Users)(nil), // 2: client.Users +} +var file_service_proto_depIdxs = []int32{ + 0, // 0: client.Team.GetVersion:input_type -> client.Empty + 0, // 1: client.Team.GetUsers:input_type -> client.Empty + 1, // 2: client.Team.GetVersion:output_type -> client.Version + 2, // 3: client.Team.GetUsers:output_type -> client.Users + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_service_proto_init() } +func file_service_proto_init() { + if File_service_proto != nil { + return + } + file_client_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_service_proto_goTypes, + DependencyIndexes: file_service_proto_depIdxs, + }.Build() + File_service_proto = out.File + file_service_proto_rawDesc = nil + file_service_proto_goTypes = nil + file_service_proto_depIdxs = nil +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto new file mode 100644 index 0000000000..13223cd11e --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package client; + +import "client.proto"; + +// Team offers basic methods used by team client/servers to communicate +// their related informations, such as connected users, compilation info, +// and streaming their output/console logs. +service Team { + rpc GetVersion(Empty) returns (Version); + rpc GetUsers(Empty) returns (Users); +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go new file mode 100644 index 0000000000..e7dde5e622 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go @@ -0,0 +1,146 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.18.1 +// source: service.proto + +package proto + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Team_GetVersion_FullMethodName = "/client.Team/GetVersion" + Team_GetUsers_FullMethodName = "/client.Team/GetUsers" +) + +// TeamClient is the client API for Team service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type TeamClient interface { + GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) + GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) +} + +type teamClient struct { + cc grpc.ClientConnInterface +} + +func NewTeamClient(cc grpc.ClientConnInterface) TeamClient { + return &teamClient{cc} +} + +func (c *teamClient) GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) { + out := new(Version) + err := c.cc.Invoke(ctx, Team_GetVersion_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamClient) GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) { + out := new(Users) + err := c.cc.Invoke(ctx, Team_GetUsers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// TeamServer is the server API for Team service. +// All implementations must embed UnimplementedTeamServer +// for forward compatibility +type TeamServer interface { + GetVersion(context.Context, *Empty) (*Version, error) + GetUsers(context.Context, *Empty) (*Users, error) + mustEmbedUnimplementedTeamServer() +} + +// UnimplementedTeamServer must be embedded to have forward compatible implementations. +type UnimplementedTeamServer struct { +} + +func (UnimplementedTeamServer) GetVersion(context.Context, *Empty) (*Version, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") +} +func (UnimplementedTeamServer) GetUsers(context.Context, *Empty) (*Users, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") +} +func (UnimplementedTeamServer) mustEmbedUnimplementedTeamServer() {} + +// UnsafeTeamServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to TeamServer will +// result in compilation errors. +type UnsafeTeamServer interface { + mustEmbedUnimplementedTeamServer() +} + +func RegisterTeamServer(s grpc.ServiceRegistrar, srv TeamServer) { + s.RegisterService(&Team_ServiceDesc, srv) +} + +func _Team_GetVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServer).GetVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Team_GetVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServer).GetVersion(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Team_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServer).GetUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Team_GetUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServer).GetUsers(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// Team_ServiceDesc is the grpc.ServiceDesc for Team service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Team_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "client.Team", + HandlerType: (*TeamServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetVersion", + Handler: _Team_GetVersion_Handler, + }, + { + MethodName: "GetUsers", + Handler: _Team_GetUsers_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "service.proto", +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go new file mode 100644 index 0000000000..9414ee1aa8 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go @@ -0,0 +1,218 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "encoding/json" + + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/common" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/status" +) + +// BufferingOptions returns a list of server options with max send/receive +// message size, which value is that of the ServerMaxMessageSize variable (2GB). +func BufferingOptions() (options []grpc.ServerOption) { + options = append(options, + grpc.MaxRecvMsgSize(ServerMaxMessageSize), + grpc.MaxSendMsgSize(ServerMaxMessageSize), + ) + + return +} + +// LogMiddlewareOptions is a set of logging middleware options +// preconfigured to perform the following tasks: +// - Log all connections/disconnections to/from the teamserver listener. +// - Log all raw client requests into a teamserver audit file (see server.AuditLog()). +func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor + + cfg := s.GetConfig() + + // Audit-log all requests. Any failure to audit-log the requests + // of this server will themselves be logged to the root teamserver log. + auditLog, err := s.AuditLogger() + if err != nil { + return nil, err + } + + requestOpts = append(requestOpts, auditLogUnaryServerInterceptor(s, auditLog)) + + requestOpts = append(requestOpts, + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + streamOpts = append(streamOpts, + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + // Logging interceptors + logrusEntry := s.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(common.CodeToLevel), + } + + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + + requestOpts = append(requestOpts, + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCUnaryPayloads + }), + ) + + streamOpts = append(streamOpts, + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCStreamPayloads + }), + ) + + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil +} + +// TLSAuthMiddlewareOptions is a set of transport security options which will use +// the preconfigured teamserver TLS (credentials) configuration to authenticate +// incoming client connections. The authentication is Mutual TLS, used because +// all teamclients will connect with a known TLS credentials set. +func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var options []grpc.ServerOption + + tlsConfig, err := s.UsersTLSConfig() + if err != nil { + return nil, err + } + + creds := credentials.NewTLS(tlsConfig) + options = append(options, grpc.Creds(creds)) + + return options, nil +} + +// initAuthMiddleware - Initialize middleware logger. +func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor + + // Authentication interceptors. + if ts.conn == nil { + // All remote connections are users who need authentication. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), + ) + + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), + ) + } else { + // Local in-memory connections have no auth. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(serverAuthFunc), + ) + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(serverAuthFunc), + ) + } + + // Return middleware for all requests and stream interactions in gRPC. + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil +} + +// TODO: Should we change the default in-memory server name ? +func serverAuthFunc(ctx context.Context) (context.Context, error) { + newCtx := context.WithValue(ctx, "transport", "local") + newCtx = context.WithValue(newCtx, "user", "server") + + return newCtx, nil +} + +func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { + log := ts.NamedLogger("transport", "grpc") + log.Debugf("Auth interceptor checking user token ...") + + rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") + if err != nil { + log.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + + user, authorized, err := ts.UserAuthenticate(rawToken) + if err != nil || !authorized || user == "" { + log.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + + newCtx := context.WithValue(ctx, "transport", "mtls") + newCtx = context.WithValue(newCtx, "user", user) + + return newCtx, nil +} + +type auditUnaryLogMsg struct { + Request string `json:"request"` + Method string `json:"method"` +} + +func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { + log := ts.NamedLogger("grpc", "audit") + + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { + rawRequest, err := json.Marshal(req) + if err != nil { + log.Errorf("Failed to serialize %s", err) + return + } + + log.Debugf("Raw request: %s", string(rawRequest)) + + if err != nil { + log.Errorf("Middleware failed to insert details: %s", err) + } + + // Construct Log Message + msg := &auditUnaryLogMsg{ + Request: string(rawRequest), + Method: info.FullMethod, + } + + msgData, _ := json.Marshal(msg) + auditLog.Info(string(msgData)) + + resp, err := handler(ctx, req) + + return resp, err + } +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go b/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go new file mode 100644 index 0000000000..2f206cde8f --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go @@ -0,0 +1,73 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/proto" +) + +// rpcServer is the gRPC server implementation. +// It makes uses of the teamserver core to query users and version information. +type rpcServer struct { + server *server.Server + *proto.UnimplementedTeamServer +} + +func newServer(server *server.Server) *rpcServer { + return &rpcServer{ + server: server, + UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, + } +} + +// GetVersion returns the teamserver version. +func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { + ver, err := ts.server.Version() + + return &proto.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, err +} + +// GetUsers returns the list of teamserver users and their status. +func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { + users, err := ts.server.Users() + + userspb := make([]*proto.User, len(users)) + for i, user := range users { + userspb[i] = &proto.User{ + Name: user.Name, + Online: user.Online, + LastSeen: user.LastSeen.Unix(), + Clients: int32(user.Clients), + } + } + + return &proto.Users{Users: userspb}, err +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/server.go b/vendor/github.com/reeflective/team/transports/grpc/server/server.go new file mode 100644 index 0000000000..e86a01baa5 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/server/server.go @@ -0,0 +1,204 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "net" + "runtime/debug" + "sync" + + teamserver "github.com/reeflective/team/server" + clientConn "github.com/reeflective/team/transports/grpc/client" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + bufSize = 2 * mb + + // ServerMaxMessageSize - Server-side max GRPC message size. + ServerMaxMessageSize = 2*gb - 1 +) + +// Teamserver is a simple example gRPC teamserver listener and server backend. +// This server can handle both remote and local (in-memory) connections, provided +// that it is being created with the correct grpc.Server options. +// +// This teamserver embeds a team/server.Server core driver and uses it for fetching +// server-side TLS configurations, use its loggers and access its database/users/list. +// +// By default, the server has no grpc.Server options attached. +// Please see the other functions of this package for pre-configured option sets. +type Teamserver struct { + *teamserver.Server + + options []grpc.ServerOption + conn *bufconn.Listener + mutex *sync.RWMutex + + hooks []func(server *grpc.Server) error +} + +// NewListener is a simple constructor returning a teamserver loaded with the +// provided list of server options. By default the server does not come with any. +func NewListener(opts ...grpc.ServerOption) *Teamserver { + listener := &Teamserver{ + mutex: &sync.RWMutex{}, + } + + listener.options = append(listener.options, opts...) + + return listener +} + +// NewClientFrom requires an existing grpc Teamserver to create an in-memory +// connection bound to both the teamserver and the teamclient backends. +// It returns a teamclient meant to be ran in memory, with TLS credentials disabled. +func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientConn.Teamclient { + conn := bufconn.Listen(bufSize) + + ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { + return conn.Dial() + }) + + opts = append(opts, []grpc.DialOption{ + ctxDialer, + grpc.WithInsecure(), + }...) + + // The server will use this conn as a listener. + // The reference is dropped after server start. + server.conn = conn + + return clientConn.NewTeamClient(opts...) +} + +// Name immplements team/server.Handler.Name(). +// It indicates the transport/rpc stack, in this case "gRPC". +func (h *Teamserver) Name() string { + return "gRPC" +} + +// PostServe registers one or more hook functions to be ran on the server +// before it is served to the listener. These hooks should naturally be +// used to register additional services to it. +func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { + h.hooks = append(h.hooks, hooks...) +} + +// Init implements team/server.Handler.Init(). +// It is used to initialize the listener with the correct TLS credentials +// middleware (or absence of if about to serve an in-memory connection). +func (h *Teamserver) Init(serv *teamserver.Server) (err error) { + h.Server = serv + + h.options, err = LogMiddlewareOptions(h.Server) + if err != nil { + return err + } + + // Logging/authentication/audit + serverOptions, err := h.initAuthMiddleware() + if err != nil { + return err + } + + h.options = append(h.options, serverOptions...) + + return nil +} + +// Listen implements team/server.Handler.Listen(). +// It starts listening on a network address for incoming gRPC clients. +// If the teamserver has previously been given an in-memory connection, +// it returns it as the listener without errors. +func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { + rpcLog := h.NamedLogger("transport", "mTLS") + + // Only wrap the connection in TLS when remote. + // In-memory connection are not authenticated. + if h.conn == nil { + ln, err = net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + // Encryption. + tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) + if err != nil { + return nil, err + } + + h.options = append(h.options, tlsOptions...) + } else { + h.mutex.Lock() + ln = h.conn + h.conn = nil + h.mutex.Unlock() + } + + grpcServer := grpc.NewServer(h.options...) + + // Register the core teamserver service + proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + + for _, hook := range h.hooks { + if err := hook(grpcServer); err != nil { + rpcLog.Errorf("service bind error: %s", err) + return nil, err + } + } + + rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) + + // Start serving the listener + go func() { + panicked := true + defer func() { + if panicked { + rpcLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) + } + }() + + if err := grpcServer.Serve(ln); err != nil { + rpcLog.Errorf("gRPC server exited with error: %v", err) + } else { + panicked = false + } + }() + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// In this implementation, the function does nothing. Thus the underlying +// *grpc.Server.Shutdown() method is not called, and only the listener +// will be closed by the server automatically when using CloseListener(). +// +// This is probably not optimal from a resource usage standpoint, but currently it +// fits most use cases. Feel free to reimplement or propose changes to this lib. +func (h *Teamserver) Close() error { + return nil +} diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go index cbee7a4e23..b18efb743f 100644 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -20,7 +20,7 @@ type token struct{} // A zero Group is valid, has no limit on the number of active goroutines, // and does not cancel on error. type Group struct { - cancel func() + cancel func(error) wg sync.WaitGroup @@ -43,7 +43,7 @@ func (g *Group) done() { // returns a non-nil error or the first time Wait returns, whichever occurs // first. func WithContext(ctx context.Context) (*Group, context.Context) { - ctx, cancel := context.WithCancel(ctx) + ctx, cancel := withCancelCause(ctx) return &Group{cancel: cancel}, ctx } @@ -52,7 +52,7 @@ func WithContext(ctx context.Context) (*Group, context.Context) { func (g *Group) Wait() error { g.wg.Wait() if g.cancel != nil { - g.cancel() + g.cancel(g.err) } return g.err } @@ -76,7 +76,7 @@ func (g *Group) Go(f func() error) { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } @@ -105,7 +105,7 @@ func (g *Group) TryGo(f func() error) bool { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go new file mode 100644 index 0000000000..7d419d3760 --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.20 +// +build go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + return context.WithCancelCause(parent) +} diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go new file mode 100644 index 0000000000..1795c18ace --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -0,0 +1,15 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.20 +// +build !go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + ctx, cancel := context.WithCancel(parent) + return ctx, func(error) { cancel() } +} diff --git a/vendor/modules.txt b/vendor/modules.txt index bc1429f636..d52796d00c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -489,7 +489,7 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.7.2 +# github.com/ncruces/go-sqlite3 v0.8.1 ## explicit; go 1.19 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver @@ -512,6 +512,9 @@ github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 ## explicit github.com/pmezard/go-difflib/difflib +# github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e +## explicit; go 1.16 +github.com/psanford/memfs # github.com/reeflective/console v0.1.6 ## explicit; go 1.20 github.com/reeflective/console @@ -531,13 +534,32 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui +# github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team +## explicit; go 1.20 +github.com/reeflective/team +github.com/reeflective/team/client +github.com/reeflective/team/client/commands +github.com/reeflective/team/internal/assets +github.com/reeflective/team/internal/certs +github.com/reeflective/team/internal/command +github.com/reeflective/team/internal/db +github.com/reeflective/team/internal/db/wasmsqlite +github.com/reeflective/team/internal/log +github.com/reeflective/team/internal/systemd +github.com/reeflective/team/internal/version +github.com/reeflective/team/server +github.com/reeflective/team/server/commands +github.com/reeflective/team/transports/grpc/client +github.com/reeflective/team/transports/grpc/common +github.com/reeflective/team/transports/grpc/proto +github.com/reeflective/team/transports/grpc/server # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.36.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -728,7 +750,7 @@ golang.org/x/exp/slices golang.org/x/exp/slog golang.org/x/exp/slog/internal golang.org/x/exp/slog/internal/buffer -# golang.org/x/mod v0.10.0 +# golang.org/x/mod v0.11.0 ## explicit; go 1.17 golang.org/x/mod/semver # golang.org/x/net v0.11.0 @@ -751,8 +773,8 @@ golang.org/x/net/ipv6 golang.org/x/net/proxy golang.org/x/net/route golang.org/x/net/trace -# golang.org/x/sync v0.2.0 -## explicit +# golang.org/x/sync v0.3.0 +## explicit; go 1.17 golang.org/x/sync/errgroup # golang.org/x/sys v0.9.0 ## explicit; go 1.17 From 8cf8e669aa12cd457b9bbfc09b0f7782983847ac Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 19 Jul 2023 07:21:54 +0200 Subject: [PATCH 010/109] A base sliver-server/client compiling with team library --- client/cli/cli.go | 2 +- client/cli/implant.go | 16 +++++----- client/command/console/console.go | 37 +++++++++++++++++++++++ client/console/log.go | 37 +++++++++++------------ server/cli/cli.go | 2 +- server/cli/teamserver.go | 2 +- server/console/console.go | 2 +- vendor/github.com/psanford/memfs/memfs.go | 5 +-- 8 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 client/command/console/console.go diff --git a/client/cli/cli.go b/client/cli/cli.go index e01c3021a7..d600ca157e 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -58,7 +58,7 @@ func init() { teamclient := newSliverTeam(con) teamclientCmds := commands.Generate(teamclient) - // rootCmd.AddCommand(teamclientCmds) + rootCmd.AddCommand(teamclientCmds) // Version rootCmd.AddCommand(cmdVersion) diff --git a/client/cli/implant.go b/client/cli/implant.go index 61cea3af38..6d609a7e19 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/pflag" ) -func implantCmd(con *console.SliverConsoleClient) *cobra.Command { - con.IsCLI = trueSliverClient +func implantCmd(con *console.SliverClient) *cobra.Command { + con.IsCLI = true makeCommands := command.SliverCommands(con) cmd := makeCommands() @@ -33,13 +33,13 @@ func implantCmd(con *console.SliverConsoleClient) *cobra.Command { return cmd } -func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (pre, post func(cmd *cobra.Command, args []string) error) { - startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient +func makeRunners(implantCmd *cobra.Command, con *console.SliverClient) (pre, post func(cmd *cobra.Command, args []string) error) { + // startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient // The pre-run function connects to the server and sets up a "fake" console, // so we can have access to active sessions/beacons, and other stuff needed. pre = func(_ *cobra.Command, args []string) error { - startConsole(implantCmd, args) + // startConsole(implantCmd, args) // Set the active target. target, _ := implantCmd.Flags().GetString("use") @@ -55,11 +55,11 @@ func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (p return nil } - return pre, closeConsole + return pre, nil } -func makeCompleters(cmd *cobra.Command, con *console.SliverConsoleClient) { - comps := carapace.Gen(cmd)SliverClient +func makeCompleters(cmd *cobra.Command, con *console.SliverClient) { + comps := carapace.Gen(cmd) comps.PreRun(func(cmd *cobra.Command, args []string) { cmd.PersistentPreRunE(cmd, args) diff --git a/client/command/console/console.go b/client/command/console/console.go new file mode 100644 index 0000000000..65dcee9c4d --- /dev/null +++ b/client/command/console/console.go @@ -0,0 +1,37 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" +) + +func Command(con *console.SliverClient) *cobra.Command { + consoleCmd := &cobra.Command{ + Use: "console", + Short: "Start the sliver client console", + RunE: func(cmd *cobra.Command, args []string) error { + return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + }, + } + + return consoleCmd +} diff --git a/client/console/log.go b/client/console/log.go index cb2d0d35c3..dde03bf9d2 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -28,14 +28,13 @@ import ( "strings" "time" - "github.com/moloch--/asciicast" - "golang.org/x/exp/slog" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/moloch--/asciicast" + "golang.org/x/exp/slog" + "golang.org/x/term" ) // ConsoleClientLogger is an io.Writer that sends data to the server. @@ -54,7 +53,7 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. -func (con *SliverConsoleClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { +func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { stream, err := con.Rpc.ClientLog(context.Background()) if err != nil { return nil, err @@ -62,7 +61,7 @@ func (con *SliverConsoleClient) ClientLogStream(name string) (*ConsoleClientLogg return &ConsoleClientLogger{name: name, Stream: stream}, nil } -func (con *SliverConsoleClient) setupLogger(writers ...io.Writer) { +func (con *SliverClient) setupLogger(writers ...io.Writer) { logWriter := io.MultiWriter(writers...) jsonOptions := &slog.HandlerOptions{ Level: slog.LevelDebug, @@ -74,7 +73,7 @@ func (con *SliverConsoleClient) setupLogger(writers ...io.Writer) { } // logCommand logs non empty commands to the client log file. -func (con *SliverConsoleClient) logCommand(args []string) ([]string, error) { +func (con *SliverClient) logCommand(args []string) ([]string, error) { if len(args) == 0 { return args, nil } @@ -83,7 +82,7 @@ func (con *SliverConsoleClient) logCommand(args []string) ([]string, error) { return args, nil } -func (con *SliverConsoleClient) setupAsciicastRecord(logFile *os.File, server io.Writer) { +func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) { x, y, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { x, y = 80, 80 @@ -139,8 +138,8 @@ func getConsoleAsciicastFile() *os.File { // These below will print their output regardless of the currently active menu (server/implant), // while those in the log package tie their output to the current menu. -// PrintAsyncResponse - Print the generic async response information -func (con *SliverConsoleClient) PrintAsyncResponse(resp *commonpb.Response) { +// PrintAsyncResponse - Print the generic async response information. +func (con *SliverClient) PrintAsyncResponse(resp *commonpb.Response) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() beacon, err := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: resp.BeaconID}) @@ -151,7 +150,7 @@ func (con *SliverConsoleClient) PrintAsyncResponse(resp *commonpb.Response) { con.PrintInfof("Tasked beacon %s (%s)\n", beacon.Name, strings.Split(resp.TaskID, "-")[0]) } -func (con *SliverConsoleClient) Printf(format string, args ...any) { +func (con *SliverClient) Printf(format string, args ...any) { logger := slog.NewLogLogger(con.jsonHandler, slog.LevelInfo) logger.Printf(format, args...) @@ -159,7 +158,7 @@ func (con *SliverConsoleClient) Printf(format string, args ...any) { } // Println prints an output without status and immediately below the last line of output. -func (con *SliverConsoleClient) Println(args ...any) { +func (con *SliverClient) Println(args ...any) { logger := slog.New(con.jsonHandler) format := strings.Repeat("%s", len(args)) logger.Info(fmt.Sprintf(format, args)) @@ -167,7 +166,7 @@ func (con *SliverConsoleClient) Println(args ...any) { } // PrintInfof prints an info message immediately below the last line of output. -func (con *SliverConsoleClient) PrintInfof(format string, args ...any) { +func (con *SliverClient) PrintInfof(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Info(fmt.Sprintf(format, args...)) @@ -176,7 +175,7 @@ func (con *SliverConsoleClient) PrintInfof(format string, args ...any) { } // PrintSuccessf prints a success message immediately below the last line of output. -func (con *SliverConsoleClient) PrintSuccessf(format string, args ...any) { +func (con *SliverClient) PrintSuccessf(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Info(fmt.Sprintf(format, args...)) @@ -185,7 +184,7 @@ func (con *SliverConsoleClient) PrintSuccessf(format string, args ...any) { } // PrintWarnf a warning message immediately below the last line of output. -func (con *SliverConsoleClient) PrintWarnf(format string, args ...any) { +func (con *SliverClient) PrintWarnf(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Warn(fmt.Sprintf(format, args...)) @@ -194,7 +193,7 @@ func (con *SliverConsoleClient) PrintWarnf(format string, args ...any) { } // PrintErrorf prints an error message immediately below the last line of output. -func (con *SliverConsoleClient) PrintErrorf(format string, args ...any) { +func (con *SliverClient) PrintErrorf(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Error(fmt.Sprintf(format, args...)) @@ -203,7 +202,7 @@ func (con *SliverConsoleClient) PrintErrorf(format string, args ...any) { } // PrintEventInfof prints an info message with a leading/trailing newline for emphasis. -func (con *SliverConsoleClient) PrintEventInfof(format string, args ...any) { +func (con *SliverClient) PrintEventInfof(format string, args ...any) { logger := slog.New(con.jsonHandler).With(slog.String("type", "event")) logger.Info(fmt.Sprintf(format, args...)) @@ -212,7 +211,7 @@ func (con *SliverConsoleClient) PrintEventInfof(format string, args ...any) { } // PrintEventErrorf prints an error message with a leading/trailing newline for emphasis. -func (con *SliverConsoleClient) PrintEventErrorf(format string, args ...any) { +func (con *SliverClient) PrintEventErrorf(format string, args ...any) { logger := slog.New(con.jsonHandler).With(slog.String("type", "event")) logger.Error(fmt.Sprintf(format, args...)) @@ -221,7 +220,7 @@ func (con *SliverConsoleClient) PrintEventErrorf(format string, args ...any) { } // PrintEventSuccessf a success message with a leading/trailing newline for emphasis. -func (con *SliverConsoleClient) PrintEventSuccessf(format string, args ...any) { +func (con *SliverClient) PrintEventSuccessf(format string, args ...any) { logger := slog.New(con.jsonHandler).With(slog.String("type", "event")) logger.Info(fmt.Sprintf(format, args...)) diff --git a/server/cli/cli.go b/server/cli/cli.go index cdab21160e..4da9dfdb38 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -221,7 +221,7 @@ func consoleCmd(con *console.SliverClient) *cobra.Command { Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, con.Rpc, command.ServerCommands(con, nil), command.SliverCommands(con), true) + return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) }, } diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go index 75efe3da0c..ff21844873 100644 --- a/server/cli/teamserver.go +++ b/server/cli/teamserver.go @@ -31,7 +31,7 @@ import ( "google.golang.org/grpc" ) -func newSliverTeam(con *console.SliverConsoleClient) (*server.Server, *client.Client) { +func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { // Teamserver gTeamserver := teamGrpc.NewListener() diff --git a/server/console/console.go b/server/console/console.go index af40d3a734..44e4d5f1e8 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -61,7 +61,7 @@ func Start() { } con := console.NewConsole(false) - console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) + // console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) con.App.Start() } diff --git a/vendor/github.com/psanford/memfs/memfs.go b/vendor/github.com/psanford/memfs/memfs.go index da2fd3e6a3..311ca6bd6d 100644 --- a/vendor/github.com/psanford/memfs/memfs.go +++ b/vendor/github.com/psanford/memfs/memfs.go @@ -179,7 +179,7 @@ func (rootFS *FS) create(path string) (*File, error) { newFile := &File{ name: filePart, - perm: 0o666, + perm: 0666, content: &bytes.Buffer{}, } dir.children[filePart] = newFile @@ -366,7 +366,8 @@ func (f *File) Close() error { return nil } -type childI interface{} +type childI interface { +} type fileInfo struct { name string From e7b6f5e5699bd3ed8256f0fe58e8ba9fa33e1a96 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 20 Jul 2023 20:48:15 +0200 Subject: [PATCH 011/109] The teamserver/teamclient model now works mostly as intended: - Correctly connects/disconnects from the server (fixed race condition). - Correctly proposes completions where required. - Correctly executes commands. Problems: - The pre-run/post-run can be more efficient. - Pre-run/post-runs should be bound to leaf commands where required. - Logging is quite big. --- Makefile | 6 +- client/cli/cli.go | 125 ++++++-- client/cli/console.go | 12 +- client/cli/teamclient.go | 1 - client/command/console/console.go | 4 +- client/command/generate/canaries.go | 9 +- client/command/generate/commands.go | 16 +- client/command/generate/generate-beacon.go | 5 +- client/command/generate/generate-info.go | 5 +- client/command/generate/generate-stager.go | 5 +- client/command/generate/generate.go | 45 ++- client/command/generate/helpers.go | 11 +- client/command/generate/implants-rm.go | 5 +- client/command/generate/implants.go | 17 +- client/command/generate/profiles-generate.go | 5 +- client/command/generate/profiles-new.go | 7 +- client/command/generate/profiles-rm.go | 5 +- client/command/generate/profiles.go | 19 +- client/command/generate/regenerate.go | 5 +- client/command/generate/traffic-encoders.go | 33 +- client/command/jobs/commands.go | 7 +- client/command/jobs/dns.go | 5 +- client/command/jobs/http.go | 5 +- client/command/jobs/https.go | 5 +- client/command/jobs/jobs.go | 10 +- client/command/jobs/mtls.go | 5 +- client/command/jobs/stage.go | 8 +- client/command/jobs/wg.go | 5 +- client/command/server.go | 17 +- client/console/console.go | 42 ++- client/constants/constants.go | 80 ++--- client/core/curses.go | 6 +- client/core/portfwd.go | 25 +- client/core/reactions.go | 14 +- client/core/socks.go | 20 +- client/core/tunnel.go | 6 +- client/core/tunnel_io.go | 10 +- client/core/tunnels.go | 17 +- go.mod | 4 + go.sum | 4 - server/cli/cli.go | 284 +++++++++++------- server/cli/teamserver.go | 10 +- server/core/events.go | 16 +- server/rpc/rpc-events.go | 7 +- .../github.com/reeflective/console/console.go | 2 +- vendor/github.com/reeflective/console/menu.go | 4 +- vendor/github.com/reeflective/console/run.go | 44 ++- .../reeflective/console/tab-completer.go | 2 +- .../reeflective/team/server/server.go | 11 +- .../github.com/rsteube/carapace/carapace.go | 13 + .../github.com/rsteube/carapace/complete.go | 6 +- .../rsteube/carapace/pkg/style/config.go | 48 +-- vendor/github.com/rsteube/carapace/storage.go | 8 + .../elves/elvish/pkg/cli/lscolors/feature.go | 1 - vendor/modules.txt | 4 +- 55 files changed, 653 insertions(+), 442 deletions(-) diff --git a/Makefile b/Makefile index 3711c6c847..d0a043d438 100644 --- a/Makefile +++ b/Makefile @@ -106,8 +106,10 @@ endif # .PHONY: default default: clean .downloaded_assets validate-go-version - $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server - $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client + $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server + # $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server + $(ENV) CGO_ENABLED=0 $(GO) build -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client + # $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client # Allows you to build a CGO-free client for any target e.g. `GOOS=windows GOARCH=arm64 make client` # NOTE: WireGuard is not supported on all platforms, but most 64-bit GOOS/GOARCH combinations should work. diff --git a/client/cli/cli.go b/client/cli/cli.go index d600ca157e..49eb31c265 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,9 +24,10 @@ import ( "os" "path" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" + // consts "github.com/bishopfox/sliver/client/constants". "github.com/bishopfox/sliver/client/version" - "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -49,6 +50,17 @@ func initLogging(appDir string) *os.File { } func init() { +} + +var rootCmd = &cobra.Command{ + Use: "sliver-client", + Short: "Client-only Sliver C2 management", + Long: ``, + TraverseChildren: true, +} + +// Execute - Execute root command. +func Execute() { // Create the console client, without any RPC or commands bound to it yet. // This created before anything so that multiple commands can make use of // the same underlying command/run infrastructure. @@ -56,50 +68,123 @@ func init() { // Teamclient API and commands for remote CLI. teamclient := newSliverTeam(con) - teamclientCmds := commands.Generate(teamclient) + con.Teamclient = teamclient - rootCmd.AddCommand(teamclientCmds) + // Bind commands to the app + // server := con.App.Menu(consts.ServerMenu) + // server.SetCommands(command.ServerCommands(con, nil)) + // + // sliver := con.App.Menu(consts.ImplantMenu) + // sliver.SetCommands(command.SliverCommands(con)) + + serverCmds := command.ServerCommands(con, nil)() + + // serverCmds = server.Command + serverCmds.Use = "sliver-client" // Version - rootCmd.AddCommand(cmdVersion) + serverCmds.AddCommand(cmdVersion) preRun := func(_ *cobra.Command, _ []string) error { - return teamclient.Connect() + teamclient.Connect() + + console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con)) + return nil } - rootCmd.PersistentPreRunE = preRun + serverCmds.PersistentPreRunE = preRun + postRun := func(_ *cobra.Command, _ []string) error { + // teamclient.SetLogLevel(1) + teamclient.Disconnect() + return nil + } + + // serverCmds.PersistentPostRunE = postRun // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with // other command trees below, such as the implant one. - rootCmd.AddCommand(consoleCmd(con)) + serverCmds.AddCommand(consoleCmd(con)) // Implant. // The implant command allows users to run commands on slivers from their // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - rootCmd.AddCommand(implantCmd(con)) + serverCmds.AddCommand(implantCmd(con)) // Completions - comps := carapace.Gen(rootCmd) + comps := carapace.Gen(serverCmds) comps.PreRun(func(cmd *cobra.Command, args []string) { preRun(cmd, args) }) -} - -var rootCmd = &cobra.Command{ - Use: "sliver-client", - Short: "Client-only Sliver C2 management", - Long: ``, - TraverseChildren: true, -} + comps.PostRun(func(cmd *cobra.Command, args []string) { + postRun(cmd, args) + }) -// Execute - Execute root command. -func Execute() { - if err := rootCmd.Execute(); err != nil { + if err := serverCmds.Execute(); err != nil { fmt.Println(err) os.Exit(1) } } + +// func Execute() { +// // Create the console client, without any RPC or commands bound to it yet. +// // This created before anything so that multiple commands can make use of +// // the same underlying command/run infrastructure. +// con := console.NewConsole(false) +// +// // Teamclient API and commands for remote CLI. +// teamclient := newSliverTeam(con) +// teamclientCmds := commands.Generate(teamclient) +// +// rootCmd.AddCommand(teamclientCmds) +// +// // Bind commands to the app +// server := con.App.Menu(consts.ServerMenu) +// server.SetCommands(command.ServerCommands(con, nil)) +// +// sliver := con.App.Menu(consts.ImplantMenu) +// sliver.SetCommands(command.SliverCommands(con)) +// +// server.Reset() +// +// rootCmd = server.Command +// rootCmd.Use = "sliver-client" +// +// // Version +// rootCmd.AddCommand(cmdVersion) +// +// preRun := func(_ *cobra.Command, _ []string) error { +// // return teamclient.Connect() +// teamclient.Connect() +// console.StartClient(con, nil, nil) +// return nil +// } +// +// rootCmd.PersistentPreRunE = preRun +// +// // Client console. +// // All commands and RPC connection are generated WITHIN the command RunE(): +// // that means there should be no redundant command tree/RPC connections with +// // other command trees below, such as the implant one. +// rootCmd.AddCommand(consoleCmd(con)) +// +// // Implant. +// // The implant command allows users to run commands on slivers from their +// // system shell. It makes use of pre-runners for connecting to the server +// // and binding sliver commands. These same pre-runners are also used for +// // command completion/filtering purposes. +// rootCmd.AddCommand(implantCmd(con)) +// +// // Completions +// comps := carapace.Gen(rootCmd) +// comps.PreRun(func(cmd *cobra.Command, args []string) { +// preRun(cmd, args) +// }) +// if err := rootCmd.Execute(); err != nil { +// fmt.Println(err) +// os.Exit(1) +// } +// } diff --git a/client/cli/console.go b/client/cli/console.go index cbd7b1ca16..541ff96050 100644 --- a/client/cli/console.go +++ b/client/cli/console.go @@ -3,6 +3,7 @@ package cli import ( "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" "github.com/spf13/cobra" ) @@ -12,7 +13,16 @@ func consoleCmd(con *console.SliverClient) *cobra.Command { Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + // return console.StartClient(con, nil, nil, true) + + // Bind commands to the app + server := con.App.Menu(consts.ServerMenu) + server.SetCommands(command.ServerCommands(con, nil)) + + sliver := con.App.Menu(consts.ImplantMenu) + sliver.SetCommands(command.SliverCommands(con)) + + return con.App.Start() }, } diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go index e54e8e303d..77c1ccc315 100644 --- a/client/cli/teamclient.go +++ b/client/cli/teamclient.go @@ -49,7 +49,6 @@ func newSliverTeam(con *console.SliverClient) *client.Client { teamclient, err := client.New("sliver", gTeamclient, clientOpts...) if err != nil { - // WARN: Remote this panic(err) } diff --git a/client/command/console/console.go b/client/command/console/console.go index 65dcee9c4d..f59a277a68 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,7 +19,6 @@ package console */ import ( - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" ) @@ -29,7 +28,8 @@ func Command(con *console.SliverClient) *cobra.Command { Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + con.IsCLI = false + return con.App.Start() }, } diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index bf475a4665..e8588eeb47 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -4,16 +4,15 @@ import ( "context" "fmt" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CanariesCmd - Display canaries from the database and their status +// CanariesCmd - Display canaries from the database and their status. func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { canaries, err := con.Rpc.Canaries(context.Background(), &commonpb.Empty{}) if err != nil { @@ -28,7 +27,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintCanaries - Print the canaries tracked by the server +// PrintCanaries - Print the canaries tracked by the server. func PrintCanaries(con *console.SliverClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 067248fde1..1580a87923 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -1,14 +1,13 @@ package generate import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -27,6 +26,15 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + preRun := func(_ *cobra.Command, _ []string) error { + con.Teamclient.Connect() + return nil + } + comps := carapace.Gen(generateCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) + // Session flags and completions. coreImplantFlags("session", generateCmd) compileImplantFlags("session", generateCmd) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index c28c2fdc7c..80add10c58 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -5,10 +5,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) var ( @@ -16,7 +15,7 @@ var ( ErrBeaconIntervalTooShort = fmt.Errorf("beacon interval must be %v or greater", minBeaconInterval) ) -// GenerateBeaconCmd - The main command used to generate implant binaries +// GenerateBeaconCmd - The main command used to generate implant binaries. func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index a8c78273c9..f9b2a3901a 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -3,13 +3,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// GenerateInfoCmd - Display information about the Sliver server's compiler configuration +// GenerateInfoCmd - Display information about the Sliver server's compiler configuration. func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index cc73e4d88c..b30831c1dd 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -27,13 +27,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// GenerateStagerCmd - Generate a stager using Metasploit +// GenerateStagerCmd - Generate a stager using Metasploit. func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var stageProto clientpb.StageProtocol lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index b51bfc30fa..a4c1fd29d6 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -33,39 +33,38 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) const ( - // DefaultMTLSLPort is the default port for mtls + // DefaultMTLSLPort is the default port for mtls. DefaultMTLSLPort = 8888 - // DefaultWGPort is the default port for wg + // DefaultWGPort is the default port for wg. DefaultWGLPort = 53 - // DefaultWGNPort is the default n port for wg + // DefaultWGNPort is the default n port for wg. DefaultWGNPort = 8888 - // DefaultWGKeyExPort is the default port for wg key exchange + // DefaultWGKeyExPort is the default port for wg key exchange. DefaultWGKeyExPort = 1337 - // DefaultHTTPLPort is the default port for http + // DefaultHTTPLPort is the default port for http. DefaultHTTPLPort = 80 - // DefaultHTTPSLPort is the default port for https + // DefaultHTTPSLPort is the default port for https. DefaultHTTPSLPort = 443 - // DefaultDNSLPortis the default port for dns + // DefaultDNSLPortis the default port for dns. DefaultDNSLPort = 53 - // DefaultTCPPivotPort is the default port for tcp pivots + // DefaultTCPPivotPort is the default port for tcp pivots. DefaultTCPPivotPort = 9898 - // DefaultReconnect is the default reconnect time + // DefaultReconnect is the default reconnect time. DefaultReconnect = 60 - // DefaultPollTimeout is the default poll timeout + // DefaultPollTimeout is the default poll timeout. DefaultPollTimeout = 360 // 6 minutes - // DefaultMaxErrors is the default max reconnection errors before giving up + // DefaultMaxErrors is the default max reconnection errors before giving up. DefaultMaxErrors = 1000 ) @@ -74,7 +73,7 @@ const ( ) var ( - // SupportedCompilerTargets - Supported compiler targets + // SupportedCompilerTargets - Supported compiler targets. SupportedCompilerTargets = map[string]bool{ "darwin/amd64": true, "darwin/arm64": true, @@ -88,7 +87,7 @@ var ( ErrNoValidBuilders = errors.New("no valid external builders for target") ) -// GenerateCmd - The main command used to generate implant binaries +// GenerateCmd - The main command used to generate implant binaries. func GenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { @@ -181,7 +180,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } } -// Shared function that extracts the compile flags from the grumble context +// Shared function that extracts the compile flags from the grumble context. func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb.ImplantConfig { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { @@ -404,7 +403,7 @@ func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb. return config } -// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled +// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled. func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverClient) (bool, []*commonpb.File) { trafficEncoders, _ := cmd.Flags().GetString("traffic-encoders") encoders := []*commonpb.File{} @@ -461,7 +460,7 @@ func getTargets(targetOS string, targetArch string, con *console.SliverClient) ( return targetOS, targetArch } -// ParseMTLSc2 - Parse mtls connection string arg +// ParseMTLSc2 - Parse mtls connection string arg. func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -496,7 +495,7 @@ func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseWGc2 - Parse wg connect string arg +// ParseWGc2 - Parse wg connect string arg. func ParseWGc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -612,7 +611,7 @@ func uriWithoutProxyOptions(uri *url.URL) { uri.RawQuery = options.Encode() } -// ParseHTTPc2 - Parse HTTP connection string arg +// ParseHTTPc2 - Parse HTTP connection string arg. func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -658,7 +657,7 @@ func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseDNSc2 - Parse DNS connection string arg +// ParseDNSc2 - Parse DNS connection string arg. func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -693,7 +692,7 @@ func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseNamedPipec2 - Parse named pipe connection string arg +// ParseNamedPipec2 - Parse named pipe connection string arg. func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -740,7 +739,7 @@ func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseTCPPivotc2 - Parse tcp pivot connection string arg +// ParseTCPPivotc2 - Parse tcp pivot connection string arg. func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 41ade08c58..b545768661 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -4,14 +4,13 @@ import ( "context" "fmt" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" ) -// GetSliverBinary - Get the binary of an implant based on it's profile +// GetSliverBinary - Get the binary of an implant based on it's profile. func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient) ([]byte, error) { var data []byte // get implant builds @@ -92,7 +91,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { }) } -// FormatCompleter completes build operating systems +// FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) @@ -126,7 +125,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { }) } -// FormatCompleter completes build formats +// FormatCompleter completes build formats. func FormatCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { return carapace.ActionValues([]string{ @@ -135,7 +134,7 @@ func FormatCompleter() carapace.Action { }) } -// TrafficEncoderCompleter - Completes the names of traffic encoders +// TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { grpcCtx, cancel := con.GrpcContext(nil) diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index f9b539e2d5..edf09a9c46 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -5,13 +5,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ImplantsRmCmd - Deletes an archived implant build from the server +// ImplantsRmCmd - Deletes an archived implant build from the server. func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 826c2f9bd8..4f69ea5c48 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -23,17 +23,16 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ImplantBuildFilter - Filter implant builds +// ImplantBuildFilter - Filter implant builds. type ImplantBuildFilter struct { GOOS string GOARCH string @@ -43,7 +42,7 @@ type ImplantBuildFilter struct { Debug bool } -// ImplantsCmd - Displays archived implant builds +// ImplantsCmd - Displays archived implant builds. func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { @@ -59,7 +58,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintImplantBuilds - Print the implant builds on the server +// PrintImplantBuilds - Print the implant builds on the server. func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -123,7 +122,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl con.Println("\n") } -// ImplantBuildNameCompleter - Completer for implant build names +// ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -193,7 +192,7 @@ func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(comps) } -// ImplantBuildByName - Get an implant build by name +// ImplantBuildByName - Get an implant build by name. func ImplantBuildByName(name string, con *console.SliverClient) *clientpb.ImplantConfig { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index fcc05e53ae..f0f2cf229d 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -24,12 +24,11 @@ import ( "path/filepath" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ProfilesGenerateCmd - Generate an implant binary based on a profile +// ProfilesGenerateCmd - Generate an implant binary based on a profile. func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 04f9c5b4c3..4a481bf49c 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -20,13 +20,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesNewCmd - Create a new implant profile +// ProfilesNewCmd - Create a new implant profile. func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { @@ -49,7 +48,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// ProfilesNewBeaconCmd - Create a new beacon profile +// ProfilesNewBeaconCmd - Create a new beacon profile. func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index 55bc75289f..f0ab60b5b1 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -23,13 +23,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesRmCmd - Delete an implant profile +// ProfilesRmCmd - Delete an implant profile. func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 592e0b62fc..dd0f7ef925 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -24,18 +24,17 @@ import ( "math" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ProfilesCmd - Display implant profiles +// ProfilesCmd - Display implant profiles. func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profiles := getImplantProfiles(con) if profiles == nil { @@ -49,7 +48,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintProfiles - Print the profiles +// PrintProfiles - Print the profiles. func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -106,7 +105,7 @@ func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { return pbProfiles.Profiles } -// GetImplantProfileByName - Get an implant profile by a specific name +// GetImplantProfileByName - Get an implant profile by a specific name. func GetImplantProfileByName(name string, con *console.SliverClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { @@ -263,7 +262,7 @@ func populateProfileProperties(config *clientpb.ImplantConfig) map[string]string return properties } -// PrintProfileInfo - Print detailed information about a given profile +// PrintProfileInfo - Print detailed information about a given profile. func PrintProfileInfo(name string, con *console.SliverClient) { profile := GetImplantProfileByName(name, con) if profile == nil { @@ -273,7 +272,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { config := profile.Config properties := populateProfileProperties(config) - //con.Printf("--- Details for profile %s ---\n", profile.Name) + tw := table.NewWriter() // Implant Basics @@ -420,7 +419,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { } } -// ProfileNameCompleter - Completer for implant build names +// ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 65a69eae1f..4cf1105a3e 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -22,13 +22,12 @@ import ( "context" "os" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// RegenerateCmd - Download an archived implant build/binary +// RegenerateCmd - Download an archived implant build/binary. func RegenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { save, _ := cmd.Flags().GetString("save") if save == "" { diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 899033907e..c1ec8530d0 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -27,22 +27,21 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/gofrs/uuid" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/text/cases" - "golang.org/x/text/language" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/gofrs/uuid" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "google.golang.org/protobuf/proto" ) -// TrafficEncodersCmd - Generate traffic encoders command implementation +// TrafficEncodersCmd - Generate traffic encoders command implementation. func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -54,7 +53,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []st DisplayTrafficEncoders(encoderMap, con) } -// DisplayTrafficEncoders - Display traffic encoders map from server +// DisplayTrafficEncoders - Display traffic encoders map from server. func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -83,7 +82,7 @@ func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console con.Println(tw.Render()) } -// TrafficEncodersAddCmd - Add a new traffic encoder to the server +// TrafficEncodersAddCmd - Add a new traffic encoder to the server. func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -138,7 +137,7 @@ func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args [ con.PrintInfof("Successfully added traffic encoder: %s\n", trafficEncoder.Wasm.Name) } -// saveFailedSample - Save the sample the encoder failed to properly encode/decode +// saveFailedSample - Save the sample the encoder failed to properly encode/decode. func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { confirm := false prompt := &survey.Confirm{ @@ -156,7 +155,7 @@ func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { } } -// allTestsPassed - Check if all tests passed +// allTestsPassed - Check if all tests passed. func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { for _, test := range tests.Tests { if !test.Success { @@ -166,7 +165,7 @@ func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { return true } -// displayTrafficEncoderTests - Display traffic encoder tests in real time +// displayTrafficEncoderTests - Display traffic encoder tests in real time. func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverClient) { listenerID, events := con.CreateEventListener() defer con.RemoveEventListener(listenerID) @@ -191,7 +190,7 @@ func displayTrafficEncoderTestProgress(testID string, completed chan interface{} } } -// clearLines - Clear a number of lines from the console +// clearLines - Clear a number of lines from the console. func clearLines(count int, con *console.SliverClient) { for i := 0; i < count; i++ { con.Printf(console.Clearln + "\r") @@ -199,7 +198,7 @@ func clearLines(count int, con *console.SliverClient) { } } -// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written +// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written. func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -245,7 +244,7 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest return lineCount } -// TrafficEncodersRemoveCmd - Remove a traffic encoder +// TrafficEncodersRemoveCmd - Remove a traffic encoder. func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, cancel := con.GrpcContext(cmd) defer cancel() @@ -272,7 +271,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, arg con.PrintInfof("Successfully removed traffic encoder: %s\n", name) } -// SelectTrafficEncoder - Select a traffic encoder from a list +// SelectTrafficEncoder - Select a traffic encoder from a list. func SelectTrafficEncoder(con *console.SliverClient) string { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 7ecf238d94..5de76356a8 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -1,15 +1,14 @@ package jobs import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index 1c58ec32e2..4cbf4e8479 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -22,13 +22,12 @@ import ( "context" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// DNSListenerCmd - Start a DNS lisenter +// DNSListenerCmd - Start a DNS lisenter. func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domainsF, _ := cmd.Flags().GetString("domains") domains := strings.Split(domainsF, ",") diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index d97b39d815..10ea0bb6bb 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -22,13 +22,12 @@ import ( "context" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// HTTPListenerCmd - Start an HTTP listener +// HTTPListenerCmd - Start an HTTP listener. func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index 5f3233b2fa..cbba4450a4 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -25,13 +25,12 @@ import ( "io/ioutil" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// HTTPSListenerCmd - Start an HTTPS listener +// HTTPSListenerCmd - Start an HTTPS listener. func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index ff958e761a..9522bc4642 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -25,18 +25,16 @@ import ( "strconv" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// JobsCmd - Manage server jobs (listeners, etc) +// JobsCmd - Manage server jobs (listeners, etc). func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if pid, _ := cmd.Flags().GetInt32("kill"); pid != -1 { jobKill(uint32(pid), con) @@ -61,7 +59,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintJobs - Prints a list of active jobs +// PrintJobs - Prints a list of active jobs. func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 93256d8c84..4c918e2914 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -21,13 +21,12 @@ package jobs import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// MTLSListenerCmd - Start an mTLS listener +// MTLSListenerCmd - Start an mTLS listener. func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index 567dfa1f89..bd779139cd 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -27,17 +27,15 @@ import ( "strconv" "strings" - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/util/encoders" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" + "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" ) -// StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name +// StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name. func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profileName, _ := cmd.Flags().GetString("profile") listenerURL, _ := cmd.Flags().GetString("url") diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index da97dc675e..1f7ae6d8cd 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -21,13 +21,12 @@ package jobs import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WGListenerCmd - Start a WireGuard listener +// WGListenerCmd - Start a WireGuard listener. func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lport, _ := cmd.Flags().GetUint32("lport") nport, _ := cmd.Flags().GetUint32("nport") diff --git a/client/command/server.go b/client/command/server.go index 593b9e9ec4..819eed345e 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -41,7 +41,6 @@ import ( "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" - "github.com/bishopfox/sliver/client/command/taskmany" "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -49,12 +48,15 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" + teamclientCmds "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/server" + teamserverCmds "github.com/reeflective/team/server/commands" "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) console.Commands { +func ServerCommands(con *client.SliverClient, serv *server.Server) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -63,9 +65,14 @@ func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) }, } - if serverCmds != nil { + if serv != nil { server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - server.AddCommand(serverCmds()) + teamserverCmds := teamserverCmds.Generate(serv, con.Teamclient) + server.AddCommand(teamserverCmds) + } else { + server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) + teamclientCmds := teamclientCmds.Generate(con.Teamclient) + server.AddCommand(teamclientCmds) } // [ Bind commands ] -------------------------------------------------------- @@ -114,7 +121,7 @@ func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) loot.Commands, hosts.Commands, reaction.Commands, - taskmany.Command, + // taskmany.Command, ) // [ Post-command declaration setup ]----------------------------------------- diff --git a/client/console/console.go b/client/console/console.go index af67e17456..a1866fcb99 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -44,6 +44,7 @@ import ( "github.com/gofrs/uuid" "github.com/reeflective/console" "github.com/reeflective/readline" + "github.com/reeflective/team/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/protobuf/proto" @@ -101,6 +102,8 @@ type SliverClient struct { jsonHandler slog.Handler printf func(format string, args ...any) (int, error) + + Teamclient *client.Client } // NewConsole creates the sliver client (and console), creating menus and prompts. @@ -121,6 +124,7 @@ func NewConsole(isServer bool) *SliverClient { BeaconTaskCallbacksMutex: &sync.Mutex{}, IsServer: isServer, Settings: settings, + IsCLI: true, } // The active target needs access to the console @@ -160,9 +164,7 @@ func NewConsole(isServer bool) *SliverClient { // Init requires a working RPC connection to the sliver server, and 2 different sets of commands. // If run is true, the console application is started, making this call blocking. Otherwise, commands and // RPC connection are bound to the console (making the console ready to run), but the console does not start. -func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands, run bool) error { - con.IsCLI = !run - +func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands) { // The console application needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). // If ran from a system shell, however, those queries will block because @@ -186,28 +188,22 @@ func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands, run // console logger if con.Settings.ConsoleLogs { - // Classic logs + // // Classic logs consoleLog := getConsoleLogFile() - consoleLogStream, err := con.ClientLogStream("json") - if err != nil { - log.Printf("Could not get client log stream: %s", err) - } - con.setupLogger(consoleLog, consoleLogStream) - defer consoleLog.Close() - - // Ascii cast sessions (complete terminal interface). - asciicastLog := getConsoleAsciicastFile() - defer asciicastLog.Close() - - asciicastStream, err := con.ClientLogStream("asciicast") - con.setupAsciicastRecord(asciicastLog, asciicastStream) + // consoleLogStream, err := con.ClientLogStream("json") + // if err != nil { + // log.Printf("Could not get client log stream: %s", err) + // } + con.setupLogger(consoleLog) + // defer consoleLog.Close() + // + // // Ascii cast sessions (complete terminal interface). + // asciicastLog := getConsoleAsciicastFile() + // defer asciicastLog.Close() + // + // asciicastStream, err := con.ClientLogStream("asciicast") + // con.setupAsciicastRecord(asciicastLog, asciicastStream) } - - if !con.IsCLI { - return con.App.Start() - } - - return nil } func (con *SliverClient) startEventLoop() { diff --git a/client/constants/constants.go b/client/constants/constants.go index 104b89a699..a906378154 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -18,105 +18,105 @@ package constants along with this program. If not, see . */ -// Meta +// Meta. const ( - // KeepAliveStr - Keep alive constant + // KeepAliveStr - Keep alive constant. KeepAliveStr = "keepalive" ) const ( - // LastUpdateCheckFileName - Last update check file name + // LastUpdateCheckFileName - Last update check file name. LastUpdateCheckFileName = "last_update_check" ) -// Console +// Console. const ( ImplantMenu = "implant" ServerMenu = "" ) -// Events +// Events. const ( - // UpdateStr - "update" + // UpdateStr - "update". UpdateStr = "update" - // VersionStr - "version" + // VersionStr - "version". VersionStr = "version" - // EventStr - "event" + // EventStr - "event". EventStr = "event" - // ServersStr - "server-error" + // ServersStr - "server-error". ServerErrorStr = "server-error" - // ConnectedEvent - Sliver Connected + // ConnectedEvent - Sliver Connected. SessionOpenedEvent = "session-connected" - // DisconnectedEvent - Sliver disconnected + // DisconnectedEvent - Sliver disconnected. SessionClosedEvent = "session-disconnected" - // UpdateEvent - Sliver updated + // UpdateEvent - Sliver updated. SessionUpdateEvent = "session-updated" - // JoinedEvent - Player joined the game + // JoinedEvent - Player joined the game. JoinedEvent = "client-joined" - // LeftEvent - Player left the game + // LeftEvent - Player left the game. LeftEvent = "client-left" - // CanaryEvent - A DNS canary was triggered + // CanaryEvent - A DNS canary was triggered. CanaryEvent = "canary" - // WatchtowerEvent - An implant hash has been identified on a threat intel platform + // WatchtowerEvent - An implant hash has been identified on a threat intel platform. WatchtowerEvent = "watchtower" - // StartedEvent - Job was started + // StartedEvent - Job was started. JobStartedEvent = "job-started" - // StoppedEvent - Job was stopped + // StoppedEvent - Job was stopped. JobStoppedEvent = "job-stopped" - // BuildEvent - Fires on change to builds + // BuildEvent - Fires on change to builds. BuildEvent = "build" - // BuildCompletedEvent - Fires when a build completes + // BuildCompletedEvent - Fires when a build completes. BuildCompletedEvent = "build-completed" - // ProfileEvent - Fires whenever there's a change to profiles + // ProfileEvent - Fires whenever there's a change to profiles. ProfileEvent = "profile" - // WebsiteEvent - Fires whenever there's a change to websites + // WebsiteEvent - Fires whenever there's a change to websites. WebsiteEvent = "website" - // LootAdded + // LootAdded. LootAddedEvent = "loot-added" - // LootRemoved + // LootRemoved. LootRemovedEvent = "loot-removed" - // BeaconRegisteredEvent - First connection from a new beacon + // BeaconRegisteredEvent - First connection from a new beacon. BeaconRegisteredEvent = "beacon-registered" - // BeaconTaskResult - Beacon task completed with a result + // BeaconTaskResult - Beacon task completed with a result. BeaconTaskResultEvent = "beacon-taskresult" - // ExternalBuildEvent + // ExternalBuildEvent. ExternalBuildEvent = "external-build" AcknowledgeBuildEvent = "external-acknowledge" ExternalBuildFailedEvent = "external-build-failed" ExternalBuildCompletedEvent = "external-build-completed" - // TrafficEncoder Events + // TrafficEncoder Events. TrafficEncoderTestProgressEvent = "traffic-encoder-test-progress" - // Crackstation Events + // Crackstation Events. CrackstationConnected = "crackstation-connected" CrackstationDisconnected = "crackstation-disconnected" - // Crack Events - Events consumed by crackstations + // Crack Events - Events consumed by crackstations. CrackBenchmark = "crack-benchmark" CrackStatusEvent = "crack-status" - // WireGuardNewPeer - New Wireguard peer added + // WireGuardNewPeer - New Wireguard peer added. WireGuardNewPeer = "wireguard-newpeer" ) -// Commands +// Commands. const ( OperatorsStr = "operators" NewOperatorStr = "new-operator" @@ -144,9 +144,9 @@ const ( SearchStr = "search" TrafficEncodersStr = "traffic-encoders" - // Generic + // Generic. - // NewStr - "new" + // NewStr - "new". NewStr = "new" AddStr = "add" StartStr = "start" @@ -294,16 +294,16 @@ const ( Hcstat2Str = "hcstat2" ) -// Groups +// Groups. const ( - // Server commands ===================== + // Server commands =====================. GenericHelpGroup = "Generic" NetworkHelpGroup = "Network" PayloadsHelpGroup = "Payload" DataHelpGroup = "Data" SliverHelpGroup = "Sliver" - // Sliver commands ===================== + // Sliver commands =====================. SliverCoreHelpGroup = "Core" InfoHelpGroup = "Info" FilesystemHelpGroup = "Filesystem" @@ -314,13 +314,13 @@ const ( AliasHelpGroup = "Sliver - 3rd Party macros" ExtensionHelpGroup = "Sliver - 3rd Party extensions" - // Useless + // Useless. SliverWinHelpGroup = "Sliver - Windows" MultiplayerHelpGroup = "Multiplayer" ) // Command types / filters (per OS/type/C2/etc) -// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below, +// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( SessionCmdsFilter = "session" BeaconCmdsFilter = "beacon" @@ -328,7 +328,7 @@ const ( WireguardCmdsFilter = "wireguard" ) -// Creds (needed here to avoid recursive imports) +// Creds (needed here to avoid recursive imports). const ( UserColonHashNewlineFormat = "user:hash" // username:hash\n HashNewlineFormat = "hash" // hash\n diff --git a/client/core/curses.go b/client/core/curses.go index 9df00d1a8c..7cc2659112 100644 --- a/client/core/curses.go +++ b/client/core/curses.go @@ -24,10 +24,8 @@ import ( "sync" ) -var ( - // SessionID -> CursedProcess - CursedProcesses = &sync.Map{} -) +// SessionID -> CursedProcess. +var CursedProcesses = &sync.Map{} type CursedProcess struct { SessionID string diff --git a/client/core/portfwd.go b/client/core/portfwd.go index 92e2141ce6..3b229b4ebb 100644 --- a/client/core/portfwd.go +++ b/client/core/portfwd.go @@ -36,7 +36,7 @@ import ( ) var ( - // Portfwds - Struct instance that holds all the portfwds + // Portfwds - Struct instance that holds all the portfwds. Portfwds = portfwds{ forwards: map[int]*Portfwd{}, mutex: &sync.RWMutex{}, @@ -45,7 +45,7 @@ var ( portfwdID = 0 ) -// PortfwdMeta - Metadata about a portfwd listener +// PortfwdMeta - Metadata about a portfwd listener. type PortfwdMeta struct { ID int SessionID string @@ -53,14 +53,14 @@ type PortfwdMeta struct { RemoteAddr string } -// Portfwd - Tracks portfwd<->tcpproxy +// Portfwd - Tracks portfwd<->tcpproxy. type Portfwd struct { ID int TCPProxy *tcpproxy.Proxy ChannelProxy *ChannelProxy } -// GetMetadata - Get metadata about the portfwd +// GetMetadata - Get metadata about the portfwd. func (p *Portfwd) GetMetadata() *PortfwdMeta { return &PortfwdMeta{ ID: p.ID, @@ -75,7 +75,7 @@ type portfwds struct { mutex *sync.RWMutex } -// Add - Add a TCP proxy instance +// Add - Add a TCP proxy instance. func (f *portfwds) Add(tcpProxy *tcpproxy.Proxy, channelProxy *ChannelProxy) *Portfwd { f.mutex.Lock() defer f.mutex.Unlock() @@ -88,7 +88,7 @@ func (f *portfwds) Add(tcpProxy *tcpproxy.Proxy, channelProxy *ChannelProxy) *Po return portfwd } -// Remove - Remove a TCP proxy instance +// Remove - Remove a TCP proxy instance. func (f *portfwds) Remove(portfwdID int) bool { f.mutex.Lock() defer f.mutex.Unlock() @@ -100,7 +100,7 @@ func (f *portfwds) Remove(portfwdID int) bool { return false } -// List - List all TCP proxy instances +// List - List all TCP proxy instances. func (f *portfwds) List() []*PortfwdMeta { f.mutex.RLock() defer f.mutex.RUnlock() @@ -114,7 +114,7 @@ func (f *portfwds) List() []*PortfwdMeta { // ChannelProxy binds the Sliver Tunnel to a net.Conn object // one ChannelProxy per port bind. // -// Implements the Target interface from tcpproxy pkg +// Implements the Target interface from tcpproxy pkg. type ChannelProxy struct { Rpc rpcpb.SliverRPCClient Session *clientpb.Session @@ -125,7 +125,7 @@ type ChannelProxy struct { DialTimeout time.Duration } -// HandleConn - Handle a TCP connection +// HandleConn - Handle a TCP connection. func (p *ChannelProxy) HandleConn(conn net.Conn) { log.Printf("[tcpproxy] Handling new connection") ctx := context.Background() @@ -158,7 +158,7 @@ func (p *ChannelProxy) HandleConn(conn net.Conn) { } } -// HostPort - Returns the host and port of the TCP proxy +// HostPort - Returns the host and port of the TCP proxy. func (p *ChannelProxy) HostPort() (string, uint32) { defaultPort := uint32(8080) host, rawPort, err := net.SplitHostPort(p.RemoteAddr) @@ -179,20 +179,19 @@ func (p *ChannelProxy) HostPort() (string, uint32) { return host, port } -// Port - Returns the TCP port of the proxy +// Port - Returns the TCP port of the proxy. func (p *ChannelProxy) Port() uint32 { _, port := p.HostPort() return port } -// Host - Returns the host (i.e., interface) of the TCP proxy +// Host - Returns the host (i.e., interface) of the TCP proxy. func (p *ChannelProxy) Host() string { host, _ := p.HostPort() return host } func (p *ChannelProxy) dialImplant(ctx context.Context) (*TunnelIO, error) { - log.Printf("[tcpproxy] Dialing implant to create tunnel ...") // Create an RPC tunnel, then start it before binding the shell to the newly created tunnel diff --git a/client/core/reactions.go b/client/core/reactions.go index fb3eb7ef49..53075a349b 100644 --- a/client/core/reactions.go +++ b/client/core/reactions.go @@ -25,13 +25,13 @@ import ( ) var ( - // Reactions - Manages/tracks reactions + // Reactions - Manages/tracks reactions. Reactions = &reactions{ reactionMap: map[string][]Reaction{}, mutex: &sync.RWMutex{}, } - // ReactableEvents - A list of reactionable events + // ReactableEvents - A list of reactionable events. ReactableEvents = []string{ consts.SessionOpenedEvent, consts.SessionUpdateEvent, @@ -58,7 +58,7 @@ type reactions struct { reactionID int } -// Add - Add a reaction +// Add - Add a reaction. func (r *reactions) Add(reaction Reaction) Reaction { r.mutex.Lock() defer r.mutex.Unlock() @@ -73,7 +73,7 @@ func (r *reactions) Add(reaction Reaction) Reaction { } // Remove - Remove a reaction, yes we're using linear search but this isn't exactly -// a performance critical piece of code and the map/slice is going to be very small +// a performance critical piece of code and the map/slice is going to be very small. func (r *reactions) Remove(reactionID int) bool { r.mutex.Lock() defer r.mutex.Unlock() @@ -88,7 +88,7 @@ func (r *reactions) Remove(reactionID int) bool { return false } -// On - Get all reactions of a specific type +// On - Get all reactions of a specific type. func (r *reactions) On(eventType string) []Reaction { r.mutex.RLock() defer r.mutex.RUnlock() @@ -100,7 +100,7 @@ func (r *reactions) On(eventType string) []Reaction { return []Reaction{} } -// All - Get all reactions (returns a flat list with all event types) +// All - Get all reactions (returns a flat list with all event types). func (r *reactions) All() []Reaction { r.mutex.RLock() defer r.mutex.RUnlock() @@ -111,7 +111,7 @@ func (r *reactions) All() []Reaction { return reactions } -// Reaction - Metadata about a portfwd listener +// Reaction - Metadata about a portfwd listener. type Reaction struct { ID int `json:"-"` EventType string `json:"event_type"` diff --git a/client/core/socks.go b/client/core/socks.go index fe95337664..78e1f42f43 100644 --- a/client/core/socks.go +++ b/client/core/socks.go @@ -34,7 +34,7 @@ import ( ) var ( - // SocksProxies - Struct instance that holds all the portfwds + // SocksProxies - Struct instance that holds all the portfwds. SocksProxies = socksProxy{ tcpProxies: map[uint64]*SocksProxy{}, mutex: &sync.RWMutex{}, @@ -43,7 +43,7 @@ var ( SocksProxyID = (uint64)(0) ) -// PortfwdMeta - Metadata about a portfwd listener +// PortfwdMeta - Metadata about a portfwd listener. type SocksProxyMeta struct { ID uint64 SessionID string @@ -78,13 +78,13 @@ func (tcp *TcpProxy) Stop() error { return err } -// SocksProxy - Tracks portfwd<->tcpproxy +// SocksProxy - Tracks portfwd<->tcpproxy. type SocksProxy struct { ID uint64 ChannelProxy *TcpProxy } -// GetMetadata - Get metadata about the portfwd +// GetMetadata - Get metadata about the portfwd. func (p *SocksProxy) GetMetadata() *SocksProxyMeta { return &SocksProxyMeta{ ID: p.ID, @@ -100,7 +100,7 @@ type socksProxy struct { mutex *sync.RWMutex } -// Add - Add a TCP proxy instance +// Add - Add a TCP proxy instance. func (f *socksProxy) Add(tcpProxy *TcpProxy) *SocksProxy { f.mutex.Lock() defer f.mutex.Unlock() @@ -140,7 +140,7 @@ func (f *socksProxy) Start(tcpProxy *TcpProxy) error { continue } log.Printf("[socks] agent to Server To (Client to User) Data Sequence %d , Data Size %d \n", FromImplantSequence, len(socksData.Data)) - //fmt.Printf("recv data len %d \n", len(p.Data)) + _, err := conn.Write(socksData.Data) if err != nil { log.Printf("Failed to write data to proxy connection, %s\n", err) @@ -177,7 +177,7 @@ func (f *socksProxy) Start(tcpProxy *TcpProxy) error { return nil } -// Remove - Remove a TCP proxy instance +// Remove - Remove a TCP proxy instance. func (f *socksProxy) Remove(socksId uint64) bool { f.mutex.Lock() defer f.mutex.Unlock() @@ -190,7 +190,7 @@ func (f *socksProxy) Remove(socksId uint64) bool { return false } -// List - List all TCP proxy instances +// List - List all TCP proxy instances. func (f *socksProxy) List() []*SocksProxyMeta { f.mutex.RLock() defer f.mutex.RUnlock() @@ -210,11 +210,10 @@ const leakyBufSize = 4108 // data.len(2) + hmacsha1(10) + data(4096) var leakyBuf = leaky.NewLeakyBuf(2048, leakyBufSize) func connect(conn net.Conn, stream rpcpb.SliverRPC_SocksProxyClient, frame *sliverpb.SocksData) { - SocksConnPool.Store(frame.TunnelID, conn) defer func() { - // It's neccessary to close and remove connection once we done with it + // It's necessary to close and remove connection once we done with it c, ok := SocksConnPool.LoadAndDelete(frame.TunnelID) if !ok { return @@ -233,7 +232,6 @@ func connect(conn net.Conn, stream rpcpb.SliverRPC_SocksProxyClient, frame *sliv var ToImplantSequence uint64 = 0 for { n, err := conn.Read(buff) - if err != nil { log.Printf("[socks] (User to Client) failed to read data, %s ", err) // Error basically means that the connection is closed(EOF) OR deadline exceeded diff --git a/client/core/tunnel.go b/client/core/tunnel.go index 821d283348..f19bf53245 100644 --- a/client/core/tunnel.go +++ b/client/core/tunnel.go @@ -27,9 +27,11 @@ import ( ) // TunnelLoop - Parses incoming tunnel messages and distributes them -// to session/tunnel objects -// Expected to be called only once during initialization +// +// to session/tunnel objects +// Expected to be called only once during initialization func TunnelLoop(rpc rpcpb.SliverRPCClient) error { + log.SetOutput(io.Discard) log.Println("Starting tunnel data loop ...") defer log.Printf("Warning: TunnelLoop exited") diff --git a/client/core/tunnel_io.go b/client/core/tunnel_io.go index 4970312c06..34eda79c66 100644 --- a/client/core/tunnel_io.go +++ b/client/core/tunnel_io.go @@ -26,7 +26,7 @@ import ( "sync" ) -// TunnelIO - Duplex data tunnel, compatible with both io.ReadWriter +// TunnelIO - Duplex data tunnel, compatible with both io.ReadWriter. type TunnelIO struct { ID uint64 SessionID string @@ -38,7 +38,7 @@ type TunnelIO struct { mutex *sync.RWMutex } -// NewTunnelIO - Single entry point for creating instance of new TunnelIO +// NewTunnelIO - Single entry point for creating instance of new TunnelIO. func NewTunnelIO(tunnelID uint64, sessionID string) *TunnelIO { log.Printf("New tunnel!: %d", tunnelID) @@ -52,7 +52,7 @@ func NewTunnelIO(tunnelID uint64, sessionID string) *TunnelIO { } } -// Write - Writer method for interface +// Write - Writer method for interface. func (tun *TunnelIO) Write(data []byte) (int, error) { if !tun.IsOpen() { log.Printf("Warning: Write on closed tunnel %d", tun.ID) @@ -71,7 +71,7 @@ func (tun *TunnelIO) Write(data []byte) (int, error) { return n, nil } -// Read - Reader method for interface +// Read - Reader method for interface. func (tun *TunnelIO) Read(data []byte) (int, error) { recvData, ok := <-tun.Recv if !ok { @@ -87,7 +87,7 @@ func (tun *TunnelIO) Read(data []byte) (int, error) { return n, nil } -// Close - Close tunnel IO operations +// Close - Close tunnel IO operations. func (tun *TunnelIO) Close() error { tun.mutex.Lock() defer tun.mutex.Unlock() diff --git a/client/core/tunnels.go b/client/core/tunnels.go index 571ac5911a..b6efec49bb 100644 --- a/client/core/tunnels.go +++ b/client/core/tunnels.go @@ -28,13 +28,13 @@ import ( ) var ( - // tunnelsStorage - Holds refs to all tunnels + // tunnelsStorage - Holds refs to all tunnels. tunnelsStorage *tunnels tunnelsSingletonLock = &sync.Mutex{} ) -// GetTunnels - singleton function that returns or initializes all tunnels +// GetTunnels - singleton function that returns or initializes all tunnels. func GetTunnels() *tunnels { tunnelsSingletonLock.Lock() defer tunnelsSingletonLock.Unlock() @@ -53,7 +53,7 @@ func GetTunnels() *tunnels { } // Holds the tunnels locally so we can map incoming data -// messages to the tunnel +// messages to the tunnel. type tunnels struct { tunnels *map[uint64]*TunnelIO mutex *sync.RWMutex @@ -70,7 +70,7 @@ func (t *tunnels) SetStream(stream rpcpb.SliverRPC_TunnelDataClient) { t.stream = stream } -// Get - Get a tunnel +// Get - Get a tunnel. func (t *tunnels) Get(tunnelID uint64) *TunnelIO { t.mutex.RLock() defer t.mutex.RUnlock() @@ -81,7 +81,7 @@ func (t *tunnels) Get(tunnelID uint64) *TunnelIO { } // send - safe way to send a message to the stream -// protobuf stream allow only one writer at a time, so just in case there is a mutex for it +// protobuf stream allow only one writer at a time, so just in case there is a mutex for it. func (t *tunnels) send(tunnelData *sliverpb.TunnelData) error { t.streamMutex.Lock() defer t.streamMutex.Unlock() @@ -95,7 +95,7 @@ func (t *tunnels) send(tunnelData *sliverpb.TunnelData) error { return t.stream.Send(tunnelData) } -// Start - Add a tunnel to the core mapper +// Start - Add a tunnel to the core mapper. func (t *tunnels) Start(tunnelID uint64, sessionID string) *TunnelIO { t.mutex.Lock() defer t.mutex.Unlock() @@ -116,7 +116,6 @@ func (t *tunnels) Start(tunnelID uint64, sessionID string) *TunnelIO { SessionID: tunnel.SessionID, Data: data, }) - if err != nil { log.Printf("Error sending, %s", err) } @@ -129,7 +128,7 @@ func (t *tunnels) Start(tunnelID uint64, sessionID string) *TunnelIO { return tunnel } -// Close - Close the tunnel channels +// Close - Close the tunnel channels. func (t *tunnels) Close(tunnelID uint64) { t.mutex.Lock() defer t.mutex.Unlock() @@ -145,7 +144,7 @@ func (t *tunnels) Close(tunnelID uint64) { } } -// CloseForSession - closing all tunnels for specified session id +// CloseForSession - closing all tunnels for specified session id. func (t *tunnels) CloseForSession(sessionID string) { t.mutex.RLock() defer t.mutex.RUnlock() diff --git a/go.mod b/go.mod index a0b5ef01ea..f665adb866 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,12 @@ go 1.20 replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +// replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace + replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team +replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console + require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 diff --git a/go.sum b/go.sum index ba570edf91..b9f137fea9 100644 --- a/go.sum +++ b/go.sum @@ -322,10 +322,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= -github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/server/cli/cli.go b/server/cli/cli.go index 4da9dfdb38..488ea42ef3 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -26,13 +26,12 @@ import ( "strings" "github.com/bishopfox/sliver/client/command" + sliverConsoleCmd "github.com/bishopfox/sliver/client/command/console" "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" - "github.com/reeflective/team/server/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -67,75 +66,6 @@ func initConsoleLogging(appDir string) *os.File { return logFile } -func init() { - // Console interface, started closed-loop or not. - con := console.NewConsole(false) - - // Teamserver/client API and commands for remote/local CLI. - teamserver, teamclient := newSliverTeam(con) - teamserverCmds := commands.Generate(teamserver, teamclient) - - rootCmd.AddCommand(teamserverCmds) - - // Pre-runners to self-connect - preRun := func(cmd *cobra.Command, _ []string) error { - // Ensure the server has what it needs - assets.Setup(false, true) - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - // Let our runtime teamclient be served. - if err := teamserver.Serve(teamclient); err != nil { - return err - } - - // Start persistent implant/c2 jobs (not teamservers) - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - // Only start the teamservers when the console being - // ran is the console itself: the daemon command will - // start them on its own, since the config is different. - if cmd.Name() == "console" { - teamserver.ListenerStartPersistents() // Automatically logged errors. - // console.StartPersistentJobs(serverConfig) // Old alternative - } - - return nil - } - - rootCmd.PersistentPreRunE = preRun - - rootCmd.AddCommand(consoleCmd(con)) - - // Unpack - unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - rootCmd.AddCommand(unpackCmd) - - // Certs - cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") - cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdExportCA) - - cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") - cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdImportCA) - - // Builder - rootCmd.AddCommand(initBuilderCmd()) - - // Version - rootCmd.AddCommand(versionCmd) - - // Completions - comps := carapace.Gen(rootCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) - }) -} - var rootCmd = &cobra.Command{ Use: "sliver-server", Short: "", @@ -175,57 +105,195 @@ var rootCmd = &cobra.Command{ // Execute - Execute root command func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + // Console interface, started closed-loop or not. + con := console.NewConsole(true) + + // Teamserver/client API and commands for remote/local CLI. + teamserver, teamclient := newSliverTeam(con) + + con.Teamclient = teamclient + + // Bind commands to the app + server := con.App.Menu(consts.ServerMenu) + server.SetCommands(command.ServerCommands(con, teamserver)) + + serverCmds := command.ServerCommands(con, teamserver)() + serverCmds.Use = "sliver-server" + + // sliver := con.App.Menu(consts.ImplantMenu) + // sliver.SetCommands(command.SliverCommands(con)) + + // Pre-runners to self-connect + preRun := func(cmd *cobra.Command, _ []string) error { + // Ensure the server has what it needs + assets.Setup(false, true) + certs.SetupCAs() + certs.SetupWGKeys() + cryptography.AgeServerKeyPair() + cryptography.MinisignServerPrivateKey() + + // Let our runtime teamclient be served. + if err := teamserver.Serve(con.Teamclient); err != nil { + return err + } + + console.StartClient(con, command.ServerCommands(con, teamserver), command.SliverCommands(con)) + return nil } -} -func initAlt() { + serverCmds.PersistentPreRunE = preRun + + serverCmds.AddCommand(sliverConsoleCmd.Command(con)) + // Unpack unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - rootCmd.AddCommand(unpackCmd) - - // Operator - // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") - // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") - // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") - // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") - // rootCmd.AddCommand(operatorCmd) + serverCmds.AddCommand(unpackCmd) // Certs cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdExportCA) + serverCmds.AddCommand(cmdExportCA) cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdImportCA) - - // Daemon - // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") - // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") - // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") - // rootCmd.AddCommand(daemonCmd) + serverCmds.AddCommand(cmdImportCA) // Builder - rootCmd.AddCommand(initBuilderCmd()) + // rootCmd.AddCommand(initBuilderCmd()) // Version - rootCmd.AddCommand(versionCmd) -} - -// consoleCmd generates the console with required pre/post runners -func consoleCmd(con *console.SliverClient) *cobra.Command { - consoleCmd := &cobra.Command{ - Use: "console", - Short: "Start the sliver client console", - RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) - }, - } + // rootCmd.AddCommand(versionCmd) - // consoleCmd.RunE, consoleCmd.PersistentPostRunE = consoleRunnerCmd(con, true) + // Completions + comps := carapace.Gen(serverCmds) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) + // comps.PostRun(func(cmd *cobra.Command, args []string) { + // postRun(cmd, args) + // }) - return consoleCmd + if err := serverCmds.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } } + +// func initAlt() { +// // Unpack +// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") +// rootCmd.AddCommand(unpackCmd) +// +// // Operator +// // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") +// // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") +// // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") +// // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") +// // rootCmd.AddCommand(operatorCmd) +// +// // Certs +// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") +// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// rootCmd.AddCommand(cmdExportCA) +// +// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") +// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// rootCmd.AddCommand(cmdImportCA) +// +// // Daemon +// // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") +// // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") +// // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") +// // rootCmd.AddCommand(daemonCmd) +// +// // Builder +// rootCmd.AddCommand(initBuilderCmd()) +// +// // Version +// rootCmd.AddCommand(versionCmd) +// } + +// func init() { +// // Console interface, started closed-loop or not. +// con := console.NewConsole(false) +// +// // Teamserver/client API and commands for remote/local CLI. +// teamserver, teamclient := newSliverTeam(con) +// // teamserverCmds := commands.Generate(teamserver, teamclient) +// +// con.Teamclient = teamclient +// +// // Bind commands to the app +// server := con.App.Menu(consts.ServerMenu) +// server.SetCommands(command.ServerCommands(con, teamserver)) +// +// serverCmds := command.ServerCommands(con, teamserver)() +// +// // server.Reset() +// // sliver := con.App.Menu(consts.ImplantMenu) +// // sliver.SetCommands(command.SliverCommands(con)) +// // rootCmd = server.Command +// // rootCmd.Use = "sliver-server" +// +// // rootCmd.AddCommand(teamserverCmds) +// +// // Pre-runners to self-connect +// preRun := func(cmd *cobra.Command, _ []string) error { +// // Ensure the server has what it needs +// assets.Setup(false, true) +// certs.SetupCAs() +// certs.SetupWGKeys() +// cryptography.AgeServerKeyPair() +// cryptography.MinisignServerPrivateKey() +// +// // Let our runtime teamclient be served. +// if err := teamserver.Serve(teamclient); err != nil { +// return err +// } +// +// // Start persistent implant/c2 jobs (not teamservers) +// // serverConfig := configs.GetServerConfig() +// // c2.StartPersistentJobs(serverConfig) +// +// // Only start the teamservers when the console being +// // ran is the console itself: the daemon command will +// // start them on its own, since the config is different. +// // if cmd.Name() == "console" { +// // teamserver.ListenerStartPersistents() // Automatically logged errors. +// // // console.StartPersistentJobs(serverConfig) // Old alternative +// // } +// +// console.StartClient(con, nil, nil) +// return nil +// } +// // return nil +// +// serverCmds.PersistentPreRunE = preRun +// +// serverCmds.AddCommand(consoleCmd(con)) +// +// // Unpack +// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") +// serverCmds.AddCommand(unpackCmd) +// +// // Certs +// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") +// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// serverCmds.AddCommand(cmdExportCA) +// +// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") +// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// serverCmds.AddCommand(cmdImportCA) +// +// // Builder +// // rootCmd.AddCommand(initBuilderCmd()) +// +// // Version +// // rootCmd.AddCommand(versionCmd) +// +// // Completions +// comps := carapace.Gen(serverCmds) +// comps.PreRun(func(cmd *cobra.Command, args []string) { +// preRun(cmd, args) +// }) +// } diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go index ff21844873..31cc8b58db 100644 --- a/server/cli/teamserver.go +++ b/server/cli/teamserver.go @@ -41,11 +41,6 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { server.WithListener(gTeamserver), ) - teamserver, err := server.New("sliver", serverOpts...) - if err != nil { - log.Fatal(err) - } - bindServer := func(grpcServer *grpc.Server) error { if grpcServer == nil { return errors.New("No gRPC server to use for service") @@ -58,6 +53,11 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { gTeamserver.PostServe(bindServer) + teamserver, err := server.New("sliver", serverOpts...) + if err != nil { + log.Fatal(err) + } + // Teamclient gTeamclient := teamGrpc.NewClientFrom(gTeamserver) diff --git a/server/core/events.go b/server/core/events.go index 9313696151..4084c5b13b 100644 --- a/server/core/events.go +++ b/server/core/events.go @@ -24,11 +24,16 @@ import ( const ( // Size is arbitrary, just want to avoid weird cases where we'd block on channel sends - eventBufSize = 5 + // NOTE: Changed by me: when clients are one-time exec CLI commands, you don't know how + // fast they connect/disconnect from their RPC.Events() call. + // When the event channels are buffered, sooner or later the broker writes to a closed + // channel. Just make it one so that this does not happen. + eventBufSize = 0 ) // Event - An event is fired when there's a state change involving a -// session, job, or client. +// +// session, job, or client. type Event struct { Session *Session Job *Job @@ -57,6 +62,7 @@ func (broker *eventBroker) Start() { case <-broker.stop: for sub := range subscribers { close(sub) + delete(subscribers, sub) } return case sub := <-broker.subscribe: @@ -106,7 +112,5 @@ func newBroker() *eventBroker { return broker } -var ( - // EventBroker - Distributes event messages - EventBroker = newBroker() -) +// EventBroker - Distributes event messages +var EventBroker = newBroker() diff --git a/server/rpc/rpc-events.go b/server/rpc/rpc-events.go index e45f235d9d..c43f74022c 100644 --- a/server/rpc/rpc-events.go +++ b/server/rpc/rpc-events.go @@ -8,9 +8,7 @@ import ( "github.com/bishopfox/sliver/server/log" ) -var ( - rpcEventsLog = log.NamedLogger("rpc", "events") -) +var rpcEventsLog = log.NamedLogger("rpc", "events") // Events - Stream events to client func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer) error { @@ -18,9 +16,10 @@ func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer client := core.NewClient(commonName) core.Clients.Add(client) events := core.EventBroker.Subscribe() + rpcEventsLog.Infof("Client %d connected", client.ID) defer func() { - rpcEventsLog.Infof("%d client disconnected", client.ID) + rpcEventsLog.Infof("Client %d disconnected", client.ID) core.EventBroker.Unsubscribe(events) core.Clients.Remove(client.ID) }() diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index ae9898f563..6a7fe8a310 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -42,7 +42,7 @@ type Console struct { // input line being ultimately provided to the command parser. This might // be used by people who want to apply supplemental, specific processing // on the command input line. - PreCmdRunLineHooks []func(args []string) ([]string, error) + PreCmdRunLineHooks []func(raw []string) (args []string, err error) // PreCmdRunHooks - Once the user has entered a command, but before executing // the target command, the console will execute every function in this list. diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 27d8412a18..7302a76f5e 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -194,7 +194,7 @@ func (m *Menu) resetPreRun() { defer m.console.mutex.RUnlock() // Menu setup - m.resetCommands() // Regenerate the commands for the menu. + m.ResetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding @@ -217,7 +217,7 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) resetCommands() { +func (m *Menu) Reset() { if m.cmds != nil { m.Command = m.cmds() } diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index eb5b60b9c1..c26264d040 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -87,6 +87,45 @@ func (c *Console) Start() error { } } +// Execute is a mimic of the classic one-time cobra command execution. +// This call is thus blocking during the entire parsing/execution process +// of a command-line, but will not happen in the closed-loop console, nor +// will start it (unless the target command does it by itself). +// +// This function should be useful if you have trees of commands that can +// be executed both in closed-loop applications or in a one-off exec style. +// Normally, most command should, if your command behavior/API has no magic. +// This function also does not print any logo. +// +// The command line (os.Args) is matched against the currently active menu. +// Be sure to set and verify this menu before calling this function. +func (c *Console) ExecuteOnce() error { + // Always ensure we work with the active menu, with freshly + // generated commands, bound prompts and some other things. + menu := c.activeMenu() + menu.resetPreRun() + + c.printed = false + + if c.NewlineBefore { + fmt.Println() + } + + // Run user-provided pre-run line hooks, + // which may modify the input line args. + args, err := c.runLineHooks(os.Args) + if err != nil { + return fmt.Errorf("Line error: %s\n", err.Error()) + } + + // Run all pre-run hooks and the command itself + // Don't check the error: if its a cobra error, + // the library user is responsible for setting + // the cobra behavior. + // If it's an interrupt, we take care of it. + return c.execute(menu, args, false) +} + // RunCommand is a convenience function to run a command in a given menu. // After running, the menu commands are reset, and the prompts reloaded. func (m *Menu) RunCommand(line string) (err error) { @@ -135,13 +174,12 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) if c.isFiltered(target) { - return + return nil } // Console-wide pre-run hooks, cannot. if err = c.runPreRunHooks(); err != nil { - fmt.Printf("Pre-run error: %s\n", err.Error()) - return + return fmt.Errorf("pre-run error: %s", err.Error()) } // Assign those arguments to our parser. diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go index 2da490bb65..0d7992dc91 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/tab-completer.go @@ -114,7 +114,7 @@ func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { - menu.resetCommands() + menu.ResetCommands() c.hideFilteredCommands() } diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index 27f04b743d..f9bcbd9686 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -24,7 +24,6 @@ import ( "os" "os/signal" "regexp" - "runtime/debug" "syscall" "github.com/reeflective/team/client" @@ -115,11 +114,11 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er log.Debugf("No port specified, using config file default: %d", port) } - defer func() { - if r := recover(); r != nil { - log.Errorf("panic:\n%s", debug.Stack()) - } - }() + // defer func() { + // if r := recover(); r != nil { + // log.Errorf("panic:\n%s", debug.Stack()) + // } + // }() // Start the listener. log.Infof("Starting %s teamserver daemon on %s:%d ...", ts.Name(), host, port) diff --git a/vendor/github.com/rsteube/carapace/carapace.go b/vendor/github.com/rsteube/carapace/carapace.go index 6573567f18..7fba2f2cec 100644 --- a/vendor/github.com/rsteube/carapace/carapace.go +++ b/vendor/github.com/rsteube/carapace/carapace.go @@ -38,6 +38,19 @@ func (c Carapace) PreRun(f func(cmd *cobra.Command, args []string)) { } } +func (c Carapace) PostRun(f func(cmd *cobra.Command, args []string)) { + if entry := storage.get(c.cmd); entry.postrun != nil { + _f := entry.postrun + entry.postrun = func(cmd *cobra.Command, args []string) { + // TODO yuck - probably best to append to a slice in storage + _f(cmd, args) + f(cmd, args) + } + } else { + entry.prerun = f + } +} + // PreInvoke sets a function to alter actions before they are invoked. func (c Carapace) PreInvoke(f func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action) { if entry := storage.get(c.cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/complete.go b/vendor/github.com/rsteube/carapace/complete.go index f23efa8f02..0cf82b3b03 100644 --- a/vendor/github.com/rsteube/carapace/complete.go +++ b/vendor/github.com/rsteube/carapace/complete.go @@ -49,7 +49,11 @@ func complete(cmd *cobra.Command, args []string) (string, error) { action = ActionMessage("failed to load config: " + err.Error()) } - return action.Invoke(context).value(args[0], args[len(args)-1]), nil + act := action.Invoke(context).value(args[0], args[len(args)-1]) + storage.postRun(cmd, args) + + return act, nil + // return action.Invoke(context).value(args[0], args[len(args)-1]), nil } } diff --git a/vendor/github.com/rsteube/carapace/pkg/style/config.go b/vendor/github.com/rsteube/carapace/pkg/style/config.go index 954c19da04..9799b13603 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/config.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/config.go @@ -25,41 +25,41 @@ func Register(name string, i interface{}) { config.RegisterStyle(name, i) } func Set(key, value string) error { return config.SetStyle(key, value) } type carapace struct { - Value string `description:"default style for values" tag:"core styles"` + Value string `description:"default style for values" tag:"core styles"` Description string `description:"default style for descriptions" tag:"core styles"` - Error string `description:"default style for errors" tag:"core styles"` - Usage string `description:"default style for usage" tag:"core styles"` + Error string `description:"default style for errors" tag:"core styles"` + Usage string `description:"default style for usage" tag:"core styles"` KeywordAmbiguous string `description:"keyword describing a ambiguous state" tag:"keyword styles"` - KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` - KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` - KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` + KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` + KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` + KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` - LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` - LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` - LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` - LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` - LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` + LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` + LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` + LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` + LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` + LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` LogLevelCritical string `description:"LogLevel CRITICAL" tag:"loglevel styles"` - LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` + LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` - Highlight1 string `description:"Highlight 1" tag:"highlight styles"` - Highlight2 string `description:"Highlight 2" tag:"highlight styles"` - Highlight3 string `description:"Highlight 3" tag:"highlight styles"` - Highlight4 string `description:"Highlight 4" tag:"highlight styles"` - Highlight5 string `description:"Highlight 5" tag:"highlight styles"` - Highlight6 string `description:"Highlight 6" tag:"highlight styles"` - Highlight7 string `description:"Highlight 7" tag:"highlight styles"` - Highlight8 string `description:"Highlight 8" tag:"highlight styles"` - Highlight9 string `description:"Highlight 9" tag:"highlight styles"` + Highlight1 string `description:"Highlight 1" tag:"highlight styles"` + Highlight2 string `description:"Highlight 2" tag:"highlight styles"` + Highlight3 string `description:"Highlight 3" tag:"highlight styles"` + Highlight4 string `description:"Highlight 4" tag:"highlight styles"` + Highlight5 string `description:"Highlight 5" tag:"highlight styles"` + Highlight6 string `description:"Highlight 6" tag:"highlight styles"` + Highlight7 string `description:"Highlight 7" tag:"highlight styles"` + Highlight8 string `description:"Highlight 8" tag:"highlight styles"` + Highlight9 string `description:"Highlight 9" tag:"highlight styles"` Highlight10 string `description:"Highlight 10" tag:"highlight styles"` Highlight11 string `description:"Highlight 11" tag:"highlight styles"` Highlight12 string `description:"Highlight 12" tag:"highlight styles"` - FlagArg string `description:"flag with argument" tag:"flag styles"` + FlagArg string `description:"flag with argument" tag:"flag styles"` FlagMultiArg string `description:"flag with multiple arguments" tag:"flag styles"` - FlagNoArg string `description:"flag without argument" tag:"flag styles"` - FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` + FlagNoArg string `description:"flag without argument" tag:"flag styles"` + FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` } var Carapace = carapace{ diff --git a/vendor/github.com/rsteube/carapace/storage.go b/vendor/github.com/rsteube/carapace/storage.go index 9673ffccd1..b4470a1d2d 100644 --- a/vendor/github.com/rsteube/carapace/storage.go +++ b/vendor/github.com/rsteube/carapace/storage.go @@ -20,6 +20,7 @@ type entry struct { dashAny Action preinvoke func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action prerun func(cmd *cobra.Command, args []string) + postrun func(cmd *cobra.Command, args []string) bridged bool } @@ -67,6 +68,13 @@ func (s _storage) preRun(cmd *cobra.Command, args []string) { } } +func (s _storage) postRun(cmd *cobra.Command, args []string) { + if entry := s.get(cmd); entry.postrun != nil { + LOG.Printf("executing PreRun for %#v with args %#v", cmd.Name(), args) + entry.postrun(cmd, args) + } +} + func (s _storage) preinvoke(cmd *cobra.Command, flag *pflag.Flag, action Action) Action { a := action if entry := s.get(cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go index fdce6d3014..ff5afcf82f 100644 --- a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go +++ b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go @@ -40,7 +40,6 @@ const worldWritable = 0o002 func determineFeature(fname string, mh bool) (feature, error) { stat, err := os.Lstat(fname) - if err != nil { return featureInvalid, err } diff --git a/vendor/modules.txt b/vendor/modules.txt index d52796d00c..530fae1ca6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -515,7 +515,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.6 +# github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console ## explicit; go 1.20 github.com/reeflective/console github.com/reeflective/console/commands/readline @@ -559,7 +559,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +# github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache From 24926692475095e89ec45632c101d1e0b3eb47c4 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 20 Jul 2023 23:57:39 +0200 Subject: [PATCH 012/109] Big refactoring of the client/server console entry/creation code - Move server-only commands in a dir. - Refactor client code with a single entrypoint function for all CLI modes, with pre-connect, loops and everything. --- Makefile | 6 +- client/cli/cli.go | 126 +---------- client/cli/console.go | 30 --- client/cli/teamclient.go | 28 +-- client/command/console/console.go | 15 +- client/console/console.go | 64 ++++-- go.mod | 6 +- go.sum | 4 + server/cli/certs.go | 155 -------------- server/cli/cli.go | 197 ++++++------------ server/cli/daemon.go | 62 ------ server/cli/operator.go | 95 --------- server/cli/teamserver.go | 35 +--- server/{cli => command/assets}/unpack.go | 39 ++-- server/{cli => command/builder}/builder.go | 135 ++++++------ server/command/certs/certs.go | 169 +++++++++++++++ server/core/events.go | 1 + server/rpc/rpc-events.go | 4 +- .../github.com/reeflective/console/console.go | 2 +- vendor/github.com/reeflective/console/menu.go | 4 +- vendor/github.com/reeflective/console/run.go | 44 +--- .../reeflective/console/tab-completer.go | 2 +- vendor/modules.txt | 2 +- 23 files changed, 429 insertions(+), 796 deletions(-) delete mode 100644 client/cli/console.go delete mode 100644 server/cli/certs.go delete mode 100644 server/cli/daemon.go delete mode 100644 server/cli/operator.go rename server/{cli => command/assets}/unpack.go (55%) rename server/{cli => command/builder}/builder.go (71%) create mode 100644 server/command/certs/certs.go diff --git a/Makefile b/Makefile index d0a043d438..3711c6c847 100644 --- a/Makefile +++ b/Makefile @@ -106,10 +106,8 @@ endif # .PHONY: default default: clean .downloaded_assets validate-go-version - $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server - # $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server - $(ENV) CGO_ENABLED=0 $(GO) build -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client - # $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client + $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server + $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client # Allows you to build a CGO-free client for any target e.g. `GOOS=windows GOARCH=arm64 make client` # NOTE: WireGuard is not supported on all platforms, but most 64-bit GOOS/GOARCH combinations should work. diff --git a/client/cli/cli.go b/client/cli/cli.go index 49eb31c265..d3f9299685 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -20,92 +20,44 @@ package cli import ( "fmt" - "log" "os" - "path" "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/console" - // consts "github.com/bishopfox/sliver/client/constants". - "github.com/bishopfox/sliver/client/version" + consoleCmd "github.com/bishopfox/sliver/client/command/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) -const ( - logFileName = "sliver-client.log" -) - -var sliverServerVersion = fmt.Sprintf("v%s", version.FullVersion()) - -// Initialize logging. -func initLogging(appDir string) *os.File { - log.SetFlags(log.LstdFlags | log.Lshortfile) - logFile, err := os.OpenFile(path.Join(appDir, logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) - if err != nil { - panic(fmt.Sprintf("[!] Error opening file: %s", err)) - } - log.SetOutput(logFile) - return logFile -} - -func init() { -} - -var rootCmd = &cobra.Command{ - Use: "sliver-client", - Short: "Client-only Sliver C2 management", - Long: ``, - TraverseChildren: true, -} - // Execute - Execute root command. func Execute() { - // Create the console client, without any RPC or commands bound to it yet. - // This created before anything so that multiple commands can make use of - // the same underlying command/run infrastructure. - con := console.NewConsole(false) - - // Teamclient API and commands for remote CLI. - teamclient := newSliverTeam(con) - con.Teamclient = teamclient - - // Bind commands to the app - // server := con.App.Menu(consts.ServerMenu) - // server.SetCommands(command.ServerCommands(con, nil)) - // - // sliver := con.App.Menu(consts.ImplantMenu) - // sliver.SetCommands(command.SliverCommands(con)) + con := newSliverTeam() serverCmds := command.ServerCommands(con, nil)() - - // serverCmds = server.Command serverCmds.Use = "sliver-client" // Version serverCmds.AddCommand(cmdVersion) preRun := func(_ *cobra.Command, _ []string) error { - teamclient.Connect() - - console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con)) - return nil + return con.Teamclient.Connect() } serverCmds.PersistentPreRunE = preRun postRun := func(_ *cobra.Command, _ []string) error { - // teamclient.SetLogLevel(1) - teamclient.Disconnect() - return nil + return con.Teamclient.Disconnect() } // serverCmds.PersistentPostRunE = postRun + // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with // other command trees below, such as the implant one. - serverCmds.AddCommand(consoleCmd(con)) + consoleServerCmds := command.ServerCommands(con, nil) + consoleSliverCmds := command.SliverCommands(con) + + serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) // Implant. // The implant command allows users to run commands on slivers from their @@ -128,63 +80,3 @@ func Execute() { os.Exit(1) } } - -// func Execute() { -// // Create the console client, without any RPC or commands bound to it yet. -// // This created before anything so that multiple commands can make use of -// // the same underlying command/run infrastructure. -// con := console.NewConsole(false) -// -// // Teamclient API and commands for remote CLI. -// teamclient := newSliverTeam(con) -// teamclientCmds := commands.Generate(teamclient) -// -// rootCmd.AddCommand(teamclientCmds) -// -// // Bind commands to the app -// server := con.App.Menu(consts.ServerMenu) -// server.SetCommands(command.ServerCommands(con, nil)) -// -// sliver := con.App.Menu(consts.ImplantMenu) -// sliver.SetCommands(command.SliverCommands(con)) -// -// server.Reset() -// -// rootCmd = server.Command -// rootCmd.Use = "sliver-client" -// -// // Version -// rootCmd.AddCommand(cmdVersion) -// -// preRun := func(_ *cobra.Command, _ []string) error { -// // return teamclient.Connect() -// teamclient.Connect() -// console.StartClient(con, nil, nil) -// return nil -// } -// -// rootCmd.PersistentPreRunE = preRun -// -// // Client console. -// // All commands and RPC connection are generated WITHIN the command RunE(): -// // that means there should be no redundant command tree/RPC connections with -// // other command trees below, such as the implant one. -// rootCmd.AddCommand(consoleCmd(con)) -// -// // Implant. -// // The implant command allows users to run commands on slivers from their -// // system shell. It makes use of pre-runners for connecting to the server -// // and binding sliver commands. These same pre-runners are also used for -// // command completion/filtering purposes. -// rootCmd.AddCommand(implantCmd(con)) -// -// // Completions -// comps := carapace.Gen(rootCmd) -// comps.PreRun(func(cmd *cobra.Command, args []string) { -// preRun(cmd, args) -// }) -// if err := rootCmd.Execute(); err != nil { -// fmt.Println(err) -// os.Exit(1) -// } -// } diff --git a/client/cli/console.go b/client/cli/console.go deleted file mode 100644 index 541ff96050..0000000000 --- a/client/cli/console.go +++ /dev/null @@ -1,30 +0,0 @@ -package cli - -import ( - "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" -) - -// consoleCmd generates the console with required pre/post runners. -func consoleCmd(con *console.SliverClient) *cobra.Command { - consoleCmd := &cobra.Command{ - Use: "console", - Short: "Start the sliver client console", - RunE: func(cmd *cobra.Command, args []string) error { - // return console.StartClient(con, nil, nil, true) - - // Bind commands to the app - server := con.App.Menu(consts.ServerMenu) - server.SetCommands(command.ServerCommands(con, nil)) - - sliver := con.App.Menu(consts.ImplantMenu) - sliver.SetCommands(command.SliverCommands(con)) - - return con.App.Start() - }, - } - - return consoleCmd -} diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go index 77c1ccc315..c3cb3c6d86 100644 --- a/client/cli/teamclient.go +++ b/client/cli/teamclient.go @@ -19,38 +19,22 @@ package cli */ import ( - "errors" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team/client" teamGrpc "github.com/reeflective/team/transports/grpc/client" - "google.golang.org/grpc" ) -func newSliverTeam(con *console.SliverClient) *client.Client { +func newSliverTeam() *console.SliverClient { gTeamclient := teamGrpc.NewTeamClient() - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") - } - - con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) - - return nil - } - - var clientOpts []client.Options - clientOpts = append(clientOpts, - client.WithDialer(gTeamclient, bindClient), - ) + con, opts := console.NewSliverClient(gTeamclient) - teamclient, err := client.New("sliver", gTeamclient, clientOpts...) + teamclient, err := client.New("sliver", gTeamclient, opts...) if err != nil { panic(err) } - return teamclient + con.Teamclient = teamclient + + return con } diff --git a/client/command/console/console.go b/client/command/console/console.go index f59a277a68..5a38decd79 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,16 +19,27 @@ package console */ import ( - "github.com/bishopfox/sliver/client/console" + client "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" "github.com/spf13/cobra" ) -func Command(con *console.SliverClient) *cobra.Command { +func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { con.IsCLI = false + + // Bind commands to the app + server := con.App.Menu(consts.ServerMenu) + server.SetCommands(serverCmds) + + sliver := con.App.Menu(consts.ImplantMenu) + sliver.SetCommands(sliverCmds) + + // Start the console, blocking until player exit. return con.App.Start() }, } diff --git a/client/console/console.go b/client/console/console.go index a1866fcb99..4a75915d18 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -21,6 +21,7 @@ package console import ( "bufio" "context" + "errors" "fmt" "io" "log" @@ -45,8 +46,10 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" + teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" + "google.golang.org/grpc" "google.golang.org/protobuf/proto" ) @@ -106,10 +109,32 @@ type SliverClient struct { Teamclient *client.Client } -// NewConsole creates the sliver client (and console), creating menus and prompts. +func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.Options) { + con := newConsole(false) + + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + startClient(con, grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(teamclient, bindClient), + ) + + return con, clientOpts +} + +// newConsole creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func NewConsole(isServer bool) *SliverClient { +func newConsole(isServer bool) *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() @@ -164,7 +189,9 @@ func NewConsole(isServer bool) *SliverClient { // Init requires a working RPC connection to the sliver server, and 2 different sets of commands. // If run is true, the console application is started, making this call blocking. Otherwise, commands and // RPC connection are bound to the console (making the console ready to run), but the console does not start. -func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands) { +func startClient(con *SliverClient, conn *grpc.ClientConn) { + con.Rpc = rpcpb.NewSliverRPCClient(conn) + // The console application needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). // If ran from a system shell, however, those queries will block because @@ -175,34 +202,27 @@ func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands) { con.printf = con.App.TransientPrintf } - // Bind commands to the app - server := con.App.Menu(consts.ServerMenu) - server.SetCommands(serverCmds) - - sliver := con.App.Menu(consts.ImplantMenu) - sliver.SetCommands(sliverCmds) - // Events go con.startEventLoop() go core.TunnelLoop(con.Rpc) // console logger if con.Settings.ConsoleLogs { - // // Classic logs + // Classic logs consoleLog := getConsoleLogFile() - // consoleLogStream, err := con.ClientLogStream("json") - // if err != nil { - // log.Printf("Could not get client log stream: %s", err) - // } - con.setupLogger(consoleLog) + consoleLogStream, err := con.ClientLogStream("json") + if err != nil { + log.Printf("Could not get client log stream: %s", err) + } + con.setupLogger(consoleLog, consoleLogStream) // defer consoleLog.Close() // - // // Ascii cast sessions (complete terminal interface). - // asciicastLog := getConsoleAsciicastFile() - // defer asciicastLog.Close() - // - // asciicastStream, err := con.ClientLogStream("asciicast") - // con.setupAsciicastRecord(asciicastLog, asciicastStream) + // Ascii cast sessions (complete terminal interface). + // asciicastLog := getConsoleAsciicastFile() + // defer asciicastLog.Close() + + // asciicastStream, err := con.ClientLogStream("asciicast") + // con.setupAsciicastRecord(asciicastLog, asciicastStream) } } diff --git a/go.mod b/go.mod index f665adb866..6419ae08d0 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,13 @@ module github.com/bishopfox/sliver go 1.20 -replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +// replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca -// replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace +replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team -replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console +// replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console require ( filippo.io/age v1.1.1 diff --git a/go.sum b/go.sum index b9f137fea9..ba570edf91 100644 --- a/go.sum +++ b/go.sum @@ -322,6 +322,10 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= +github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= +github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= +github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= +github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/server/cli/certs.go b/server/cli/certs.go deleted file mode 100644 index c334d23934..0000000000 --- a/server/cli/certs.go +++ /dev/null @@ -1,155 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/bishopfox/sliver/server/certs" - "github.com/spf13/cobra" -) - -var ( - // CATypes - CA types - CATypes = map[string]string{ - "operator": certs.OperatorCA, - "mtls": certs.MtlsImplantCA, - "https": certs.HTTPSCA, - } -) - -// CA - Exported CA format -type CA struct { - Certificate string `json:"certificate"` - PrivateKey string `json:"private_key"` -} - -func validCATypes() []string { - types := []string{} - for caType := range CATypes { - types = append(types, caType) - } - return types -} - -var cmdImportCA = &cobra.Command{ - Use: "import-ca", - Short: "Import certificate authority", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - caType, err := cmd.Flags().GetString(caTypeFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) - os.Exit(1) - } - ca, ok := CATypes[caType] - if !ok { - CAs := strings.Join(validCATypes(), ", ") - fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) - os.Exit(1) - } - - load, err := cmd.Flags().GetString(loadFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", loadFlagStr, err) - os.Exit(1) - } - fi, err := os.Stat(load) - if os.IsNotExist(err) || fi.IsDir() { - fmt.Printf("Cannot load file %s\n", load) - os.Exit(1) - } - - data, err := os.ReadFile(load) - if err != nil { - fmt.Printf("Cannot read file %s", err) - os.Exit(1) - } - - importCA := &CA{} - err = json.Unmarshal(data, importCA) - if err != nil { - fmt.Printf("Failed to parse file %s", err) - os.Exit(1) - } - cert := []byte(importCA.Certificate) - key := []byte(importCA.PrivateKey) - certs.SaveCertificateAuthority(ca, cert, key) - }, -} - -var cmdExportCA = &cobra.Command{ - Use: "export-ca", - Short: "Export certificate authority", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - caType, err := cmd.Flags().GetString(caTypeFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) - os.Exit(1) - } - ca, ok := CATypes[caType] - if !ok { - CAs := strings.Join(validCATypes(), ", ") - fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) - os.Exit(1) - } - - save, err := cmd.Flags().GetString(saveFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", saveFlagStr, err) - os.Exit(1) - } - if save == "" { - save, _ = os.Getwd() - } - - certs.SetupCAs() - certificateData, privateKeyData, err := certs.GetCertificateAuthorityPEM(ca) - if err != nil { - fmt.Printf("Error reading CA %s\n", err) - os.Exit(1) - } - exportedCA := &CA{ - Certificate: string(certificateData), - PrivateKey: string(privateKeyData), - } - - saveTo, _ := filepath.Abs(save) - fi, err := os.Stat(saveTo) - if !os.IsNotExist(err) && !fi.IsDir() { - fmt.Printf("File already exists: %s\n", err) - os.Exit(1) - } - if !os.IsNotExist(err) && fi.IsDir() { - filename := fmt.Sprintf("%s.ca", filepath.Base(caType)) - saveTo = filepath.Join(saveTo, filename) - } - data, _ := json.Marshal(exportedCA) - err = os.WriteFile(saveTo, data, 0600) - if err != nil { - fmt.Printf("Write failed: %s (%s)\n", saveTo, err) - os.Exit(1) - } - }, -} diff --git a/server/cli/cli.go b/server/cli/cli.go index 488ea42ef3..7dc51ac23b 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -20,20 +20,22 @@ package cli import ( "fmt" - "log" "os" - "path/filepath" - "strings" + + "github.com/rsteube/carapace" + "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" - sliverConsoleCmd "github.com/bishopfox/sliver/client/command/console" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" + assetsCmds "github.com/bishopfox/sliver/server/command/assets" + builderCmds "github.com/bishopfox/sliver/server/command/builder" + certsCmds "github.com/bishopfox/sliver/server/command/certs" + + consoleCmd "github.com/bishopfox/sliver/client/command/console" "github.com/bishopfox/sliver/server/assets" + "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" + "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) const ( @@ -50,78 +52,13 @@ const ( // Cert flags caTypeFlagStr = "type" loadFlagStr = "load" - - // console log file name - logFileName = "console.log" ) -// Initialize logging -func initConsoleLogging(appDir string) *os.File { - log.SetFlags(log.LstdFlags | log.Lshortfile) - logFile, err := os.OpenFile(filepath.Join(appDir, "logs", logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) - if err != nil { - log.Fatalf("Error opening file: %v", err) - } - log.SetOutput(logFile) - return logFile -} - -var rootCmd = &cobra.Command{ - Use: "sliver-server", - Short: "", - Long: ``, - // Run: func(cmd *cobra.Command, args []string) { - // // Root command starts the server normally - // - // appDir := assets.GetRootAppDir() - // logFile := initConsoleLogging(appDir) - // defer logFile.Close() - // - // defer func() { - // if r := recover(); r != nil { - // log.Printf("panic:\n%s", debug.Stack()) - // fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - // os.Exit(99) - // } - // }() - // - // assets.Setup(false, true) - // certs.SetupCAs() - // certs.SetupWGKeys() - // cryptography.AgeServerKeyPair() - // cryptography.MinisignServerPrivateKey() - // - // serverConfig := configs.GetServerConfig() - // c2.StartPersistentJobs(serverConfig) - // console.StartPersistentJobs(serverConfig) - // if serverConfig.DaemonMode { - // daemon.Start(daemon.BlankHost, daemon.BlankPort) - // } else { - // os.Args = os.Args[:1] // Hide cli from grumble console - // console.Start() - // } - // }, -} - // Execute - Execute root command func Execute() { // Console interface, started closed-loop or not. - con := console.NewConsole(true) - // Teamserver/client API and commands for remote/local CLI. - teamserver, teamclient := newSliverTeam(con) - - con.Teamclient = teamclient - - // Bind commands to the app - server := con.App.Menu(consts.ServerMenu) - server.SetCommands(command.ServerCommands(con, teamserver)) - - serverCmds := command.ServerCommands(con, teamserver)() - serverCmds.Use = "sliver-server" - - // sliver := con.App.Menu(consts.ImplantMenu) - // sliver.SetCommands(command.SliverCommands(con)) + teamserver, con := newSliverTeam() // Pre-runners to self-connect preRun := func(cmd *cobra.Command, _ []string) error { @@ -132,46 +69,41 @@ func Execute() { cryptography.AgeServerKeyPair() cryptography.MinisignServerPrivateKey() + // TODO: Move this out of here. + serverConfig := configs.GetServerConfig() + c2.StartPersistentJobs(serverConfig) + // Let our runtime teamclient be served. if err := teamserver.Serve(con.Teamclient); err != nil { return err } - console.StartClient(con, command.ServerCommands(con, teamserver), command.SliverCommands(con)) return nil } - serverCmds.PersistentPreRunE = preRun - - serverCmds.AddCommand(sliverConsoleCmd.Command(con)) - - // Unpack - unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - serverCmds.AddCommand(unpackCmd) - - // Certs - cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") - cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - serverCmds.AddCommand(cmdExportCA) + serverCmds := command.ServerCommands(con, teamserver)() + serverCmds.Use = "sliver-server" - cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") - cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - serverCmds.AddCommand(cmdImportCA) + serverCmds.PersistentPreRunE = preRun - // Builder - // rootCmd.AddCommand(initBuilderCmd()) + serverCmds.AddCommand(versionCmd) + serverCmds.AddCommand(assetsCmds.Commands()...) + serverCmds.AddCommand(builderCmds.Commands()...) + serverCmds.AddCommand(certsCmds.Commands()...) - // Version - // rootCmd.AddCommand(versionCmd) + // Console + consoleServerCmds := command.ServerCommands(con, teamserver) + consoleSliverCmds := command.SliverCommands(con) + serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) // Completions comps := carapace.Gen(serverCmds) comps.PreRun(func(cmd *cobra.Command, args []string) { preRun(cmd, args) }) - // comps.PostRun(func(cmd *cobra.Command, args []string) { - // postRun(cmd, args) - // }) + comps.PostRun(func(cmd *cobra.Command, args []string) { + con.Teamclient.Disconnect() + }) if err := serverCmds.Execute(); err != nil { fmt.Println(err) @@ -179,40 +111,6 @@ func Execute() { } } -// func initAlt() { -// // Unpack -// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") -// rootCmd.AddCommand(unpackCmd) -// -// // Operator -// // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") -// // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") -// // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") -// // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") -// // rootCmd.AddCommand(operatorCmd) -// -// // Certs -// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") -// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// rootCmd.AddCommand(cmdExportCA) -// -// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") -// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// rootCmd.AddCommand(cmdImportCA) -// -// // Daemon -// // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") -// // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") -// // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") -// // rootCmd.AddCommand(daemonCmd) -// -// // Builder -// rootCmd.AddCommand(initBuilderCmd()) -// -// // Version -// rootCmd.AddCommand(versionCmd) -// } - // func init() { // // Console interface, started closed-loop or not. // con := console.NewConsole(false) @@ -297,3 +195,40 @@ func Execute() { // preRun(cmd, args) // }) // } + +// var rootCmd = &cobra.Command{ +// Use: "sliver-server", +// Short: "", +// Long: ``, +// Run: func(cmd *cobra.Command, args []string) { +// // Root command starts the server normally +// +// appDir := assets.GetRootAppDir() +// logFile := initConsoleLogging(appDir) +// defer logFile.Close() +// +// defer func() { +// if r := recover(); r != nil { +// log.Printf("panic:\n%s", debug.Stack()) +// fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) +// os.Exit(99) +// } +// }() +// +// assets.Setup(false, true) +// certs.SetupCAs() +// certs.SetupWGKeys() +// cryptography.AgeServerKeyPair() +// cryptography.MinisignServerPrivateKey() +// +// serverConfig := configs.GetServerConfig() +// c2.StartPersistentJobs(serverConfig) +// console.StartPersistentJobs(serverConfig) +// if serverConfig.DaemonMode { +// daemon.Start(daemon.BlankHost, daemon.BlankPort) +// } else { +// os.Args = os.Args[:1] // Hide cli from grumble console +// console.Start() +// } +// }, +// } diff --git a/server/cli/daemon.go b/server/cli/daemon.go deleted file mode 100644 index 618d919dfe..0000000000 --- a/server/cli/daemon.go +++ /dev/null @@ -1,62 +0,0 @@ -package cli - -import ( - "fmt" - "log" - "os" - "runtime/debug" - - "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/c2" - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/cryptography" - "github.com/bishopfox/sliver/server/daemon" - "github.com/spf13/cobra" -) - -var daemonCmd = &cobra.Command{ - Use: "daemon", - Short: "Force start server in daemon mode", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - force, err := cmd.Flags().GetBool(forceFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", forceFlagStr, err) - return - } - lhost, err := cmd.Flags().GetString(lhostFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", lhostFlagStr, err) - return - } - lport, err := cmd.Flags().GetUint16(lportFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", lportFlagStr, err) - return - } - - appDir := assets.GetRootAppDir() - logFile := initConsoleLogging(appDir) - defer logFile.Close() - - defer func() { - if r := recover(); r != nil { - log.Printf("panic:\n%s", debug.Stack()) - fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - os.Exit(99) - } - }() - - assets.Setup(force, false) - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - daemon.Start(lhost, uint16(lport)) - }, -} diff --git a/server/cli/operator.go b/server/cli/operator.go deleted file mode 100644 index 2876c8b6ae..0000000000 --- a/server/cli/operator.go +++ /dev/null @@ -1,95 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/console" - "github.com/spf13/cobra" -) - -var operatorCmd = &cobra.Command{ - Use: "operator", - Short: "Generate operator configuration files", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - - name, err := cmd.Flags().GetString(nameFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", nameFlagStr, err) - os.Exit(1) - } - if name == "" { - fmt.Printf("Must specify --%s", nameFlagStr) - os.Exit(1) - } - - lhost, err := cmd.Flags().GetString(lhostFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", lhostFlagStr, err) - os.Exit(1) - } - if lhost == "" { - fmt.Printf("Must specify --%s", lhostFlagStr) - os.Exit(1) - } - - lport, err := cmd.Flags().GetUint16(lportFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", lportFlagStr, err) - os.Exit(1) - } - - save, err := cmd.Flags().GetString(saveFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", saveFlagStr, err) - os.Exit(1) - } - if save == "" { - save, _ = os.Getwd() - } - - certs.SetupCAs() - configJSON, err := console.NewOperatorConfig(name, lhost, lport) - if err != nil { - fmt.Printf("Failed: %s\n", err) - os.Exit(1) - } - - saveTo, _ := filepath.Abs(save) - fi, err := os.Stat(saveTo) - if !os.IsNotExist(err) && !fi.IsDir() { - fmt.Printf("File already exists: %s\n", err) - os.Exit(1) - } - if !os.IsNotExist(err) && fi.IsDir() { - filename := fmt.Sprintf("%s_%s.cfg", filepath.Base(name), filepath.Base(lhost)) - saveTo = filepath.Join(saveTo, filename) - } - err = os.WriteFile(saveTo, configJSON, 0600) - if err != nil { - fmt.Printf("Write failed: %s (%s)\n", saveTo, err) - os.Exit(1) - } - }, -} diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go index 31cc8b58db..84107e7c81 100644 --- a/server/cli/teamserver.go +++ b/server/cli/teamserver.go @@ -25,22 +25,15 @@ import ( "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/rpc" - "github.com/reeflective/team/client" "github.com/reeflective/team/server" teamGrpc "github.com/reeflective/team/transports/grpc/server" "google.golang.org/grpc" ) -func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { +func newSliverTeam() (*server.Server, *console.SliverClient) { // Teamserver gTeamserver := teamGrpc.NewListener() - var serverOpts []server.Options - serverOpts = append(serverOpts, - server.WithDefaultPort(31337), - server.WithListener(gTeamserver), - ) - bindServer := func(grpcServer *grpc.Server) error { if grpcServer == nil { return errors.New("No gRPC server to use for service") @@ -51,6 +44,12 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { return nil } + var serverOpts []server.Options + serverOpts = append(serverOpts, + server.WithDefaultPort(31337), + server.WithListener(gTeamserver), + ) + gTeamserver.PostServe(bindServer) teamserver, err := server.New("sliver", serverOpts...) @@ -61,23 +60,9 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { // Teamclient gTeamclient := teamGrpc.NewClientFrom(gTeamserver) - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") - } - - con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) - - return nil - } - - var clientOpts []client.Options - clientOpts = append(clientOpts, - client.WithDialer(gTeamclient, bindClient), - ) + sliver, opts := console.NewSliverClient(gTeamclient) - teamclient := teamserver.Self(clientOpts...) + sliver.Teamclient = teamserver.Self(opts...) - return teamserver, teamclient + return teamserver, sliver } diff --git a/server/cli/unpack.go b/server/command/assets/unpack.go similarity index 55% rename from server/cli/unpack.go rename to server/command/assets/unpack.go index e6b72fd558..f3bbe77b54 100644 --- a/server/cli/unpack.go +++ b/server/command/assets/unpack.go @@ -1,4 +1,4 @@ -package cli +package assets /* Sliver Implant Framework @@ -25,18 +25,29 @@ import ( "github.com/spf13/cobra" ) -var unpackCmd = &cobra.Command{ - Use: "unpack", - Short: "Unpack assets and exit", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - - force, err := cmd.Flags().GetBool(forceFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", forceFlagStr, err) - return - } +const ( + // Unpack flags + forceFlagStr = "force" +) - assets.Setup(force, true) - }, +// Commands returns all commands for Sliver assets management. +func Commands() []*cobra.Command { + unpackCmd := &cobra.Command{ + Use: "unpack", + Short: "Unpack assets and exit", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + force, err := cmd.Flags().GetBool(forceFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s\n", forceFlagStr, err) + return + } + + assets.Setup(force, true) + }, + } + + unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") + + return []*cobra.Command{unpackCmd} } diff --git a/server/cli/builder.go b/server/command/builder/builder.go similarity index 71% rename from server/cli/builder.go rename to server/command/builder/builder.go index 80037adb94..25316e02b6 100644 --- a/server/cli/builder.go +++ b/server/command/builder/builder.go @@ -1,4 +1,4 @@ -package cli +package builder /* Sliver Implant Framework @@ -35,11 +35,11 @@ import ( "github.com/spf13/cobra" ) -var ( - builderLog = log.NamedLogger("cli", "builder") -) +var builderLog = log.NamedLogger("cli", "builder") const ( + nameFlagStr = "name" + enableTargetFlagStr = "enable-target" disableTargetFlagStr = "disable-target" @@ -48,7 +48,15 @@ const ( logLevelFlagStr = "log-level" ) -func initBuilderCmd() *cobra.Command { +// Commands returns all commands for using Sliver as a builder backend. +func Commands() []*cobra.Command { + builderCmd := &cobra.Command{ + Use: "builder", + Short: "Start the process as an external builder", + Long: ``, + Run: runBuilderCmd, + } + builderCmd.Flags().StringP(nameFlagStr, "n", "", "Name of the builder (blank = hostname)") builderCmd.Flags().IntP(logLevelFlagStr, "L", 4, "Logging level: 1/fatal, 2/error, 3/warn, 4/info, 5/debug, 6/trace") builderCmd.Flags().StringP(operatorConfigFlagStr, "c", "", "operator config file path") @@ -58,77 +66,72 @@ func initBuilderCmd() *cobra.Command { builderCmd.Flags().StringSlice(enableTargetFlagStr, []string{}, "force enable a target: format:goos/goarch") builderCmd.Flags().StringSlice(disableTargetFlagStr, []string{}, "force disable target arch: format:goos/goarch") - return builderCmd + return []*cobra.Command{builderCmd} } -var builderCmd = &cobra.Command{ - Use: "builder", - Short: "Start the process as an external builder", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) - if err != nil { - builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) - return - } - if configPath == "" { - builderLog.Errorf("Missing --%s flag\n", operatorConfigFlagStr) - return - } +func runBuilderCmd(cmd *cobra.Command, args []string) { + configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) + if err != nil { + builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) + return + } + if configPath == "" { + builderLog.Errorf("Missing --%s flag\n", operatorConfigFlagStr) + return + } - quiet, err := cmd.Flags().GetBool(quietFlagStr) - if err != nil { - builderLog.Errorf("Failed to parse --%s flag %s\n", quietFlagStr, err) - } - if !quiet { - log.RootLogger.AddHook(log.NewStdoutHook(log.RootLoggerName)) - } - builderLog.Infof("Initializing Sliver external builder - %s", version.FullVersion()) + quiet, err := cmd.Flags().GetBool(quietFlagStr) + if err != nil { + builderLog.Errorf("Failed to parse --%s flag %s\n", quietFlagStr, err) + } + if !quiet { + log.RootLogger.AddHook(log.NewStdoutHook(log.RootLoggerName)) + } + builderLog.Infof("Initializing Sliver external builder - %s", version.FullVersion()) - level, err := cmd.Flags().GetInt(logLevelFlagStr) - if err != nil { - builderLog.Errorf("Failed to parse --%s flag %s\n", logLevelFlagStr, err) - return - } - log.RootLogger.SetLevel(log.LevelFrom(level)) + level, err := cmd.Flags().GetInt(logLevelFlagStr) + if err != nil { + builderLog.Errorf("Failed to parse --%s flag %s\n", logLevelFlagStr, err) + return + } + log.RootLogger.SetLevel(log.LevelFrom(level)) - defer func() { - if r := recover(); r != nil { - builderLog.Printf("panic:\n%s", debug.Stack()) - builderLog.Fatalf("stacktrace from panic: \n" + string(debug.Stack())) - os.Exit(99) - } - }() + defer func() { + if r := recover(); r != nil { + builderLog.Printf("panic:\n%s", debug.Stack()) + builderLog.Fatalf("stacktrace from panic: \n" + string(debug.Stack())) + os.Exit(99) + } + }() - externalBuilder := parseBuilderConfigFlags(cmd) - externalBuilder.Templates = []string{"sliver"} + externalBuilder := parseBuilderConfigFlags(cmd) + externalBuilder.Templates = []string{"sliver"} - // load the client configuration from the filesystem - config, err := clientAssets.ReadConfig(configPath) + // load the client configuration from the filesystem + config, err := clientAssets.ReadConfig(configPath) + if err != nil { + builderLog.Fatalf("Invalid config file: %s", err) + os.Exit(-1) + } + if externalBuilder.Name == "" { + builderLog.Infof("No builder name was specified, attempting to use hostname") + externalBuilder.Name, err = os.Hostname() if err != nil { - builderLog.Fatalf("Invalid config file: %s", err) - os.Exit(-1) - } - if externalBuilder.Name == "" { - builderLog.Infof("No builder name was specified, attempting to use hostname") - externalBuilder.Name, err = os.Hostname() - if err != nil { - builderLog.Errorf("Failed to get hostname: %s", err) - externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.Operator, runtime.GOOS) - } + builderLog.Errorf("Failed to get hostname: %s", err) + externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.Operator, runtime.GOOS) } - builderLog.Infof("Hello my name is: %s", externalBuilder.Name) + } + builderLog.Infof("Hello my name is: %s", externalBuilder.Name) - // connect to the server - builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) - rpc, ln, err := transport.MTLSConnect(config) - if err != nil { - builderLog.Errorf("Failed to connect to server: %s", err) - os.Exit(-2) - } - defer ln.Close() - builder.StartBuilder(externalBuilder, rpc) - }, + // connect to the server + builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) + rpc, ln, err := transport.MTLSConnect(config) + if err != nil { + builderLog.Errorf("Failed to connect to server: %s", err) + os.Exit(-2) + } + defer ln.Close() + builder.StartBuilder(externalBuilder, rpc) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { diff --git a/server/command/certs/certs.go b/server/command/certs/certs.go new file mode 100644 index 0000000000..aaac31e2f0 --- /dev/null +++ b/server/command/certs/certs.go @@ -0,0 +1,169 @@ +package certs + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/bishopfox/sliver/server/certs" + "github.com/spf13/cobra" +) + +// CATypes - CA types +var CATypes = map[string]string{ + "operator": certs.OperatorCA, + "mtls": certs.MtlsImplantCA, + "https": certs.HTTPSCA, +} + +const ( + // Cert flags + caTypeFlagStr = "type" + loadFlagStr = "load" + saveFlagStr = "save" +) + +// CA - Exported CA format +type CA struct { + Certificate string `json:"certificate"` + PrivateKey string `json:"private_key"` +} + +func validCATypes() []string { + types := []string{} + for caType := range CATypes { + types = append(types, caType) + } + return types +} + +// Commands returns all commands for Sliver-specific Certificates management. +func Commands() []*cobra.Command { + cmdImportCA := &cobra.Command{ + Use: "import-ca", + Short: "Import certificate authority", + Long: ``, + Run: runBuilderCmd, + } + + cmdExportCA := &cobra.Command{ + Use: "export-ca", + Short: "Export certificate authority", + Long: ``, + Run: exportCACmd, + } + + return []*cobra.Command{cmdImportCA, cmdExportCA} +} + +func runBuilderCmd(cmd *cobra.Command, args []string) { + caType, err := cmd.Flags().GetString(caTypeFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) + os.Exit(1) + } + ca, ok := CATypes[caType] + if !ok { + CAs := strings.Join(validCATypes(), ", ") + fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) + os.Exit(1) + } + + load, err := cmd.Flags().GetString(loadFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s\n", loadFlagStr, err) + os.Exit(1) + } + fi, err := os.Stat(load) + if os.IsNotExist(err) || fi.IsDir() { + fmt.Printf("Cannot load file %s\n", load) + os.Exit(1) + } + + data, err := os.ReadFile(load) + if err != nil { + fmt.Printf("Cannot read file %s", err) + os.Exit(1) + } + + importCA := &CA{} + err = json.Unmarshal(data, importCA) + if err != nil { + fmt.Printf("Failed to parse file %s", err) + os.Exit(1) + } + cert := []byte(importCA.Certificate) + key := []byte(importCA.PrivateKey) + certs.SaveCertificateAuthority(ca, cert, key) +} + +func exportCACmd(cmd *cobra.Command, args []string) { + caType, err := cmd.Flags().GetString(caTypeFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) + os.Exit(1) + } + ca, ok := CATypes[caType] + if !ok { + CAs := strings.Join(validCATypes(), ", ") + fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) + os.Exit(1) + } + + save, err := cmd.Flags().GetString(saveFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s\n", saveFlagStr, err) + os.Exit(1) + } + if save == "" { + save, _ = os.Getwd() + } + + certs.SetupCAs() + certificateData, privateKeyData, err := certs.GetCertificateAuthorityPEM(ca) + if err != nil { + fmt.Printf("Error reading CA %s\n", err) + os.Exit(1) + } + exportedCA := &CA{ + Certificate: string(certificateData), + PrivateKey: string(privateKeyData), + } + + saveTo, _ := filepath.Abs(save) + fi, err := os.Stat(saveTo) + if !os.IsNotExist(err) && !fi.IsDir() { + fmt.Printf("File already exists: %s\n", err) + os.Exit(1) + } + if !os.IsNotExist(err) && fi.IsDir() { + filename := fmt.Sprintf("%s.ca", filepath.Base(caType)) + saveTo = filepath.Join(saveTo, filename) + } + data, _ := json.Marshal(exportedCA) + err = os.WriteFile(saveTo, data, 0o600) + if err != nil { + fmt.Printf("Write failed: %s (%s)\n", saveTo, err) + os.Exit(1) + } +} diff --git a/server/core/events.go b/server/core/events.go index 4084c5b13b..d5114df3e6 100644 --- a/server/core/events.go +++ b/server/core/events.go @@ -24,6 +24,7 @@ import ( const ( // Size is arbitrary, just want to avoid weird cases where we'd block on channel sends + // // NOTE: Changed by me: when clients are one-time exec CLI commands, you don't know how // fast they connect/disconnect from their RPC.Events() call. // When the event channels are buffered, sooner or later the broker writes to a closed diff --git a/server/rpc/rpc-events.go b/server/rpc/rpc-events.go index c43f74022c..4d24840a69 100644 --- a/server/rpc/rpc-events.go +++ b/server/rpc/rpc-events.go @@ -16,10 +16,10 @@ func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer client := core.NewClient(commonName) core.Clients.Add(client) events := core.EventBroker.Subscribe() - rpcEventsLog.Infof("Client %d connected", client.ID) + rpcEventsLog.Debugf("Client %d connected", client.ID) defer func() { - rpcEventsLog.Infof("Client %d disconnected", client.ID) + rpcEventsLog.Debugf("Client %d disconnected", client.ID) core.EventBroker.Unsubscribe(events) core.Clients.Remove(client.ID) }() diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index 6a7fe8a310..ae9898f563 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -42,7 +42,7 @@ type Console struct { // input line being ultimately provided to the command parser. This might // be used by people who want to apply supplemental, specific processing // on the command input line. - PreCmdRunLineHooks []func(raw []string) (args []string, err error) + PreCmdRunLineHooks []func(args []string) ([]string, error) // PreCmdRunHooks - Once the user has entered a command, but before executing // the target command, the console will execute every function in this list. diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 7302a76f5e..27d8412a18 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -194,7 +194,7 @@ func (m *Menu) resetPreRun() { defer m.console.mutex.RUnlock() // Menu setup - m.ResetCommands() // Regenerate the commands for the menu. + m.resetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding @@ -217,7 +217,7 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) Reset() { +func (m *Menu) resetCommands() { if m.cmds != nil { m.Command = m.cmds() } diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index c26264d040..eb5b60b9c1 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -87,45 +87,6 @@ func (c *Console) Start() error { } } -// Execute is a mimic of the classic one-time cobra command execution. -// This call is thus blocking during the entire parsing/execution process -// of a command-line, but will not happen in the closed-loop console, nor -// will start it (unless the target command does it by itself). -// -// This function should be useful if you have trees of commands that can -// be executed both in closed-loop applications or in a one-off exec style. -// Normally, most command should, if your command behavior/API has no magic. -// This function also does not print any logo. -// -// The command line (os.Args) is matched against the currently active menu. -// Be sure to set and verify this menu before calling this function. -func (c *Console) ExecuteOnce() error { - // Always ensure we work with the active menu, with freshly - // generated commands, bound prompts and some other things. - menu := c.activeMenu() - menu.resetPreRun() - - c.printed = false - - if c.NewlineBefore { - fmt.Println() - } - - // Run user-provided pre-run line hooks, - // which may modify the input line args. - args, err := c.runLineHooks(os.Args) - if err != nil { - return fmt.Errorf("Line error: %s\n", err.Error()) - } - - // Run all pre-run hooks and the command itself - // Don't check the error: if its a cobra error, - // the library user is responsible for setting - // the cobra behavior. - // If it's an interrupt, we take care of it. - return c.execute(menu, args, false) -} - // RunCommand is a convenience function to run a command in a given menu. // After running, the menu commands are reset, and the prompts reloaded. func (m *Menu) RunCommand(line string) (err error) { @@ -174,12 +135,13 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) if c.isFiltered(target) { - return nil + return } // Console-wide pre-run hooks, cannot. if err = c.runPreRunHooks(); err != nil { - return fmt.Errorf("pre-run error: %s", err.Error()) + fmt.Printf("Pre-run error: %s\n", err.Error()) + return } // Assign those arguments to our parser. diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go index 0d7992dc91..2da490bb65 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/tab-completer.go @@ -114,7 +114,7 @@ func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { - menu.ResetCommands() + menu.resetCommands() c.hideFilteredCommands() } diff --git a/vendor/modules.txt b/vendor/modules.txt index 530fae1ca6..b74b65565f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -515,7 +515,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console +# github.com/reeflective/console v0.1.6 ## explicit; go 1.20 github.com/reeflective/console github.com/reeflective/console/commands/readline From f3e02c040f4a2efd6aa92c4c7c49a34494a5a93f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 21 Jul 2023 18:42:53 +0200 Subject: [PATCH 013/109] Comment server-binary entry and refactor other entries --- client/cli/cli.go | 22 +-- client/command/console/console.go | 2 +- client/command/server.go | 15 +- server/cli/cli.go | 241 ++++++++++++------------------ 4 files changed, 111 insertions(+), 169 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index d3f9299685..28ecb4c727 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,6 +24,7 @@ import ( "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" + "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -32,31 +33,34 @@ import ( func Execute() { con := newSliverTeam() - serverCmds := command.ServerCommands(con, nil)() - serverCmds.Use = "sliver-client" - - // Version - serverCmds.AddCommand(cmdVersion) - preRun := func(_ *cobra.Command, _ []string) error { return con.Teamclient.Connect() } - serverCmds.PersistentPreRunE = preRun - postRun := func(_ *cobra.Command, _ []string) error { return con.Teamclient.Disconnect() } // serverCmds.PersistentPostRunE = postRun + teamclientCmds := func() *cobra.Command { + return commands.Generate(con.Teamclient) + } // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with // other command trees below, such as the implant one. - consoleServerCmds := command.ServerCommands(con, nil) + consoleServerCmds := command.ServerCommands(con, teamclientCmds) consoleSliverCmds := command.SliverCommands(con) + serverCmds := command.ServerCommands(con, teamclientCmds)() + serverCmds.Use = "sliver-client" + + // Version + serverCmds.AddCommand(cmdVersion) + + serverCmds.PersistentPreRunE = preRun + serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) // Implant. diff --git a/client/command/console/console.go b/client/command/console/console.go index 5a38decd79..09ee56e1c2 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -32,7 +32,7 @@ func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) RunE: func(cmd *cobra.Command, args []string) error { con.IsCLI = false - // Bind commands to the app + // Bind commands to the closed-loop console. server := con.App.Menu(consts.ServerMenu) server.SetCommands(serverCmds) diff --git a/client/command/server.go b/client/command/server.go index 819eed345e..fc391548ad 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -41,6 +41,7 @@ import ( "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" + // "github.com/bishopfox/sliver/client/command/taskmany". "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -48,15 +49,12 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" - teamclientCmds "github.com/reeflective/team/client/commands" - "github.com/reeflective/team/server" - teamserverCmds "github.com/reeflective/team/server/commands" "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serv *server.Server) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds console.Commands) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -65,14 +63,9 @@ func ServerCommands(con *client.SliverClient, serv *server.Server) console.Comma }, } - if serv != nil { + if serverCmds != nil { server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - teamserverCmds := teamserverCmds.Generate(serv, con.Teamclient) - server.AddCommand(teamserverCmds) - } else { - server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - teamclientCmds := teamclientCmds.Generate(con.Teamclient) - server.AddCommand(teamclientCmds) + server.AddCommand(serverCmds()) } // [ Bind commands ] -------------------------------------------------------- diff --git a/server/cli/cli.go b/server/cli/cli.go index 7dc51ac23b..71d4424864 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -22,10 +22,14 @@ import ( "fmt" "os" + "github.com/reeflective/console" + "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" + client "github.com/bishopfox/sliver/client/console" assetsCmds "github.com/bishopfox/sliver/server/command/assets" builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" @@ -38,31 +42,98 @@ import ( "github.com/bishopfox/sliver/server/cryptography" ) -const ( +// Execute the sliver server binary. +func Execute() { + // Create a self-serving teamserver: + // This teamserver creates an in-memory -gRPC-transported- teamclient + // (which is not yet connected). The server is also able to serve remote + // clients, although no persistent/network listeners are started by default. + // + // This teamclient is used to create a Sliver Client, which functioning + // is agnostic to its execution mode (one-exec CLI, or closed-loop console). + // The client has no commands available yet. + teamserver, con := newSliverTeam() - // Unpack flags - forceFlagStr = "force" + // Prepare the entire Sliver Command-line Interface as yielder functions: + // - Server commands are all commands which don't need an active Sliver implant. + // These commands include a server-binary-specific set of "teamserver" commands. + // - Sliver commands are all commands requiring an active target. + serverCmds, sliverCmds := getSliverCommands(teamserver, con) + + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + rootCmd := serverCmds() + rootCmd.Use = "sliver-server" + rootCmd.PersistentPreRunE = preRunServer(teamserver, con) + + // Bind additional commands peculiar to the one-exec CLI. + // NOTE: Down the road these commands should probably stripped of their + // os.Exit() calls and adapted so that they can be used in the console too. + rootCmd.AddCommand(versionCmd) + rootCmd.AddCommand(assetsCmds.Commands()...) + rootCmd.AddCommand(builderCmds.Commands()...) + rootCmd.AddCommand(certsCmds.Commands()...) + + // Bind the closed-loop console: + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) + + // Completion setup: + // Following the same logic as the console command, we only generate and setup + // completions in our root command tree instance. This setup is not needed in + // the command yielder functions themselves, because the closed-loop console + // takes care of its own completion/API interfacing. + comps := carapace.Gen(rootCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + rootCmd.PersistentPreRunE(cmd, args) + }) + comps.PostRun(func(cmd *cobra.Command, args []string) { + con.Teamclient.Disconnect() + }) - // Operator flags - nameFlagStr = "name" - lhostFlagStr = "lhost" - lportFlagStr = "lport" - saveFlagStr = "save" + // Run the target Sliver command: + // Three different examples here, to illustrate. + // + // - `sliver generate --os linux` starts the server, ensuring assets are unpacked, etc. + // Once ready, the generate command is executed (from the client, passed to the server + // via the in-memory RPC, and executed, compiled, then returned to the client). + // When the binary exits, an implant is compiled and available client-side (locally here). + // + // - `sliver console` starts the console, and everything works like it ever did. + // On top of that, you can access and use the entire `teamserver` control commands to + // start/close/delete client listeners, create/delete users, manage CAs, show status, etc. + // + // - `sliver teamserver serve` is a teamserver-tree specific command, and the teamserver + // set above in the init() code has been given a single hook to register its RPC backend. + // The call blocks like your old daemon command, and works _just the same_. + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} - // Cert flags - caTypeFlagStr = "type" - loadFlagStr = "load" -) +// getSliverCommands wraps the `teamserver` specific commands in a command yielder function, passes those +// server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode +// agnostic Command-Line-Interface for the Sliver Framework. +func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { + teamserverCmds := func() *cobra.Command { + return commands.Generate(teamserver, con.Teamclient) + } -// Execute - Execute root command -func Execute() { - // Console interface, started closed-loop or not. - // Teamserver/client API and commands for remote/local CLI. - teamserver, con := newSliverTeam() + serverCmds := command.ServerCommands(con, teamserverCmds) + sliverCmds := command.SliverCommands(con) + + return serverCmds, sliverCmds +} - // Pre-runners to self-connect - preRun := func(cmd *cobra.Command, _ []string) error { - // Ensure the server has what it needs +// preRunServer is the server-binary-specific pre-run; it ensures that the server +// has everything it needs to perform any client-side command/task. +func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(_ *cobra.Command, _ []string) error { + // Ensure the server has what it needs. assets.Setup(false, true) certs.SetupCAs() certs.SetupWGKeys() @@ -73,69 +144,11 @@ func Execute() { serverConfig := configs.GetServerConfig() c2.StartPersistentJobs(serverConfig) - // Let our runtime teamclient be served. - if err := teamserver.Serve(con.Teamclient); err != nil { - return err - } - - return nil - } - - serverCmds := command.ServerCommands(con, teamserver)() - serverCmds.Use = "sliver-server" - - serverCmds.PersistentPreRunE = preRun - - serverCmds.AddCommand(versionCmd) - serverCmds.AddCommand(assetsCmds.Commands()...) - serverCmds.AddCommand(builderCmds.Commands()...) - serverCmds.AddCommand(certsCmds.Commands()...) - - // Console - consoleServerCmds := command.ServerCommands(con, teamserver) - consoleSliverCmds := command.SliverCommands(con) - serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) - - // Completions - comps := carapace.Gen(serverCmds) - comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) - }) - comps.PostRun(func(cmd *cobra.Command, args []string) { - con.Teamclient.Disconnect() - }) - - if err := serverCmds.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + // Let our in-memory teamclient be served. + return teamserver.Serve(con.Teamclient) } } -// func init() { -// // Console interface, started closed-loop or not. -// con := console.NewConsole(false) -// -// // Teamserver/client API and commands for remote/local CLI. -// teamserver, teamclient := newSliverTeam(con) -// // teamserverCmds := commands.Generate(teamserver, teamclient) -// -// con.Teamclient = teamclient -// -// // Bind commands to the app -// server := con.App.Menu(consts.ServerMenu) -// server.SetCommands(command.ServerCommands(con, teamserver)) -// -// serverCmds := command.ServerCommands(con, teamserver)() -// -// // server.Reset() -// // sliver := con.App.Menu(consts.ImplantMenu) -// // sliver.SetCommands(command.SliverCommands(con)) -// // rootCmd = server.Command -// // rootCmd.Use = "sliver-server" -// -// // rootCmd.AddCommand(teamserverCmds) -// -// // Pre-runners to self-connect // preRun := func(cmd *cobra.Command, _ []string) error { // // Ensure the server has what it needs // assets.Setup(false, true) @@ -164,71 +177,3 @@ func Execute() { // console.StartClient(con, nil, nil) // return nil // } -// // return nil -// -// serverCmds.PersistentPreRunE = preRun -// -// serverCmds.AddCommand(consoleCmd(con)) -// -// // Unpack -// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") -// serverCmds.AddCommand(unpackCmd) -// -// // Certs -// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") -// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// serverCmds.AddCommand(cmdExportCA) -// -// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") -// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// serverCmds.AddCommand(cmdImportCA) -// -// // Builder -// // rootCmd.AddCommand(initBuilderCmd()) -// -// // Version -// // rootCmd.AddCommand(versionCmd) -// -// // Completions -// comps := carapace.Gen(serverCmds) -// comps.PreRun(func(cmd *cobra.Command, args []string) { -// preRun(cmd, args) -// }) -// } - -// var rootCmd = &cobra.Command{ -// Use: "sliver-server", -// Short: "", -// Long: ``, -// Run: func(cmd *cobra.Command, args []string) { -// // Root command starts the server normally -// -// appDir := assets.GetRootAppDir() -// logFile := initConsoleLogging(appDir) -// defer logFile.Close() -// -// defer func() { -// if r := recover(); r != nil { -// log.Printf("panic:\n%s", debug.Stack()) -// fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) -// os.Exit(99) -// } -// }() -// -// assets.Setup(false, true) -// certs.SetupCAs() -// certs.SetupWGKeys() -// cryptography.AgeServerKeyPair() -// cryptography.MinisignServerPrivateKey() -// -// serverConfig := configs.GetServerConfig() -// c2.StartPersistentJobs(serverConfig) -// console.StartPersistentJobs(serverConfig) -// if serverConfig.DaemonMode { -// daemon.Start(daemon.BlankHost, daemon.BlankPort) -// } else { -// os.Args = os.Args[:1] // Hide cli from grumble console -// console.Start() -// } -// }, -// } From 6e6b774d14da2ef60f0b2025e285e132fa12104c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 21 Jul 2023 22:04:30 +0200 Subject: [PATCH 014/109] Comment client entrypoints, remove useless files --- client/cli/cli.go | 115 +++++++++++++++++++++++++++------------ client/cli/teamclient.go | 40 -------------- server/cli/cli.go | 80 ++++++++++++++++++++++++++- server/cli/teamserver.go | 68 ----------------------- 4 files changed, 159 insertions(+), 144 deletions(-) delete mode 100644 client/cli/teamclient.go delete mode 100644 server/cli/teamserver.go diff --git a/client/cli/cli.go b/client/cli/cli.go index 28ecb4c727..c7e4749283 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -22,65 +22,112 @@ import ( "fmt" "os" + teamclient "github.com/reeflective/team/client" + teamGrpc "github.com/reeflective/team/transports/grpc/client" + "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" + client "github.com/bishopfox/sliver/client/console" + "github.com/reeflective/console" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) -// Execute - Execute root command. +// Execute - Run the sliver-client binary. func Execute() { - con := newSliverTeam() - - preRun := func(_ *cobra.Command, _ []string) error { - return con.Teamclient.Connect() - } - - postRun := func(_ *cobra.Command, _ []string) error { - return con.Teamclient.Disconnect() - } - - // serverCmds.PersistentPostRunE = postRun - teamclientCmds := func() *cobra.Command { - return commands.Generate(con.Teamclient) - } - - // Client console. - // All commands and RPC connection are generated WITHIN the command RunE(): - // that means there should be no redundant command tree/RPC connections with - // other command trees below, such as the implant one. - consoleServerCmds := command.ServerCommands(con, teamclientCmds) - consoleSliverCmds := command.SliverCommands(con) - - serverCmds := command.ServerCommands(con, teamclientCmds)() - serverCmds.Use = "sliver-client" + // Create a client-only (remote TLS-transported connections) + // Sliver Client, prepared with a working reeflective/teamclient. + // The teamclient automatically handles remote teamserver configuration + // prompting/loading and use, as well as other things. + con := newSliverClient() + + // Prepare the entire Sliver Command-line Interface as yielder functions. + serverCmds, sliverCmds := getSliverCommands(con) + + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + rootCmd := serverCmds() + rootCmd.Use = "sliver-client" // Needed by completion scripts. + rootCmd.PersistentPreRunE = preRunClient(con) + rootCmd.PersistentPostRunE = postRunClient(con) // Version - serverCmds.AddCommand(cmdVersion) - - serverCmds.PersistentPreRunE = preRun + rootCmd.AddCommand(cmdVersion) - serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) + // Bind the closed-loop console: + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) // Implant. // The implant command allows users to run commands on slivers from their // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - serverCmds.AddCommand(implantCmd(con)) + rootCmd.AddCommand(implantCmd(con)) // Completions - comps := carapace.Gen(serverCmds) + // Following the same logic as the console command, we only generate + // and setup completions in our root command tree instance. We also + // ensure that we correctly disconnect from the server on each run. + comps := carapace.Gen(rootCmd) comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) + rootCmd.PersistentPreRunE(cmd, args) }) comps.PostRun(func(cmd *cobra.Command, args []string) { - postRun(cmd, args) + rootCmd.PersistentPostRunE(cmd, args) }) - if err := serverCmds.Execute(); err != nil { + // Run the sliver client binary. + if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } } + +// newSliverClient creates a new application teamclient. +// From this teamclient, configured to work with TLS connections +// to remote teamservers, generate a new Sliver Client. +func newSliverClient() *client.SliverClient { + gTeamclient := teamGrpc.NewTeamClient() + + con, opts := client.NewSliverClient(gTeamclient) + + teamclient, err := teamclient.New("sliver", gTeamclient, opts...) + if err != nil { + panic(err) + } + + con.Teamclient = teamclient + + return con +} + +// getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. +func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { + teamserverCmds := func() *cobra.Command { + return commands.Generate(con.Teamclient) + } + + serverCmds := command.ServerCommands(con, teamserverCmds) + sliverCmds := command.SliverCommands(con) + + return serverCmds, sliverCmds +} + +// Before running any CLI entry command, require the Sliver client to connect to a teamserver. +func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(_ *cobra.Command, _ []string) error { + return con.Teamclient.Connect() + } +} + +// After running any CLI entry command, correctly disconnect from the server. +func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(_ *cobra.Command, _ []string) error { + return con.Teamclient.Disconnect() + } +} diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go deleted file mode 100644 index c3cb3c6d86..0000000000 --- a/client/cli/teamclient.go +++ /dev/null @@ -1,40 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "github.com/bishopfox/sliver/client/console" - "github.com/reeflective/team/client" - teamGrpc "github.com/reeflective/team/transports/grpc/client" -) - -func newSliverTeam() *console.SliverClient { - gTeamclient := teamGrpc.NewTeamClient() - - con, opts := console.NewSliverClient(gTeamclient) - - teamclient, err := client.New("sliver", gTeamclient, opts...) - if err != nil { - panic(err) - } - - con.Teamclient = teamclient - - return con -} diff --git a/server/cli/cli.go b/server/cli/cli.go index 71d4424864..eb65445b2c 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -19,9 +19,17 @@ package cli */ import ( + "errors" "fmt" + "log" "os" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/rpc" + teamserver "github.com/reeflective/team/server" + teamGrpc "github.com/reeflective/team/transports/grpc/server" + "google.golang.org/grpc" + "github.com/reeflective/console" "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" @@ -52,7 +60,7 @@ func Execute() { // This teamclient is used to create a Sliver Client, which functioning // is agnostic to its execution mode (one-exec CLI, or closed-loop console). // The client has no commands available yet. - teamserver, con := newSliverTeam() + teamserver, con := newSliverServer() // Prepare the entire Sliver Command-line Interface as yielder functions: // - Server commands are all commands which don't need an active Sliver implant. @@ -64,7 +72,7 @@ func Execute() { // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with // a pre-runner ensuring the server and its teamclient are set up and connected. rootCmd := serverCmds() - rootCmd.Use = "sliver-server" + rootCmd.Use = "sliver-server" // Needed by completion scripts. rootCmd.PersistentPreRunE = preRunServer(teamserver, con) // Bind additional commands peculiar to the one-exec CLI. @@ -115,6 +123,74 @@ func Execute() { } } +// newSliverServer creates a new application teamserver. +// The gRPC listener is hooked with an in-memory teamclient, and the latter +// is passed to our client console package to create a new SliverClient. +func newSliverServer() (*teamserver.Server, *client.SliverClient) { + // + // 1) Teamserver --------- + // + + // NOTE: Teamserver gRPC stack. + // The teamserver stack is for now contained in a package of the third-party + // module github.com/reeflective/team: + // 1) The listener is pre-set with all gRPC transport,auth and middleware logging. + // 2) This listener could be partially/fully reimplemented within the Sliver repo. + gTeamserver := teamGrpc.NewListener() + + // NOTE: This might not be needed if 2) above is chosen. + // The listener obviously works with gRPC servers, so we need to pass + // a hook for service binding before starting those gRPC HTTP/2 listeners. + gTeamserver.PostServe(func(grpcServer *grpc.Server) error { + if grpcServer == nil { + return errors.New("No gRPC server to use for service") + } + + rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) + + return nil + }) + + // Here is an import step, where we are given a change to setup + // the reeflective/teamserver with everything we want: our own + // database, the application daemon default port, loggers or files, + // directories, and much more. + var serverOpts []teamserver.Options + serverOpts = append(serverOpts, + teamserver.WithDefaultPort(31337), + teamserver.WithListener(gTeamserver), + ) + + // Create the application teamserver. + // Any error is critical, and means we can't work correctly. + teamserver, err := teamserver.New("sliver", serverOpts...) + if err != nil { + log.Fatal(err) + } + + // + // 2) Teamclient --------- + // + + // The gRPC teamserver backend is hooked to produce a single + // in-memory teamclient RPC/dialer backend. Not encrypted. + gTeamclient := teamGrpc.NewClientFrom(gTeamserver) + + // Pass the gRPC teamclient backend to our console package, + // with registers a hook to bind its RPC client and start + // monitoring events/logs/etc when asked to connect. + // + // The options returned are used to dictate to the server + // how it should configure and run its self-teamclient. + sliver, opts := client.NewSliverClient(gTeamclient) + + // And let the server create its own teamclient, + // pass to the Sliver client for normal usage. + sliver.Teamclient = teamserver.Self(opts...) + + return teamserver, sliver +} + // getSliverCommands wraps the `teamserver` specific commands in a command yielder function, passes those // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go deleted file mode 100644 index 84107e7c81..0000000000 --- a/server/cli/teamserver.go +++ /dev/null @@ -1,68 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "errors" - "log" - - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/rpc" - "github.com/reeflective/team/server" - teamGrpc "github.com/reeflective/team/transports/grpc/server" - "google.golang.org/grpc" -) - -func newSliverTeam() (*server.Server, *console.SliverClient) { - // Teamserver - gTeamserver := teamGrpc.NewListener() - - bindServer := func(grpcServer *grpc.Server) error { - if grpcServer == nil { - return errors.New("No gRPC server to use for service") - } - - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - - return nil - } - - var serverOpts []server.Options - serverOpts = append(serverOpts, - server.WithDefaultPort(31337), - server.WithListener(gTeamserver), - ) - - gTeamserver.PostServe(bindServer) - - teamserver, err := server.New("sliver", serverOpts...) - if err != nil { - log.Fatal(err) - } - - // Teamclient - gTeamclient := teamGrpc.NewClientFrom(gTeamserver) - - sliver, opts := console.NewSliverClient(gTeamclient) - - sliver.Teamclient = teamserver.Self(opts...) - - return teamserver, sliver -} From 1711475db88ef0ca4fe49812b23113a1248688ee Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 22 Jul 2023 06:53:53 +0200 Subject: [PATCH 015/109] Clean client console a bit --- client/console/console.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index 4a75915d18..19888b5759 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -109,16 +109,22 @@ type SliverClient struct { Teamclient *client.Client } +// NewSliverClient is the general-purpose Sliver Client constructor. func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.Options) { - con := newConsole(false) + // Generate the console client, setting up menus, etc. + con := newConsole() + // The teamclient requires hooks to bind RPC clients around its connection. + // NOTE: this might not be needed either if Sliver uses its own teamclient backend. bindClient := func(clientConn any) error { grpcClient, ok := clientConn.(*grpc.ClientConn) if !ok || grpcClient == nil { return errors.New("No gRPC client to use for service") } - startClient(con, grpcClient) + // Register our core Sliver RPC client, and start monitoring + // events, tunnels, logs, and all. + con.connect(grpcClient) return nil } @@ -134,7 +140,7 @@ func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.O // newConsole creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func newConsole(isServer bool) *SliverClient { +func newConsole() *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() @@ -147,14 +153,13 @@ func newConsole(isServer bool) *SliverClient { EventListeners: &sync.Map{}, BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, BeaconTaskCallbacksMutex: &sync.Mutex{}, - IsServer: isServer, Settings: settings, IsCLI: true, } - // The active target needs access to the console - // to automatically switch between command menus. - con.ActiveTarget.con = con + con.App.SetPrintLogo(func(_ *console.Console) { + con.PrintLogo() + }) // Readline-shell (edition) settings if settings.VimMode { @@ -179,17 +184,16 @@ func newConsole(isServer bool) *SliverClient { sliver.Prompt().Primary = con.GetPrompt sliver.AddInterrupt(io.EOF, con.exitImplantMenu) // Ctrl-D - con.App.SetPrintLogo(func(_ *console.Console) { - con.PrintLogo() - }) + // The active target needs access to the console + // to automatically switch between command menus. + con.ActiveTarget.con = con return con } -// Init requires a working RPC connection to the sliver server, and 2 different sets of commands. -// If run is true, the console application is started, making this call blocking. Otherwise, commands and -// RPC connection are bound to the console (making the console ready to run), but the console does not start. -func startClient(con *SliverClient, conn *grpc.ClientConn) { +// connect requires a working gRPC connection to the sliver server. +// It starts monitoring events, implant tunnels and client logs streams. +func (con *SliverClient) connect(conn *grpc.ClientConn) { con.Rpc = rpcpb.NewSliverRPCClient(conn) // The console application needs to query the terminal for cursor positions @@ -335,7 +339,6 @@ func (con *SliverClient) startEventLoop() { case consts.BeaconTaskResultEvent: con.triggerBeaconTaskCallback(event.Data) - } con.triggerReactions(event) From 334f8dd7a75775870028b52938bad0aaef16325d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 22 Jul 2023 23:14:39 +0200 Subject: [PATCH 016/109] Simplify pre-runners binding --- client/cli/cli.go | 25 ++++--------- client/command/server.go | 74 +++++++++++++++++++++++++++++++++++++ client/transport/mtls.go | 10 ++--- server/cli/cli.go | 45 +++++++++++----------- server/cli/version.go | 3 +- server/console/console.go | 4 +- server/encoders/encoders.go | 7 ++-- 7 files changed, 116 insertions(+), 52 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index c7e4749283..cdccc4fdc6 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -22,14 +22,13 @@ import ( "fmt" "os" - teamclient "github.com/reeflective/team/client" - teamGrpc "github.com/reeflective/team/transports/grpc/client" - "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" + teamclient "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" + teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -46,12 +45,10 @@ func Execute() { serverCmds, sliverCmds := getSliverCommands(con) // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with + // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. rootCmd := serverCmds() rootCmd.Use = "sliver-client" // Needed by completion scripts. - rootCmd.PersistentPreRunE = preRunClient(con) - rootCmd.PersistentPostRunE = postRunClient(con) // Version rootCmd.AddCommand(cmdVersion) @@ -69,17 +66,11 @@ func Execute() { // command completion/filtering purposes. rootCmd.AddCommand(implantCmd(con)) - // Completions - // Following the same logic as the console command, we only generate - // and setup completions in our root command tree instance. We also - // ensure that we correctly disconnect from the server on each run. - comps := carapace.Gen(rootCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - rootCmd.PersistentPreRunE(cmd, args) - }) - comps.PostRun(func(cmd *cobra.Command, args []string) { - rootCmd.PersistentPostRunE(cmd, args) - }) + // Pre/post runners and completions. + command.BindRunners(rootCmd, true, preRunClient(con)) + // command.BindRunners(rootCmd, false, postRunClient(con)) + + carapace.Gen(rootCmd) // Run the sliver client binary. if err := rootCmd.Execute(); err != nil { diff --git a/client/command/server.go b/client/command/server.go index fc391548ad..d73bc46914 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -49,6 +49,7 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" + "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -141,3 +142,76 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso return serverCommands } + +// BindRunners is used to register specific pre/post-runs for a given command/tree. +// +// This function is special in that it will only bind the pre/post-runners to commands +// in the tree if they have a non-nil Run/RunE function, or if they are leaf commands. +// +// This allows us to optimize client-to-server connections for things like completions. +func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { + for _, cmd := range root.Commands() { + ePreE := cmd.PersistentPreRunE + ePostE := cmd.PersistentPostRunE + run, runE := cmd.Run, cmd.RunE + + // Don't modify commands in charge on their own tree. + if pre && ePreE != nil { + continue + } else if ePostE != nil { + continue + } + + // Always go to find the leaf commands, irrespective + // of what we do with this parent command. + if cmd.HasSubCommands() { + BindRunners(cmd, pre, runs...) + } + + // If the command has no runners, there's nothing to bind: + // If it has flags, any child command requiring them should + // trigger the prerunners, which will connect to the server. + if run == nil && runE == nil { + continue + } + + // Else we have runners, bind the pre-runs if possible. + if pre && cmd.PreRunE != nil { + continue + } else if cmd.PostRunE != nil { + continue + } + + // Compound all runners together. + cRun := func(c *cobra.Command, args []string) error { + for _, run := range runs { + err := run(c, args) + if err != nil { + return err + } + } + + return nil + } + + // Bind + if pre { + cmd.PreRunE = cRun + } else { + cmd.PostRunE = cRun + } + + // Completions use this pre-runner as well. + cmdComps := carapace.Gen(cmd) + + completionRun := func(c *cobra.Command, args []string) { + cRun(c, args) + } + + if pre { + cmdComps.PreRun(completionRun) + } else { + cmdComps.PostRun(completionRun) + } + } +} diff --git a/client/transport/mtls.go b/client/transport/mtls.go index 880e1319c5..f8e67f96c4 100644 --- a/client/transport/mtls.go +++ b/client/transport/mtls.go @@ -27,11 +27,10 @@ import ( "os" "time" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/rpcpb" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) const ( @@ -39,7 +38,7 @@ const ( mb = kb * 1024 gb = mb * 1024 - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte defaultTimeout = time.Duration(10 * time.Second) @@ -60,7 +59,7 @@ func (TokenAuth) RequireTransportSecurity() bool { return true } -// MTLSConnect - Connect to the sliver server +// MTLSConnect - Connect to the sliver server. func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.ClientConn, error) { tlsConfig, err := getTLSConfig(config.CACertificate, config.Certificate, config.PrivateKey) if err != nil { @@ -84,7 +83,6 @@ func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.Clie } func getTLSConfig(caCertificate string, certificate string, privateKey string) (*tls.Config, error) { - certPEM, err := tls.X509KeyPair([]byte(certificate), []byte(privateKey)) if err != nil { log.Printf("Cannot parse client certificate: %v", err) diff --git a/server/cli/cli.go b/server/cli/cli.go index eb65445b2c..2c155be58d 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -24,30 +24,35 @@ import ( "log" "os" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/rpc" - teamserver "github.com/reeflective/team/server" - teamGrpc "github.com/reeflective/team/transports/grpc/server" - "google.golang.org/grpc" - + // CLI dependencies "github.com/reeflective/console" - "github.com/reeflective/team/server" - "github.com/reeflective/team/server/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" + // Teamserver/teamclient dependencies + "github.com/reeflective/team/server" + teamserver "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" + teamGrpc "github.com/reeflective/team/transports/grpc/server" + "google.golang.org/grpc" + + // Sliver Client core, and generic/server-only commands "github.com/bishopfox/sliver/client/command" + consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" assetsCmds "github.com/bishopfox/sliver/server/command/assets" builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" + "github.com/bishopfox/sliver/server/encoders" - consoleCmd "github.com/bishopfox/sliver/client/command/console" + // Server-only imports + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" + "github.com/bishopfox/sliver/server/rpc" ) // Execute the sliver server binary. @@ -57,7 +62,7 @@ func Execute() { // (which is not yet connected). The server is also able to serve remote // clients, although no persistent/network listeners are started by default. // - // This teamclient is used to create a Sliver Client, which functioning + // The server-only teamclient is used to create a Sliver Client, which functioning // is agnostic to its execution mode (one-exec CLI, or closed-loop console). // The client has no commands available yet. teamserver, con := newSliverServer() @@ -73,7 +78,6 @@ func Execute() { // a pre-runner ensuring the server and its teamclient are set up and connected. rootCmd := serverCmds() rootCmd.Use = "sliver-server" // Needed by completion scripts. - rootCmd.PersistentPreRunE = preRunServer(teamserver, con) // Bind additional commands peculiar to the one-exec CLI. // NOTE: Down the road these commands should probably stripped of their @@ -90,17 +94,11 @@ func Execute() { rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) // Completion setup: - // Following the same logic as the console command, we only generate and setup - // completions in our root command tree instance. This setup is not needed in - // the command yielder functions themselves, because the closed-loop console - // takes care of its own completion/API interfacing. - comps := carapace.Gen(rootCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - rootCmd.PersistentPreRunE(cmd, args) - }) - comps.PostRun(func(cmd *cobra.Command, args []string) { - con.Teamclient.Disconnect() - }) + carapace.Gen(rootCmd) + command.BindRunners(rootCmd, true, preRunServer(teamserver, con)) + // command.BindRunners(rootCmd, false, func(_ *cobra.Command, _ []string) error { + // return con.Teamclient.Disconnect() + // }) // Run the target Sliver command: // Three different examples here, to illustrate. @@ -115,7 +113,7 @@ func Execute() { // start/close/delete client listeners, create/delete users, manage CAs, show status, etc. // // - `sliver teamserver serve` is a teamserver-tree specific command, and the teamserver - // set above in the init() code has been given a single hook to register its RPC backend. + // set above in the code has been given a single hook to register its RPC backend. // The call blocks like your old daemon command, and works _just the same_. if err := rootCmd.Execute(); err != nil { fmt.Println(err) @@ -211,6 +209,7 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c return func(_ *cobra.Command, _ []string) error { // Ensure the server has what it needs. assets.Setup(false, true) + encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? certs.SetupCAs() certs.SetupWGKeys() cryptography.AgeServerKeyPair() diff --git a/server/cli/version.go b/server/cli/version.go index b9784e35bb..c3af479bf8 100644 --- a/server/cli/version.go +++ b/server/cli/version.go @@ -21,8 +21,9 @@ package cli import ( "fmt" - "github.com/bishopfox/sliver/client/version" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/version" ) var versionCmd = &cobra.Command{ diff --git a/server/console/console.go b/server/console/console.go index 44e4d5f1e8..e8fdeeee5c 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -60,10 +60,10 @@ func Start() { fmt.Printf(Warn+"Error in HTTP C2 config: %s\n", err) } - con := console.NewConsole(false) + // con := console.NewConsole(false) // console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) - con.App.Start() + // con.App.Start() } // serverOnlyCmds - Server only commands diff --git a/server/encoders/encoders.go b/server/encoders/encoders.go index b3ddd766d8..51ad576fdc 100644 --- a/server/encoders/encoders.go +++ b/server/encoders/encoders.go @@ -51,7 +51,9 @@ var ( Nop = util.NoEncoder{} ) -func init() { +// Setup is an init function to automatically setup default encoders. +// Called in the root sliver server binary command pre-runners. +func Setup() { util.SetEnglishDictionary(assets.English()) TrafficEncoderFS = PassthroughEncoderFS{ rootDir: filepath.Join(assets.GetRootAppDir(), "traffic-encoders"), @@ -90,7 +92,7 @@ func SaveTrafficEncoder(name string, wasmBin []byte) error { return fmt.Errorf("invalid encoder name, must end with .wasm") } wasmFilePath := filepath.Join(assets.GetTrafficEncoderDir(), filepath.Base(name)) - err := os.WriteFile(wasmFilePath, wasmBin, 0600) + err := os.WriteFile(wasmFilePath, wasmBin, 0o600) if err != nil { return err } @@ -127,7 +129,6 @@ func RemoveTrafficEncoder(name string) error { // loadTrafficEncodersFromFS - Loads the wasm traffic encoders from the filesystem, for the // server these will be loaded from: /traffic-encoders/*.wasm func loadTrafficEncodersFromFS(encodersFS util.EncoderFS, logger func(string)) error { - // Reset references pointing to traffic encoders for _, encoder := range TrafficEncoderMap { delete(EncoderMap, encoder.ID) From bb59e1efabeb5e118bf1cff9731dea7ad93519c3 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 22 Jul 2023 23:58:25 +0200 Subject: [PATCH 017/109] Add gRPC teamserver/client backend, no code removed yet. --- client/cli/cli.go | 4 +- client/console/console.go | 4 +- client/transport/client.go | 189 +++++++++++++ client/transport/middleware.go | 99 +++++++ client/transport/mtls.go | 29 +- server/cli/cli.go | 6 +- server/console/console.go | 1 - server/transport/local.go | 64 ----- server/transport/middleware-old.go.old | 296 ++++++++++++++++++++ server/transport/middleware.go | 372 ++++++++++--------------- server/transport/mtls.go | 15 +- server/transport/rpc.go | 73 +++++ server/transport/server.go | 205 ++++++++++++++ server/transport/tailscale.go | 8 +- 14 files changed, 1022 insertions(+), 343 deletions(-) create mode 100644 client/transport/client.go create mode 100644 client/transport/middleware.go delete mode 100644 server/transport/local.go create mode 100644 server/transport/middleware-old.go.old create mode 100644 server/transport/rpc.go create mode 100644 server/transport/server.go diff --git a/client/cli/cli.go b/client/cli/cli.go index cdccc4fdc6..892b335858 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -25,10 +25,10 @@ import ( "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/transport" "github.com/reeflective/console" teamclient "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" - teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -83,7 +83,7 @@ func Execute() { // From this teamclient, configured to work with TLS connections // to remote teamservers, generate a new Sliver Client. func newSliverClient() *client.SliverClient { - gTeamclient := teamGrpc.NewTeamClient() + gTeamclient := transport.NewTeamClient() con, opts := client.NewSliverClient(gTeamclient) diff --git a/client/console/console.go b/client/console/console.go index 19888b5759..aa583a7a3a 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -38,6 +38,7 @@ import ( "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/client/spin" + "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -46,7 +47,6 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" - teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" @@ -110,7 +110,7 @@ type SliverClient struct { } // NewSliverClient is the general-purpose Sliver Client constructor. -func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.Options) { +func NewSliverClient(teamclient *transport.Teamclient) (*SliverClient, []client.Options) { // Generate the console client, setting up menus, etc. con := newConsole() diff --git a/client/transport/client.go b/client/transport/client.go new file mode 100644 index 0000000000..06130f59df --- /dev/null +++ b/client/transport/client.go @@ -0,0 +1,189 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/reeflective/team" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. + ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte + + defaultTimeout = 10 * time.Second +) + +var ( + // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client + // connection is available. The error is raised when the handler hasn't connected. + ErrNoRPC = errors.New("no working grpc.Teamclient available") + + // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try + // connecting with, TLS credentials. If such an error is raised, make sure your team + // client has correctly fetched -using client.Config()- a remote teamserver config. + ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") +) + +// Teamclient is a simple example gRPC teamclient and dialer backend. +// It comes correctly configured with Mutual TLS authentication and +// RPC connection/registration/use when created with NewTeamClient(). +// +// This teamclient embeds a team/client.Client core driver and uses +// it for fetching/setting up the transport credentials, dialers, etc... +// It also has a few internal types (clientConns, options) for working. +// +// Note that this teamclient is not able to be used as an in-memory dialer. +// See the counterpart `team/transports/grpc/server` package for creating one. +// Also note that this example transport has been made for a single use-case, +// and that your program might require more elaborated behavior. +// In this case, please use this simple code as a reference for what/not to do. +type Teamclient struct { + *client.Client + conn *grpc.ClientConn + rpc proto.TeamClient + options []grpc.DialOption +} + +// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. +// This client has by default only a few options, like max message buffer size. +// All options passed to this call are stored as is and will be used later. +func NewTeamClient(opts ...grpc.DialOption) *Teamclient { + client := &Teamclient{ + options: opts, + } + + client.options = append(client.options, + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), + ) + + return client +} + +// Init implements team/client.Dialer.Init(c). +// This implementation asks the teamclient core for its remote server +// configuration, and uses it to load a set of Mutual TLS dialing options. +func (h *Teamclient) Init(cli *client.Client) error { + h.Client = cli + config := cli.Config() + + options := LogMiddlewareOptions(cli) + + // If the configuration has no credentials, we are most probably + // an in-memory dialer, don't authenticate and encrypt the conn. + if config.PrivateKey != "" { + tlsOpts, err := tlsAuthMiddleware(cli) + if err != nil { + return err + } + + h.options = append(h.options, tlsOpts...) + } + + h.options = append(h.options, options...) + + return nil +} + +// Dial implements team/client.Dialer.Dial(). +// It uses the teamclient remote server configuration as a target of a dial call. +// If the connection is successful, the teamclient registers a proto.Teamclient +// RPC around its client connection, to provide the core teamclient functionality. +func (h *Teamclient) Dial() (rpcClient any, err error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) + + h.conn, err = grpc.DialContext(ctx, host, h.options...) + if err != nil { + return nil, err + } + + h.rpc = proto.NewTeamClient(h.conn) + + return h.conn, nil +} + +// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. +func (h *Teamclient) Close() error { + return h.conn.Close() +} + +// Users returns a list of all users registered with the app teamserver. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Users() (users []team.User, err error) { + if h.rpc == nil { + return nil, ErrNoRPC + } + + res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) + if err != nil { + return nil, err + } + + for _, user := range res.GetUsers() { + users = append(users, team.User{ + Name: user.Name, + Online: user.Online, + LastSeen: time.Unix(user.LastSeen, 0), + }) + } + + return +} + +// ServerVersion returns the version information of the server to which +// the client is connected, or nil and an error if it could not retrieve it. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Version() (version team.Version, err error) { + if h.rpc == nil { + return version, ErrNoRPC + } + + ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) + if err != nil { + return version, errors.New(status.Convert(err).Message()) + } + + return team.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, nil +} diff --git a/client/transport/middleware.go b/client/transport/middleware.go new file mode 100644 index 0000000000..3cfbcc9883 --- /dev/null +++ b/client/transport/middleware.go @@ -0,0 +1,99 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "encoding/json" + + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/common" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// TokenAuth extracts authentication metadata from contexts, +// specifically the "Authorization": "Bearer" key:value pair. +type TokenAuth string + +// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// This function uses the core teamclient loggers to log the gRPC stack/requests events. +// The Teamclient of this package uses them by default. +func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { + logrusEntry := cli.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(common.CodeToLevel), + } + + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + + // Intercepting client requests. + requestIntercept := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + rawRequest, err := json.Marshal(req) + if err != nil { + logrusEntry.Errorf("Failed to serialize: %s", err) + return invoker(ctx, method, req, reply, cc, opts...) + } + + logrusEntry.Debugf("Raw request: %s", string(rawRequest)) + + return invoker(ctx, method, req, reply, cc, opts...) + } + + options := []grpc.DialOption{ + grpc.WithBlock(), + grpc.WithUnaryInterceptor(grpc_logrus.UnaryClientInterceptor(logrusEntry, logrusOpts...)), + grpc.WithUnaryInterceptor(requestIntercept), + } + + return options +} + +func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { + config := cli.Config() + if config.PrivateKey == "" { + return nil, ErrNoTLSCredentials + } + + tlsConfig, err := cli.NewTLSConfigFrom(config.CACertificate, config.Certificate, config.PrivateKey) + if err != nil { + return nil, err + } + + transportCreds := credentials.NewTLS(tlsConfig) + callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) + + return []grpc.DialOption{ + grpc.WithTransportCredentials(transportCreds), + grpc.WithPerRPCCredentials(callCreds), + }, nil +} + +// Return value is mapped to request headers. +func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { + return map[string]string{ + "Authorization": "Bearer " + string(t), + }, nil +} + +// RequireTransportSecurity always return true. +func (TokenAuth) RequireTransportSecurity() bool { + return true +} diff --git a/client/transport/mtls.go b/client/transport/mtls.go index f8e67f96c4..ac5ff56686 100644 --- a/client/transport/mtls.go +++ b/client/transport/mtls.go @@ -25,7 +25,6 @@ import ( "fmt" "log" "os" - "time" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/rpcpb" @@ -33,32 +32,6 @@ import ( "google.golang.org/grpc/credentials" ) -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. - ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte - - defaultTimeout = time.Duration(10 * time.Second) -) - -type TokenAuth struct { - token string -} - -// Return value is mapped to request headers. -func (t TokenAuth) GetRequestMetadata(ctx context.Context, in ...string) (map[string]string, error) { - return map[string]string{ - "Authorization": "Bearer " + t.token, - }, nil -} - -func (TokenAuth) RequireTransportSecurity() bool { - return true -} - // MTLSConnect - Connect to the sliver server. func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.ClientConn, error) { tlsConfig, err := getTLSConfig(config.CACertificate, config.Certificate, config.PrivateKey) @@ -66,7 +39,7 @@ func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.Clie return nil, nil, err } transportCreds := credentials.NewTLS(tlsConfig) - callCreds := credentials.PerRPCCredentials(TokenAuth{token: config.Token}) + callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) options := []grpc.DialOption{ grpc.WithTransportCredentials(transportCreds), grpc.WithPerRPCCredentials(callCreds), diff --git a/server/cli/cli.go b/server/cli/cli.go index 2c155be58d..c2ce0c8996 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -33,7 +33,6 @@ import ( "github.com/reeflective/team/server" teamserver "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" - teamGrpc "github.com/reeflective/team/transports/grpc/server" "google.golang.org/grpc" // Sliver Client core, and generic/server-only commands @@ -44,6 +43,7 @@ import ( builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" "github.com/bishopfox/sliver/server/encoders" + "github.com/bishopfox/sliver/server/transport" // Server-only imports "github.com/bishopfox/sliver/protobuf/rpcpb" @@ -134,7 +134,7 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // module github.com/reeflective/team: // 1) The listener is pre-set with all gRPC transport,auth and middleware logging. // 2) This listener could be partially/fully reimplemented within the Sliver repo. - gTeamserver := teamGrpc.NewListener() + gTeamserver := transport.NewListener() // NOTE: This might not be needed if 2) above is chosen. // The listener obviously works with gRPC servers, so we need to pass @@ -172,7 +172,7 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // The gRPC teamserver backend is hooked to produce a single // in-memory teamclient RPC/dialer backend. Not encrypted. - gTeamclient := teamGrpc.NewClientFrom(gTeamserver) + gTeamclient := transport.NewClientFrom(gTeamserver) // Pass the gRPC teamclient backend to our console package, // with registers a hook to bind its RPC client and start diff --git a/server/console/console.go b/server/console/console.go index e8fdeeee5c..d3baa07e7a 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -29,7 +29,6 @@ import ( "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" clienttransport "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/server/configs" diff --git a/server/transport/local.go b/server/transport/local.go deleted file mode 100644 index 3be3d679a3..0000000000 --- a/server/transport/local.go +++ /dev/null @@ -1,64 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "runtime/debug" - - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/rpc" - "google.golang.org/grpc" - "google.golang.org/grpc/test/bufconn" -) - -const bufSize = 2 * mb - -var ( - bufConnLog = log.NamedLogger("transport", "local") -) - -// LocalListener - Bind gRPC server to an in-memory listener, which is -// -// typically used for unit testing, but ... it should be fine -func LocalListener() (*grpc.Server, *bufconn.Listener, error) { - bufConnLog.Infof("Binding gRPC/bufconn to listener ...") - ln := bufconn.Listen(bufSize) - options := []grpc.ServerOption{ - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - } - options = append(options, initMiddleware(false)...) - grpcServer := grpc.NewServer(options...) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - go func() { - panicked := true - defer func() { - if panicked { - bufConnLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - if err := grpcServer.Serve(ln); err != nil { - bufConnLog.Fatalf("gRPC local listener error: %v", err) - } else { - panicked = false - } - }() - return grpcServer, ln, nil -} diff --git a/server/transport/middleware-old.go.old b/server/transport/middleware-old.go.old new file mode 100644 index 0000000000..db1d833b46 --- /dev/null +++ b/server/transport/middleware-old.go.old @@ -0,0 +1,296 @@ +package transport + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "sync" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/configs" + "github.com/bishopfox/sliver/server/core" + "github.com/bishopfox/sliver/server/db" + "github.com/bishopfox/sliver/server/log" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/status" +) + +var ( + serverConfig = configs.GetServerConfig() + middlewareLog = log.NamedLogger("transport", "middleware") +) + +type contextKey int + +const ( + Transport contextKey = iota + Operator +) + +// initMiddleware - Initialize middleware logger +func initMiddleware(remoteAuth bool) []grpc.ServerOption { + logrusEntry := log.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(codeToLevel), + } + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + if remoteAuth { + return []grpc.ServerOption{ + grpc.ChainUnaryInterceptor( + grpc_auth.UnaryServerInterceptor(tokenAuthFunc), + auditLogUnaryServerInterceptor(), + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), + ), + grpc.ChainStreamInterceptor( + grpc_auth.StreamServerInterceptor(tokenAuthFunc), + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), + ), + } + } else { + return []grpc.ServerOption{ + grpc.ChainUnaryInterceptor( + grpc_auth.UnaryServerInterceptor(serverAuthFunc), + auditLogUnaryServerInterceptor(), + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), + ), + grpc.ChainStreamInterceptor( + grpc_auth.StreamServerInterceptor(serverAuthFunc), + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), + ), + } + } + +} + +var ( + tokenCache = sync.Map{} +) + +// ClearTokenCache - Clear the auth token cache +func ClearTokenCache() { + tokenCache = sync.Map{} +} + +func serverAuthFunc(ctx context.Context) (context.Context, error) { + newCtx := context.WithValue(ctx, Transport, "local") + newCtx = context.WithValue(newCtx, Operator, "server") + return newCtx, nil +} + +func tokenAuthFunc(ctx context.Context) (context.Context, error) { + mtlsLog.Debugf("Auth interceptor checking operator token ...") + rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") + if err != nil { + mtlsLog.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + + // Check auth cache + digest := sha256.Sum256([]byte(rawToken)) + token := hex.EncodeToString(digest[:]) + newCtx := context.WithValue(ctx, Transport, "mtls") + if name, ok := tokenCache.Load(token); ok { + mtlsLog.Debugf("Token in cache!") + newCtx = context.WithValue(newCtx, Operator, name.(string)) + return newCtx, nil + } + operator, err := db.OperatorByToken(token) + if err != nil || operator == nil { + mtlsLog.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + mtlsLog.Debugf("Valid user token for %s", operator.Name) + tokenCache.Store(token, operator.Name) + + newCtx = context.WithValue(newCtx, Operator, operator.Name) + return newCtx, nil +} + +func deciderUnary(_ context.Context, _ string, _ interface{}) bool { + return serverConfig.Logs.GRPCUnaryPayloads +} + +func deciderStream(_ context.Context, _ string, _ interface{}) bool { + return serverConfig.Logs.GRPCStreamPayloads +} + +// Maps a grpc response code to a logging level +func codeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.InfoLevel + case codes.Canceled: + return logrus.InfoLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.InfoLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.InfoLevel + case codes.AlreadyExists: + return logrus.InfoLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.InfoLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} + +type auditUnaryLogMsg struct { + Request string `json:"request"` + Method string `json:"method"` + Session string `json:"session,omitempty"` + Beacon string `json:"beacon,omitempty"` + RemoteIP string `json:"remote_ip"` + User string `json:"user"` +} + +func auditLogUnaryServerInterceptor() grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { + rawRequest, err := json.Marshal(req) + if err != nil { + middlewareLog.Errorf("Failed to serialize %s", err) + return + } + middlewareLog.Debugf("Raw request: %s", string(rawRequest)) + session, beacon, err := getActiveTarget(rawRequest) + if err != nil { + middlewareLog.Errorf("Middleware failed to insert details: %s", err) + } + + p, _ := peer.FromContext(ctx) + + // Construct Log Message + msg := &auditUnaryLogMsg{ + Request: string(rawRequest), + Method: info.FullMethod, + User: getUser(p), + RemoteIP: p.Addr.String(), + } + if session != nil { + sessionJSON, _ := json.Marshal(session) + msg.Session = string(sessionJSON) + } + if beacon != nil { + beaconJSON, _ := json.Marshal(beacon) + msg.Beacon = string(beaconJSON) + } + + msgData, _ := json.Marshal(msg) + log.AuditLogger.Info(string(msgData)) + + resp, err := handler(ctx, req) + return resp, err + } +} + +func getUser(client *peer.Peer) string { + tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) + if !ok { + return "" + } + if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { + return "" + } + if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { + return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName + } + return "" +} + +func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { + + var activeBeacon *clientpb.Beacon + var activeSession *clientpb.Session + + var request map[string]interface{} + err := json.Unmarshal(rawRequest, &request) + if err != nil { + return nil, nil, err + } + + // RPC is not a session/beacon request + if _, ok := request["Request"]; !ok { + return nil, nil, nil + } + + rpcRequest := request["Request"].(map[string]interface{}) + + middlewareLog.Debugf("RPC Request: %v", rpcRequest) + + if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { + beaconID := rawBeaconID.(string) + middlewareLog.Debugf("Found Beacon ID: %s", beaconID) + beacon, err := db.BeaconByID(beaconID) + if err != nil { + middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) + } else if beacon != nil { + activeBeacon = beacon.ToProtobuf() + } + } + + if rawSessionID, ok := rpcRequest["SessionID"]; ok { + sessionID := rawSessionID.(string) + middlewareLog.Debugf("Found Session ID: %s", sessionID) + session := core.Sessions.Get(sessionID) + if session != nil { + activeSession = session.ToProtobuf() + } + } + + return activeSession, activeBeacon, nil +} diff --git a/server/transport/middleware.go b/server/transport/middleware.go index db1d833b46..d51673034f 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -1,296 +1,218 @@ package transport /* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ import ( "context" - "crypto/sha256" - "encoding/hex" "encoding/json" - "sync" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/log" + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/common" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" "google.golang.org/grpc/status" ) -var ( - serverConfig = configs.GetServerConfig() - middlewareLog = log.NamedLogger("transport", "middleware") -) +// BufferingOptions returns a list of server options with max send/receive +// message size, which value is that of the ServerMaxMessageSize variable (2GB). +func BufferingOptions() (options []grpc.ServerOption) { + options = append(options, + grpc.MaxRecvMsgSize(ServerMaxMessageSize), + grpc.MaxSendMsgSize(ServerMaxMessageSize), + ) + + return +} -type contextKey int +// LogMiddlewareOptions is a set of logging middleware options +// preconfigured to perform the following tasks: +// - Log all connections/disconnections to/from the teamserver listener. +// - Log all raw client requests into a teamserver audit file (see server.AuditLog()). +func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor -const ( - Transport contextKey = iota - Operator -) + cfg := s.GetConfig() + + // Audit-log all requests. Any failure to audit-log the requests + // of this server will themselves be logged to the root teamserver log. + auditLog, err := s.AuditLogger() + if err != nil { + return nil, err + } + + requestOpts = append(requestOpts, auditLogUnaryServerInterceptor(s, auditLog)) -// initMiddleware - Initialize middleware logger -func initMiddleware(remoteAuth bool) []grpc.ServerOption { - logrusEntry := log.NamedLogger("transport", "grpc") + requestOpts = append(requestOpts, + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + streamOpts = append(streamOpts, + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + // Logging interceptors + logrusEntry := s.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(codeToLevel), + grpc_logrus.WithLevels(common.CodeToLevel), } + grpc_logrus.ReplaceGrpcLogger(logrusEntry) - if remoteAuth { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(tokenAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(tokenAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } - } else { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(serverAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(serverAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } + + requestOpts = append(requestOpts, + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCUnaryPayloads + }), + ) + + streamOpts = append(streamOpts, + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCStreamPayloads + }), + ) + + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil +} + +// TLSAuthMiddlewareOptions is a set of transport security options which will use +// the preconfigured teamserver TLS (credentials) configuration to authenticate +// incoming client connections. The authentication is Mutual TLS, used because +// all teamclients will connect with a known TLS credentials set. +func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var options []grpc.ServerOption + + tlsConfig, err := s.UsersTLSConfig() + if err != nil { + return nil, err } + creds := credentials.NewTLS(tlsConfig) + options = append(options, grpc.Creds(creds)) + + return options, nil } -var ( - tokenCache = sync.Map{} -) +// initAuthMiddleware - Initialize middleware logger. +func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor + + // Authentication interceptors. + if ts.conn == nil { + // All remote connections are users who need authentication. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), + ) + + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), + ) + } else { + // Local in-memory connections have no auth. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(serverAuthFunc), + ) + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(serverAuthFunc), + ) + } -// ClearTokenCache - Clear the auth token cache -func ClearTokenCache() { - tokenCache = sync.Map{} + // Return middleware for all requests and stream interactions in gRPC. + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil } +// TODO: Should we change the default in-memory server name ? func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, Transport, "local") - newCtx = context.WithValue(newCtx, Operator, "server") + newCtx := context.WithValue(ctx, "transport", "local") + newCtx = context.WithValue(newCtx, "user", "server") + return newCtx, nil } -func tokenAuthFunc(ctx context.Context) (context.Context, error) { - mtlsLog.Debugf("Auth interceptor checking operator token ...") +func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { + log := ts.NamedLogger("transport", "grpc") + log.Debugf("Auth interceptor checking user token ...") + rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") if err != nil { - mtlsLog.Errorf("Authentication failure: %s", err) + log.Errorf("Authentication failure: %s", err) return nil, status.Error(codes.Unauthenticated, "Authentication failure") } - // Check auth cache - digest := sha256.Sum256([]byte(rawToken)) - token := hex.EncodeToString(digest[:]) - newCtx := context.WithValue(ctx, Transport, "mtls") - if name, ok := tokenCache.Load(token); ok { - mtlsLog.Debugf("Token in cache!") - newCtx = context.WithValue(newCtx, Operator, name.(string)) - return newCtx, nil - } - operator, err := db.OperatorByToken(token) - if err != nil || operator == nil { - mtlsLog.Errorf("Authentication failure: %s", err) + user, authorized, err := ts.UserAuthenticate(rawToken) + if err != nil || !authorized || user == "" { + log.Errorf("Authentication failure: %s", err) return nil, status.Error(codes.Unauthenticated, "Authentication failure") } - mtlsLog.Debugf("Valid user token for %s", operator.Name) - tokenCache.Store(token, operator.Name) - - newCtx = context.WithValue(newCtx, Operator, operator.Name) - return newCtx, nil -} - -func deciderUnary(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCUnaryPayloads -} -func deciderStream(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCStreamPayloads -} + newCtx := context.WithValue(ctx, "transport", "mtls") + newCtx = context.WithValue(newCtx, "user", user) -// Maps a grpc response code to a logging level -func codeToLevel(code codes.Code) logrus.Level { - switch code { - case codes.OK: - return logrus.InfoLevel - case codes.Canceled: - return logrus.InfoLevel - case codes.Unknown: - return logrus.ErrorLevel - case codes.InvalidArgument: - return logrus.InfoLevel - case codes.DeadlineExceeded: - return logrus.WarnLevel - case codes.NotFound: - return logrus.InfoLevel - case codes.AlreadyExists: - return logrus.InfoLevel - case codes.PermissionDenied: - return logrus.WarnLevel - case codes.Unauthenticated: - return logrus.InfoLevel - case codes.ResourceExhausted: - return logrus.WarnLevel - case codes.FailedPrecondition: - return logrus.WarnLevel - case codes.Aborted: - return logrus.WarnLevel - case codes.OutOfRange: - return logrus.WarnLevel - case codes.Unimplemented: - return logrus.ErrorLevel - case codes.Internal: - return logrus.ErrorLevel - case codes.Unavailable: - return logrus.WarnLevel - case codes.DataLoss: - return logrus.ErrorLevel - default: - return logrus.ErrorLevel - } + return newCtx, nil } type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` - Session string `json:"session,omitempty"` - Beacon string `json:"beacon,omitempty"` - RemoteIP string `json:"remote_ip"` - User string `json:"user"` + Request string `json:"request"` + Method string `json:"method"` } -func auditLogUnaryServerInterceptor() grpc.UnaryServerInterceptor { +func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { + log := ts.NamedLogger("grpc", "audit") + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { rawRequest, err := json.Marshal(req) if err != nil { - middlewareLog.Errorf("Failed to serialize %s", err) + log.Errorf("Failed to serialize %s", err) return } - middlewareLog.Debugf("Raw request: %s", string(rawRequest)) - session, beacon, err := getActiveTarget(rawRequest) + + log.Debugf("Raw request: %s", string(rawRequest)) + if err != nil { - middlewareLog.Errorf("Middleware failed to insert details: %s", err) + log.Errorf("Middleware failed to insert details: %s", err) } - p, _ := peer.FromContext(ctx) - // Construct Log Message msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, - User: getUser(p), - RemoteIP: p.Addr.String(), - } - if session != nil { - sessionJSON, _ := json.Marshal(session) - msg.Session = string(sessionJSON) - } - if beacon != nil { - beaconJSON, _ := json.Marshal(beacon) - msg.Beacon = string(beaconJSON) + Request: string(rawRequest), + Method: info.FullMethod, } msgData, _ := json.Marshal(msg) - log.AuditLogger.Info(string(msgData)) + auditLog.Info(string(msgData)) resp, err := handler(ctx, req) - return resp, err - } -} - -func getUser(client *peer.Peer) string { - tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) - if !ok { - return "" - } - if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { - return "" - } - if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { - return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName - } - return "" -} -func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { - - var activeBeacon *clientpb.Beacon - var activeSession *clientpb.Session - - var request map[string]interface{} - err := json.Unmarshal(rawRequest, &request) - if err != nil { - return nil, nil, err - } - - // RPC is not a session/beacon request - if _, ok := request["Request"]; !ok { - return nil, nil, nil - } - - rpcRequest := request["Request"].(map[string]interface{}) - - middlewareLog.Debugf("RPC Request: %v", rpcRequest) - - if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { - beaconID := rawBeaconID.(string) - middlewareLog.Debugf("Found Beacon ID: %s", beaconID) - beacon, err := db.BeaconByID(beaconID) - if err != nil { - middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) - } else if beacon != nil { - activeBeacon = beacon.ToProtobuf() - } - } - - if rawSessionID, ok := rpcRequest["SessionID"]; ok { - sessionID := rawSessionID.(string) - middlewareLog.Debugf("Found Session ID: %s", sessionID) - session := core.Sessions.Get(sessionID) - if session != nil { - activeSession = session.ToProtobuf() - } + return resp, err } - - return activeSession, activeBeacon, nil } diff --git a/server/transport/mtls.go b/server/transport/mtls.go index 8c24962dbc..674f0b5b6c 100644 --- a/server/transport/mtls.go +++ b/server/transport/mtls.go @@ -34,18 +34,7 @@ import ( "google.golang.org/grpc/credentials" ) -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ServerMaxMessageSize - Server-side max GRPC message size - ServerMaxMessageSize = 2 * gb -) - -var ( - mtlsLog = log.NamedLogger("transport", "mtls") -) +var mtlsLog = log.NamedLogger("transport", "mtls") // StartMtlsClientListener - Start a mutual TLS listener func StartMtlsClientListener(host string, port uint16) (*grpc.Server, net.Listener, error) { @@ -64,7 +53,7 @@ func StartMtlsClientListener(host string, port uint16) (*grpc.Server, net.Listen grpc.MaxRecvMsgSize(ServerMaxMessageSize), grpc.MaxSendMsgSize(ServerMaxMessageSize), } - options = append(options, initMiddleware(true)...) + // options = append(options, initMiddleware(true)...) grpcServer := grpc.NewServer(options...) rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) go func() { diff --git a/server/transport/rpc.go b/server/transport/rpc.go new file mode 100644 index 0000000000..00ef9c6adc --- /dev/null +++ b/server/transport/rpc.go @@ -0,0 +1,73 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/proto" +) + +// rpcServer is the gRPC server implementation. +// It makes uses of the teamserver core to query users and version information. +type rpcServer struct { + server *server.Server + *proto.UnimplementedTeamServer +} + +func newServer(server *server.Server) *rpcServer { + return &rpcServer{ + server: server, + UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, + } +} + +// GetVersion returns the teamserver version. +func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { + ver, err := ts.server.Version() + + return &proto.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, err +} + +// GetUsers returns the list of teamserver users and their status. +func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { + users, err := ts.server.Users() + + userspb := make([]*proto.User, len(users)) + for i, user := range users { + userspb[i] = &proto.User{ + Name: user.Name, + Online: user.Online, + LastSeen: user.LastSeen.Unix(), + Clients: int32(user.Clients), + } + } + + return &proto.Users{Users: userspb}, err +} diff --git a/server/transport/server.go b/server/transport/server.go new file mode 100644 index 0000000000..0baa174139 --- /dev/null +++ b/server/transport/server.go @@ -0,0 +1,205 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "net" + "runtime/debug" + "sync" + + teamserver "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" + + clientTransport "github.com/bishopfox/sliver/client/transport" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + bufSize = 2 * mb + + // ServerMaxMessageSize - Server-side max GRPC message size. + ServerMaxMessageSize = 2*gb - 1 +) + +// Teamserver is a simple example gRPC teamserver listener and server backend. +// This server can handle both remote and local (in-memory) connections, provided +// that it is being created with the correct grpc.Server options. +// +// This teamserver embeds a team/server.Server core driver and uses it for fetching +// server-side TLS configurations, use its loggers and access its database/users/list. +// +// By default, the server has no grpc.Server options attached. +// Please see the other functions of this package for pre-configured option sets. +type Teamserver struct { + *teamserver.Server + + options []grpc.ServerOption + conn *bufconn.Listener + mutex *sync.RWMutex + + hooks []func(server *grpc.Server) error +} + +// NewListener is a simple constructor returning a teamserver loaded with the +// provided list of server options. By default the server does not come with any. +func NewListener(opts ...grpc.ServerOption) *Teamserver { + listener := &Teamserver{ + mutex: &sync.RWMutex{}, + } + + listener.options = append(listener.options, opts...) + + return listener +} + +// NewClientFrom requires an existing grpc Teamserver to create an in-memory +// connection bound to both the teamserver and the teamclient backends. +// It returns a teamclient meant to be ran in memory, with TLS credentials disabled. +func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport.Teamclient { + conn := bufconn.Listen(bufSize) + + ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { + return conn.Dial() + }) + + opts = append(opts, []grpc.DialOption{ + ctxDialer, + grpc.WithInsecure(), + }...) + + // The server will use this conn as a listener. + // The reference is dropped after server start. + server.conn = conn + + return clientTransport.NewTeamClient(opts...) +} + +// Name immplements team/server.Handler.Name(). +// It indicates the transport/rpc stack, in this case "gRPC". +func (h *Teamserver) Name() string { + return "gRPC" +} + +// PostServe registers one or more hook functions to be ran on the server +// before it is served to the listener. These hooks should naturally be +// used to register additional services to it. +func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { + h.hooks = append(h.hooks, hooks...) +} + +// Init implements team/server.Handler.Init(). +// It is used to initialize the listener with the correct TLS credentials +// middleware (or absence of if about to serve an in-memory connection). +func (h *Teamserver) Init(serv *teamserver.Server) (err error) { + h.Server = serv + + h.options, err = LogMiddlewareOptions(h.Server) + if err != nil { + return err + } + + // Logging/authentication/audit + serverOptions, err := h.initAuthMiddleware() + if err != nil { + return err + } + + h.options = append(h.options, serverOptions...) + + return nil +} + +// Listen implements team/server.Handler.Listen(). +// It starts listening on a network address for incoming gRPC clients. +// If the teamserver has previously been given an in-memory connection, +// it returns it as the listener without errors. +func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { + rpcLog := h.NamedLogger("transport", "mTLS") + + // Only wrap the connection in TLS when remote. + // In-memory connection are not authenticated. + if h.conn == nil { + ln, err = net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + // Encryption. + tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) + if err != nil { + return nil, err + } + + h.options = append(h.options, tlsOptions...) + } else { + h.mutex.Lock() + ln = h.conn + h.conn = nil + h.mutex.Unlock() + } + + grpcServer := grpc.NewServer(h.options...) + + // Register the core teamserver service + proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + + for _, hook := range h.hooks { + if err := hook(grpcServer); err != nil { + rpcLog.Errorf("service bind error: %s", err) + return nil, err + } + } + + rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) + + // Start serving the listener + go func() { + panicked := true + defer func() { + if panicked { + rpcLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) + } + }() + + if err := grpcServer.Serve(ln); err != nil { + rpcLog.Errorf("gRPC server exited with error: %v", err) + } else { + panicked = false + } + }() + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// In this implementation, the function does nothing. Thus the underlying +// *grpc.Server.Shutdown() method is not called, and only the listener +// will be closed by the server automatically when using CloseListener(). +// +// This is probably not optimal from a resource usage standpoint, but currently it +// fits most use cases. Feel free to reimplement or propose changes to this lib. +func (h *Teamserver) Close() error { + return nil +} diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index dd18a89c70..44ea47f27b 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -34,9 +34,7 @@ import ( "tailscale.com/tsnet" ) -var ( - tsNetLog = log.NamedLogger("transport", "tsnet") -) +var tsNetLog = log.NamedLogger("transport", "tsnet") // StartTsNetClientListener - Start a TSNet gRPC listener func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.Listener, error) { @@ -57,7 +55,7 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L } tsnetDir := filepath.Join(assets.GetRootAppDir(), "tsnet") - if err := os.MkdirAll(tsnetDir, 0700); err != nil { + if err := os.MkdirAll(tsnetDir, 0o700); err != nil { return nil, nil, err } @@ -81,7 +79,7 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L grpc.MaxRecvMsgSize(ServerMaxMessageSize), grpc.MaxSendMsgSize(ServerMaxMessageSize), } - options = append(options, initMiddleware(true)...) + // options = append(options, initMiddleware(true)...) grpcServer := grpc.NewServer(options...) rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) go func() { From 617b5b7bfcd5fe321c9c18eee58a410184b872cc Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:17:53 +0200 Subject: [PATCH 018/109] Start removing/cleaning up unused code with teamserver. --- client/transport/mtls.go | 113 ---------- server/cli/cli.go | 31 +-- server/command/builder/builder.go | 56 ++++- server/console/console-admin.go | 281 ------------------------- server/console/console-admin_test.go | 46 ---- server/console/console.go | 120 ----------- server/daemon/README.md | 4 - server/daemon/daemon.go | 73 ------- server/transport/middleware-old.go.old | 6 +- server/transport/middleware.go | 30 +-- server/transport/mtls.go | 109 ---------- server/transport/server.go | 85 ++++---- server/transport/tailscale.go | 83 ++++---- 13 files changed, 152 insertions(+), 885 deletions(-) delete mode 100644 client/transport/mtls.go delete mode 100644 server/console/console-admin.go delete mode 100644 server/console/console-admin_test.go delete mode 100644 server/console/console.go delete mode 100644 server/daemon/README.md delete mode 100644 server/daemon/daemon.go delete mode 100644 server/transport/mtls.go diff --git a/client/transport/mtls.go b/client/transport/mtls.go deleted file mode 100644 index ac5ff56686..0000000000 --- a/client/transport/mtls.go +++ /dev/null @@ -1,113 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "os" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -// MTLSConnect - Connect to the sliver server. -func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.ClientConn, error) { - tlsConfig, err := getTLSConfig(config.CACertificate, config.Certificate, config.PrivateKey) - if err != nil { - return nil, nil, err - } - transportCreds := credentials.NewTLS(tlsConfig) - callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) - options := []grpc.DialOption{ - grpc.WithTransportCredentials(transportCreds), - grpc.WithPerRPCCredentials(callCreds), - grpc.WithBlock(), - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), - } - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - connection, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", config.LHost, config.LPort), options...) - if err != nil { - return nil, nil, err - } - return rpcpb.NewSliverRPCClient(connection), connection, nil -} - -func getTLSConfig(caCertificate string, certificate string, privateKey string) (*tls.Config, error) { - certPEM, err := tls.X509KeyPair([]byte(certificate), []byte(privateKey)) - if err != nil { - log.Printf("Cannot parse client certificate: %v", err) - return nil, err - } - - // Load CA cert - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM([]byte(caCertificate)) - - // Setup config with custom certificate validation routine - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{certPEM}, - RootCAs: caCertPool, - InsecureSkipVerify: true, // Don't worry I sorta know what I'm doing - VerifyPeerCertificate: func(rawCerts [][]byte, _ [][]*x509.Certificate) error { - return RootOnlyVerifyCertificate(caCertificate, rawCerts) - }, - } - return tlsConfig, nil -} - -// RootOnlyVerifyCertificate - Go doesn't provide a method for only skipping hostname validation so -// we have to disable all of the certificate validation and re-implement everything. -// https://github.com/golang/go/issues/21971 -func RootOnlyVerifyCertificate(caCertificate string, rawCerts [][]byte) error { - roots := x509.NewCertPool() - ok := roots.AppendCertsFromPEM([]byte(caCertificate)) - if !ok { - log.Printf("Failed to parse root certificate") - os.Exit(3) - } - - cert, err := x509.ParseCertificate(rawCerts[0]) // We should only get one cert - if err != nil { - log.Printf("Failed to parse certificate: " + err.Error()) - return err - } - - // Basically we only care if the certificate was signed by our authority - // Go selects sensible defaults for time and EKU, basically we're only - // skipping the hostname check, I think? - options := x509.VerifyOptions{ - Roots: roots, - } - if options.Roots == nil { - panic("no root certificate") - } - if _, err := cert.Verify(options); err != nil { - log.Printf("Failed to verify certificate: " + err.Error()) - return err - } - - return nil -} diff --git a/server/cli/cli.go b/server/cli/cli.go index c2ce0c8996..5134c81173 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -19,7 +19,6 @@ package cli */ import ( - "errors" "fmt" "log" "os" @@ -33,7 +32,6 @@ import ( "github.com/reeflective/team/server" teamserver "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" - "google.golang.org/grpc" // Sliver Client core, and generic/server-only commands "github.com/bishopfox/sliver/client/command" @@ -46,13 +44,11 @@ import ( "github.com/bishopfox/sliver/server/transport" // Server-only imports - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" - "github.com/bishopfox/sliver/server/rpc" ) // Execute the sliver server binary. @@ -129,25 +125,9 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // 1) Teamserver --------- // - // NOTE: Teamserver gRPC stack. - // The teamserver stack is for now contained in a package of the third-party - // module github.com/reeflective/team: - // 1) The listener is pre-set with all gRPC transport,auth and middleware logging. - // 2) This listener could be partially/fully reimplemented within the Sliver repo. - gTeamserver := transport.NewListener() - - // NOTE: This might not be needed if 2) above is chosen. - // The listener obviously works with gRPC servers, so we need to pass - // a hook for service binding before starting those gRPC HTTP/2 listeners. - gTeamserver.PostServe(func(grpcServer *grpc.Server) error { - if grpcServer == nil { - return errors.New("No gRPC server to use for service") - } - - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - - return nil - }) + // We can use several teamserver listener/stack backends. + tlsListener := transport.NewListener() + tailscaleListener := transport.NewTailScaleListener() // Here is an import step, where we are given a change to setup // the reeflective/teamserver with everything we want: our own @@ -156,7 +136,8 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { var serverOpts []teamserver.Options serverOpts = append(serverOpts, teamserver.WithDefaultPort(31337), - teamserver.WithListener(gTeamserver), + teamserver.WithListener(tlsListener), + teamserver.WithListener(tailscaleListener), ) // Create the application teamserver. @@ -172,7 +153,7 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // The gRPC teamserver backend is hooked to produce a single // in-memory teamclient RPC/dialer backend. Not encrypted. - gTeamclient := transport.NewClientFrom(gTeamserver) + gTeamclient := transport.NewClientFrom(tlsListener) // Pass the gRPC teamclient backend to our console package, // with registers a hook to bind its RPC client and start diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 25316e02b6..6bab0ac0e7 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -19,6 +19,7 @@ package builder */ import ( + "errors" "fmt" "os" "runtime" @@ -29,10 +30,13 @@ import ( "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" + "github.com/reeflective/team/client" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var builderLog = log.NamedLogger("cli", "builder") @@ -123,15 +127,8 @@ func runBuilderCmd(cmd *cobra.Command, args []string) { } builderLog.Infof("Hello my name is: %s", externalBuilder.Name) - // connect to the server builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) - rpc, ln, err := transport.MTLSConnect(config) - if err != nil { - builderLog.Errorf("Failed to connect to server: %s", err) - os.Exit(-2) - } - defer ln.Close() - builder.StartBuilder(externalBuilder, rpc) + startBuilderTeamclient(externalBuilder, configPath) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -263,3 +260,46 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } } + +func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string) { + var rpc rpcpb.SliverRPCClient + + gTeamclient := transport.NewTeamClient() + + // The teamclient requires hooks to bind RPC clients around its connection. + // NOTE: this might not be needed either if Sliver uses its own teamclient backend. + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + rpc = rpcpb.NewSliverRPCClient(grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(gTeamclient, bindClient), + ) + + teamclient, err := client.New("sliver", gTeamclient, clientOpts...) + if err != nil { + panic(err) + } + + // Now use our teamclient to fetch the configuration. + config, err := teamclient.ReadConfig(configPath) + if err != nil { + builderLog.Fatalf("Invalid config file: %s", err) + os.Exit(-1) + } + + // And immediately connect with it. + teamclient.Connect(client.WithConfig(config)) + defer teamclient.Disconnect() + + // Let the builder do its work, blocking. + builder.StartBuilder(externalBuilder, rpc) +} diff --git a/server/console/console-admin.go b/server/console/console-admin.go deleted file mode 100644 index 34a8aa22ae..0000000000 --- a/server/console/console-admin.go +++ /dev/null @@ -1,281 +0,0 @@ -package console - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "regexp" - - "github.com/spf13/cobra" - - consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/db/models" - "github.com/bishopfox/sliver/server/transport" -) - -const ( - // ANSI Colors - normal = "\033[0m" - black = "\033[30m" - red = "\033[31m" - green = "\033[32m" - orange = "\033[33m" - blue = "\033[34m" - purple = "\033[35m" - cyan = "\033[36m" - gray = "\033[37m" - bold = "\033[1m" - clearln = "\r\x1b[2K" - upN = "\033[%dA" - downN = "\033[%dB" - underline = "\033[4m" - - // Info - Display colorful information - Info = bold + cyan + "[*] " + normal - // Warn - Warn a user - Warn = bold + red + "[!] " + normal - // Debug - Display debug information - Debug = bold + purple + "[-] " + normal - // Woot - Display success - Woot = bold + green + "[$] " + normal -) - -var namePattern = regexp.MustCompile("^[a-zA-Z0-9_-]*$") // Only allow alphanumeric chars - -// ClientConfig - Client JSON config -type ClientConfig struct { - Operator string `json:"operator"` - Token string `json:"token"` - LHost string `json:"lhost"` - LPort int `json:"lport"` - CACertificate string `json:"ca_certificate"` - PrivateKey string `json:"private_key"` - Certificate string `json:"certificate"` -} - -func newOperatorCmd(cmd *cobra.Command, _ []string) { - name, _ := cmd.Flags().GetString("name") - lhost, _ := cmd.Flags().GetString("lhost") - lport, _ := cmd.Flags().GetUint16("lport") - save, _ := cmd.Flags().GetString("save") - - if save == "" { - save, _ = os.Getwd() - } - - fmt.Printf(Info + "Generating new client certificate, please wait ... \n") - configJSON, err := NewOperatorConfig(name, lhost, lport) - if err != nil { - fmt.Printf(Warn+"%s\n", err) - return - } - - saveTo, _ := filepath.Abs(save) - fi, err := os.Stat(saveTo) - if !os.IsNotExist(err) && !fi.IsDir() { - fmt.Printf(Warn+"File already exists %s\n", err) - return - } - if !os.IsNotExist(err) && fi.IsDir() { - filename := fmt.Sprintf("%s_%s.cfg", filepath.Base(name), filepath.Base(lhost)) - saveTo = filepath.Join(saveTo, filename) - } - err = ioutil.WriteFile(saveTo, configJSON, 0o600) - if err != nil { - fmt.Printf(Warn+"Failed to write config to: %s (%s) \n", saveTo, err) - return - } - fmt.Printf(Info+"Saved new client config to: %s \n", saveTo) -} - -// NewOperatorConfig - Generate a new player/client/operator configuration -func NewOperatorConfig(operatorName string, lhost string, lport uint16) ([]byte, error) { - if !namePattern.MatchString(operatorName) { - return nil, errors.New("invalid operator name (alphanumerics only)") - } - if operatorName == "" { - return nil, errors.New("operator name required") - } - if lhost == "" { - return nil, errors.New("invalid lhost") - } - - rawToken := models.GenerateOperatorToken() - digest := sha256.Sum256([]byte(rawToken)) - dbOperator := &models.Operator{ - Name: operatorName, - Token: hex.EncodeToString(digest[:]), - } - err := db.Session().Save(dbOperator).Error - if err != nil { - return nil, err - } - - publicKey, privateKey, err := certs.OperatorClientGenerateCertificate(operatorName) - if err != nil { - return nil, fmt.Errorf("failed to generate certificate %s", err) - } - caCertPEM, _, _ := certs.GetCertificateAuthorityPEM(certs.OperatorCA) - config := ClientConfig{ - Operator: operatorName, - Token: rawToken, - LHost: lhost, - LPort: int(lport), - CACertificate: string(caCertPEM), - PrivateKey: string(privateKey), - Certificate: string(publicKey), - } - return json.Marshal(config) -} - -func kickOperatorCmd(cmd *cobra.Command, _ []string) { - operator, _ := cmd.Flags().GetString("name") - - fmt.Printf(Info+"Removing auth token(s) for %s, please wait ... \n", operator) - err := db.Session().Where(&models.Operator{ - Name: operator, - }).Delete(&models.Operator{}).Error - if err != nil { - return - } - transport.ClearTokenCache() - fmt.Printf(Info+"Removing client certificate(s) for %s, please wait ... \n", operator) - err = certs.OperatorClientRemoveCertificate(operator) - if err != nil { - fmt.Printf(Warn+"Failed to remove the operator certificate: %v \n", err) - return - } - fmt.Printf(Info+"Operator %s has been kicked out.\n", operator) -} - -func StartPersistentJobs(cfg *configs.ServerConfig) error { - if cfg.Jobs == nil { - return nil - } - for _, j := range cfg.Jobs.Multiplayer { - if j.Tailscale { - jobStartTsNetClientListener(j.Host, j.Port) - } else { - jobStartMtlsClientListener(j.Host, j.Port) - } - } - return nil -} - -func startMultiplayerModeCmd(cmd *cobra.Command, _ []string) { - lhost, _ := cmd.Flags().GetString("lhost") - lport, _ := cmd.Flags().GetUint16("lport") - persistent, _ := cmd.Flags().GetBool("persistent") - tailscale, _ := cmd.Flags().GetBool("tailscale") - - var err error - if tailscale { - _, err = jobStartTsNetClientListener(lhost, lport) - } else { - _, err = jobStartMtlsClientListener(lhost, lport) - } - if err == nil { - fmt.Printf(Info + "Multiplayer mode enabled!\n") - if persistent { - serverConfig := configs.GetServerConfig() - serverConfig.AddMultiplayerJob(&configs.MultiplayerJobConfig{ - Host: lhost, - Port: lport, - Tailscale: tailscale, - }) - serverConfig.Save() - } - } else { - fmt.Printf(Warn+"Failed to start job %v\n", err) - } -} - -func jobStartMtlsClientListener(host string, port uint16) (int, error) { - _, ln, err := transport.StartMtlsClientListener(host, port) - if err != nil { - return -1, err // If we fail to bind don't setup the Job - } - - job := &core.Job{ - ID: core.NextJobID(), - Name: "grpc/mtls", - Description: "client listener", - Protocol: "tcp", - Port: port, - JobCtrl: make(chan bool), - } - - go func() { - <-job.JobCtrl - log.Printf("Stopping client listener (%d) ...\n", job.ID) - ln.Close() // Kills listener GoRoutines in startMutualTLSListener() but NOT connections - - core.Jobs.Remove(job) - core.EventBroker.Publish(core.Event{ - Job: job, - EventType: consts.JobStoppedEvent, - }) - }() - - core.Jobs.Add(job) - return job.ID, nil -} - -func jobStartTsNetClientListener(host string, port uint16) (int, error) { - _, ln, err := transport.StartTsNetClientListener(host, port) - if err != nil { - return -1, err // If we fail to bind don't setup the Job - } - - job := &core.Job{ - ID: core.NextJobID(), - Name: "grpc/tsnet", - Description: "client listener", - Protocol: "tcp", - Port: port, - JobCtrl: make(chan bool), - } - - go func() { - <-job.JobCtrl - log.Printf("Stopping client listener (%d) ...\n", job.ID) - ln.Close() // Kills listener GoRoutines in startMutualTLSListener() but NOT connections - - core.Jobs.Remove(job) - core.EventBroker.Publish(core.Event{ - Job: job, - EventType: consts.JobStoppedEvent, - }) - }() - - core.Jobs.Add(job) - return job.ID, nil -} diff --git a/server/console/console-admin_test.go b/server/console/console-admin_test.go deleted file mode 100644 index ba7f84935f..0000000000 --- a/server/console/console-admin_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package console - -import ( - "encoding/json" - "encoding/pem" - "testing" - - clienttransport "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/server/certs" -) - -func TestRootOnlyVerifyCertificate(t *testing.T) { - certs.SetupCAs() - - data, err := NewOperatorConfig("zerocool", "localhost", uint16(1337)) - if err != nil { - t.Fatalf("failed to generate test player profile %s", err) - } - config := &ClientConfig{} - err = json.Unmarshal(data, config) - if err != nil { - t.Fatalf("failed to parse client config %s", err) - } - - _, _, err = certs.OperatorServerGetCertificate("localhost") - if err == certs.ErrCertDoesNotExist { - certs.OperatorServerGenerateCertificate("localhost") - } - - // Test with a valid certificate - certPEM, _, _ := certs.OperatorServerGetCertificate("localhost") - block, _ := pem.Decode(certPEM) - err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) - if err != nil { - t.Fatalf("root only verify certificate error: %s", err) - } - - // Test with wrong CA - wrongCert, _ := certs.GenerateECCCertificate(certs.HTTPSCA, "foobar", false, false) - block, _ = pem.Decode(wrongCert) - err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) - if err == nil { - t.Fatal("root only verify cert verified a certificate with invalid ca!") - } - -} diff --git a/server/console/console.go b/server/console/console.go deleted file mode 100644 index d3baa07e7a..0000000000 --- a/server/console/console.go +++ /dev/null @@ -1,120 +0,0 @@ -package console - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "fmt" - "net" - - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/command/help" - consts "github.com/bishopfox/sliver/client/constants" - clienttransport "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/transport" - "google.golang.org/grpc" -) - -// Start - Starts the server console -func Start() { - _, ln, _ := transport.LocalListener() - ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { - return ln.Dial() - }) - - options := []grpc.DialOption{ - ctxDialer, - grpc.WithInsecure(), // This is an in-memory listener, no need for secure transport - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(clienttransport.ClientMaxReceiveMessageSize)), - } - conn, err := grpc.DialContext(context.Background(), "bufnet", options...) - if err != nil { - fmt.Printf(Warn+"Failed to dial bufnet: %s\n", err) - return - } - defer conn.Close() - // localRPC := rpcpb.NewSliverRPCClient(conn) - if err := configs.CheckHTTPC2ConfigErrors(); err != nil { - fmt.Printf(Warn+"Error in HTTP C2 config: %s\n", err) - } - - // con := console.NewConsole(false) - // console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) - - // con.App.Start() -} - -// serverOnlyCmds - Server only commands -func serverOnlyCmds() (commands []*cobra.Command) { - // [ Multiplayer ] ----------------------------------------------------------------- - - startMultiplayer := &cobra.Command{ - Use: consts.MultiplayerModeStr, - Short: "Enable multiplayer mode", - Long: help.GetHelpFor([]string{consts.MultiplayerModeStr}), - Run: startMultiplayerModeCmd, - GroupID: consts.MultiplayerHelpGroup, - } - command.Bind("multiplayer", false, startMultiplayer, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint16P("lport", "l", 31337, "tcp listen port") - f.BoolP("tailscale", "T", false, "only expose multiplayer interface over Tailscale (requires TS_AUTHKEY)") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - - commands = append(commands, startMultiplayer) - - newOperator := &cobra.Command{ - Use: consts.NewOperatorStr, - Short: "Create a new operator config file", - Long: help.GetHelpFor([]string{consts.NewOperatorStr}), - Run: newOperatorCmd, - GroupID: consts.MultiplayerHelpGroup, - } - command.Bind("operator", false, newOperator, func(f *pflag.FlagSet) { - f.StringP("lhost", "l", "", "listen host") - f.Uint16P("lport", "p", 31337, "listen port") - f.StringP("save", "s", "", "directory/file in which to save config") - f.StringP("name", "n", "", "operator name") - }) - command.BindFlagCompletions(newOperator, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionDirectories() - }) - commands = append(commands, newOperator) - - kickOperator := &cobra.Command{ - Use: consts.KickOperatorStr, - Short: "Kick an operator from the server", - Long: help.GetHelpFor([]string{consts.KickOperatorStr}), - Run: kickOperatorCmd, - GroupID: consts.MultiplayerHelpGroup, - } - - command.Bind("operator", false, kickOperator, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "operator name") - }) - commands = append(commands, kickOperator) - - return -} diff --git a/server/daemon/README.md b/server/daemon/README.md deleted file mode 100644 index 8c8d1b9add..0000000000 --- a/server/daemon/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Daemon -====== - -This is the main function when the application is executed as a daemon instead of in console mode. It simply starts the MTLS listener and responds to SIG messages. diff --git a/server/daemon/daemon.go b/server/daemon/daemon.go deleted file mode 100644 index d673142fcd..0000000000 --- a/server/daemon/daemon.go +++ /dev/null @@ -1,73 +0,0 @@ -package daemon - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "os" - "os/signal" - "syscall" - - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/transport" -) - -var ( - serverConfig = configs.GetServerConfig() - daemonLog = log.NamedLogger("daemon", "main") - - // BlankHost is a blank hostname - BlankHost = "-" - // BlankPort is a blank port number - BlankPort = uint16(0) -) - -// Start - Start as daemon process -func Start(host string, port uint16) { - - // cli args take president over config - if host == BlankHost { - daemonLog.Info("No cli lhost, using config file or default value") - host = serverConfig.DaemonConfig.Host - } - if port == BlankPort { - daemonLog.Info("No cli lport, using config file or default value") - port = uint16(serverConfig.DaemonConfig.Port) - } - - daemonLog.Infof("Starting Sliver daemon %s:%d ...", host, port) - _, ln, err := transport.StartMtlsClientListener(host, port) - if err != nil { - fmt.Printf("[!] Failed to start daemon %s", err) - daemonLog.Errorf("Error starting client listener %s", err) - os.Exit(1) - } - - done := make(chan bool) - signals := make(chan os.Signal, 1) - signal.Notify(signals, syscall.SIGTERM) - go func() { - <-signals - daemonLog.Infof("Received SIGTERM, exiting ...") - ln.Close() - done <- true - }() - <-done -} diff --git a/server/transport/middleware-old.go.old b/server/transport/middleware-old.go.old index db1d833b46..32aea05a18 100644 --- a/server/transport/middleware-old.go.old +++ b/server/transport/middleware-old.go.old @@ -93,12 +93,9 @@ func initMiddleware(remoteAuth bool) []grpc.ServerOption { ), } } - } -var ( - tokenCache = sync.Map{} -) +var tokenCache = sync.Map{} // ClearTokenCache - Clear the auth token cache func ClearTokenCache() { @@ -253,7 +250,6 @@ func getUser(client *peer.Peer) string { } func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { - var activeBeacon *clientpb.Beacon var activeSession *clientpb.Session diff --git a/server/transport/middleware.go b/server/transport/middleware.go index d51673034f..97035684c2 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -22,17 +22,17 @@ import ( "context" "encoding/json" - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/common" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/status" + + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/common" ) // BufferingOptions returns a list of server options with max send/receive @@ -96,8 +96,8 @@ func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { ) return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), + grpc.ChainUnaryInterceptor(requestOpts...), + grpc.ChainStreamInterceptor(streamOpts...), }, nil } @@ -146,15 +146,21 @@ func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { // Return middleware for all requests and stream interactions in gRPC. return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), + grpc.ChainUnaryInterceptor(requestOpts...), + grpc.ChainStreamInterceptor(streamOpts...), }, nil } -// TODO: Should we change the default in-memory server name ? +type contextKey int + +const ( + Transport contextKey = iota + Operator +) + func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, "transport", "local") - newCtx = context.WithValue(newCtx, "user", "server") + newCtx := context.WithValue(ctx, Transport, "local") + newCtx = context.WithValue(newCtx, Operator, "server") return newCtx, nil } @@ -175,8 +181,8 @@ func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error return nil, status.Error(codes.Unauthenticated, "Authentication failure") } - newCtx := context.WithValue(ctx, "transport", "mtls") - newCtx = context.WithValue(newCtx, "user", user) + newCtx := context.WithValue(ctx, Transport, "mtls") + newCtx = context.WithValue(newCtx, Operator, user) return newCtx, nil } diff --git a/server/transport/mtls.go b/server/transport/mtls.go deleted file mode 100644 index 674f0b5b6c..0000000000 --- a/server/transport/mtls.go +++ /dev/null @@ -1,109 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "net" - "runtime/debug" - - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/rpc" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -var mtlsLog = log.NamedLogger("transport", "mtls") - -// StartMtlsClientListener - Start a mutual TLS listener -func StartMtlsClientListener(host string, port uint16) (*grpc.Server, net.Listener, error) { - mtlsLog.Infof("Starting gRPC/mtls listener on %s:%d", host, port) - - tlsConfig := getOperatorServerTLSConfig("multiplayer") - - creds := credentials.NewTLS(tlsConfig) - ln, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port)) - if err != nil { - mtlsLog.Error(err) - return nil, nil, err - } - options := []grpc.ServerOption{ - grpc.Creds(creds), - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - } - // options = append(options, initMiddleware(true)...) - grpcServer := grpc.NewServer(options...) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - go func() { - panicked := true - defer func() { - if panicked { - mtlsLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - if err := grpcServer.Serve(ln); err != nil { - mtlsLog.Warnf("gRPC server exited with error: %v", err) - } else { - panicked = false - } - }() - return grpcServer, ln, nil -} - -// getOperatorServerTLSConfig - Generate the TLS configuration, we do now allow the end user -// to specify any TLS paramters, we choose sensible defaults instead -func getOperatorServerTLSConfig(host string) *tls.Config { - caCertPtr, _, err := certs.GetCertificateAuthority(certs.OperatorCA) - if err != nil { - mtlsLog.Fatalf("Invalid ca type (%s): %v", certs.OperatorCA, host) - } - caCertPool := x509.NewCertPool() - caCertPool.AddCert(caCertPtr) - - _, _, err = certs.OperatorServerGetCertificate(host) - if err == certs.ErrCertDoesNotExist { - certs.OperatorServerGenerateCertificate(host) - } - - certPEM, keyPEM, err := certs.OperatorServerGetCertificate(host) - if err != nil { - mtlsLog.Errorf("Failed to generate or fetch certificate %s", err) - return nil - } - cert, err := tls.X509KeyPair(certPEM, keyPEM) - if err != nil { - mtlsLog.Fatalf("Error loading server certificate: %v", err) - } - - tlsConfig := &tls.Config{ - RootCAs: caCertPool, - ClientAuth: tls.RequireAndVerifyClientCert, - ClientCAs: caCertPool, - Certificates: []tls.Certificate{cert}, - MinVersion: tls.VersionTLS13, - } - - return tlsConfig -} diff --git a/server/transport/server.go b/server/transport/server.go index 0baa174139..fed5174b63 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -1,21 +1,21 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ import ( @@ -30,6 +30,8 @@ import ( "google.golang.org/grpc/test/bufconn" clientTransport "github.com/bishopfox/sliver/client/transport" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/rpc" ) const ( @@ -49,17 +51,12 @@ const ( // // This teamserver embeds a team/server.Server core driver and uses it for fetching // server-side TLS configurations, use its loggers and access its database/users/list. -// -// By default, the server has no grpc.Server options attached. -// Please see the other functions of this package for pre-configured option sets. type Teamserver struct { *teamserver.Server options []grpc.ServerOption conn *bufconn.Listener mutex *sync.RWMutex - - hooks []func(server *grpc.Server) error } // NewListener is a simple constructor returning a teamserver loaded with the @@ -99,14 +96,7 @@ func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport // Name immplements team/server.Handler.Name(). // It indicates the transport/rpc stack, in this case "gRPC". func (h *Teamserver) Name() string { - return "gRPC" -} - -// PostServe registers one or more hook functions to be ran on the server -// before it is served to the listener. These hooks should naturally be -// used to register additional services to it. -func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { - h.hooks = append(h.hooks, hooks...) + return "gRPC/mTLS" } // Init implements team/server.Handler.Init(). @@ -136,9 +126,6 @@ func (h *Teamserver) Init(serv *teamserver.Server) (err error) { // If the teamserver has previously been given an in-memory connection, // it returns it as the listener without errors. func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { - rpcLog := h.NamedLogger("transport", "mTLS") - - // Only wrap the connection in TLS when remote. // In-memory connection are not authenticated. if h.conn == nil { ln, err = net.Listen("tcp", addr) @@ -160,17 +147,30 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { h.mutex.Unlock() } + h.serve(ln) + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// In this implementation, the function does nothing. Thus the underlying +// *grpc.Server.Shutdown() method is not called, and only the listener +// will be closed by the server automatically when using CloseListener(). +// +// This is probably not optimal from a resource usage standpoint, but currently it +// fits most use cases. Feel free to reimplement or propose changes to this lib. +func (h *Teamserver) Close() error { + return nil +} + +func (h *Teamserver) serve(ln net.Listener) { grpcServer := grpc.NewServer(h.options...) - // Register the core teamserver service - proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + rpcLog := h.NamedLogger("transport", "gRPC") - for _, hook := range h.hooks { - if err := hook(grpcServer); err != nil { - rpcLog.Errorf("service bind error: %s", err) - return nil, err - } - } + // Teamserver/Sliver services + proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) @@ -189,17 +189,4 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { panicked = false } }() - - return ln, nil -} - -// Close implements team/server.Handler.Close(). -// In this implementation, the function does nothing. Thus the underlying -// *grpc.Server.Shutdown() method is not called, and only the listener -// will be closed by the server automatically when using CloseListener(). -// -// This is probably not optimal from a resource usage standpoint, but currently it -// fits most use cases. Feel free to reimplement or propose changes to this lib. -func (h *Teamserver) Close() error { - return nil } diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 44ea47f27b..6b86c6902d 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -21,23 +21,43 @@ package transport import ( "fmt" "net" + "net/url" "os" "path/filepath" - "runtime/debug" + "sync" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/rpc" + "github.com/reeflective/team/server" "google.golang.org/grpc" - "google.golang.org/grpc/credentials" "tailscale.com/tsnet" + + "github.com/bishopfox/sliver/server/assets" ) -var tsNetLog = log.NamedLogger("transport", "tsnet") +type TailScaleTeamserver struct { + *Teamserver +} + +func NewTailScaleListener(opts ...grpc.ServerOption) server.Listener { + core := &Teamserver{ + mutex: &sync.RWMutex{}, + } + + core.options = append(core.options, opts...) + + return &TailScaleTeamserver{core} +} + +func (ts *TailScaleTeamserver) Listen(addr string) (ln net.Listener, err error) { + tsNetLog := ts.NamedLogger("transport", "tailscale") + + url, err := url.Parse(fmt.Sprintf("ts://%s", addr)) + if err != nil { + return nil, err + } + + hostname := url.Hostname() + port := url.Port() -// StartTsNetClientListener - Start a TSNet gRPC listener -func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.Listener, error) { if hostname == "" { hostname = "sliver-server" machineName, _ := os.Hostname() @@ -46,17 +66,17 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L } } - tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%d", hostname, port) + tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%d", hostname, port) authKey := os.Getenv("TS_AUTHKEY") if authKey == "" { tsNetLog.Errorf("TS_AUTHKEY not set") - return nil, nil, fmt.Errorf("TS_AUTHKEY not set") + return nil, fmt.Errorf("TS_AUTHKEY not set") } tsnetDir := filepath.Join(assets.GetRootAppDir(), "tsnet") if err := os.MkdirAll(tsnetDir, 0o700); err != nil { - return nil, nil, err + return nil, err } tsNetServer := &tsnet.Server{ @@ -65,35 +85,18 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L Logf: tsNetLog.Debugf, AuthKey: authKey, } - ln, err := tsNetServer.Listen("tcp", fmt.Sprintf(":%d", port)) + + ln, err = tsNetServer.Listen("tcp", fmt.Sprintf(":%d", port)) if err != nil { - return nil, nil, err + return nil, err } - // We don't really need the mutual TLS here, but it's easier - // maintain compatibility with existing config files - tlsConfig := getOperatorServerTLSConfig("multiplayer") - creds := credentials.NewTLS(tlsConfig) - options := []grpc.ServerOption{ - grpc.Creds(creds), - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - } - // options = append(options, initMiddleware(true)...) - grpcServer := grpc.NewServer(options...) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - go func() { - panicked := true - defer func() { - if panicked { - tsNetLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - if err := grpcServer.Serve(ln); err != nil { - tsNetLog.Warnf("gRPC/tsnet server exited with error: %v", err) - } else { - panicked = false - } - }() - return grpcServer, ln, nil + ts.serve(ln) + + return ln, nil +} + +// It indicates the transport/rpc stack, in this case "gRPC". +func (ts *TailScaleTeamserver) Name() string { + return "gRPC/TSNet" } From 139b44d882b8f404f906a255925d7208fedf4aea Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:27:36 +0200 Subject: [PATCH 019/109] Keep removing old code not needed --- go.sum | 2 -- .../team/server/commands/commands.go | 20 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/go.sum b/go.sum index ba570edf91..df65d357b5 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index f8ea077d17..618a32b6d0 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -51,22 +51,22 @@ func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Comma // On top, they need a listener in memory. servCmds := serverCommands(teamserver, teamclient) - for _, cmd := range servCmds.Commands() { - cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - return teamserver.Serve(teamclient) - } - } + // for _, cmd := range servCmds.Commands() { + // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + // return teamserver.Serve(teamclient) + // } + // } // We bind the same runners to the client-side commands. cliCmds := cli.Generate(teamclient) cliCmds.Use = "client" cliCmds.GroupID = command.TeamServerGroup - for _, cmd := range cliCmds.Commands() { - cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - return teamserver.Serve(teamclient) - } - } + // for _, cmd := range cliCmds.Commands() { + // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + // return teamserver.Serve(teamclient) + // } + // } servCmds.AddCommand(cliCmds) From cb8d01eb6cf209503f83b39142247855f09be19d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:27:57 +0200 Subject: [PATCH 020/109] End of previous commit --- server/certs/README.md | 4 -- server/certs/ca.go | 10 ++--- server/certs/certs_test.go | 44 ------------------- server/certs/operators.go | 75 -------------------------------- server/command/certs/certs.go | 5 +-- server/configs/server.go | 34 +++------------ server/core/rtunnels/rtunnels.go | 10 ++--- 7 files changed, 18 insertions(+), 164 deletions(-) delete mode 100644 server/certs/README.md delete mode 100644 server/certs/certs_test.go diff --git a/server/certs/README.md b/server/certs/README.md deleted file mode 100644 index ea7e38806b..0000000000 --- a/server/certs/README.md +++ /dev/null @@ -1,4 +0,0 @@ -certs -====== - -X.509 certificate generation and management code. diff --git a/server/certs/ca.go b/server/certs/ca.go index 7ebf12f321..20205bca58 100644 --- a/server/certs/ca.go +++ b/server/certs/ca.go @@ -38,7 +38,6 @@ import ( func SetupCAs() { GenerateCertificateAuthority(MtlsImplantCA, "") GenerateCertificateAuthority(MtlsServerCA, "") - GenerateCertificateAuthority(OperatorCA, "operators") GenerateCertificateAuthority(HTTPSCA, "") } @@ -46,7 +45,7 @@ func getCertDir() string { rootDir := assets.GetRootAppDir() certDir := filepath.Join(rootDir, "certs") if _, err := os.Stat(certDir); os.IsNotExist(err) { - err := os.MkdirAll(certDir, 0700) + err := os.MkdirAll(certDir, 0o700) if err != nil { certsLog.Fatalf("Failed to create cert dir %s", err) } @@ -126,10 +125,9 @@ func GetCertificateAuthorityPEM(caType string) ([]byte, []byte, error) { // doesn't return an error because errors are fatal. If we can't generate CAs, // then we can't secure communication and we should die a horrible death. func SaveCertificateAuthority(caType string, cert []byte, key []byte) { - storageDir := getCertDir() if _, err := os.Stat(storageDir); os.IsNotExist(err) { - os.MkdirAll(storageDir, 0700) + os.MkdirAll(storageDir, 0o700) } // CAs get written to the filesystem since we control the names and makes them @@ -137,12 +135,12 @@ func SaveCertificateAuthority(caType string, cert []byte, key []byte) { certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s-ca-cert.pem", caType)) keyFilePath := filepath.Join(storageDir, fmt.Sprintf("%s-ca-key.pem", caType)) - err := ioutil.WriteFile(certFilePath, cert, 0600) + err := ioutil.WriteFile(certFilePath, cert, 0o600) if err != nil { certsLog.Fatalf("Failed write certificate data to: %s", certFilePath) } - err = ioutil.WriteFile(keyFilePath, key, 0600) + err = ioutil.WriteFile(keyFilePath, key, 0o600) if err != nil { certsLog.Fatalf("Failed write certificate data to: %s", keyFilePath) } diff --git a/server/certs/certs_test.go b/server/certs/certs_test.go deleted file mode 100644 index d2c8034dd1..0000000000 --- a/server/certs/certs_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package certs - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "bytes" - "testing" -) - -func TestOperatorGenerateCertificate(t *testing.T) { - GenerateCertificateAuthority(OperatorCA, "") - cert1, key1, err := OperatorClientGenerateCertificate("test3") - if err != nil { - t.Errorf("Failed to store ecc certificate %v", err) - return - } - - cert2, key2, err := OperatorClientGetCertificate("test3") - if err != nil { - t.Errorf("Failed to get ecc certificate %v", err) - return - } - - if !bytes.Equal(cert1, cert2) || !bytes.Equal(key1, key2) { - t.Errorf("Stored ecc cert/key does match generated cert/key: %v != %v", cert1, cert2) - return - } -} diff --git a/server/certs/operators.go b/server/certs/operators.go index aa91d1b501..591c4319a6 100644 --- a/server/certs/operators.go +++ b/server/certs/operators.go @@ -17,78 +17,3 @@ package certs You should have received a copy of the GNU General Public License along with this program. If not, see . */ - -import ( - "crypto/x509" - "encoding/pem" - "fmt" - - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/db/models" -) - -const ( - // OperatorCA - Directory containing operator certificates - OperatorCA = "operator" - - clientNamespace = "client" // Operator clients - serverNamespace = "server" // Operator servers -) - -// OperatorClientGenerateCertificate - Generate a certificate signed with a given CA -func OperatorClientGenerateCertificate(operator string) ([]byte, []byte, error) { - cert, key := GenerateECCCertificate(OperatorCA, operator, false, true) - err := saveCertificate(OperatorCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, operator), cert, key) - return cert, key, err -} - -// OperatorClientGetCertificate - Helper function to fetch a client cert -func OperatorClientGetCertificate(operator string) ([]byte, []byte, error) { - return GetECCCertificate(OperatorCA, fmt.Sprintf("%s.%s", clientNamespace, operator)) -} - -// OperatorClientRemoveCertificate - Helper function to remove a client cert -func OperatorClientRemoveCertificate(operator string) error { - return RemoveCertificate(OperatorCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, operator)) -} - -// OperatorServerGetCertificate - Helper function to fetch a server cert -func OperatorServerGetCertificate(hostname string) ([]byte, []byte, error) { - return GetECCCertificate(OperatorCA, fmt.Sprintf("%s.%s", serverNamespace, hostname)) -} - -// OperatorServerGenerateCertificate - Generate a certificate signed with a given CA -func OperatorServerGenerateCertificate(hostname string) ([]byte, []byte, error) { - cert, key := GenerateECCCertificate(OperatorCA, hostname, false, false) - err := saveCertificate(OperatorCA, ECCKey, fmt.Sprintf("%s.%s", serverNamespace, hostname), cert, key) - return cert, key, err -} - -// OperatorClientListCertificates - Get all client certificates -func OperatorClientListCertificates() []*x509.Certificate { - operatorCerts := []*models.Certificate{} - dbSession := db.Session() - result := dbSession.Where(&models.Certificate{CAType: OperatorCA}).Find(&operatorCerts) - if result.Error != nil { - certsLog.Error(result.Error) - return []*x509.Certificate{} - } - - certsLog.Infof("Found %d operator certs ...", len(operatorCerts)) - - certs := []*x509.Certificate{} - for _, operator := range operatorCerts { - block, _ := pem.Decode([]byte(operator.CertificatePEM)) - if block == nil { - certsLog.Warn("failed to parse certificate PEM") - continue - } - cert, err := x509.ParseCertificate(block.Bytes) - if err != nil { - certsLog.Warnf("failed to parse x.509 certificate %v", err) - continue - } - certs = append(certs, cert) - } - return certs -} diff --git a/server/command/certs/certs.go b/server/command/certs/certs.go index aaac31e2f0..b81fa8349c 100644 --- a/server/command/certs/certs.go +++ b/server/command/certs/certs.go @@ -31,9 +31,8 @@ import ( // CATypes - CA types var CATypes = map[string]string{ - "operator": certs.OperatorCA, - "mtls": certs.MtlsImplantCA, - "https": certs.HTTPSCA, + "mtls": certs.MtlsImplantCA, + "https": certs.HTTPSCA, } const ( diff --git a/server/configs/server.go b/server/configs/server.go index 2f9c004020..058b4de28d 100644 --- a/server/configs/server.go +++ b/server/configs/server.go @@ -35,9 +35,7 @@ const ( serverConfigFileName = "server.json" ) -var ( - serverConfigLog = log.NamedLogger("config", "server") -) +var serverConfigLog = log.NamedLogger("config", "server") // GetServerConfigPath - File path to config.json func GetServerConfigPath() string { @@ -63,18 +61,10 @@ type DaemonConfig struct { // JobConfig - Restart Jobs on Load type JobConfig struct { - Multiplayer []*MultiplayerJobConfig `json:"multiplayer"` - MTLS []*MTLSJobConfig `json:"mtls,omitempty"` - WG []*WGJobConfig `json:"wg,omitempty"` - DNS []*DNSJobConfig `json:"dns,omitempty"` - HTTP []*HTTPJobConfig `json:"http,omitempty"` -} - -type MultiplayerJobConfig struct { - Host string `json:"host"` - Port uint16 `json:"port"` - JobID string `json:"job_id"` - Tailscale bool `json:"tailscale"` + MTLS []*MTLSJobConfig `json:"mtls,omitempty"` + WG []*WGJobConfig `json:"wg,omitempty"` + DNS []*DNSJobConfig `json:"dns,omitempty"` + HTTP []*HTTPJobConfig `json:"http,omitempty"` } // MTLSJobConfig - Per-type job configs @@ -142,7 +132,7 @@ func (c *ServerConfig) Save() error { configDir := filepath.Dir(configPath) if _, err := os.Stat(configDir); os.IsNotExist(err) { serverConfigLog.Debugf("Creating config dir %s", configDir) - err := os.MkdirAll(configDir, 0700) + err := os.MkdirAll(configDir, 0o700) if err != nil { return err } @@ -152,23 +142,13 @@ func (c *ServerConfig) Save() error { return err } serverConfigLog.Infof("Saving config to %s", configPath) - err = os.WriteFile(configPath, data, 0600) + err = os.WriteFile(configPath, data, 0o600) if err != nil { serverConfigLog.Errorf("Failed to write config %s", err) } return nil } -// AddMultiplayerJob - Add Job Configs -func (c *ServerConfig) AddMultiplayerJob(config *MultiplayerJobConfig) error { - if c.Jobs == nil { - c.Jobs = &JobConfig{} - } - config.JobID = getRandomID() - c.Jobs.Multiplayer = append(c.Jobs.Multiplayer, config) - return c.Save() -} - // AddMTLSJob - Add Job Configs func (c *ServerConfig) AddMTLSJob(config *MTLSJobConfig) error { if c.Jobs == nil { diff --git a/server/core/rtunnels/rtunnels.go b/server/core/rtunnels/rtunnels.go index 4841989f51..312f254461 100644 --- a/server/core/rtunnels/rtunnels.go +++ b/server/core/rtunnels/rtunnels.go @@ -10,7 +10,7 @@ var ( mutex sync.RWMutex ) -// RTunnel - Duplex byte read/write +// RTunnel - Duplex byte read/write. type RTunnel struct { ID uint64 SessionID string @@ -62,7 +62,7 @@ func (c *RTunnel) IncWriteSequence() { c.writeSequence += 1 } -// Close - close RTunnel reader and writer +// Close - close RTunnel reader and writer. func (c *RTunnel) Close() { for _, rc := range c.Readers { if rc != nil { @@ -72,14 +72,14 @@ func (c *RTunnel) Close() { c.Writer.Close() } -// Tunnel - Add tunnel to mapping +// Tunnel - Add tunnel to mapping. func GetRTunnel(ID uint64) *RTunnel { mutex.RLock() defer mutex.RUnlock() return Rtunnels[ID] } -// AddTunnel - Add tunnel to mapping +// AddTunnel - Add tunnel to mapping. func AddRTunnel(tun *RTunnel) { mutex.Lock() defer mutex.Unlock() @@ -87,7 +87,7 @@ func AddRTunnel(tun *RTunnel) { Rtunnels[tun.ID] = tun } -// RemoveTunnel - Add tunnel to mapping +// RemoveTunnel - Add tunnel to mapping. func RemoveRTunnel(ID uint64) { mutex.Lock() defer mutex.Unlock() From e39db64c860e5f45e1e603e5cce69800bdf77437 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:37:17 +0200 Subject: [PATCH 021/109] Remove related operators commands and RPC stub --- client/command/operators/README.md | 6 - client/command/operators/commands.go | 29 - client/command/operators/operators.go | 67 - client/command/server.go | 2 - protobuf/clientpb/client.pb.go | 2323 ++++++++++++------------- protobuf/clientpb/client.proto | 2 - protobuf/commonpb/common.pb.go | 7 +- protobuf/dnspb/dns.pb.go | 10 +- protobuf/rpcpb/services.pb.go | 2070 +++++++++++----------- protobuf/rpcpb/services.proto | 3 - protobuf/rpcpb/services_grpc.pb.go | 858 +++++---- protobuf/sliverpb/sliver.pb.go | 4 +- server/rpc/rpc-operators.go | 53 - server/transport/rpc.go | 15 +- 14 files changed, 2679 insertions(+), 2770 deletions(-) delete mode 100644 client/command/operators/README.md delete mode 100644 client/command/operators/commands.go delete mode 100644 client/command/operators/operators.go delete mode 100644 server/rpc/rpc-operators.go diff --git a/client/command/operators/README.md b/client/command/operators/README.md deleted file mode 100644 index cb946e2b47..0000000000 --- a/client/command/operators/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Operators -========== - -Operator related command implementations. - -__NOTE:__ Some operator-related commands are server-side only and are located instead in `server/console` diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go deleted file mode 100644 index acdf6c7835..0000000000 --- a/client/command/operators/commands.go +++ /dev/null @@ -1,29 +0,0 @@ -package operators - -import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverClient) []*cobra.Command { - operatorsCmd := &cobra.Command{ - Use: consts.OperatorsStr, - Short: "Manage operators", - Long: help.GetHelpFor([]string{consts.OperatorsStr}), - Run: func(cmd *cobra.Command, args []string) { - OperatorsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - flags.Bind("operators", false, operatorsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") - }) - - return []*cobra.Command{operatorsCmd} -} diff --git a/client/command/operators/operators.go b/client/command/operators/operators.go deleted file mode 100644 index 70824a341d..0000000000 --- a/client/command/operators/operators.go +++ /dev/null @@ -1,67 +0,0 @@ -package operators - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" - - "github.com/jedib0t/go-pretty/v6/table" -) - -// OperatorsCmd - Display operators and current online status -func OperatorsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - operators, err := con.Rpc.GetOperators(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintErrorf("%s\n", err) - } else if 0 < len(operators.Operators) { - displayOperators(operators.Operators, con) - } else { - con.PrintInfof("No remote operators connected\n") - } -} - -func displayOperators(operators []*clientpb.Operator, con *console.SliverClient) { - tw := table.NewWriter() - tw.SetStyle(settings.GetTableStyle(con)) - tw.AppendHeader(table.Row{ - "Name", - "Status", - }) - for _, operator := range operators { - tw.AppendRow(table.Row{ - console.Bold + operator.Name + console.Normal, - status(operator.Online), - }) - } - con.Printf("%s\n", tw.Render()) -} - -func status(isOnline bool) string { - if isOnline { - return console.Bold + console.Green + "Online" + console.Normal - } - return console.Bold + console.Red + "Offline" + console.Normal -} diff --git a/client/command/server.go b/client/command/server.go index d73bc46914..931cde702f 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -35,7 +35,6 @@ import ( "github.com/bishopfox/sliver/client/command/licenses" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/command/monitor" - "github.com/bishopfox/sliver/client/command/operators" operator "github.com/bishopfox/sliver/client/command/prelude-operator" "github.com/bishopfox/sliver/client/command/reaction" "github.com/bishopfox/sliver/client/command/sessions" @@ -85,7 +84,6 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso alias.Commands, armory.Commands, update.Commands, - operators.Commands, operator.Commands, creds.Commands, crack.Commands, diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index a291b96d2d..ebd03832cd 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.31.0 // protoc v3.15.8 // source: clientpb/client.proto @@ -5256,7 +5256,8 @@ func (x *MsfStager) GetFile() *commonpb.File { } // GetSystemReq - Client request to the server which is translated into -// InvokeSystemReq when sending to the implant. +// +// InvokeSystemReq when sending to the implant. type GetSystemReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5321,7 +5322,8 @@ func (x *GetSystemReq) GetRequest() *commonpb.Request { } // MigrateReq - Client request to the server which is translated into -// InvokeMigrateReq when sending to the implant. +// +// InvokeMigrateReq when sending to the implant. type MigrateReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5821,53 +5823,6 @@ func (x *Event) GetErr() string { return "" } -type Operators struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Operators []*Operator `protobuf:"bytes,1,rep,name=Operators,proto3" json:"Operators,omitempty"` -} - -func (x *Operators) Reset() { - *x = Operators{} - if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Operators) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Operators) ProtoMessage() {} - -func (x *Operators) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Operators.ProtoReflect.Descriptor instead. -func (*Operators) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} -} - -func (x *Operators) GetOperators() []*Operator { - if x != nil { - return x.Operators - } - return nil -} - type Operator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5880,7 +5835,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5893,7 +5848,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5906,7 +5861,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *Operator) GetOnline() bool { @@ -5938,7 +5893,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5951,7 +5906,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5964,7 +5919,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *WebContent) GetPath() string { @@ -6007,7 +5962,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6020,7 +5975,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6033,7 +5988,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *WebsiteAddContent) GetName() string { @@ -6062,7 +6017,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6075,7 +6030,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6088,7 +6043,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *WebsiteRemoveContent) GetName() string { @@ -6117,7 +6072,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6130,7 +6085,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6143,7 +6098,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *Website) GetName() string { @@ -6171,7 +6126,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6184,7 +6139,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6197,7 +6152,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *Websites) GetWebsites() []*Website { @@ -6221,7 +6176,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6234,7 +6189,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6247,7 +6202,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6294,7 +6249,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6307,7 +6262,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6320,7 +6275,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Loot) GetID() string { @@ -6376,7 +6331,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6389,7 +6344,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6402,7 +6357,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *AllLoot) GetLoot() []*Loot { @@ -6426,7 +6381,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6439,7 +6394,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6452,7 +6407,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *IOC) GetPath() string { @@ -6487,7 +6442,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6500,7 +6455,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6513,7 +6468,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *ExtensionData) GetOutput() string { @@ -6540,7 +6495,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6553,7 +6508,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6566,7 +6521,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *Host) GetHostname() string { @@ -6629,7 +6584,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6642,7 +6597,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6655,7 +6610,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *AllHosts) GetHosts() []*Host { @@ -6682,7 +6637,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6695,7 +6650,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6708,7 +6663,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -6764,7 +6719,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6777,7 +6732,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6790,7 +6745,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -6813,7 +6768,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6826,7 +6781,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6839,7 +6794,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *BackdoorReq) GetFilePath() string { @@ -6874,7 +6829,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6887,7 +6842,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6900,7 +6855,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -6926,7 +6881,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6939,7 +6894,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6952,7 +6907,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7009,7 +6964,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7022,7 +6977,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7035,7 +6990,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *ShellcodeEncode) GetData() []byte { @@ -7063,7 +7018,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7076,7 +7031,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7089,7 +7044,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7111,7 +7066,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7124,7 +7079,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7137,7 +7092,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7165,7 +7120,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7178,7 +7133,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7191,7 +7146,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *Builders) GetBuilders() []*Builder { @@ -7218,7 +7173,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7231,7 +7186,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7244,7 +7199,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *Builder) GetName() string { @@ -7314,7 +7269,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7327,7 +7282,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7340,7 +7295,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *Credential) GetID() string { @@ -7410,7 +7365,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7423,7 +7378,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7436,7 +7391,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *Credentials) GetCredentials() []*Credential { @@ -7458,7 +7413,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7471,7 +7426,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7484,7 +7439,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7510,7 +7465,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7523,7 +7478,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7536,7 +7491,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *CrackstationStatus) GetName() string { @@ -7593,7 +7548,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7606,7 +7561,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7619,7 +7574,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -7649,7 +7604,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7662,7 +7617,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7675,7 +7630,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *CrackBenchmark) GetName() string { @@ -7716,7 +7671,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7729,7 +7684,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7742,7 +7697,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *CrackTask) GetID() string { @@ -7815,7 +7770,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7828,7 +7783,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7841,7 +7796,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Crackstation) GetName() string { @@ -7941,7 +7896,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7954,7 +7909,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7967,7 +7922,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *CUDABackendInfo) GetType() string { @@ -8061,7 +8016,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8074,7 +8029,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8087,7 +8042,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *OpenCLBackendInfo) GetType() string { @@ -8187,7 +8142,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8200,7 +8155,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8213,7 +8168,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *MetalBackendInfo) GetType() string { @@ -8411,7 +8366,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8424,7 +8379,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8437,7 +8392,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9168,7 +9123,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9181,7 +9136,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9194,7 +9149,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *CrackConfig) GetAutoFire() bool { @@ -9238,7 +9193,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9251,7 +9206,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9264,7 +9219,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9309,7 +9264,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9322,7 +9277,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9335,7 +9290,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *CrackFile) GetID() string { @@ -9429,7 +9384,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9442,7 +9397,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9455,7 +9410,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *CrackFileChunk) GetID() string { @@ -10126,349 +10081,305 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x3d, 0x0a, 0x09, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, - 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, - 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, - 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, - 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, - 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, - 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, - 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, - 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, - 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, - 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, - 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, - 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, - 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, - 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, + 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, + 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, + 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, + 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, + 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, + 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, + 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, + 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, + 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, + 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, + 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, + 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, + 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, + 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, - 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, - 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, - 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, - 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, - 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, - 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, - 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, - 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, - 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, - 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, - 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, - 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, - 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, - 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, - 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, - 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, - 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, - 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, - 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, + 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, + 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, + 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, + 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, + 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, + 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, + 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, + 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, + 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, + 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, + 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, + 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, + 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, + 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, + 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, + 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, @@ -10483,515 +10394,555 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, - 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, - 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, - 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, - 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, - 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, - 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, - 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, - 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, - 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, - 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, - 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, - 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, - 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, - 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, - 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, - 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, - 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, - 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, - 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, - 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, - 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, - 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, - 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, - 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, - 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, - 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, - 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, - 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, - 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, - 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, - 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, - 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, - 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, - 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, - 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, - 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, - 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, - 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, - 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, - 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, - 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, - 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, - 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, - 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, - 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, - 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, - 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, - 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, - 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, - 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, - 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, - 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, - 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, - 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, - 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, - 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, - 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, - 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, - 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, - 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, - 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, - 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, - 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, - 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, - 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, - 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, - 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, - 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, - 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, - 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, - 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, - 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, - 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, - 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, - 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, - 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, - 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, - 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, - 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, - 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, - 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, - 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, - 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, - 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, - 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, - 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, - 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, - 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, - 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, - 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, - 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, - 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, - 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, - 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, - 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, - 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, - 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, - 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, - 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, - 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, - 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, - 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, - 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, - 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, - 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, - 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, - 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, - 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, - 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, - 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, - 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, - 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, - 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, - 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, - 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, - 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, - 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, - 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, - 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, - 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, - 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, - 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, - 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, - 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, - 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, - 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, - 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, - 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, - 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, - 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, - 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, - 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, - 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, - 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, - 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, - 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, - 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, - 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, - 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, - 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, - 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, - 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, - 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, - 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, - 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, - 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, - 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, - 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, - 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, - 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, - 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, - 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, - 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, - 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, - 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, - 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, - 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, - 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, - 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, - 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, - 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, - 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, - 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, - 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, - 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, - 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, - 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, - 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, - 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, - 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, - 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, - 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, - 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, - 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, - 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, - 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, - 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, - 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, - 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, - 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, - 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, - 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, - 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, - 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, - 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, - 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, - 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, - 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, - 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, - 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, - 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, - 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, - 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, - 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, - 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, - 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, - 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, - 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, - 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, - 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, - 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, - 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, - 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, - 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, - 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, - 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, - 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, - 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, - 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, - 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, - 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, - 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, - 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, - 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, - 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, - 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, - 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, - 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, + 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, + 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, + 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, + 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, + 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, + 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, + 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, + 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, + 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, + 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, + 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, + 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, + 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, + 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, + 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, + 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, + 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, + 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, + 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, + 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, + 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, + 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, + 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, + 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, + 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, + 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, + 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, + 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, + 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, + 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, + 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, + 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, + 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, + 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, + 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, + 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, + 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, + 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, + 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, + 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, + 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, + 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, + 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, + 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, + 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, + 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, + 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, + 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, + 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, + 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, + 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, + 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, + 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, + 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, + 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, + 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, + 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, + 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, + 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, + 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, + 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, + 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, + 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, + 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, + 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, + 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, + 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, + 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, + 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, + 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, + 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, + 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, + 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, + 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, + 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, + 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, + 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, + 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, + 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, + 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, + 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, + 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, + 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, + 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, + 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, + 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, + 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, + 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, + 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, + 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, + 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, + 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, + 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, + 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, + 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, + 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, + 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, + 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, + 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, + 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, + 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, + 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, + 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, + 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, + 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, + 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, + 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, + 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, + 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, + 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, + 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, + 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, + 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, + 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, + 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, + 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, + 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, + 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, + 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, + 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, + 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, + 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, + 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, + 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, + 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, + 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, + 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, + 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, + 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, + 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, + 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, + 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, + 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, + 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, + 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, + 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, + 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, + 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, + 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, + 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, + 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, + 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, + 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, + 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, + 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, + 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, + 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, + 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, + 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, + 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, + 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, + 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, + 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, + 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, + 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, + 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, + 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, + 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, + 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, + 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, + 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, + 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, + 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, + 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, + 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, + 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, + 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, + 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, + 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, + 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, + 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, + 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, + 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, + 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, + 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, + 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, + 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, + 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, + 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, + 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, + 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, + 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, + 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, + 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, + 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, + 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, + 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, + 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, + 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, + 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, + 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, + 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, + 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, + 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11007,7 +10958,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 112) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 111) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -11084,72 +11035,71 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (*PivotGraph)(nil), // 72: clientpb.PivotGraph (*Client)(nil), // 73: clientpb.Client (*Event)(nil), // 74: clientpb.Event - (*Operators)(nil), // 75: clientpb.Operators - (*Operator)(nil), // 76: clientpb.Operator - (*WebContent)(nil), // 77: clientpb.WebContent - (*WebsiteAddContent)(nil), // 78: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 79: clientpb.WebsiteRemoveContent - (*Website)(nil), // 80: clientpb.Website - (*Websites)(nil), // 81: clientpb.Websites - (*WGClientConfig)(nil), // 82: clientpb.WGClientConfig - (*Loot)(nil), // 83: clientpb.Loot - (*AllLoot)(nil), // 84: clientpb.AllLoot - (*IOC)(nil), // 85: clientpb.IOC - (*ExtensionData)(nil), // 86: clientpb.ExtensionData - (*Host)(nil), // 87: clientpb.Host - (*AllHosts)(nil), // 88: clientpb.AllHosts - (*DllHijackReq)(nil), // 89: clientpb.DllHijackReq - (*DllHijack)(nil), // 90: clientpb.DllHijack - (*BackdoorReq)(nil), // 91: clientpb.BackdoorReq - (*Backdoor)(nil), // 92: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 93: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 94: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 95: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 96: clientpb.ExternalGenerateReq - (*Builders)(nil), // 97: clientpb.Builders - (*Builder)(nil), // 98: clientpb.Builder - (*Credential)(nil), // 99: clientpb.Credential - (*Credentials)(nil), // 100: clientpb.Credentials - (*Crackstations)(nil), // 101: clientpb.Crackstations - (*CrackstationStatus)(nil), // 102: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 103: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 104: clientpb.CrackBenchmark - (*CrackTask)(nil), // 105: clientpb.CrackTask - (*Crackstation)(nil), // 106: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 107: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 108: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 109: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 110: clientpb.CrackCommand - (*CrackConfig)(nil), // 111: clientpb.CrackConfig - (*CrackFiles)(nil), // 112: clientpb.CrackFiles - (*CrackFile)(nil), // 113: clientpb.CrackFile - (*CrackFileChunk)(nil), // 114: clientpb.CrackFileChunk - nil, // 115: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 116: clientpb.ImplantBuilds.ConfigsEntry - nil, // 117: clientpb.WebsiteAddContent.ContentsEntry - nil, // 118: clientpb.Website.ContentsEntry - nil, // 119: clientpb.Host.ExtensionDataEntry - nil, // 120: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 121: clientpb.CrackSyncStatus.ProgressEntry - nil, // 122: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 123: clientpb.Crackstation.BenchmarksEntry - (*commonpb.File)(nil), // 124: commonpb.File - (*commonpb.Request)(nil), // 125: commonpb.Request - (*commonpb.Response)(nil), // 126: commonpb.Response + (*Operator)(nil), // 75: clientpb.Operator + (*WebContent)(nil), // 76: clientpb.WebContent + (*WebsiteAddContent)(nil), // 77: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 78: clientpb.WebsiteRemoveContent + (*Website)(nil), // 79: clientpb.Website + (*Websites)(nil), // 80: clientpb.Websites + (*WGClientConfig)(nil), // 81: clientpb.WGClientConfig + (*Loot)(nil), // 82: clientpb.Loot + (*AllLoot)(nil), // 83: clientpb.AllLoot + (*IOC)(nil), // 84: clientpb.IOC + (*ExtensionData)(nil), // 85: clientpb.ExtensionData + (*Host)(nil), // 86: clientpb.Host + (*AllHosts)(nil), // 87: clientpb.AllHosts + (*DllHijackReq)(nil), // 88: clientpb.DllHijackReq + (*DllHijack)(nil), // 89: clientpb.DllHijack + (*BackdoorReq)(nil), // 90: clientpb.BackdoorReq + (*Backdoor)(nil), // 91: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 92: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 93: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 94: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 95: clientpb.ExternalGenerateReq + (*Builders)(nil), // 96: clientpb.Builders + (*Builder)(nil), // 97: clientpb.Builder + (*Credential)(nil), // 98: clientpb.Credential + (*Credentials)(nil), // 99: clientpb.Credentials + (*Crackstations)(nil), // 100: clientpb.Crackstations + (*CrackstationStatus)(nil), // 101: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 102: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 103: clientpb.CrackBenchmark + (*CrackTask)(nil), // 104: clientpb.CrackTask + (*Crackstation)(nil), // 105: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 106: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 107: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 108: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 109: clientpb.CrackCommand + (*CrackConfig)(nil), // 110: clientpb.CrackConfig + (*CrackFiles)(nil), // 111: clientpb.CrackFiles + (*CrackFile)(nil), // 112: clientpb.CrackFile + (*CrackFileChunk)(nil), // 113: clientpb.CrackFileChunk + nil, // 114: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 115: clientpb.ImplantBuilds.ConfigsEntry + nil, // 116: clientpb.WebsiteAddContent.ContentsEntry + nil, // 117: clientpb.Website.ContentsEntry + nil, // 118: clientpb.Host.ExtensionDataEntry + nil, // 119: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 120: clientpb.CrackSyncStatus.ProgressEntry + nil, // 121: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 122: clientpb.Crackstation.BenchmarksEntry + (*commonpb.File)(nil), // 123: commonpb.File + (*commonpb.Request)(nil), // 124: commonpb.Request + (*commonpb.Response)(nil), // 125: commonpb.Response } var file_clientpb_client_proto_depIdxs = []int32{ 15, // 0: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon 17, // 1: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask 19, // 2: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 0, // 3: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 124, // 4: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 124, // 5: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 115, // 6: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 123, // 4: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 123, // 5: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 114, // 6: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry 21, // 7: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder 23, // 8: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest 20, // 9: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 124, // 10: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 116, // 11: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 123, // 10: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 115, // 11: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry 0, // 12: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat 28, // 13: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget 29, // 14: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler @@ -11158,86 +11108,85 @@ var file_clientpb_client_proto_depIdxs = []int32{ 20, // 17: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig 35, // 18: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile 38, // 19: clientpb.Jobs.Active:type_name -> clientpb.Job - 125, // 20: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 126, // 21: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 125, // 22: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 126, // 23: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 124, // 20: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 125, // 21: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 124, // 22: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 125, // 23: clientpb.TCPPivot.Response:type_name -> commonpb.Response 14, // 24: clientpb.Sessions.Sessions:type_name -> clientpb.Session 20, // 25: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 124, // 26: clientpb.Generate.File:type_name -> commonpb.File - 125, // 27: clientpb.MSFReq.Request:type_name -> commonpb.Request - 125, // 28: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 123, // 26: clientpb.Generate.File:type_name -> commonpb.File + 124, // 27: clientpb.MSFReq.Request:type_name -> commonpb.Request + 124, // 28: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request 1, // 29: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol 1, // 30: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 124, // 31: clientpb.MsfStager.File:type_name -> commonpb.File + 123, // 31: clientpb.MsfStager.File:type_name -> commonpb.File 20, // 32: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 125, // 33: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 124, // 33: clientpb.GetSystemReq.Request:type_name -> commonpb.Request 20, // 34: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig 3, // 35: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 125, // 36: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 125, // 37: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 125, // 38: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 124, // 36: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 124, // 37: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 124, // 38: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request 14, // 39: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session 71, // 40: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry 71, // 41: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 76, // 42: clientpb.Client.Operator:type_name -> clientpb.Operator + 75, // 42: clientpb.Client.Operator:type_name -> clientpb.Operator 14, // 43: clientpb.Event.Session:type_name -> clientpb.Session 38, // 44: clientpb.Event.Job:type_name -> clientpb.Job 73, // 45: clientpb.Event.Client:type_name -> clientpb.Client - 76, // 46: clientpb.Operators.Operators:type_name -> clientpb.Operator - 117, // 47: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 118, // 48: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 80, // 49: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 50: clientpb.Loot.FileType:type_name -> clientpb.FileType - 124, // 51: clientpb.Loot.File:type_name -> commonpb.File - 83, // 52: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 85, // 53: clientpb.Host.IOCs:type_name -> clientpb.IOC - 119, // 54: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 87, // 55: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 125, // 56: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 126, // 57: clientpb.DllHijack.Response:type_name -> commonpb.Response - 125, // 58: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 126, // 59: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 60: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 125, // 61: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 126, // 62: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 120, // 63: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 20, // 64: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 98, // 65: clientpb.Builders.Builders:type_name -> clientpb.Builder - 28, // 66: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 29, // 67: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 68: clientpb.Credential.HashType:type_name -> clientpb.HashType - 99, // 69: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 106, // 70: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 71: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 103, // 72: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 121, // 73: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 122, // 74: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 110, // 75: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 123, // 76: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 107, // 77: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 109, // 78: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 108, // 79: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 80: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 81: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 82: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 83: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 84: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 85: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 113, // 86: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 87: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 114, // 88: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 21, // 89: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 20, // 90: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 77, // 91: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 77, // 92: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 86, // 93: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 94: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 95, // [95:95] is the sub-list for method output_type - 95, // [95:95] is the sub-list for method input_type - 95, // [95:95] is the sub-list for extension type_name - 95, // [95:95] is the sub-list for extension extendee - 0, // [0:95] is the sub-list for field type_name + 116, // 46: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 117, // 47: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 79, // 48: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 49: clientpb.Loot.FileType:type_name -> clientpb.FileType + 123, // 50: clientpb.Loot.File:type_name -> commonpb.File + 82, // 51: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 84, // 52: clientpb.Host.IOCs:type_name -> clientpb.IOC + 118, // 53: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 86, // 54: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 124, // 55: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 125, // 56: clientpb.DllHijack.Response:type_name -> commonpb.Response + 124, // 57: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 125, // 58: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 59: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 124, // 60: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 125, // 61: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 119, // 62: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 20, // 63: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 97, // 64: clientpb.Builders.Builders:type_name -> clientpb.Builder + 28, // 65: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 29, // 66: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 67: clientpb.Credential.HashType:type_name -> clientpb.HashType + 98, // 68: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 105, // 69: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 70: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 102, // 71: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 120, // 72: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 121, // 73: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 109, // 74: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 122, // 75: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 106, // 76: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 108, // 77: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 107, // 78: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 79: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 80: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 81: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 82: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 83: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 84: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 112, // 85: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 86: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 113, // 87: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 21, // 88: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 20, // 89: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 76, // 90: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 76, // 91: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 85, // 92: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 93: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 94, // [94:94] is the sub-list for method output_type + 94, // [94:94] is the sub-list for method input_type + 94, // [94:94] is the sub-list for extension type_name + 94, // [94:94] is the sub-list for extension extendee + 0, // [0:94] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -12003,18 +11952,6 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operators); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Operator); i { case 0: return &v.state @@ -12026,7 +11963,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebContent); i { case 0: return &v.state @@ -12038,7 +11975,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebsiteAddContent); i { case 0: return &v.state @@ -12050,7 +11987,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state @@ -12062,7 +11999,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Website); i { case 0: return &v.state @@ -12074,7 +12011,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Websites); i { case 0: return &v.state @@ -12086,7 +12023,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WGClientConfig); i { case 0: return &v.state @@ -12098,7 +12035,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Loot); i { case 0: return &v.state @@ -12110,7 +12047,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllLoot); i { case 0: return &v.state @@ -12122,7 +12059,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IOC); i { case 0: return &v.state @@ -12134,7 +12071,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExtensionData); i { case 0: return &v.state @@ -12146,7 +12083,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Host); i { case 0: return &v.state @@ -12158,7 +12095,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllHosts); i { case 0: return &v.state @@ -12170,7 +12107,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DllHijackReq); i { case 0: return &v.state @@ -12182,7 +12119,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DllHijack); i { case 0: return &v.state @@ -12194,7 +12131,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BackdoorReq); i { case 0: return &v.state @@ -12206,7 +12143,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Backdoor); i { case 0: return &v.state @@ -12218,7 +12155,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state @@ -12230,7 +12167,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncode); i { case 0: return &v.state @@ -12242,7 +12179,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state @@ -12254,7 +12191,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state @@ -12266,7 +12203,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Builders); i { case 0: return &v.state @@ -12278,7 +12215,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Builder); i { case 0: return &v.state @@ -12290,7 +12227,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Credential); i { case 0: return &v.state @@ -12302,7 +12239,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Credentials); i { case 0: return &v.state @@ -12314,7 +12251,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Crackstations); i { case 0: return &v.state @@ -12326,7 +12263,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackstationStatus); i { case 0: return &v.state @@ -12338,7 +12275,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackSyncStatus); i { case 0: return &v.state @@ -12350,7 +12287,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackBenchmark); i { case 0: return &v.state @@ -12362,7 +12299,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackTask); i { case 0: return &v.state @@ -12374,7 +12311,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Crackstation); i { case 0: return &v.state @@ -12386,7 +12323,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CUDABackendInfo); i { case 0: return &v.state @@ -12398,7 +12335,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state @@ -12410,7 +12347,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetalBackendInfo); i { case 0: return &v.state @@ -12422,7 +12359,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackCommand); i { case 0: return &v.state @@ -12434,7 +12371,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackConfig); i { case 0: return &v.state @@ -12446,7 +12383,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFiles); i { case 0: return &v.state @@ -12458,7 +12395,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFile); i { case 0: return &v.state @@ -12470,7 +12407,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12489,7 +12426,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 112, + NumMessages: 111, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index 7e7384036d..ec42e85758 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -514,8 +514,6 @@ message Event { string Err = 6; // Can't trigger normal gRPC error } -message Operators { repeated Operator Operators = 1; } - message Operator { bool Online = 1; string Name = 2; diff --git a/protobuf/commonpb/common.pb.go b/protobuf/commonpb/common.pb.go index 0bfd3a489b..0ebf02a837 100644 --- a/protobuf/commonpb/common.pb.go +++ b/protobuf/commonpb/common.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.31.0 // protoc v3.15.8 // source: commonpb/common.proto @@ -131,8 +131,9 @@ func (x *Request) GetSessionID() string { } // Response - Common fields used in all gRPC responses. Note that the Err field -// only used when the implant needs to return an error to the server. -// Client<->Server comms should use normal gRPC error handling. +// +// only used when the implant needs to return an error to the server. +// Client<->Server comms should use normal gRPC error handling. type Response struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/protobuf/dnspb/dns.pb.go b/protobuf/dnspb/dns.pb.go index a31c365aa8..b5cdf7b18f 100644 --- a/protobuf/dnspb/dns.pb.go +++ b/protobuf/dnspb/dns.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.31.0 // protoc v3.15.8 // source: dnspb/dns.proto @@ -87,12 +87,10 @@ func (DNSMessageType) EnumDescriptor() ([]byte, []int) { return file_dnspb_dns_proto_rawDescGZIP(), []int{0} } +// NOTE: DNS is very space sensitive so certain fields are re-purposed +// depending on the DNSMessageType as noted below: // -//NOTE: DNS is very space sensitive so certain fields are re-purposed -//depending on the DNSMessageType as noted below: -// -//[Type TOTP]: ID field is used for the TOTP code -// +// [Type TOTP]: ID field is used for the TOTP code type DNSMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index 0ce82cc45e..9f77e54f9d 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.21.12 +// protoc-gen-go v1.31.0 +// protoc v3.15.8 // source: rpcpb/services.proto package rpcpb @@ -31,636 +31,633 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x9c, 0x4e, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xe6, 0x4d, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x34, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x4b, 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, - 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, - 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, + 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, + 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, + 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, - 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, - 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, + 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, + 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, + 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, - 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, - 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, - 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, - 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, + 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, + 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, + 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, - 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, + 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, + 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, - 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, + 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, - 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, - 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, - 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, - 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, - 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, - 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, + 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, + 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, + 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, - 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, - 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, + 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, + 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, + 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, + 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, + 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, - 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, - 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, + 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, - 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, - 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, - 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, - 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, + 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, + 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, + 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, + 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, + 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, - 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, - 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, - 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, - 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, - 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, - 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, - 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, - 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, - 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, - 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, - 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, - 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, - 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, - 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, - 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, + 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, + 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, + 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, + 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, + 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, + 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, + 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, + 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, + 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, + 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, + 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, + 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, - 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, - 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, - 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, - 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, - 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, - 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, + 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, + 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, + 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, + 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, - 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, - 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, - 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, - 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, - 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, - 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, - 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, - 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, - 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, - 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, + 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, + 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, + 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, + 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, + 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, + 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, - 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, - 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, - 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, - 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, - 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, - 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, - 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, - 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, - 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, - 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, - 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, - 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, - 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, - 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, - 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, - 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, - 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, + 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, + 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, + 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, + 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, + 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, + 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, + 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, + 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, + 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, + 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, + 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, + 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, + 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, + 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, + 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, + 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, + 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, + 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, + 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, + 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -783,437 +780,434 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.Tunnel)(nil), // 116: sliverpb.Tunnel (*sliverpb.TunnelData)(nil), // 117: sliverpb.TunnelData (*clientpb.Version)(nil), // 118: clientpb.Version - (*clientpb.Operators)(nil), // 119: clientpb.Operators - (*sliverpb.Reconfigure)(nil), // 120: sliverpb.Reconfigure - (*clientpb.Sessions)(nil), // 121: clientpb.Sessions - (*clientpb.Beacons)(nil), // 122: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 123: clientpb.BeaconTasks - (*commonpb.Response)(nil), // 124: commonpb.Response - (*clientpb.Jobs)(nil), // 125: clientpb.Jobs - (*clientpb.KillJob)(nil), // 126: clientpb.KillJob - (*clientpb.MTLSListener)(nil), // 127: clientpb.MTLSListener - (*clientpb.WGListener)(nil), // 128: clientpb.WGListener - (*clientpb.DNSListener)(nil), // 129: clientpb.DNSListener - (*clientpb.HTTPListener)(nil), // 130: clientpb.HTTPListener - (*clientpb.StagerListener)(nil), // 131: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 132: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 133: clientpb.AllHosts - (*clientpb.Generate)(nil), // 134: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 135: clientpb.ExternalImplantConfig - (*clientpb.Builders)(nil), // 136: clientpb.Builders - (*clientpb.Crackstations)(nil), // 137: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 138: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 139: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 140: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 141: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 142: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 143: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 144: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 145: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 146: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 147: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 148: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 149: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 150: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 151: clientpb.Websites - (*sliverpb.Ps)(nil), // 152: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 153: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 154: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 155: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 156: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 157: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 158: sliverpb.Mv - (*sliverpb.Cp)(nil), // 159: sliverpb.Cp - (*sliverpb.Rm)(nil), // 160: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 161: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 162: sliverpb.Download - (*sliverpb.Upload)(nil), // 163: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 164: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 165: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 166: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 167: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 168: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 169: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 170: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 171: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 172: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 173: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 174: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 175: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 176: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 177: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 178: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 179: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 180: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 181: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 182: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 183: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 184: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 185: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 186: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 187: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 188: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 189: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 190: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 191: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 192: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 193: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 194: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 195: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 196: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 197: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 198: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 199: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 200: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 201: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 202: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 203: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 204: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 205: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 206: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 207: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 208: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 209: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 210: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 211: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 212: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 213: sliverpb.Portfwd + (*sliverpb.Reconfigure)(nil), // 119: sliverpb.Reconfigure + (*clientpb.Sessions)(nil), // 120: clientpb.Sessions + (*clientpb.Beacons)(nil), // 121: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 122: clientpb.BeaconTasks + (*commonpb.Response)(nil), // 123: commonpb.Response + (*clientpb.Jobs)(nil), // 124: clientpb.Jobs + (*clientpb.KillJob)(nil), // 125: clientpb.KillJob + (*clientpb.MTLSListener)(nil), // 126: clientpb.MTLSListener + (*clientpb.WGListener)(nil), // 127: clientpb.WGListener + (*clientpb.DNSListener)(nil), // 128: clientpb.DNSListener + (*clientpb.HTTPListener)(nil), // 129: clientpb.HTTPListener + (*clientpb.StagerListener)(nil), // 130: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 131: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 132: clientpb.AllHosts + (*clientpb.Generate)(nil), // 133: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 134: clientpb.ExternalImplantConfig + (*clientpb.Builders)(nil), // 135: clientpb.Builders + (*clientpb.Crackstations)(nil), // 136: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 137: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 138: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 139: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 140: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 141: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 142: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 143: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 144: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 145: clientpb.Compiler + (*clientpb.ShellcodeEncode)(nil), // 146: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 147: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 148: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 149: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 150: clientpb.Websites + (*sliverpb.Ps)(nil), // 151: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 152: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 153: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 154: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 155: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 156: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 157: sliverpb.Mv + (*sliverpb.Cp)(nil), // 158: sliverpb.Cp + (*sliverpb.Rm)(nil), // 159: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 160: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 161: sliverpb.Download + (*sliverpb.Upload)(nil), // 162: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 163: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 164: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 165: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 166: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 167: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 168: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 169: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 170: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 171: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 172: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 173: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 174: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 175: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 176: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 177: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 178: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 179: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 180: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 181: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 182: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 183: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 184: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 185: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 186: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 187: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 188: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 189: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 190: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 191: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 192: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 193: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 194: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 195: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 196: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 197: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 198: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 199: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 200: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 201: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 202: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 203: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 204: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 205: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 206: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 207: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 208: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 209: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 210: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 211: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 212: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty 1, // 1: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData - 0, // 2: rpcpb.SliverRPC.GetOperators:input_type -> commonpb.Empty - 2, // 3: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq - 3, // 4: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq - 4, // 5: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 0, // 6: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 7: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 5, // 8: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 5, // 9: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 5, // 10: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 6, // 11: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 6, // 12: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 13: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 14: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 15: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 7, // 16: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 8, // 17: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 9, // 18: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 10, // 19: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 11, // 20: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 11, // 21: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 12, // 22: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 12, // 23: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq - 13, // 24: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 13, // 25: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 13, // 26: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 13, // 27: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 28: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 29: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 14, // 30: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 14, // 31: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 14, // 32: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 15, // 33: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 15, // 34: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 15, // 35: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 15, // 36: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 37: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 16, // 38: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 16, // 39: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 17, // 40: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 18, // 41: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 19, // 42: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 20, // 43: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 21, // 44: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig - 22, // 45: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 23, // 46: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 47: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 24, // 48: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 23, // 49: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 25, // 50: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 51: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 26, // 52: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 26, // 53: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 27, // 54: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 27, // 55: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 28, // 56: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 28, // 57: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 27, // 58: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 27, // 59: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 29, // 60: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 61: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 30, // 62: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 63: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 64: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 65: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 66: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 30, // 67: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 31, // 68: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 32, // 69: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 33, // 70: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 71: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 34, // 72: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 73: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 74: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 35, // 75: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 35, // 76: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 77: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 36, // 78: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 36, // 79: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 37, // 80: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 37, // 81: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 38, // 82: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 39, // 83: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 40, // 84: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 41, // 85: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 42, // 86: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 43, // 87: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 44, // 88: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 45, // 89: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 46, // 90: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 47, // 91: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 48, // 92: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 49, // 93: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 50, // 94: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 51, // 95: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 52, // 96: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 53, // 97: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 54, // 98: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 55, // 99: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 56, // 100: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 57, // 101: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 58, // 102: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 59, // 103: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 60, // 104: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 61, // 105: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 62, // 106: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 63, // 107: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 64, // 108: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 65, // 109: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 66, // 110: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 67, // 111: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 68, // 112: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 69, // 113: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 70, // 114: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 71, // 115: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 72, // 116: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 73, // 117: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 74, // 118: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 75, // 119: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 76, // 120: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 77, // 121: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 122: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 78, // 123: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 79, // 124: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 80, // 125: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 81, // 126: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 82, // 127: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 83, // 128: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 84, // 129: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 85, // 130: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 86, // 131: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 87, // 132: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 88, // 133: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 89, // 134: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 90, // 135: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 91, // 136: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 92, // 137: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 93, // 138: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 94, // 139: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 95, // 140: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 96, // 141: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 97, // 142: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 98, // 143: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 99, // 144: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 100, // 145: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 101, // 146: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 102, // 147: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 103, // 148: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 104, // 149: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 105, // 150: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 106, // 151: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 107, // 152: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 108, // 153: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 109, // 154: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 110, // 155: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 111, // 156: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 112, // 157: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 113, // 158: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 114, // 159: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 114, // 160: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 115, // 161: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 116, // 162: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 116, // 163: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 117, // 164: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 165: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 118, // 166: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 167: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 119, // 168: rpcpb.SliverRPC.GetOperators:output_type -> clientpb.Operators - 0, // 169: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 120, // 170: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 171: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 121, // 172: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 122, // 173: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 5, // 174: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 175: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 123, // 176: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 6, // 177: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 6, // 178: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 124, // 179: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 180: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 125, // 181: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 126, // 182: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 127, // 183: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 128, // 184: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 129, // 185: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 130, // 186: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 130, // 187: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 131, // 188: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 131, // 189: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 13, // 190: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 191: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 13, // 192: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 13, // 193: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 132, // 194: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 14, // 195: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 196: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 197: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 198: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 15, // 199: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 14, // 200: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 14, // 201: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 15, // 202: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 133, // 203: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 16, // 204: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 205: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 206: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 134, // 207: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 135, // 208: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 209: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 135, // 210: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 23, // 211: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 212: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 136, // 213: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 23, // 214: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 215: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 216: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 137, // 217: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 26, // 218: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 219: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 138, // 220: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 27, // 221: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 222: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 28, // 223: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 224: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 225: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 134, // 226: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 139, // 227: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 228: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 140, // 229: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 141, // 230: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 142, // 231: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 143, // 232: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 233: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 31, // 234: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 144, // 235: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 145, // 236: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 146, // 237: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 147, // 238: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 148, // 239: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 149, // 240: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 150, // 241: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 242: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 151, // 243: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 36, // 244: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 245: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 36, // 246: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 36, // 247: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 36, // 248: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 39, // 249: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 152, // 250: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 153, // 251: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 154, // 252: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 155, // 253: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 156, // 254: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 157, // 255: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 157, // 256: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 158, // 257: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 159, // 258: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 160, // 259: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 161, // 260: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 162, // 261: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 163, // 262: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 164, // 263: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 165, // 264: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 166, // 265: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 156, // 266: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 167, // 267: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 168, // 268: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 169, // 269: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 170, // 270: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 171, // 271: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 172, // 272: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 173, // 273: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 174, // 274: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 174, // 275: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 174, // 276: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 175, // 277: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 176, // 278: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 177, // 279: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 177, // 280: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 178, // 281: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 179, // 282: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 180, // 283: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 181, // 284: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 182, // 285: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 286: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 183, // 287: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 184, // 288: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 185, // 289: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 185, // 290: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 185, // 291: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 186, // 292: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 187, // 293: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 188, // 294: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 189, // 295: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 190, // 296: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 191, // 297: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 192, // 298: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 193, // 299: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 194, // 300: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 195, // 301: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 196, // 302: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 197, // 303: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 198, // 304: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 199, // 305: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 200, // 306: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 201, // 307: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 200, // 308: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 98, // 309: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 310: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 202, // 311: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 203, // 312: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 204, // 313: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 205, // 314: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 206, // 315: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 207, // 316: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 208, // 317: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 208, // 318: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 209, // 319: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 209, // 320: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 210, // 321: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 211, // 322: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 212, // 323: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 213, // 324: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 114, // 325: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 326: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 115, // 327: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 116, // 328: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 329: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 117, // 330: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 23, // 331: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 166, // [166:332] is the sub-list for method output_type - 0, // [0:166] is the sub-list for method input_type + 2, // 2: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq + 3, // 3: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq + 4, // 4: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq + 0, // 5: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 6: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 5, // 7: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 5, // 8: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 5, // 9: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 6, // 10: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 6, // 11: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 12: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 13: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 14: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 7, // 15: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 8, // 16: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 9, // 17: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 10, // 18: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 11, // 19: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 11, // 20: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 12, // 21: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 12, // 22: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq + 13, // 23: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 13, // 24: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 13, // 25: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 13, // 26: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 27: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 28: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 14, // 29: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 14, // 30: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 14, // 31: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 15, // 32: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 15, // 33: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 15, // 34: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 15, // 35: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 36: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 16, // 37: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 16, // 38: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 17, // 39: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 18, // 40: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 19, // 41: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 20, // 42: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 21, // 43: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig + 22, // 44: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 23, // 45: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 46: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 24, // 47: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 23, // 48: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 25, // 49: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 50: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 26, // 51: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 26, // 52: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 27, // 53: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 27, // 54: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 28, // 55: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 28, // 56: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 27, // 57: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 27, // 58: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 29, // 59: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 60: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 30, // 61: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 62: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 63: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 64: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 65: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 30, // 66: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 31, // 67: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 32, // 68: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 33, // 69: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 70: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 34, // 71: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 72: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 73: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 35, // 74: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 35, // 75: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 76: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 36, // 77: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 36, // 78: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 37, // 79: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 37, // 80: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 38, // 81: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 39, // 82: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 40, // 83: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 41, // 84: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 42, // 85: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 43, // 86: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 44, // 87: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 45, // 88: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 46, // 89: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 47, // 90: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 48, // 91: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 49, // 92: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 50, // 93: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 51, // 94: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 52, // 95: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 53, // 96: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 54, // 97: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 55, // 98: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 56, // 99: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 57, // 100: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 58, // 101: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 59, // 102: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 60, // 103: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 61, // 104: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 62, // 105: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 63, // 106: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 64, // 107: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 65, // 108: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 66, // 109: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 67, // 110: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 68, // 111: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 69, // 112: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 70, // 113: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 71, // 114: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 72, // 115: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 73, // 116: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 74, // 117: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 75, // 118: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 76, // 119: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 77, // 120: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 121: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 78, // 122: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 79, // 123: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 80, // 124: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 81, // 125: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 82, // 126: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 83, // 127: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 84, // 128: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 85, // 129: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 86, // 130: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 87, // 131: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 88, // 132: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 89, // 133: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 90, // 134: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 91, // 135: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 92, // 136: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 93, // 137: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 94, // 138: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 95, // 139: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 96, // 140: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 97, // 141: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 98, // 142: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 99, // 143: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 100, // 144: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 101, // 145: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 102, // 146: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 103, // 147: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 104, // 148: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 105, // 149: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 106, // 150: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 107, // 151: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 108, // 152: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 109, // 153: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 110, // 154: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 111, // 155: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 112, // 156: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 113, // 157: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 114, // 158: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 114, // 159: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 115, // 160: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 116, // 161: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 116, // 162: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 117, // 163: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 164: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 118, // 165: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 0, // 166: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 167: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 119, // 168: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 169: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 120, // 170: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 121, // 171: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 5, // 172: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 173: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 122, // 174: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 6, // 175: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 6, // 176: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 123, // 177: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 178: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 124, // 179: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 125, // 180: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 126, // 181: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 127, // 182: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 128, // 183: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 129, // 184: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 129, // 185: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 130, // 186: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 130, // 187: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 13, // 188: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 189: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 13, // 190: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 13, // 191: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 131, // 192: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 14, // 193: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 194: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 195: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 196: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 15, // 197: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 14, // 198: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 14, // 199: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 15, // 200: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 132, // 201: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 16, // 202: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 203: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 204: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 133, // 205: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 134, // 206: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 207: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 134, // 208: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 23, // 209: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 210: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 135, // 211: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 23, // 212: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 213: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 214: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 136, // 215: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 26, // 216: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 217: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 137, // 218: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 27, // 219: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 220: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 28, // 221: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 222: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 223: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 133, // 224: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 138, // 225: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 226: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 139, // 227: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 140, // 228: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 141, // 229: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 142, // 230: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 231: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 31, // 232: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 143, // 233: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 144, // 234: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 145, // 235: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 146, // 236: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 147, // 237: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 148, // 238: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 149, // 239: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 240: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 150, // 241: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 36, // 242: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 243: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 36, // 244: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 36, // 245: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 36, // 246: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 39, // 247: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 151, // 248: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 152, // 249: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 153, // 250: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 154, // 251: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 155, // 252: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 156, // 253: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 156, // 254: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 157, // 255: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 158, // 256: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 159, // 257: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 160, // 258: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 161, // 259: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 162, // 260: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 163, // 261: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 164, // 262: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 165, // 263: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 155, // 264: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 166, // 265: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 167, // 266: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 168, // 267: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 169, // 268: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 170, // 269: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 171, // 270: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 172, // 271: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 173, // 272: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 173, // 273: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 173, // 274: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 174, // 275: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 175, // 276: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 176, // 277: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 176, // 278: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 177, // 279: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 178, // 280: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 179, // 281: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 180, // 282: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 181, // 283: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 284: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 182, // 285: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 183, // 286: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 184, // 287: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 184, // 288: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 184, // 289: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 185, // 290: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 186, // 291: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 187, // 292: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 188, // 293: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 189, // 294: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 190, // 295: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 191, // 296: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 192, // 297: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 193, // 298: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 194, // 299: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 195, // 300: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 196, // 301: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 197, // 302: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 198, // 303: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 199, // 304: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 200, // 305: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 199, // 306: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 98, // 307: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 308: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 201, // 309: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 202, // 310: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 203, // 311: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 204, // 312: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 205, // 313: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 206, // 314: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 207, // 315: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 207, // 316: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 208, // 317: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 208, // 318: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 209, // 319: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 210, // 320: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 211, // 321: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 212, // 322: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 114, // 323: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 324: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 115, // 325: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 116, // 326: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 327: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 117, // 328: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 23, // 329: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 165, // [165:330] is the sub-list for method output_type + 0, // [0:165] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 68401fde39..71c74fe2d5 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -14,9 +14,6 @@ service SliverRPC { // *** Client Logs *** rpc ClientLog(stream clientpb.ClientLogData) returns (commonpb.Empty); - // *** Operator Commands *** - rpc GetOperators(commonpb.Empty) returns (clientpb.Operators); - // *** Generic *** rpc Kill(sliverpb.KillReq) returns (commonpb.Empty); rpc Reconfigure(sliverpb.ReconfigureReq) returns (sliverpb.Reconfigure); diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index ebb8f65494..0128953350 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.15.8 // source: rpcpb/services.proto package rpcpb @@ -21,6 +21,174 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + SliverRPC_GetVersion_FullMethodName = "/rpcpb.SliverRPC/GetVersion" + SliverRPC_ClientLog_FullMethodName = "/rpcpb.SliverRPC/ClientLog" + SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" + SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" + SliverRPC_Rename_FullMethodName = "/rpcpb.SliverRPC/Rename" + SliverRPC_GetSessions_FullMethodName = "/rpcpb.SliverRPC/GetSessions" + SliverRPC_GetBeacons_FullMethodName = "/rpcpb.SliverRPC/GetBeacons" + SliverRPC_GetBeacon_FullMethodName = "/rpcpb.SliverRPC/GetBeacon" + SliverRPC_RmBeacon_FullMethodName = "/rpcpb.SliverRPC/RmBeacon" + SliverRPC_GetBeaconTasks_FullMethodName = "/rpcpb.SliverRPC/GetBeaconTasks" + SliverRPC_GetBeaconTaskContent_FullMethodName = "/rpcpb.SliverRPC/GetBeaconTaskContent" + SliverRPC_CancelBeaconTask_FullMethodName = "/rpcpb.SliverRPC/CancelBeaconTask" + SliverRPC_MonitorStart_FullMethodName = "/rpcpb.SliverRPC/MonitorStart" + SliverRPC_MonitorStop_FullMethodName = "/rpcpb.SliverRPC/MonitorStop" + SliverRPC_GetJobs_FullMethodName = "/rpcpb.SliverRPC/GetJobs" + SliverRPC_KillJob_FullMethodName = "/rpcpb.SliverRPC/KillJob" + SliverRPC_StartMTLSListener_FullMethodName = "/rpcpb.SliverRPC/StartMTLSListener" + SliverRPC_StartWGListener_FullMethodName = "/rpcpb.SliverRPC/StartWGListener" + SliverRPC_StartDNSListener_FullMethodName = "/rpcpb.SliverRPC/StartDNSListener" + SliverRPC_StartHTTPSListener_FullMethodName = "/rpcpb.SliverRPC/StartHTTPSListener" + SliverRPC_StartHTTPListener_FullMethodName = "/rpcpb.SliverRPC/StartHTTPListener" + SliverRPC_StartTCPStagerListener_FullMethodName = "/rpcpb.SliverRPC/StartTCPStagerListener" + SliverRPC_StartHTTPStagerListener_FullMethodName = "/rpcpb.SliverRPC/StartHTTPStagerListener" + SliverRPC_LootAdd_FullMethodName = "/rpcpb.SliverRPC/LootAdd" + SliverRPC_LootRm_FullMethodName = "/rpcpb.SliverRPC/LootRm" + SliverRPC_LootUpdate_FullMethodName = "/rpcpb.SliverRPC/LootUpdate" + SliverRPC_LootContent_FullMethodName = "/rpcpb.SliverRPC/LootContent" + SliverRPC_LootAll_FullMethodName = "/rpcpb.SliverRPC/LootAll" + SliverRPC_Creds_FullMethodName = "/rpcpb.SliverRPC/Creds" + SliverRPC_CredsAdd_FullMethodName = "/rpcpb.SliverRPC/CredsAdd" + SliverRPC_CredsRm_FullMethodName = "/rpcpb.SliverRPC/CredsRm" + SliverRPC_CredsUpdate_FullMethodName = "/rpcpb.SliverRPC/CredsUpdate" + SliverRPC_GetCredByID_FullMethodName = "/rpcpb.SliverRPC/GetCredByID" + SliverRPC_GetCredsByHashType_FullMethodName = "/rpcpb.SliverRPC/GetCredsByHashType" + SliverRPC_GetPlaintextCredsByHashType_FullMethodName = "/rpcpb.SliverRPC/GetPlaintextCredsByHashType" + SliverRPC_CredsSniffHashType_FullMethodName = "/rpcpb.SliverRPC/CredsSniffHashType" + SliverRPC_Hosts_FullMethodName = "/rpcpb.SliverRPC/Hosts" + SliverRPC_Host_FullMethodName = "/rpcpb.SliverRPC/Host" + SliverRPC_HostRm_FullMethodName = "/rpcpb.SliverRPC/HostRm" + SliverRPC_HostIOCRm_FullMethodName = "/rpcpb.SliverRPC/HostIOCRm" + SliverRPC_Generate_FullMethodName = "/rpcpb.SliverRPC/Generate" + SliverRPC_GenerateExternal_FullMethodName = "/rpcpb.SliverRPC/GenerateExternal" + SliverRPC_GenerateExternalSaveBuild_FullMethodName = "/rpcpb.SliverRPC/GenerateExternalSaveBuild" + SliverRPC_GenerateExternalGetImplantConfig_FullMethodName = "/rpcpb.SliverRPC/GenerateExternalGetImplantConfig" + SliverRPC_BuilderRegister_FullMethodName = "/rpcpb.SliverRPC/BuilderRegister" + SliverRPC_BuilderTrigger_FullMethodName = "/rpcpb.SliverRPC/BuilderTrigger" + SliverRPC_Builders_FullMethodName = "/rpcpb.SliverRPC/Builders" + SliverRPC_CrackstationRegister_FullMethodName = "/rpcpb.SliverRPC/CrackstationRegister" + SliverRPC_CrackstationTrigger_FullMethodName = "/rpcpb.SliverRPC/CrackstationTrigger" + SliverRPC_CrackstationBenchmark_FullMethodName = "/rpcpb.SliverRPC/CrackstationBenchmark" + SliverRPC_Crackstations_FullMethodName = "/rpcpb.SliverRPC/Crackstations" + SliverRPC_CrackTaskByID_FullMethodName = "/rpcpb.SliverRPC/CrackTaskByID" + SliverRPC_CrackTaskUpdate_FullMethodName = "/rpcpb.SliverRPC/CrackTaskUpdate" + SliverRPC_CrackFilesList_FullMethodName = "/rpcpb.SliverRPC/CrackFilesList" + SliverRPC_CrackFileCreate_FullMethodName = "/rpcpb.SliverRPC/CrackFileCreate" + SliverRPC_CrackFileChunkUpload_FullMethodName = "/rpcpb.SliverRPC/CrackFileChunkUpload" + SliverRPC_CrackFileChunkDownload_FullMethodName = "/rpcpb.SliverRPC/CrackFileChunkDownload" + SliverRPC_CrackFileComplete_FullMethodName = "/rpcpb.SliverRPC/CrackFileComplete" + SliverRPC_CrackFileDelete_FullMethodName = "/rpcpb.SliverRPC/CrackFileDelete" + SliverRPC_Regenerate_FullMethodName = "/rpcpb.SliverRPC/Regenerate" + SliverRPC_ImplantBuilds_FullMethodName = "/rpcpb.SliverRPC/ImplantBuilds" + SliverRPC_DeleteImplantBuild_FullMethodName = "/rpcpb.SliverRPC/DeleteImplantBuild" + SliverRPC_Canaries_FullMethodName = "/rpcpb.SliverRPC/Canaries" + SliverRPC_GenerateWGClientConfig_FullMethodName = "/rpcpb.SliverRPC/GenerateWGClientConfig" + SliverRPC_GenerateUniqueIP_FullMethodName = "/rpcpb.SliverRPC/GenerateUniqueIP" + SliverRPC_ImplantProfiles_FullMethodName = "/rpcpb.SliverRPC/ImplantProfiles" + SliverRPC_DeleteImplantProfile_FullMethodName = "/rpcpb.SliverRPC/DeleteImplantProfile" + SliverRPC_SaveImplantProfile_FullMethodName = "/rpcpb.SliverRPC/SaveImplantProfile" + SliverRPC_MsfStage_FullMethodName = "/rpcpb.SliverRPC/MsfStage" + SliverRPC_ShellcodeRDI_FullMethodName = "/rpcpb.SliverRPC/ShellcodeRDI" + SliverRPC_GetCompiler_FullMethodName = "/rpcpb.SliverRPC/GetCompiler" + SliverRPC_ShellcodeEncoder_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoder" + SliverRPC_ShellcodeEncoderMap_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoderMap" + SliverRPC_TrafficEncoderMap_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderMap" + SliverRPC_TrafficEncoderAdd_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderAdd" + SliverRPC_TrafficEncoderRm_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderRm" + SliverRPC_Websites_FullMethodName = "/rpcpb.SliverRPC/Websites" + SliverRPC_Website_FullMethodName = "/rpcpb.SliverRPC/Website" + SliverRPC_WebsiteRemove_FullMethodName = "/rpcpb.SliverRPC/WebsiteRemove" + SliverRPC_WebsiteAddContent_FullMethodName = "/rpcpb.SliverRPC/WebsiteAddContent" + SliverRPC_WebsiteUpdateContent_FullMethodName = "/rpcpb.SliverRPC/WebsiteUpdateContent" + SliverRPC_WebsiteRemoveContent_FullMethodName = "/rpcpb.SliverRPC/WebsiteRemoveContent" + SliverRPC_Ping_FullMethodName = "/rpcpb.SliverRPC/Ping" + SliverRPC_Ps_FullMethodName = "/rpcpb.SliverRPC/Ps" + SliverRPC_Terminate_FullMethodName = "/rpcpb.SliverRPC/Terminate" + SliverRPC_Ifconfig_FullMethodName = "/rpcpb.SliverRPC/Ifconfig" + SliverRPC_Netstat_FullMethodName = "/rpcpb.SliverRPC/Netstat" + SliverRPC_Ls_FullMethodName = "/rpcpb.SliverRPC/Ls" + SliverRPC_Cd_FullMethodName = "/rpcpb.SliverRPC/Cd" + SliverRPC_Pwd_FullMethodName = "/rpcpb.SliverRPC/Pwd" + SliverRPC_Mv_FullMethodName = "/rpcpb.SliverRPC/Mv" + SliverRPC_Cp_FullMethodName = "/rpcpb.SliverRPC/Cp" + SliverRPC_Rm_FullMethodName = "/rpcpb.SliverRPC/Rm" + SliverRPC_Mkdir_FullMethodName = "/rpcpb.SliverRPC/Mkdir" + SliverRPC_Download_FullMethodName = "/rpcpb.SliverRPC/Download" + SliverRPC_Upload_FullMethodName = "/rpcpb.SliverRPC/Upload" + SliverRPC_Chmod_FullMethodName = "/rpcpb.SliverRPC/Chmod" + SliverRPC_Chown_FullMethodName = "/rpcpb.SliverRPC/Chown" + SliverRPC_Chtimes_FullMethodName = "/rpcpb.SliverRPC/Chtimes" + SliverRPC_MemfilesList_FullMethodName = "/rpcpb.SliverRPC/MemfilesList" + SliverRPC_MemfilesAdd_FullMethodName = "/rpcpb.SliverRPC/MemfilesAdd" + SliverRPC_MemfilesRm_FullMethodName = "/rpcpb.SliverRPC/MemfilesRm" + SliverRPC_ProcessDump_FullMethodName = "/rpcpb.SliverRPC/ProcessDump" + SliverRPC_RunAs_FullMethodName = "/rpcpb.SliverRPC/RunAs" + SliverRPC_Impersonate_FullMethodName = "/rpcpb.SliverRPC/Impersonate" + SliverRPC_RevToSelf_FullMethodName = "/rpcpb.SliverRPC/RevToSelf" + SliverRPC_GetSystem_FullMethodName = "/rpcpb.SliverRPC/GetSystem" + SliverRPC_Task_FullMethodName = "/rpcpb.SliverRPC/Task" + SliverRPC_Msf_FullMethodName = "/rpcpb.SliverRPC/Msf" + SliverRPC_MsfRemote_FullMethodName = "/rpcpb.SliverRPC/MsfRemote" + SliverRPC_ExecuteAssembly_FullMethodName = "/rpcpb.SliverRPC/ExecuteAssembly" + SliverRPC_Migrate_FullMethodName = "/rpcpb.SliverRPC/Migrate" + SliverRPC_Execute_FullMethodName = "/rpcpb.SliverRPC/Execute" + SliverRPC_ExecuteWindows_FullMethodName = "/rpcpb.SliverRPC/ExecuteWindows" + SliverRPC_Sideload_FullMethodName = "/rpcpb.SliverRPC/Sideload" + SliverRPC_SpawnDll_FullMethodName = "/rpcpb.SliverRPC/SpawnDll" + SliverRPC_Screenshot_FullMethodName = "/rpcpb.SliverRPC/Screenshot" + SliverRPC_CurrentTokenOwner_FullMethodName = "/rpcpb.SliverRPC/CurrentTokenOwner" + SliverRPC_PivotStartListener_FullMethodName = "/rpcpb.SliverRPC/PivotStartListener" + SliverRPC_PivotStopListener_FullMethodName = "/rpcpb.SliverRPC/PivotStopListener" + SliverRPC_PivotSessionListeners_FullMethodName = "/rpcpb.SliverRPC/PivotSessionListeners" + SliverRPC_PivotGraph_FullMethodName = "/rpcpb.SliverRPC/PivotGraph" + SliverRPC_StartService_FullMethodName = "/rpcpb.SliverRPC/StartService" + SliverRPC_StopService_FullMethodName = "/rpcpb.SliverRPC/StopService" + SliverRPC_RemoveService_FullMethodName = "/rpcpb.SliverRPC/RemoveService" + SliverRPC_MakeToken_FullMethodName = "/rpcpb.SliverRPC/MakeToken" + SliverRPC_GetEnv_FullMethodName = "/rpcpb.SliverRPC/GetEnv" + SliverRPC_SetEnv_FullMethodName = "/rpcpb.SliverRPC/SetEnv" + SliverRPC_UnsetEnv_FullMethodName = "/rpcpb.SliverRPC/UnsetEnv" + SliverRPC_Backdoor_FullMethodName = "/rpcpb.SliverRPC/Backdoor" + SliverRPC_RegistryRead_FullMethodName = "/rpcpb.SliverRPC/RegistryRead" + SliverRPC_RegistryWrite_FullMethodName = "/rpcpb.SliverRPC/RegistryWrite" + SliverRPC_RegistryCreateKey_FullMethodName = "/rpcpb.SliverRPC/RegistryCreateKey" + SliverRPC_RegistryDeleteKey_FullMethodName = "/rpcpb.SliverRPC/RegistryDeleteKey" + SliverRPC_RegistryListSubKeys_FullMethodName = "/rpcpb.SliverRPC/RegistryListSubKeys" + SliverRPC_RegistryListValues_FullMethodName = "/rpcpb.SliverRPC/RegistryListValues" + SliverRPC_RunSSHCommand_FullMethodName = "/rpcpb.SliverRPC/RunSSHCommand" + SliverRPC_HijackDLL_FullMethodName = "/rpcpb.SliverRPC/HijackDLL" + SliverRPC_GetPrivs_FullMethodName = "/rpcpb.SliverRPC/GetPrivs" + SliverRPC_StartRportFwdListener_FullMethodName = "/rpcpb.SliverRPC/StartRportFwdListener" + SliverRPC_GetRportFwdListeners_FullMethodName = "/rpcpb.SliverRPC/GetRportFwdListeners" + SliverRPC_StopRportFwdListener_FullMethodName = "/rpcpb.SliverRPC/StopRportFwdListener" + SliverRPC_OpenSession_FullMethodName = "/rpcpb.SliverRPC/OpenSession" + SliverRPC_CloseSession_FullMethodName = "/rpcpb.SliverRPC/CloseSession" + SliverRPC_RegisterExtension_FullMethodName = "/rpcpb.SliverRPC/RegisterExtension" + SliverRPC_CallExtension_FullMethodName = "/rpcpb.SliverRPC/CallExtension" + SliverRPC_ListExtensions_FullMethodName = "/rpcpb.SliverRPC/ListExtensions" + SliverRPC_RegisterWasmExtension_FullMethodName = "/rpcpb.SliverRPC/RegisterWasmExtension" + SliverRPC_ListWasmExtensions_FullMethodName = "/rpcpb.SliverRPC/ListWasmExtensions" + SliverRPC_ExecWasmExtension_FullMethodName = "/rpcpb.SliverRPC/ExecWasmExtension" + SliverRPC_WGStartPortForward_FullMethodName = "/rpcpb.SliverRPC/WGStartPortForward" + SliverRPC_WGStopPortForward_FullMethodName = "/rpcpb.SliverRPC/WGStopPortForward" + SliverRPC_WGStartSocks_FullMethodName = "/rpcpb.SliverRPC/WGStartSocks" + SliverRPC_WGStopSocks_FullMethodName = "/rpcpb.SliverRPC/WGStopSocks" + SliverRPC_WGListForwarders_FullMethodName = "/rpcpb.SliverRPC/WGListForwarders" + SliverRPC_WGListSocksServers_FullMethodName = "/rpcpb.SliverRPC/WGListSocksServers" + SliverRPC_Shell_FullMethodName = "/rpcpb.SliverRPC/Shell" + SliverRPC_Portfwd_FullMethodName = "/rpcpb.SliverRPC/Portfwd" + SliverRPC_CreateSocks_FullMethodName = "/rpcpb.SliverRPC/CreateSocks" + SliverRPC_CloseSocks_FullMethodName = "/rpcpb.SliverRPC/CloseSocks" + SliverRPC_SocksProxy_FullMethodName = "/rpcpb.SliverRPC/SocksProxy" + SliverRPC_CreateTunnel_FullMethodName = "/rpcpb.SliverRPC/CreateTunnel" + SliverRPC_CloseTunnel_FullMethodName = "/rpcpb.SliverRPC/CloseTunnel" + SliverRPC_TunnelData_FullMethodName = "/rpcpb.SliverRPC/TunnelData" + SliverRPC_Events_FullMethodName = "/rpcpb.SliverRPC/Events" +) + // SliverRPCClient is the client API for SliverRPC service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -29,8 +197,6 @@ type SliverRPCClient interface { GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) // *** Client Logs *** ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) - // *** Operator Commands *** - GetOperators(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Operators, error) // *** Generic *** Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) @@ -231,7 +397,7 @@ func NewSliverRPCClient(cc grpc.ClientConnInterface) SliverRPCClient { func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) { out := new(clientpb.Version) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetVersion", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetVersion_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -239,7 +405,7 @@ func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, op } func (c *sliverRPCClient) ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], "/rpcpb.SliverRPC/ClientLog", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], SliverRPC_ClientLog_FullMethodName, opts...) if err != nil { return nil, err } @@ -272,18 +438,9 @@ func (x *sliverRPCClientLogClient) CloseAndRecv() (*commonpb.Empty, error) { return m, nil } -func (c *sliverRPCClient) GetOperators(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Operators, error) { - out := new(clientpb.Operators) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetOperators", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *sliverRPCClient) Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Kill", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Kill_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -292,7 +449,7 @@ func (c *sliverRPCClient) Kill(ctx context.Context, in *sliverpb.KillReq, opts . func (c *sliverRPCClient) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) { out := new(sliverpb.Reconfigure) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Reconfigure", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Reconfigure_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -301,7 +458,7 @@ func (c *sliverRPCClient) Reconfigure(ctx context.Context, in *sliverpb.Reconfig func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Rename", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Rename_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -310,7 +467,7 @@ func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, op func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) { out := new(clientpb.Sessions) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetSessions", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetSessions_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -319,7 +476,7 @@ func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, o func (c *sliverRPCClient) GetBeacons(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Beacons, error) { out := new(clientpb.Beacons) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeacons", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeacons_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -328,7 +485,7 @@ func (c *sliverRPCClient) GetBeacons(ctx context.Context, in *commonpb.Empty, op func (c *sliverRPCClient) GetBeacon(ctx context.Context, in *clientpb.Beacon, opts ...grpc.CallOption) (*clientpb.Beacon, error) { out := new(clientpb.Beacon) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeacon", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeacon_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -337,7 +494,7 @@ func (c *sliverRPCClient) GetBeacon(ctx context.Context, in *clientpb.Beacon, op func (c *sliverRPCClient) RmBeacon(ctx context.Context, in *clientpb.Beacon, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RmBeacon", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RmBeacon_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -346,7 +503,7 @@ func (c *sliverRPCClient) RmBeacon(ctx context.Context, in *clientpb.Beacon, opt func (c *sliverRPCClient) GetBeaconTasks(ctx context.Context, in *clientpb.Beacon, opts ...grpc.CallOption) (*clientpb.BeaconTasks, error) { out := new(clientpb.BeaconTasks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeaconTasks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeaconTasks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -355,7 +512,7 @@ func (c *sliverRPCClient) GetBeaconTasks(ctx context.Context, in *clientpb.Beaco func (c *sliverRPCClient) GetBeaconTaskContent(ctx context.Context, in *clientpb.BeaconTask, opts ...grpc.CallOption) (*clientpb.BeaconTask, error) { out := new(clientpb.BeaconTask) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeaconTaskContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeaconTaskContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -364,7 +521,7 @@ func (c *sliverRPCClient) GetBeaconTaskContent(ctx context.Context, in *clientpb func (c *sliverRPCClient) CancelBeaconTask(ctx context.Context, in *clientpb.BeaconTask, opts ...grpc.CallOption) (*clientpb.BeaconTask, error) { out := new(clientpb.BeaconTask) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CancelBeaconTask", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CancelBeaconTask_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -373,7 +530,7 @@ func (c *sliverRPCClient) CancelBeaconTask(ctx context.Context, in *clientpb.Bea func (c *sliverRPCClient) MonitorStart(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*commonpb.Response, error) { out := new(commonpb.Response) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MonitorStart", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MonitorStart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -382,7 +539,7 @@ func (c *sliverRPCClient) MonitorStart(ctx context.Context, in *commonpb.Empty, func (c *sliverRPCClient) MonitorStop(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MonitorStop", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MonitorStop_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -391,7 +548,7 @@ func (c *sliverRPCClient) MonitorStop(ctx context.Context, in *commonpb.Empty, o func (c *sliverRPCClient) GetJobs(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Jobs, error) { out := new(clientpb.Jobs) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetJobs", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetJobs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -400,7 +557,7 @@ func (c *sliverRPCClient) GetJobs(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) KillJob(ctx context.Context, in *clientpb.KillJobReq, opts ...grpc.CallOption) (*clientpb.KillJob, error) { out := new(clientpb.KillJob) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/KillJob", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_KillJob_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -409,7 +566,7 @@ func (c *sliverRPCClient) KillJob(ctx context.Context, in *clientpb.KillJobReq, func (c *sliverRPCClient) StartMTLSListener(ctx context.Context, in *clientpb.MTLSListenerReq, opts ...grpc.CallOption) (*clientpb.MTLSListener, error) { out := new(clientpb.MTLSListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartMTLSListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartMTLSListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -418,7 +575,7 @@ func (c *sliverRPCClient) StartMTLSListener(ctx context.Context, in *clientpb.MT func (c *sliverRPCClient) StartWGListener(ctx context.Context, in *clientpb.WGListenerReq, opts ...grpc.CallOption) (*clientpb.WGListener, error) { out := new(clientpb.WGListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartWGListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartWGListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -427,7 +584,7 @@ func (c *sliverRPCClient) StartWGListener(ctx context.Context, in *clientpb.WGLi func (c *sliverRPCClient) StartDNSListener(ctx context.Context, in *clientpb.DNSListenerReq, opts ...grpc.CallOption) (*clientpb.DNSListener, error) { out := new(clientpb.DNSListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartDNSListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartDNSListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -436,7 +593,7 @@ func (c *sliverRPCClient) StartDNSListener(ctx context.Context, in *clientpb.DNS func (c *sliverRPCClient) StartHTTPSListener(ctx context.Context, in *clientpb.HTTPListenerReq, opts ...grpc.CallOption) (*clientpb.HTTPListener, error) { out := new(clientpb.HTTPListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartHTTPSListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartHTTPSListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -445,7 +602,7 @@ func (c *sliverRPCClient) StartHTTPSListener(ctx context.Context, in *clientpb.H func (c *sliverRPCClient) StartHTTPListener(ctx context.Context, in *clientpb.HTTPListenerReq, opts ...grpc.CallOption) (*clientpb.HTTPListener, error) { out := new(clientpb.HTTPListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartHTTPListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartHTTPListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -454,7 +611,7 @@ func (c *sliverRPCClient) StartHTTPListener(ctx context.Context, in *clientpb.HT func (c *sliverRPCClient) StartTCPStagerListener(ctx context.Context, in *clientpb.StagerListenerReq, opts ...grpc.CallOption) (*clientpb.StagerListener, error) { out := new(clientpb.StagerListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartTCPStagerListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartTCPStagerListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -463,7 +620,7 @@ func (c *sliverRPCClient) StartTCPStagerListener(ctx context.Context, in *client func (c *sliverRPCClient) StartHTTPStagerListener(ctx context.Context, in *clientpb.StagerListenerReq, opts ...grpc.CallOption) (*clientpb.StagerListener, error) { out := new(clientpb.StagerListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartHTTPStagerListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartHTTPStagerListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -472,7 +629,7 @@ func (c *sliverRPCClient) StartHTTPStagerListener(ctx context.Context, in *clien func (c *sliverRPCClient) LootAdd(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*clientpb.Loot, error) { out := new(clientpb.Loot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -481,7 +638,7 @@ func (c *sliverRPCClient) LootAdd(ctx context.Context, in *clientpb.Loot, opts . func (c *sliverRPCClient) LootRm(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -490,7 +647,7 @@ func (c *sliverRPCClient) LootRm(ctx context.Context, in *clientpb.Loot, opts .. func (c *sliverRPCClient) LootUpdate(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*clientpb.Loot, error) { out := new(clientpb.Loot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootUpdate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootUpdate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -499,7 +656,7 @@ func (c *sliverRPCClient) LootUpdate(ctx context.Context, in *clientpb.Loot, opt func (c *sliverRPCClient) LootContent(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*clientpb.Loot, error) { out := new(clientpb.Loot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -508,7 +665,7 @@ func (c *sliverRPCClient) LootContent(ctx context.Context, in *clientpb.Loot, op func (c *sliverRPCClient) LootAll(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.AllLoot, error) { out := new(clientpb.AllLoot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootAll", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootAll_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -517,7 +674,7 @@ func (c *sliverRPCClient) LootAll(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) Creds(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Credentials, error) { out := new(clientpb.Credentials) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Creds", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Creds_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -526,7 +683,7 @@ func (c *sliverRPCClient) Creds(ctx context.Context, in *commonpb.Empty, opts .. func (c *sliverRPCClient) CredsAdd(ctx context.Context, in *clientpb.Credentials, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -535,7 +692,7 @@ func (c *sliverRPCClient) CredsAdd(ctx context.Context, in *clientpb.Credentials func (c *sliverRPCClient) CredsRm(ctx context.Context, in *clientpb.Credentials, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -544,7 +701,7 @@ func (c *sliverRPCClient) CredsRm(ctx context.Context, in *clientpb.Credentials, func (c *sliverRPCClient) CredsUpdate(ctx context.Context, in *clientpb.Credentials, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsUpdate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsUpdate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -553,7 +710,7 @@ func (c *sliverRPCClient) CredsUpdate(ctx context.Context, in *clientpb.Credenti func (c *sliverRPCClient) GetCredByID(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credential, error) { out := new(clientpb.Credential) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetCredByID", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetCredByID_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -562,7 +719,7 @@ func (c *sliverRPCClient) GetCredByID(ctx context.Context, in *clientpb.Credenti func (c *sliverRPCClient) GetCredsByHashType(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credentials, error) { out := new(clientpb.Credentials) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetCredsByHashType", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetCredsByHashType_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -571,7 +728,7 @@ func (c *sliverRPCClient) GetCredsByHashType(ctx context.Context, in *clientpb.C func (c *sliverRPCClient) GetPlaintextCredsByHashType(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credentials, error) { out := new(clientpb.Credentials) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetPlaintextCredsByHashType", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetPlaintextCredsByHashType_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -580,7 +737,7 @@ func (c *sliverRPCClient) GetPlaintextCredsByHashType(ctx context.Context, in *c func (c *sliverRPCClient) CredsSniffHashType(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credential, error) { out := new(clientpb.Credential) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsSniffHashType", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsSniffHashType_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -589,7 +746,7 @@ func (c *sliverRPCClient) CredsSniffHashType(ctx context.Context, in *clientpb.C func (c *sliverRPCClient) Hosts(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.AllHosts, error) { out := new(clientpb.AllHosts) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Hosts", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Hosts_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -598,7 +755,7 @@ func (c *sliverRPCClient) Hosts(ctx context.Context, in *commonpb.Empty, opts .. func (c *sliverRPCClient) Host(ctx context.Context, in *clientpb.Host, opts ...grpc.CallOption) (*clientpb.Host, error) { out := new(clientpb.Host) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Host", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Host_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -607,7 +764,7 @@ func (c *sliverRPCClient) Host(ctx context.Context, in *clientpb.Host, opts ...g func (c *sliverRPCClient) HostRm(ctx context.Context, in *clientpb.Host, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/HostRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_HostRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -616,7 +773,7 @@ func (c *sliverRPCClient) HostRm(ctx context.Context, in *clientpb.Host, opts .. func (c *sliverRPCClient) HostIOCRm(ctx context.Context, in *clientpb.IOC, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/HostIOCRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_HostIOCRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -625,7 +782,7 @@ func (c *sliverRPCClient) HostIOCRm(ctx context.Context, in *clientpb.IOC, opts func (c *sliverRPCClient) Generate(ctx context.Context, in *clientpb.GenerateReq, opts ...grpc.CallOption) (*clientpb.Generate, error) { out := new(clientpb.Generate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Generate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Generate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -634,7 +791,7 @@ func (c *sliverRPCClient) Generate(ctx context.Context, in *clientpb.GenerateReq func (c *sliverRPCClient) GenerateExternal(ctx context.Context, in *clientpb.ExternalGenerateReq, opts ...grpc.CallOption) (*clientpb.ExternalImplantConfig, error) { out := new(clientpb.ExternalImplantConfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateExternal", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateExternal_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -643,7 +800,7 @@ func (c *sliverRPCClient) GenerateExternal(ctx context.Context, in *clientpb.Ext func (c *sliverRPCClient) GenerateExternalSaveBuild(ctx context.Context, in *clientpb.ExternalImplantBinary, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateExternalSaveBuild", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateExternalSaveBuild_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -652,7 +809,7 @@ func (c *sliverRPCClient) GenerateExternalSaveBuild(ctx context.Context, in *cli func (c *sliverRPCClient) GenerateExternalGetImplantConfig(ctx context.Context, in *clientpb.ImplantConfig, opts ...grpc.CallOption) (*clientpb.ExternalImplantConfig, error) { out := new(clientpb.ExternalImplantConfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateExternalGetImplantConfig", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateExternalGetImplantConfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -660,7 +817,7 @@ func (c *sliverRPCClient) GenerateExternalGetImplantConfig(ctx context.Context, } func (c *sliverRPCClient) BuilderRegister(ctx context.Context, in *clientpb.Builder, opts ...grpc.CallOption) (SliverRPC_BuilderRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], "/rpcpb.SliverRPC/BuilderRegister", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_BuilderRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -693,7 +850,7 @@ func (x *sliverRPCBuilderRegisterClient) Recv() (*clientpb.Event, error) { func (c *sliverRPCClient) BuilderTrigger(ctx context.Context, in *clientpb.Event, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/BuilderTrigger", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_BuilderTrigger_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -702,7 +859,7 @@ func (c *sliverRPCClient) BuilderTrigger(ctx context.Context, in *clientpb.Event func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Builders, error) { out := new(clientpb.Builders) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Builders", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Builders_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -710,7 +867,7 @@ func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts } func (c *sliverRPCClient) CrackstationRegister(ctx context.Context, in *clientpb.Crackstation, opts ...grpc.CallOption) (SliverRPC_CrackstationRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], "/rpcpb.SliverRPC/CrackstationRegister", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_CrackstationRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -743,7 +900,7 @@ func (x *sliverRPCCrackstationRegisterClient) Recv() (*clientpb.Event, error) { func (c *sliverRPCClient) CrackstationTrigger(ctx context.Context, in *clientpb.Event, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackstationTrigger", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackstationTrigger_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -752,7 +909,7 @@ func (c *sliverRPCClient) CrackstationTrigger(ctx context.Context, in *clientpb. func (c *sliverRPCClient) CrackstationBenchmark(ctx context.Context, in *clientpb.CrackBenchmark, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackstationBenchmark", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackstationBenchmark_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -761,7 +918,7 @@ func (c *sliverRPCClient) CrackstationBenchmark(ctx context.Context, in *clientp func (c *sliverRPCClient) Crackstations(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Crackstations, error) { out := new(clientpb.Crackstations) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Crackstations", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Crackstations_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -770,7 +927,7 @@ func (c *sliverRPCClient) Crackstations(ctx context.Context, in *commonpb.Empty, func (c *sliverRPCClient) CrackTaskByID(ctx context.Context, in *clientpb.CrackTask, opts ...grpc.CallOption) (*clientpb.CrackTask, error) { out := new(clientpb.CrackTask) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackTaskByID", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackTaskByID_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -779,7 +936,7 @@ func (c *sliverRPCClient) CrackTaskByID(ctx context.Context, in *clientpb.CrackT func (c *sliverRPCClient) CrackTaskUpdate(ctx context.Context, in *clientpb.CrackTask, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackTaskUpdate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackTaskUpdate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -788,7 +945,7 @@ func (c *sliverRPCClient) CrackTaskUpdate(ctx context.Context, in *clientpb.Crac func (c *sliverRPCClient) CrackFilesList(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*clientpb.CrackFiles, error) { out := new(clientpb.CrackFiles) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFilesList", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFilesList_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -797,7 +954,7 @@ func (c *sliverRPCClient) CrackFilesList(ctx context.Context, in *clientpb.Crack func (c *sliverRPCClient) CrackFileCreate(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*clientpb.CrackFile, error) { out := new(clientpb.CrackFile) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileCreate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileCreate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -806,7 +963,7 @@ func (c *sliverRPCClient) CrackFileCreate(ctx context.Context, in *clientpb.Crac func (c *sliverRPCClient) CrackFileChunkUpload(ctx context.Context, in *clientpb.CrackFileChunk, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileChunkUpload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileChunkUpload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -815,7 +972,7 @@ func (c *sliverRPCClient) CrackFileChunkUpload(ctx context.Context, in *clientpb func (c *sliverRPCClient) CrackFileChunkDownload(ctx context.Context, in *clientpb.CrackFileChunk, opts ...grpc.CallOption) (*clientpb.CrackFileChunk, error) { out := new(clientpb.CrackFileChunk) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileChunkDownload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileChunkDownload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -824,7 +981,7 @@ func (c *sliverRPCClient) CrackFileChunkDownload(ctx context.Context, in *client func (c *sliverRPCClient) CrackFileComplete(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileComplete", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileComplete_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -833,7 +990,7 @@ func (c *sliverRPCClient) CrackFileComplete(ctx context.Context, in *clientpb.Cr func (c *sliverRPCClient) CrackFileDelete(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileDelete", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileDelete_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -842,7 +999,7 @@ func (c *sliverRPCClient) CrackFileDelete(ctx context.Context, in *clientpb.Crac func (c *sliverRPCClient) Regenerate(ctx context.Context, in *clientpb.RegenerateReq, opts ...grpc.CallOption) (*clientpb.Generate, error) { out := new(clientpb.Generate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Regenerate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Regenerate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -851,7 +1008,7 @@ func (c *sliverRPCClient) Regenerate(ctx context.Context, in *clientpb.Regenerat func (c *sliverRPCClient) ImplantBuilds(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ImplantBuilds, error) { out := new(clientpb.ImplantBuilds) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ImplantBuilds", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ImplantBuilds_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -860,7 +1017,7 @@ func (c *sliverRPCClient) ImplantBuilds(ctx context.Context, in *commonpb.Empty, func (c *sliverRPCClient) DeleteImplantBuild(ctx context.Context, in *clientpb.DeleteReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/DeleteImplantBuild", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_DeleteImplantBuild_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -869,7 +1026,7 @@ func (c *sliverRPCClient) DeleteImplantBuild(ctx context.Context, in *clientpb.D func (c *sliverRPCClient) Canaries(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Canaries, error) { out := new(clientpb.Canaries) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Canaries", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Canaries_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -878,7 +1035,7 @@ func (c *sliverRPCClient) Canaries(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) GenerateWGClientConfig(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.WGClientConfig, error) { out := new(clientpb.WGClientConfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateWGClientConfig", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateWGClientConfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -887,7 +1044,7 @@ func (c *sliverRPCClient) GenerateWGClientConfig(ctx context.Context, in *common func (c *sliverRPCClient) GenerateUniqueIP(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.UniqueWGIP, error) { out := new(clientpb.UniqueWGIP) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateUniqueIP", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateUniqueIP_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -896,7 +1053,7 @@ func (c *sliverRPCClient) GenerateUniqueIP(ctx context.Context, in *commonpb.Emp func (c *sliverRPCClient) ImplantProfiles(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ImplantProfiles, error) { out := new(clientpb.ImplantProfiles) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ImplantProfiles", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ImplantProfiles_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -905,7 +1062,7 @@ func (c *sliverRPCClient) ImplantProfiles(ctx context.Context, in *commonpb.Empt func (c *sliverRPCClient) DeleteImplantProfile(ctx context.Context, in *clientpb.DeleteReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/DeleteImplantProfile", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_DeleteImplantProfile_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -914,7 +1071,7 @@ func (c *sliverRPCClient) DeleteImplantProfile(ctx context.Context, in *clientpb func (c *sliverRPCClient) SaveImplantProfile(ctx context.Context, in *clientpb.ImplantProfile, opts ...grpc.CallOption) (*clientpb.ImplantProfile, error) { out := new(clientpb.ImplantProfile) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/SaveImplantProfile", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_SaveImplantProfile_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -923,7 +1080,7 @@ func (c *sliverRPCClient) SaveImplantProfile(ctx context.Context, in *clientpb.I func (c *sliverRPCClient) MsfStage(ctx context.Context, in *clientpb.MsfStagerReq, opts ...grpc.CallOption) (*clientpb.MsfStager, error) { out := new(clientpb.MsfStager) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MsfStage", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MsfStage_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -932,7 +1089,7 @@ func (c *sliverRPCClient) MsfStage(ctx context.Context, in *clientpb.MsfStagerRe func (c *sliverRPCClient) ShellcodeRDI(ctx context.Context, in *clientpb.ShellcodeRDIReq, opts ...grpc.CallOption) (*clientpb.ShellcodeRDI, error) { out := new(clientpb.ShellcodeRDI) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ShellcodeRDI", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ShellcodeRDI_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -941,7 +1098,7 @@ func (c *sliverRPCClient) ShellcodeRDI(ctx context.Context, in *clientpb.Shellco func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Compiler, error) { out := new(clientpb.Compiler) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetCompiler", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetCompiler_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -950,7 +1107,7 @@ func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, o func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) { out := new(clientpb.ShellcodeEncode) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ShellcodeEncoder", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoder_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -959,7 +1116,7 @@ func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.She func (c *sliverRPCClient) ShellcodeEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ShellcodeEncoderMap, error) { out := new(clientpb.ShellcodeEncoderMap) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ShellcodeEncoderMap", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoderMap_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -968,7 +1125,7 @@ func (c *sliverRPCClient) ShellcodeEncoderMap(ctx context.Context, in *commonpb. func (c *sliverRPCClient) TrafficEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.TrafficEncoderMap, error) { out := new(clientpb.TrafficEncoderMap) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/TrafficEncoderMap", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_TrafficEncoderMap_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -977,7 +1134,7 @@ func (c *sliverRPCClient) TrafficEncoderMap(ctx context.Context, in *commonpb.Em func (c *sliverRPCClient) TrafficEncoderAdd(ctx context.Context, in *clientpb.TrafficEncoder, opts ...grpc.CallOption) (*clientpb.TrafficEncoderTests, error) { out := new(clientpb.TrafficEncoderTests) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/TrafficEncoderAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_TrafficEncoderAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -986,7 +1143,7 @@ func (c *sliverRPCClient) TrafficEncoderAdd(ctx context.Context, in *clientpb.Tr func (c *sliverRPCClient) TrafficEncoderRm(ctx context.Context, in *clientpb.TrafficEncoder, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/TrafficEncoderRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_TrafficEncoderRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -995,7 +1152,7 @@ func (c *sliverRPCClient) TrafficEncoderRm(ctx context.Context, in *clientpb.Tra func (c *sliverRPCClient) Websites(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Websites, error) { out := new(clientpb.Websites) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Websites", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Websites_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1004,7 +1161,7 @@ func (c *sliverRPCClient) Websites(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) Website(ctx context.Context, in *clientpb.Website, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Website", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Website_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1013,7 +1170,7 @@ func (c *sliverRPCClient) Website(ctx context.Context, in *clientpb.Website, opt func (c *sliverRPCClient) WebsiteRemove(ctx context.Context, in *clientpb.Website, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteRemove", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteRemove_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1022,7 +1179,7 @@ func (c *sliverRPCClient) WebsiteRemove(ctx context.Context, in *clientpb.Websit func (c *sliverRPCClient) WebsiteAddContent(ctx context.Context, in *clientpb.WebsiteAddContent, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteAddContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteAddContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1031,7 +1188,7 @@ func (c *sliverRPCClient) WebsiteAddContent(ctx context.Context, in *clientpb.We func (c *sliverRPCClient) WebsiteUpdateContent(ctx context.Context, in *clientpb.WebsiteAddContent, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteUpdateContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteUpdateContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1040,7 +1197,7 @@ func (c *sliverRPCClient) WebsiteUpdateContent(ctx context.Context, in *clientpb func (c *sliverRPCClient) WebsiteRemoveContent(ctx context.Context, in *clientpb.WebsiteRemoveContent, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteRemoveContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteRemoveContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1049,7 +1206,7 @@ func (c *sliverRPCClient) WebsiteRemoveContent(ctx context.Context, in *clientpb func (c *sliverRPCClient) Ping(ctx context.Context, in *sliverpb.Ping, opts ...grpc.CallOption) (*sliverpb.Ping, error) { out := new(sliverpb.Ping) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ping", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ping_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1058,7 +1215,7 @@ func (c *sliverRPCClient) Ping(ctx context.Context, in *sliverpb.Ping, opts ...g func (c *sliverRPCClient) Ps(ctx context.Context, in *sliverpb.PsReq, opts ...grpc.CallOption) (*sliverpb.Ps, error) { out := new(sliverpb.Ps) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ps", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ps_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1067,7 +1224,7 @@ func (c *sliverRPCClient) Ps(ctx context.Context, in *sliverpb.PsReq, opts ...gr func (c *sliverRPCClient) Terminate(ctx context.Context, in *sliverpb.TerminateReq, opts ...grpc.CallOption) (*sliverpb.Terminate, error) { out := new(sliverpb.Terminate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Terminate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Terminate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1076,7 +1233,7 @@ func (c *sliverRPCClient) Terminate(ctx context.Context, in *sliverpb.TerminateR func (c *sliverRPCClient) Ifconfig(ctx context.Context, in *sliverpb.IfconfigReq, opts ...grpc.CallOption) (*sliverpb.Ifconfig, error) { out := new(sliverpb.Ifconfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ifconfig", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ifconfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1085,7 +1242,7 @@ func (c *sliverRPCClient) Ifconfig(ctx context.Context, in *sliverpb.IfconfigReq func (c *sliverRPCClient) Netstat(ctx context.Context, in *sliverpb.NetstatReq, opts ...grpc.CallOption) (*sliverpb.Netstat, error) { out := new(sliverpb.Netstat) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Netstat", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Netstat_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1094,7 +1251,7 @@ func (c *sliverRPCClient) Netstat(ctx context.Context, in *sliverpb.NetstatReq, func (c *sliverRPCClient) Ls(ctx context.Context, in *sliverpb.LsReq, opts ...grpc.CallOption) (*sliverpb.Ls, error) { out := new(sliverpb.Ls) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ls", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ls_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1103,7 +1260,7 @@ func (c *sliverRPCClient) Ls(ctx context.Context, in *sliverpb.LsReq, opts ...gr func (c *sliverRPCClient) Cd(ctx context.Context, in *sliverpb.CdReq, opts ...grpc.CallOption) (*sliverpb.Pwd, error) { out := new(sliverpb.Pwd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Cd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Cd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1112,7 +1269,7 @@ func (c *sliverRPCClient) Cd(ctx context.Context, in *sliverpb.CdReq, opts ...gr func (c *sliverRPCClient) Pwd(ctx context.Context, in *sliverpb.PwdReq, opts ...grpc.CallOption) (*sliverpb.Pwd, error) { out := new(sliverpb.Pwd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Pwd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Pwd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1121,7 +1278,7 @@ func (c *sliverRPCClient) Pwd(ctx context.Context, in *sliverpb.PwdReq, opts ... func (c *sliverRPCClient) Mv(ctx context.Context, in *sliverpb.MvReq, opts ...grpc.CallOption) (*sliverpb.Mv, error) { out := new(sliverpb.Mv) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Mv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Mv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1130,7 +1287,7 @@ func (c *sliverRPCClient) Mv(ctx context.Context, in *sliverpb.MvReq, opts ...gr func (c *sliverRPCClient) Cp(ctx context.Context, in *sliverpb.CpReq, opts ...grpc.CallOption) (*sliverpb.Cp, error) { out := new(sliverpb.Cp) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Cp", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Cp_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1139,7 +1296,7 @@ func (c *sliverRPCClient) Cp(ctx context.Context, in *sliverpb.CpReq, opts ...gr func (c *sliverRPCClient) Rm(ctx context.Context, in *sliverpb.RmReq, opts ...grpc.CallOption) (*sliverpb.Rm, error) { out := new(sliverpb.Rm) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Rm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Rm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1148,7 +1305,7 @@ func (c *sliverRPCClient) Rm(ctx context.Context, in *sliverpb.RmReq, opts ...gr func (c *sliverRPCClient) Mkdir(ctx context.Context, in *sliverpb.MkdirReq, opts ...grpc.CallOption) (*sliverpb.Mkdir, error) { out := new(sliverpb.Mkdir) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Mkdir", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Mkdir_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1157,7 +1314,7 @@ func (c *sliverRPCClient) Mkdir(ctx context.Context, in *sliverpb.MkdirReq, opts func (c *sliverRPCClient) Download(ctx context.Context, in *sliverpb.DownloadReq, opts ...grpc.CallOption) (*sliverpb.Download, error) { out := new(sliverpb.Download) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Download", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Download_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1166,7 +1323,7 @@ func (c *sliverRPCClient) Download(ctx context.Context, in *sliverpb.DownloadReq func (c *sliverRPCClient) Upload(ctx context.Context, in *sliverpb.UploadReq, opts ...grpc.CallOption) (*sliverpb.Upload, error) { out := new(sliverpb.Upload) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Upload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Upload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1175,7 +1332,7 @@ func (c *sliverRPCClient) Upload(ctx context.Context, in *sliverpb.UploadReq, op func (c *sliverRPCClient) Chmod(ctx context.Context, in *sliverpb.ChmodReq, opts ...grpc.CallOption) (*sliverpb.Chmod, error) { out := new(sliverpb.Chmod) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Chmod", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Chmod_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1184,7 +1341,7 @@ func (c *sliverRPCClient) Chmod(ctx context.Context, in *sliverpb.ChmodReq, opts func (c *sliverRPCClient) Chown(ctx context.Context, in *sliverpb.ChownReq, opts ...grpc.CallOption) (*sliverpb.Chown, error) { out := new(sliverpb.Chown) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Chown", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Chown_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1193,7 +1350,7 @@ func (c *sliverRPCClient) Chown(ctx context.Context, in *sliverpb.ChownReq, opts func (c *sliverRPCClient) Chtimes(ctx context.Context, in *sliverpb.ChtimesReq, opts ...grpc.CallOption) (*sliverpb.Chtimes, error) { out := new(sliverpb.Chtimes) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Chtimes", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Chtimes_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1202,7 +1359,7 @@ func (c *sliverRPCClient) Chtimes(ctx context.Context, in *sliverpb.ChtimesReq, func (c *sliverRPCClient) MemfilesList(ctx context.Context, in *sliverpb.MemfilesListReq, opts ...grpc.CallOption) (*sliverpb.Ls, error) { out := new(sliverpb.Ls) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MemfilesList", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MemfilesList_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1211,7 +1368,7 @@ func (c *sliverRPCClient) MemfilesList(ctx context.Context, in *sliverpb.Memfile func (c *sliverRPCClient) MemfilesAdd(ctx context.Context, in *sliverpb.MemfilesAddReq, opts ...grpc.CallOption) (*sliverpb.MemfilesAdd, error) { out := new(sliverpb.MemfilesAdd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MemfilesAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MemfilesAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1220,7 +1377,7 @@ func (c *sliverRPCClient) MemfilesAdd(ctx context.Context, in *sliverpb.Memfiles func (c *sliverRPCClient) MemfilesRm(ctx context.Context, in *sliverpb.MemfilesRmReq, opts ...grpc.CallOption) (*sliverpb.MemfilesRm, error) { out := new(sliverpb.MemfilesRm) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MemfilesRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MemfilesRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1229,7 +1386,7 @@ func (c *sliverRPCClient) MemfilesRm(ctx context.Context, in *sliverpb.MemfilesR func (c *sliverRPCClient) ProcessDump(ctx context.Context, in *sliverpb.ProcessDumpReq, opts ...grpc.CallOption) (*sliverpb.ProcessDump, error) { out := new(sliverpb.ProcessDump) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ProcessDump", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ProcessDump_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1238,7 +1395,7 @@ func (c *sliverRPCClient) ProcessDump(ctx context.Context, in *sliverpb.ProcessD func (c *sliverRPCClient) RunAs(ctx context.Context, in *sliverpb.RunAsReq, opts ...grpc.CallOption) (*sliverpb.RunAs, error) { out := new(sliverpb.RunAs) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RunAs", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RunAs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1247,7 +1404,7 @@ func (c *sliverRPCClient) RunAs(ctx context.Context, in *sliverpb.RunAsReq, opts func (c *sliverRPCClient) Impersonate(ctx context.Context, in *sliverpb.ImpersonateReq, opts ...grpc.CallOption) (*sliverpb.Impersonate, error) { out := new(sliverpb.Impersonate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Impersonate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Impersonate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1256,7 +1413,7 @@ func (c *sliverRPCClient) Impersonate(ctx context.Context, in *sliverpb.Imperson func (c *sliverRPCClient) RevToSelf(ctx context.Context, in *sliverpb.RevToSelfReq, opts ...grpc.CallOption) (*sliverpb.RevToSelf, error) { out := new(sliverpb.RevToSelf) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RevToSelf", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RevToSelf_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1265,7 +1422,7 @@ func (c *sliverRPCClient) RevToSelf(ctx context.Context, in *sliverpb.RevToSelfR func (c *sliverRPCClient) GetSystem(ctx context.Context, in *clientpb.GetSystemReq, opts ...grpc.CallOption) (*sliverpb.GetSystem, error) { out := new(sliverpb.GetSystem) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetSystem", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetSystem_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1274,7 +1431,7 @@ func (c *sliverRPCClient) GetSystem(ctx context.Context, in *clientpb.GetSystemR func (c *sliverRPCClient) Task(ctx context.Context, in *sliverpb.TaskReq, opts ...grpc.CallOption) (*sliverpb.Task, error) { out := new(sliverpb.Task) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Task", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Task_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1283,7 +1440,7 @@ func (c *sliverRPCClient) Task(ctx context.Context, in *sliverpb.TaskReq, opts . func (c *sliverRPCClient) Msf(ctx context.Context, in *clientpb.MSFReq, opts ...grpc.CallOption) (*sliverpb.Task, error) { out := new(sliverpb.Task) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Msf", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Msf_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1292,7 +1449,7 @@ func (c *sliverRPCClient) Msf(ctx context.Context, in *clientpb.MSFReq, opts ... func (c *sliverRPCClient) MsfRemote(ctx context.Context, in *clientpb.MSFRemoteReq, opts ...grpc.CallOption) (*sliverpb.Task, error) { out := new(sliverpb.Task) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MsfRemote", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MsfRemote_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1301,7 +1458,7 @@ func (c *sliverRPCClient) MsfRemote(ctx context.Context, in *clientpb.MSFRemoteR func (c *sliverRPCClient) ExecuteAssembly(ctx context.Context, in *sliverpb.ExecuteAssemblyReq, opts ...grpc.CallOption) (*sliverpb.ExecuteAssembly, error) { out := new(sliverpb.ExecuteAssembly) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ExecuteAssembly", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ExecuteAssembly_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1310,7 +1467,7 @@ func (c *sliverRPCClient) ExecuteAssembly(ctx context.Context, in *sliverpb.Exec func (c *sliverRPCClient) Migrate(ctx context.Context, in *clientpb.MigrateReq, opts ...grpc.CallOption) (*sliverpb.Migrate, error) { out := new(sliverpb.Migrate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Migrate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Migrate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1319,7 +1476,7 @@ func (c *sliverRPCClient) Migrate(ctx context.Context, in *clientpb.MigrateReq, func (c *sliverRPCClient) Execute(ctx context.Context, in *sliverpb.ExecuteReq, opts ...grpc.CallOption) (*sliverpb.Execute, error) { out := new(sliverpb.Execute) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Execute", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Execute_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1328,7 +1485,7 @@ func (c *sliverRPCClient) Execute(ctx context.Context, in *sliverpb.ExecuteReq, func (c *sliverRPCClient) ExecuteWindows(ctx context.Context, in *sliverpb.ExecuteWindowsReq, opts ...grpc.CallOption) (*sliverpb.Execute, error) { out := new(sliverpb.Execute) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ExecuteWindows", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ExecuteWindows_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1337,7 +1494,7 @@ func (c *sliverRPCClient) ExecuteWindows(ctx context.Context, in *sliverpb.Execu func (c *sliverRPCClient) Sideload(ctx context.Context, in *sliverpb.SideloadReq, opts ...grpc.CallOption) (*sliverpb.Sideload, error) { out := new(sliverpb.Sideload) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Sideload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Sideload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1346,7 +1503,7 @@ func (c *sliverRPCClient) Sideload(ctx context.Context, in *sliverpb.SideloadReq func (c *sliverRPCClient) SpawnDll(ctx context.Context, in *sliverpb.InvokeSpawnDllReq, opts ...grpc.CallOption) (*sliverpb.SpawnDll, error) { out := new(sliverpb.SpawnDll) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/SpawnDll", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_SpawnDll_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1355,7 +1512,7 @@ func (c *sliverRPCClient) SpawnDll(ctx context.Context, in *sliverpb.InvokeSpawn func (c *sliverRPCClient) Screenshot(ctx context.Context, in *sliverpb.ScreenshotReq, opts ...grpc.CallOption) (*sliverpb.Screenshot, error) { out := new(sliverpb.Screenshot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Screenshot", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Screenshot_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1364,7 +1521,7 @@ func (c *sliverRPCClient) Screenshot(ctx context.Context, in *sliverpb.Screensho func (c *sliverRPCClient) CurrentTokenOwner(ctx context.Context, in *sliverpb.CurrentTokenOwnerReq, opts ...grpc.CallOption) (*sliverpb.CurrentTokenOwner, error) { out := new(sliverpb.CurrentTokenOwner) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CurrentTokenOwner", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CurrentTokenOwner_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1373,7 +1530,7 @@ func (c *sliverRPCClient) CurrentTokenOwner(ctx context.Context, in *sliverpb.Cu func (c *sliverRPCClient) PivotStartListener(ctx context.Context, in *sliverpb.PivotStartListenerReq, opts ...grpc.CallOption) (*sliverpb.PivotListener, error) { out := new(sliverpb.PivotListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotStartListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotStartListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1382,7 +1539,7 @@ func (c *sliverRPCClient) PivotStartListener(ctx context.Context, in *sliverpb.P func (c *sliverRPCClient) PivotStopListener(ctx context.Context, in *sliverpb.PivotStopListenerReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotStopListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotStopListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1391,7 +1548,7 @@ func (c *sliverRPCClient) PivotStopListener(ctx context.Context, in *sliverpb.Pi func (c *sliverRPCClient) PivotSessionListeners(ctx context.Context, in *sliverpb.PivotListenersReq, opts ...grpc.CallOption) (*sliverpb.PivotListeners, error) { out := new(sliverpb.PivotListeners) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotSessionListeners", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotSessionListeners_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1400,7 +1557,7 @@ func (c *sliverRPCClient) PivotSessionListeners(ctx context.Context, in *sliverp func (c *sliverRPCClient) PivotGraph(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.PivotGraph, error) { out := new(clientpb.PivotGraph) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotGraph", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotGraph_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1409,7 +1566,7 @@ func (c *sliverRPCClient) PivotGraph(ctx context.Context, in *commonpb.Empty, op func (c *sliverRPCClient) StartService(ctx context.Context, in *sliverpb.StartServiceReq, opts ...grpc.CallOption) (*sliverpb.ServiceInfo, error) { out := new(sliverpb.ServiceInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartService", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartService_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1418,7 +1575,7 @@ func (c *sliverRPCClient) StartService(ctx context.Context, in *sliverpb.StartSe func (c *sliverRPCClient) StopService(ctx context.Context, in *sliverpb.StopServiceReq, opts ...grpc.CallOption) (*sliverpb.ServiceInfo, error) { out := new(sliverpb.ServiceInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StopService", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StopService_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1427,7 +1584,7 @@ func (c *sliverRPCClient) StopService(ctx context.Context, in *sliverpb.StopServ func (c *sliverRPCClient) RemoveService(ctx context.Context, in *sliverpb.RemoveServiceReq, opts ...grpc.CallOption) (*sliverpb.ServiceInfo, error) { out := new(sliverpb.ServiceInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RemoveService", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RemoveService_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1436,7 +1593,7 @@ func (c *sliverRPCClient) RemoveService(ctx context.Context, in *sliverpb.Remove func (c *sliverRPCClient) MakeToken(ctx context.Context, in *sliverpb.MakeTokenReq, opts ...grpc.CallOption) (*sliverpb.MakeToken, error) { out := new(sliverpb.MakeToken) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MakeToken", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MakeToken_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1445,7 +1602,7 @@ func (c *sliverRPCClient) MakeToken(ctx context.Context, in *sliverpb.MakeTokenR func (c *sliverRPCClient) GetEnv(ctx context.Context, in *sliverpb.EnvReq, opts ...grpc.CallOption) (*sliverpb.EnvInfo, error) { out := new(sliverpb.EnvInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetEnv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetEnv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1454,7 +1611,7 @@ func (c *sliverRPCClient) GetEnv(ctx context.Context, in *sliverpb.EnvReq, opts func (c *sliverRPCClient) SetEnv(ctx context.Context, in *sliverpb.SetEnvReq, opts ...grpc.CallOption) (*sliverpb.SetEnv, error) { out := new(sliverpb.SetEnv) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/SetEnv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_SetEnv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1463,7 +1620,7 @@ func (c *sliverRPCClient) SetEnv(ctx context.Context, in *sliverpb.SetEnvReq, op func (c *sliverRPCClient) UnsetEnv(ctx context.Context, in *sliverpb.UnsetEnvReq, opts ...grpc.CallOption) (*sliverpb.UnsetEnv, error) { out := new(sliverpb.UnsetEnv) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/UnsetEnv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_UnsetEnv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1472,7 +1629,7 @@ func (c *sliverRPCClient) UnsetEnv(ctx context.Context, in *sliverpb.UnsetEnvReq func (c *sliverRPCClient) Backdoor(ctx context.Context, in *clientpb.BackdoorReq, opts ...grpc.CallOption) (*clientpb.Backdoor, error) { out := new(clientpb.Backdoor) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Backdoor", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Backdoor_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1481,7 +1638,7 @@ func (c *sliverRPCClient) Backdoor(ctx context.Context, in *clientpb.BackdoorReq func (c *sliverRPCClient) RegistryRead(ctx context.Context, in *sliverpb.RegistryReadReq, opts ...grpc.CallOption) (*sliverpb.RegistryRead, error) { out := new(sliverpb.RegistryRead) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryRead", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryRead_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1490,7 +1647,7 @@ func (c *sliverRPCClient) RegistryRead(ctx context.Context, in *sliverpb.Registr func (c *sliverRPCClient) RegistryWrite(ctx context.Context, in *sliverpb.RegistryWriteReq, opts ...grpc.CallOption) (*sliverpb.RegistryWrite, error) { out := new(sliverpb.RegistryWrite) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryWrite", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryWrite_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1499,7 +1656,7 @@ func (c *sliverRPCClient) RegistryWrite(ctx context.Context, in *sliverpb.Regist func (c *sliverRPCClient) RegistryCreateKey(ctx context.Context, in *sliverpb.RegistryCreateKeyReq, opts ...grpc.CallOption) (*sliverpb.RegistryCreateKey, error) { out := new(sliverpb.RegistryCreateKey) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryCreateKey", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryCreateKey_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1508,7 +1665,7 @@ func (c *sliverRPCClient) RegistryCreateKey(ctx context.Context, in *sliverpb.Re func (c *sliverRPCClient) RegistryDeleteKey(ctx context.Context, in *sliverpb.RegistryDeleteKeyReq, opts ...grpc.CallOption) (*sliverpb.RegistryDeleteKey, error) { out := new(sliverpb.RegistryDeleteKey) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryDeleteKey", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryDeleteKey_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1517,7 +1674,7 @@ func (c *sliverRPCClient) RegistryDeleteKey(ctx context.Context, in *sliverpb.Re func (c *sliverRPCClient) RegistryListSubKeys(ctx context.Context, in *sliverpb.RegistrySubKeyListReq, opts ...grpc.CallOption) (*sliverpb.RegistrySubKeyList, error) { out := new(sliverpb.RegistrySubKeyList) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryListSubKeys", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryListSubKeys_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1526,7 +1683,7 @@ func (c *sliverRPCClient) RegistryListSubKeys(ctx context.Context, in *sliverpb. func (c *sliverRPCClient) RegistryListValues(ctx context.Context, in *sliverpb.RegistryListValuesReq, opts ...grpc.CallOption) (*sliverpb.RegistryValuesList, error) { out := new(sliverpb.RegistryValuesList) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryListValues", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryListValues_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1535,7 +1692,7 @@ func (c *sliverRPCClient) RegistryListValues(ctx context.Context, in *sliverpb.R func (c *sliverRPCClient) RunSSHCommand(ctx context.Context, in *sliverpb.SSHCommandReq, opts ...grpc.CallOption) (*sliverpb.SSHCommand, error) { out := new(sliverpb.SSHCommand) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RunSSHCommand", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RunSSHCommand_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1544,7 +1701,7 @@ func (c *sliverRPCClient) RunSSHCommand(ctx context.Context, in *sliverpb.SSHCom func (c *sliverRPCClient) HijackDLL(ctx context.Context, in *clientpb.DllHijackReq, opts ...grpc.CallOption) (*clientpb.DllHijack, error) { out := new(clientpb.DllHijack) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/HijackDLL", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_HijackDLL_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1553,7 +1710,7 @@ func (c *sliverRPCClient) HijackDLL(ctx context.Context, in *clientpb.DllHijackR func (c *sliverRPCClient) GetPrivs(ctx context.Context, in *sliverpb.GetPrivsReq, opts ...grpc.CallOption) (*sliverpb.GetPrivs, error) { out := new(sliverpb.GetPrivs) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetPrivs", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetPrivs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1562,7 +1719,7 @@ func (c *sliverRPCClient) GetPrivs(ctx context.Context, in *sliverpb.GetPrivsReq func (c *sliverRPCClient) StartRportFwdListener(ctx context.Context, in *sliverpb.RportFwdStartListenerReq, opts ...grpc.CallOption) (*sliverpb.RportFwdListener, error) { out := new(sliverpb.RportFwdListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartRportFwdListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartRportFwdListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1571,7 +1728,7 @@ func (c *sliverRPCClient) StartRportFwdListener(ctx context.Context, in *sliverp func (c *sliverRPCClient) GetRportFwdListeners(ctx context.Context, in *sliverpb.RportFwdListenersReq, opts ...grpc.CallOption) (*sliverpb.RportFwdListeners, error) { out := new(sliverpb.RportFwdListeners) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetRportFwdListeners", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetRportFwdListeners_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1580,7 +1737,7 @@ func (c *sliverRPCClient) GetRportFwdListeners(ctx context.Context, in *sliverpb func (c *sliverRPCClient) StopRportFwdListener(ctx context.Context, in *sliverpb.RportFwdStopListenerReq, opts ...grpc.CallOption) (*sliverpb.RportFwdListener, error) { out := new(sliverpb.RportFwdListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StopRportFwdListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StopRportFwdListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1589,7 +1746,7 @@ func (c *sliverRPCClient) StopRportFwdListener(ctx context.Context, in *sliverpb func (c *sliverRPCClient) OpenSession(ctx context.Context, in *sliverpb.OpenSession, opts ...grpc.CallOption) (*sliverpb.OpenSession, error) { out := new(sliverpb.OpenSession) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/OpenSession", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_OpenSession_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1598,7 +1755,7 @@ func (c *sliverRPCClient) OpenSession(ctx context.Context, in *sliverpb.OpenSess func (c *sliverRPCClient) CloseSession(ctx context.Context, in *sliverpb.CloseSession, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CloseSession", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CloseSession_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1607,7 +1764,7 @@ func (c *sliverRPCClient) CloseSession(ctx context.Context, in *sliverpb.CloseSe func (c *sliverRPCClient) RegisterExtension(ctx context.Context, in *sliverpb.RegisterExtensionReq, opts ...grpc.CallOption) (*sliverpb.RegisterExtension, error) { out := new(sliverpb.RegisterExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegisterExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegisterExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1616,7 +1773,7 @@ func (c *sliverRPCClient) RegisterExtension(ctx context.Context, in *sliverpb.Re func (c *sliverRPCClient) CallExtension(ctx context.Context, in *sliverpb.CallExtensionReq, opts ...grpc.CallOption) (*sliverpb.CallExtension, error) { out := new(sliverpb.CallExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CallExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CallExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1625,7 +1782,7 @@ func (c *sliverRPCClient) CallExtension(ctx context.Context, in *sliverpb.CallEx func (c *sliverRPCClient) ListExtensions(ctx context.Context, in *sliverpb.ListExtensionsReq, opts ...grpc.CallOption) (*sliverpb.ListExtensions, error) { out := new(sliverpb.ListExtensions) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ListExtensions", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ListExtensions_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1634,7 +1791,7 @@ func (c *sliverRPCClient) ListExtensions(ctx context.Context, in *sliverpb.ListE func (c *sliverRPCClient) RegisterWasmExtension(ctx context.Context, in *sliverpb.RegisterWasmExtensionReq, opts ...grpc.CallOption) (*sliverpb.RegisterWasmExtension, error) { out := new(sliverpb.RegisterWasmExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegisterWasmExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegisterWasmExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1643,7 +1800,7 @@ func (c *sliverRPCClient) RegisterWasmExtension(ctx context.Context, in *sliverp func (c *sliverRPCClient) ListWasmExtensions(ctx context.Context, in *sliverpb.ListWasmExtensionsReq, opts ...grpc.CallOption) (*sliverpb.ListWasmExtensions, error) { out := new(sliverpb.ListWasmExtensions) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ListWasmExtensions", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ListWasmExtensions_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1652,7 +1809,7 @@ func (c *sliverRPCClient) ListWasmExtensions(ctx context.Context, in *sliverpb.L func (c *sliverRPCClient) ExecWasmExtension(ctx context.Context, in *sliverpb.ExecWasmExtensionReq, opts ...grpc.CallOption) (*sliverpb.ExecWasmExtension, error) { out := new(sliverpb.ExecWasmExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ExecWasmExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ExecWasmExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1661,7 +1818,7 @@ func (c *sliverRPCClient) ExecWasmExtension(ctx context.Context, in *sliverpb.Ex func (c *sliverRPCClient) WGStartPortForward(ctx context.Context, in *sliverpb.WGPortForwardStartReq, opts ...grpc.CallOption) (*sliverpb.WGPortForward, error) { out := new(sliverpb.WGPortForward) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStartPortForward", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStartPortForward_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1670,7 +1827,7 @@ func (c *sliverRPCClient) WGStartPortForward(ctx context.Context, in *sliverpb.W func (c *sliverRPCClient) WGStopPortForward(ctx context.Context, in *sliverpb.WGPortForwardStopReq, opts ...grpc.CallOption) (*sliverpb.WGPortForward, error) { out := new(sliverpb.WGPortForward) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStopPortForward", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStopPortForward_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1679,7 +1836,7 @@ func (c *sliverRPCClient) WGStopPortForward(ctx context.Context, in *sliverpb.WG func (c *sliverRPCClient) WGStartSocks(ctx context.Context, in *sliverpb.WGSocksStartReq, opts ...grpc.CallOption) (*sliverpb.WGSocks, error) { out := new(sliverpb.WGSocks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStartSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStartSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1688,7 +1845,7 @@ func (c *sliverRPCClient) WGStartSocks(ctx context.Context, in *sliverpb.WGSocks func (c *sliverRPCClient) WGStopSocks(ctx context.Context, in *sliverpb.WGSocksStopReq, opts ...grpc.CallOption) (*sliverpb.WGSocks, error) { out := new(sliverpb.WGSocks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStopSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStopSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1697,7 +1854,7 @@ func (c *sliverRPCClient) WGStopSocks(ctx context.Context, in *sliverpb.WGSocksS func (c *sliverRPCClient) WGListForwarders(ctx context.Context, in *sliverpb.WGTCPForwardersReq, opts ...grpc.CallOption) (*sliverpb.WGTCPForwarders, error) { out := new(sliverpb.WGTCPForwarders) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGListForwarders", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGListForwarders_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1706,7 +1863,7 @@ func (c *sliverRPCClient) WGListForwarders(ctx context.Context, in *sliverpb.WGT func (c *sliverRPCClient) WGListSocksServers(ctx context.Context, in *sliverpb.WGSocksServersReq, opts ...grpc.CallOption) (*sliverpb.WGSocksServers, error) { out := new(sliverpb.WGSocksServers) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGListSocksServers", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGListSocksServers_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1715,7 +1872,7 @@ func (c *sliverRPCClient) WGListSocksServers(ctx context.Context, in *sliverpb.W func (c *sliverRPCClient) Shell(ctx context.Context, in *sliverpb.ShellReq, opts ...grpc.CallOption) (*sliverpb.Shell, error) { out := new(sliverpb.Shell) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Shell", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Shell_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1724,7 +1881,7 @@ func (c *sliverRPCClient) Shell(ctx context.Context, in *sliverpb.ShellReq, opts func (c *sliverRPCClient) Portfwd(ctx context.Context, in *sliverpb.PortfwdReq, opts ...grpc.CallOption) (*sliverpb.Portfwd, error) { out := new(sliverpb.Portfwd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Portfwd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Portfwd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1733,7 +1890,7 @@ func (c *sliverRPCClient) Portfwd(ctx context.Context, in *sliverpb.PortfwdReq, func (c *sliverRPCClient) CreateSocks(ctx context.Context, in *sliverpb.Socks, opts ...grpc.CallOption) (*sliverpb.Socks, error) { out := new(sliverpb.Socks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CreateSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CreateSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1742,7 +1899,7 @@ func (c *sliverRPCClient) CreateSocks(ctx context.Context, in *sliverpb.Socks, o func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CloseSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CloseSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1750,7 +1907,7 @@ func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, op } func (c *sliverRPCClient) SocksProxy(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_SocksProxyClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], "/rpcpb.SliverRPC/SocksProxy", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_SocksProxy_FullMethodName, opts...) if err != nil { return nil, err } @@ -1782,7 +1939,7 @@ func (x *sliverRPCSocksProxyClient) Recv() (*sliverpb.SocksData, error) { func (c *sliverRPCClient) CreateTunnel(ctx context.Context, in *sliverpb.Tunnel, opts ...grpc.CallOption) (*sliverpb.Tunnel, error) { out := new(sliverpb.Tunnel) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CreateTunnel", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CreateTunnel_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1791,7 +1948,7 @@ func (c *sliverRPCClient) CreateTunnel(ctx context.Context, in *sliverpb.Tunnel, func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CloseTunnel", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CloseTunnel_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1799,7 +1956,7 @@ func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, } func (c *sliverRPCClient) TunnelData(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_TunnelDataClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], "/rpcpb.SliverRPC/TunnelData", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_TunnelData_FullMethodName, opts...) if err != nil { return nil, err } @@ -1830,7 +1987,7 @@ func (x *sliverRPCTunnelDataClient) Recv() (*sliverpb.TunnelData, error) { } func (c *sliverRPCClient) Events(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (SliverRPC_EventsClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], "/rpcpb.SliverRPC/Events", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_Events_FullMethodName, opts...) if err != nil { return nil, err } @@ -1869,8 +2026,6 @@ type SliverRPCServer interface { GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) // *** Client Logs *** ClientLog(SliverRPC_ClientLogServer) error - // *** Operator Commands *** - GetOperators(context.Context, *commonpb.Empty) (*clientpb.Operators, error) // *** Generic *** Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) Reconfigure(context.Context, *sliverpb.ReconfigureReq) (*sliverpb.Reconfigure, error) @@ -2072,9 +2227,6 @@ func (UnimplementedSliverRPCServer) GetVersion(context.Context, *commonpb.Empty) func (UnimplementedSliverRPCServer) ClientLog(SliverRPC_ClientLogServer) error { return status.Errorf(codes.Unimplemented, "method ClientLog not implemented") } -func (UnimplementedSliverRPCServer) GetOperators(context.Context, *commonpb.Empty) (*clientpb.Operators, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetOperators not implemented") -} func (UnimplementedSliverRPCServer) Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Kill not implemented") } @@ -2587,7 +2739,7 @@ func _SliverRPC_GetVersion_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetVersion", + FullMethod: SliverRPC_GetVersion_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetVersion(ctx, req.(*commonpb.Empty)) @@ -2621,24 +2773,6 @@ func (x *sliverRPCClientLogServer) Recv() (*clientpb.ClientLogData, error) { return m, nil } -func _SliverRPC_GetOperators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(commonpb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SliverRPCServer).GetOperators(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetOperators", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SliverRPCServer).GetOperators(ctx, req.(*commonpb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - func _SliverRPC_Kill_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(sliverpb.KillReq) if err := dec(in); err != nil { @@ -2649,7 +2783,7 @@ func _SliverRPC_Kill_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Kill", + FullMethod: SliverRPC_Kill_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Kill(ctx, req.(*sliverpb.KillReq)) @@ -2667,7 +2801,7 @@ func _SliverRPC_Reconfigure_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Reconfigure", + FullMethod: SliverRPC_Reconfigure_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Reconfigure(ctx, req.(*sliverpb.ReconfigureReq)) @@ -2685,7 +2819,7 @@ func _SliverRPC_Rename_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Rename", + FullMethod: SliverRPC_Rename_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Rename(ctx, req.(*clientpb.RenameReq)) @@ -2703,7 +2837,7 @@ func _SliverRPC_GetSessions_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetSessions", + FullMethod: SliverRPC_GetSessions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetSessions(ctx, req.(*commonpb.Empty)) @@ -2721,7 +2855,7 @@ func _SliverRPC_GetBeacons_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeacons", + FullMethod: SliverRPC_GetBeacons_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeacons(ctx, req.(*commonpb.Empty)) @@ -2739,7 +2873,7 @@ func _SliverRPC_GetBeacon_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeacon", + FullMethod: SliverRPC_GetBeacon_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeacon(ctx, req.(*clientpb.Beacon)) @@ -2757,7 +2891,7 @@ func _SliverRPC_RmBeacon_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RmBeacon", + FullMethod: SliverRPC_RmBeacon_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RmBeacon(ctx, req.(*clientpb.Beacon)) @@ -2775,7 +2909,7 @@ func _SliverRPC_GetBeaconTasks_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeaconTasks", + FullMethod: SliverRPC_GetBeaconTasks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeaconTasks(ctx, req.(*clientpb.Beacon)) @@ -2793,7 +2927,7 @@ func _SliverRPC_GetBeaconTaskContent_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeaconTaskContent", + FullMethod: SliverRPC_GetBeaconTaskContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeaconTaskContent(ctx, req.(*clientpb.BeaconTask)) @@ -2811,7 +2945,7 @@ func _SliverRPC_CancelBeaconTask_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CancelBeaconTask", + FullMethod: SliverRPC_CancelBeaconTask_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CancelBeaconTask(ctx, req.(*clientpb.BeaconTask)) @@ -2829,7 +2963,7 @@ func _SliverRPC_MonitorStart_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MonitorStart", + FullMethod: SliverRPC_MonitorStart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MonitorStart(ctx, req.(*commonpb.Empty)) @@ -2847,7 +2981,7 @@ func _SliverRPC_MonitorStop_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MonitorStop", + FullMethod: SliverRPC_MonitorStop_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MonitorStop(ctx, req.(*commonpb.Empty)) @@ -2865,7 +2999,7 @@ func _SliverRPC_GetJobs_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetJobs", + FullMethod: SliverRPC_GetJobs_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetJobs(ctx, req.(*commonpb.Empty)) @@ -2883,7 +3017,7 @@ func _SliverRPC_KillJob_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/KillJob", + FullMethod: SliverRPC_KillJob_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).KillJob(ctx, req.(*clientpb.KillJobReq)) @@ -2901,7 +3035,7 @@ func _SliverRPC_StartMTLSListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartMTLSListener", + FullMethod: SliverRPC_StartMTLSListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartMTLSListener(ctx, req.(*clientpb.MTLSListenerReq)) @@ -2919,7 +3053,7 @@ func _SliverRPC_StartWGListener_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartWGListener", + FullMethod: SliverRPC_StartWGListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartWGListener(ctx, req.(*clientpb.WGListenerReq)) @@ -2937,7 +3071,7 @@ func _SliverRPC_StartDNSListener_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartDNSListener", + FullMethod: SliverRPC_StartDNSListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartDNSListener(ctx, req.(*clientpb.DNSListenerReq)) @@ -2955,7 +3089,7 @@ func _SliverRPC_StartHTTPSListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartHTTPSListener", + FullMethod: SliverRPC_StartHTTPSListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartHTTPSListener(ctx, req.(*clientpb.HTTPListenerReq)) @@ -2973,7 +3107,7 @@ func _SliverRPC_StartHTTPListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartHTTPListener", + FullMethod: SliverRPC_StartHTTPListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartHTTPListener(ctx, req.(*clientpb.HTTPListenerReq)) @@ -2991,7 +3125,7 @@ func _SliverRPC_StartTCPStagerListener_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartTCPStagerListener", + FullMethod: SliverRPC_StartTCPStagerListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartTCPStagerListener(ctx, req.(*clientpb.StagerListenerReq)) @@ -3009,7 +3143,7 @@ func _SliverRPC_StartHTTPStagerListener_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartHTTPStagerListener", + FullMethod: SliverRPC_StartHTTPStagerListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartHTTPStagerListener(ctx, req.(*clientpb.StagerListenerReq)) @@ -3027,7 +3161,7 @@ func _SliverRPC_LootAdd_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootAdd", + FullMethod: SliverRPC_LootAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootAdd(ctx, req.(*clientpb.Loot)) @@ -3045,7 +3179,7 @@ func _SliverRPC_LootRm_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootRm", + FullMethod: SliverRPC_LootRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootRm(ctx, req.(*clientpb.Loot)) @@ -3063,7 +3197,7 @@ func _SliverRPC_LootUpdate_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootUpdate", + FullMethod: SliverRPC_LootUpdate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootUpdate(ctx, req.(*clientpb.Loot)) @@ -3081,7 +3215,7 @@ func _SliverRPC_LootContent_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootContent", + FullMethod: SliverRPC_LootContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootContent(ctx, req.(*clientpb.Loot)) @@ -3099,7 +3233,7 @@ func _SliverRPC_LootAll_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootAll", + FullMethod: SliverRPC_LootAll_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootAll(ctx, req.(*commonpb.Empty)) @@ -3117,7 +3251,7 @@ func _SliverRPC_Creds_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Creds", + FullMethod: SliverRPC_Creds_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Creds(ctx, req.(*commonpb.Empty)) @@ -3135,7 +3269,7 @@ func _SliverRPC_CredsAdd_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsAdd", + FullMethod: SliverRPC_CredsAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsAdd(ctx, req.(*clientpb.Credentials)) @@ -3153,7 +3287,7 @@ func _SliverRPC_CredsRm_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsRm", + FullMethod: SliverRPC_CredsRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsRm(ctx, req.(*clientpb.Credentials)) @@ -3171,7 +3305,7 @@ func _SliverRPC_CredsUpdate_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsUpdate", + FullMethod: SliverRPC_CredsUpdate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsUpdate(ctx, req.(*clientpb.Credentials)) @@ -3189,7 +3323,7 @@ func _SliverRPC_GetCredByID_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetCredByID", + FullMethod: SliverRPC_GetCredByID_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetCredByID(ctx, req.(*clientpb.Credential)) @@ -3207,7 +3341,7 @@ func _SliverRPC_GetCredsByHashType_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetCredsByHashType", + FullMethod: SliverRPC_GetCredsByHashType_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetCredsByHashType(ctx, req.(*clientpb.Credential)) @@ -3225,7 +3359,7 @@ func _SliverRPC_GetPlaintextCredsByHashType_Handler(srv interface{}, ctx context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetPlaintextCredsByHashType", + FullMethod: SliverRPC_GetPlaintextCredsByHashType_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetPlaintextCredsByHashType(ctx, req.(*clientpb.Credential)) @@ -3243,7 +3377,7 @@ func _SliverRPC_CredsSniffHashType_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsSniffHashType", + FullMethod: SliverRPC_CredsSniffHashType_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsSniffHashType(ctx, req.(*clientpb.Credential)) @@ -3261,7 +3395,7 @@ func _SliverRPC_Hosts_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Hosts", + FullMethod: SliverRPC_Hosts_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Hosts(ctx, req.(*commonpb.Empty)) @@ -3279,7 +3413,7 @@ func _SliverRPC_Host_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Host", + FullMethod: SliverRPC_Host_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Host(ctx, req.(*clientpb.Host)) @@ -3297,7 +3431,7 @@ func _SliverRPC_HostRm_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/HostRm", + FullMethod: SliverRPC_HostRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).HostRm(ctx, req.(*clientpb.Host)) @@ -3315,7 +3449,7 @@ func _SliverRPC_HostIOCRm_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/HostIOCRm", + FullMethod: SliverRPC_HostIOCRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).HostIOCRm(ctx, req.(*clientpb.IOC)) @@ -3333,7 +3467,7 @@ func _SliverRPC_Generate_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Generate", + FullMethod: SliverRPC_Generate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Generate(ctx, req.(*clientpb.GenerateReq)) @@ -3351,7 +3485,7 @@ func _SliverRPC_GenerateExternal_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateExternal", + FullMethod: SliverRPC_GenerateExternal_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateExternal(ctx, req.(*clientpb.ExternalGenerateReq)) @@ -3369,7 +3503,7 @@ func _SliverRPC_GenerateExternalSaveBuild_Handler(srv interface{}, ctx context.C } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateExternalSaveBuild", + FullMethod: SliverRPC_GenerateExternalSaveBuild_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateExternalSaveBuild(ctx, req.(*clientpb.ExternalImplantBinary)) @@ -3387,7 +3521,7 @@ func _SliverRPC_GenerateExternalGetImplantConfig_Handler(srv interface{}, ctx co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateExternalGetImplantConfig", + FullMethod: SliverRPC_GenerateExternalGetImplantConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateExternalGetImplantConfig(ctx, req.(*clientpb.ImplantConfig)) @@ -3426,7 +3560,7 @@ func _SliverRPC_BuilderTrigger_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/BuilderTrigger", + FullMethod: SliverRPC_BuilderTrigger_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).BuilderTrigger(ctx, req.(*clientpb.Event)) @@ -3444,7 +3578,7 @@ func _SliverRPC_Builders_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Builders", + FullMethod: SliverRPC_Builders_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Builders(ctx, req.(*commonpb.Empty)) @@ -3483,7 +3617,7 @@ func _SliverRPC_CrackstationTrigger_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackstationTrigger", + FullMethod: SliverRPC_CrackstationTrigger_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackstationTrigger(ctx, req.(*clientpb.Event)) @@ -3501,7 +3635,7 @@ func _SliverRPC_CrackstationBenchmark_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackstationBenchmark", + FullMethod: SliverRPC_CrackstationBenchmark_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackstationBenchmark(ctx, req.(*clientpb.CrackBenchmark)) @@ -3519,7 +3653,7 @@ func _SliverRPC_Crackstations_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Crackstations", + FullMethod: SliverRPC_Crackstations_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Crackstations(ctx, req.(*commonpb.Empty)) @@ -3537,7 +3671,7 @@ func _SliverRPC_CrackTaskByID_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackTaskByID", + FullMethod: SliverRPC_CrackTaskByID_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackTaskByID(ctx, req.(*clientpb.CrackTask)) @@ -3555,7 +3689,7 @@ func _SliverRPC_CrackTaskUpdate_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackTaskUpdate", + FullMethod: SliverRPC_CrackTaskUpdate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackTaskUpdate(ctx, req.(*clientpb.CrackTask)) @@ -3573,7 +3707,7 @@ func _SliverRPC_CrackFilesList_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFilesList", + FullMethod: SliverRPC_CrackFilesList_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFilesList(ctx, req.(*clientpb.CrackFile)) @@ -3591,7 +3725,7 @@ func _SliverRPC_CrackFileCreate_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileCreate", + FullMethod: SliverRPC_CrackFileCreate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileCreate(ctx, req.(*clientpb.CrackFile)) @@ -3609,7 +3743,7 @@ func _SliverRPC_CrackFileChunkUpload_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileChunkUpload", + FullMethod: SliverRPC_CrackFileChunkUpload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileChunkUpload(ctx, req.(*clientpb.CrackFileChunk)) @@ -3627,7 +3761,7 @@ func _SliverRPC_CrackFileChunkDownload_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileChunkDownload", + FullMethod: SliverRPC_CrackFileChunkDownload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileChunkDownload(ctx, req.(*clientpb.CrackFileChunk)) @@ -3645,7 +3779,7 @@ func _SliverRPC_CrackFileComplete_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileComplete", + FullMethod: SliverRPC_CrackFileComplete_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileComplete(ctx, req.(*clientpb.CrackFile)) @@ -3663,7 +3797,7 @@ func _SliverRPC_CrackFileDelete_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileDelete", + FullMethod: SliverRPC_CrackFileDelete_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileDelete(ctx, req.(*clientpb.CrackFile)) @@ -3681,7 +3815,7 @@ func _SliverRPC_Regenerate_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Regenerate", + FullMethod: SliverRPC_Regenerate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Regenerate(ctx, req.(*clientpb.RegenerateReq)) @@ -3699,7 +3833,7 @@ func _SliverRPC_ImplantBuilds_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ImplantBuilds", + FullMethod: SliverRPC_ImplantBuilds_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ImplantBuilds(ctx, req.(*commonpb.Empty)) @@ -3717,7 +3851,7 @@ func _SliverRPC_DeleteImplantBuild_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/DeleteImplantBuild", + FullMethod: SliverRPC_DeleteImplantBuild_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).DeleteImplantBuild(ctx, req.(*clientpb.DeleteReq)) @@ -3735,7 +3869,7 @@ func _SliverRPC_Canaries_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Canaries", + FullMethod: SliverRPC_Canaries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Canaries(ctx, req.(*commonpb.Empty)) @@ -3753,7 +3887,7 @@ func _SliverRPC_GenerateWGClientConfig_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateWGClientConfig", + FullMethod: SliverRPC_GenerateWGClientConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateWGClientConfig(ctx, req.(*commonpb.Empty)) @@ -3771,7 +3905,7 @@ func _SliverRPC_GenerateUniqueIP_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateUniqueIP", + FullMethod: SliverRPC_GenerateUniqueIP_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateUniqueIP(ctx, req.(*commonpb.Empty)) @@ -3789,7 +3923,7 @@ func _SliverRPC_ImplantProfiles_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ImplantProfiles", + FullMethod: SliverRPC_ImplantProfiles_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ImplantProfiles(ctx, req.(*commonpb.Empty)) @@ -3807,7 +3941,7 @@ func _SliverRPC_DeleteImplantProfile_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/DeleteImplantProfile", + FullMethod: SliverRPC_DeleteImplantProfile_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).DeleteImplantProfile(ctx, req.(*clientpb.DeleteReq)) @@ -3825,7 +3959,7 @@ func _SliverRPC_SaveImplantProfile_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/SaveImplantProfile", + FullMethod: SliverRPC_SaveImplantProfile_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).SaveImplantProfile(ctx, req.(*clientpb.ImplantProfile)) @@ -3843,7 +3977,7 @@ func _SliverRPC_MsfStage_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MsfStage", + FullMethod: SliverRPC_MsfStage_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MsfStage(ctx, req.(*clientpb.MsfStagerReq)) @@ -3861,7 +3995,7 @@ func _SliverRPC_ShellcodeRDI_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ShellcodeRDI", + FullMethod: SliverRPC_ShellcodeRDI_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ShellcodeRDI(ctx, req.(*clientpb.ShellcodeRDIReq)) @@ -3879,7 +4013,7 @@ func _SliverRPC_GetCompiler_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetCompiler", + FullMethod: SliverRPC_GetCompiler_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetCompiler(ctx, req.(*commonpb.Empty)) @@ -3897,7 +4031,7 @@ func _SliverRPC_ShellcodeEncoder_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ShellcodeEncoder", + FullMethod: SliverRPC_ShellcodeEncoder_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ShellcodeEncoder(ctx, req.(*clientpb.ShellcodeEncodeReq)) @@ -3915,7 +4049,7 @@ func _SliverRPC_ShellcodeEncoderMap_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ShellcodeEncoderMap", + FullMethod: SliverRPC_ShellcodeEncoderMap_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ShellcodeEncoderMap(ctx, req.(*commonpb.Empty)) @@ -3933,7 +4067,7 @@ func _SliverRPC_TrafficEncoderMap_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/TrafficEncoderMap", + FullMethod: SliverRPC_TrafficEncoderMap_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).TrafficEncoderMap(ctx, req.(*commonpb.Empty)) @@ -3951,7 +4085,7 @@ func _SliverRPC_TrafficEncoderAdd_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/TrafficEncoderAdd", + FullMethod: SliverRPC_TrafficEncoderAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).TrafficEncoderAdd(ctx, req.(*clientpb.TrafficEncoder)) @@ -3969,7 +4103,7 @@ func _SliverRPC_TrafficEncoderRm_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/TrafficEncoderRm", + FullMethod: SliverRPC_TrafficEncoderRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).TrafficEncoderRm(ctx, req.(*clientpb.TrafficEncoder)) @@ -3987,7 +4121,7 @@ func _SliverRPC_Websites_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Websites", + FullMethod: SliverRPC_Websites_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Websites(ctx, req.(*commonpb.Empty)) @@ -4005,7 +4139,7 @@ func _SliverRPC_Website_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Website", + FullMethod: SliverRPC_Website_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Website(ctx, req.(*clientpb.Website)) @@ -4023,7 +4157,7 @@ func _SliverRPC_WebsiteRemove_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteRemove", + FullMethod: SliverRPC_WebsiteRemove_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteRemove(ctx, req.(*clientpb.Website)) @@ -4041,7 +4175,7 @@ func _SliverRPC_WebsiteAddContent_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteAddContent", + FullMethod: SliverRPC_WebsiteAddContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteAddContent(ctx, req.(*clientpb.WebsiteAddContent)) @@ -4059,7 +4193,7 @@ func _SliverRPC_WebsiteUpdateContent_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteUpdateContent", + FullMethod: SliverRPC_WebsiteUpdateContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteUpdateContent(ctx, req.(*clientpb.WebsiteAddContent)) @@ -4077,7 +4211,7 @@ func _SliverRPC_WebsiteRemoveContent_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteRemoveContent", + FullMethod: SliverRPC_WebsiteRemoveContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteRemoveContent(ctx, req.(*clientpb.WebsiteRemoveContent)) @@ -4095,7 +4229,7 @@ func _SliverRPC_Ping_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ping", + FullMethod: SliverRPC_Ping_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ping(ctx, req.(*sliverpb.Ping)) @@ -4113,7 +4247,7 @@ func _SliverRPC_Ps_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ps", + FullMethod: SliverRPC_Ps_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ps(ctx, req.(*sliverpb.PsReq)) @@ -4131,7 +4265,7 @@ func _SliverRPC_Terminate_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Terminate", + FullMethod: SliverRPC_Terminate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Terminate(ctx, req.(*sliverpb.TerminateReq)) @@ -4149,7 +4283,7 @@ func _SliverRPC_Ifconfig_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ifconfig", + FullMethod: SliverRPC_Ifconfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ifconfig(ctx, req.(*sliverpb.IfconfigReq)) @@ -4167,7 +4301,7 @@ func _SliverRPC_Netstat_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Netstat", + FullMethod: SliverRPC_Netstat_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Netstat(ctx, req.(*sliverpb.NetstatReq)) @@ -4185,7 +4319,7 @@ func _SliverRPC_Ls_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ls", + FullMethod: SliverRPC_Ls_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ls(ctx, req.(*sliverpb.LsReq)) @@ -4203,7 +4337,7 @@ func _SliverRPC_Cd_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Cd", + FullMethod: SliverRPC_Cd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Cd(ctx, req.(*sliverpb.CdReq)) @@ -4221,7 +4355,7 @@ func _SliverRPC_Pwd_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Pwd", + FullMethod: SliverRPC_Pwd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Pwd(ctx, req.(*sliverpb.PwdReq)) @@ -4239,7 +4373,7 @@ func _SliverRPC_Mv_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Mv", + FullMethod: SliverRPC_Mv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Mv(ctx, req.(*sliverpb.MvReq)) @@ -4257,7 +4391,7 @@ func _SliverRPC_Cp_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Cp", + FullMethod: SliverRPC_Cp_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Cp(ctx, req.(*sliverpb.CpReq)) @@ -4275,7 +4409,7 @@ func _SliverRPC_Rm_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Rm", + FullMethod: SliverRPC_Rm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Rm(ctx, req.(*sliverpb.RmReq)) @@ -4293,7 +4427,7 @@ func _SliverRPC_Mkdir_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Mkdir", + FullMethod: SliverRPC_Mkdir_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Mkdir(ctx, req.(*sliverpb.MkdirReq)) @@ -4311,7 +4445,7 @@ func _SliverRPC_Download_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Download", + FullMethod: SliverRPC_Download_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Download(ctx, req.(*sliverpb.DownloadReq)) @@ -4329,7 +4463,7 @@ func _SliverRPC_Upload_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Upload", + FullMethod: SliverRPC_Upload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Upload(ctx, req.(*sliverpb.UploadReq)) @@ -4347,7 +4481,7 @@ func _SliverRPC_Chmod_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Chmod", + FullMethod: SliverRPC_Chmod_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Chmod(ctx, req.(*sliverpb.ChmodReq)) @@ -4365,7 +4499,7 @@ func _SliverRPC_Chown_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Chown", + FullMethod: SliverRPC_Chown_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Chown(ctx, req.(*sliverpb.ChownReq)) @@ -4383,7 +4517,7 @@ func _SliverRPC_Chtimes_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Chtimes", + FullMethod: SliverRPC_Chtimes_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Chtimes(ctx, req.(*sliverpb.ChtimesReq)) @@ -4401,7 +4535,7 @@ func _SliverRPC_MemfilesList_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MemfilesList", + FullMethod: SliverRPC_MemfilesList_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MemfilesList(ctx, req.(*sliverpb.MemfilesListReq)) @@ -4419,7 +4553,7 @@ func _SliverRPC_MemfilesAdd_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MemfilesAdd", + FullMethod: SliverRPC_MemfilesAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MemfilesAdd(ctx, req.(*sliverpb.MemfilesAddReq)) @@ -4437,7 +4571,7 @@ func _SliverRPC_MemfilesRm_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MemfilesRm", + FullMethod: SliverRPC_MemfilesRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MemfilesRm(ctx, req.(*sliverpb.MemfilesRmReq)) @@ -4455,7 +4589,7 @@ func _SliverRPC_ProcessDump_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ProcessDump", + FullMethod: SliverRPC_ProcessDump_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ProcessDump(ctx, req.(*sliverpb.ProcessDumpReq)) @@ -4473,7 +4607,7 @@ func _SliverRPC_RunAs_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RunAs", + FullMethod: SliverRPC_RunAs_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RunAs(ctx, req.(*sliverpb.RunAsReq)) @@ -4491,7 +4625,7 @@ func _SliverRPC_Impersonate_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Impersonate", + FullMethod: SliverRPC_Impersonate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Impersonate(ctx, req.(*sliverpb.ImpersonateReq)) @@ -4509,7 +4643,7 @@ func _SliverRPC_RevToSelf_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RevToSelf", + FullMethod: SliverRPC_RevToSelf_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RevToSelf(ctx, req.(*sliverpb.RevToSelfReq)) @@ -4527,7 +4661,7 @@ func _SliverRPC_GetSystem_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetSystem", + FullMethod: SliverRPC_GetSystem_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetSystem(ctx, req.(*clientpb.GetSystemReq)) @@ -4545,7 +4679,7 @@ func _SliverRPC_Task_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Task", + FullMethod: SliverRPC_Task_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Task(ctx, req.(*sliverpb.TaskReq)) @@ -4563,7 +4697,7 @@ func _SliverRPC_Msf_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Msf", + FullMethod: SliverRPC_Msf_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Msf(ctx, req.(*clientpb.MSFReq)) @@ -4581,7 +4715,7 @@ func _SliverRPC_MsfRemote_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MsfRemote", + FullMethod: SliverRPC_MsfRemote_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MsfRemote(ctx, req.(*clientpb.MSFRemoteReq)) @@ -4599,7 +4733,7 @@ func _SliverRPC_ExecuteAssembly_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ExecuteAssembly", + FullMethod: SliverRPC_ExecuteAssembly_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ExecuteAssembly(ctx, req.(*sliverpb.ExecuteAssemblyReq)) @@ -4617,7 +4751,7 @@ func _SliverRPC_Migrate_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Migrate", + FullMethod: SliverRPC_Migrate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Migrate(ctx, req.(*clientpb.MigrateReq)) @@ -4635,7 +4769,7 @@ func _SliverRPC_Execute_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Execute", + FullMethod: SliverRPC_Execute_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Execute(ctx, req.(*sliverpb.ExecuteReq)) @@ -4653,7 +4787,7 @@ func _SliverRPC_ExecuteWindows_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ExecuteWindows", + FullMethod: SliverRPC_ExecuteWindows_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ExecuteWindows(ctx, req.(*sliverpb.ExecuteWindowsReq)) @@ -4671,7 +4805,7 @@ func _SliverRPC_Sideload_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Sideload", + FullMethod: SliverRPC_Sideload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Sideload(ctx, req.(*sliverpb.SideloadReq)) @@ -4689,7 +4823,7 @@ func _SliverRPC_SpawnDll_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/SpawnDll", + FullMethod: SliverRPC_SpawnDll_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).SpawnDll(ctx, req.(*sliverpb.InvokeSpawnDllReq)) @@ -4707,7 +4841,7 @@ func _SliverRPC_Screenshot_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Screenshot", + FullMethod: SliverRPC_Screenshot_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Screenshot(ctx, req.(*sliverpb.ScreenshotReq)) @@ -4725,7 +4859,7 @@ func _SliverRPC_CurrentTokenOwner_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CurrentTokenOwner", + FullMethod: SliverRPC_CurrentTokenOwner_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CurrentTokenOwner(ctx, req.(*sliverpb.CurrentTokenOwnerReq)) @@ -4743,7 +4877,7 @@ func _SliverRPC_PivotStartListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotStartListener", + FullMethod: SliverRPC_PivotStartListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotStartListener(ctx, req.(*sliverpb.PivotStartListenerReq)) @@ -4761,7 +4895,7 @@ func _SliverRPC_PivotStopListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotStopListener", + FullMethod: SliverRPC_PivotStopListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotStopListener(ctx, req.(*sliverpb.PivotStopListenerReq)) @@ -4779,7 +4913,7 @@ func _SliverRPC_PivotSessionListeners_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotSessionListeners", + FullMethod: SliverRPC_PivotSessionListeners_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotSessionListeners(ctx, req.(*sliverpb.PivotListenersReq)) @@ -4797,7 +4931,7 @@ func _SliverRPC_PivotGraph_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotGraph", + FullMethod: SliverRPC_PivotGraph_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotGraph(ctx, req.(*commonpb.Empty)) @@ -4815,7 +4949,7 @@ func _SliverRPC_StartService_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartService", + FullMethod: SliverRPC_StartService_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartService(ctx, req.(*sliverpb.StartServiceReq)) @@ -4833,7 +4967,7 @@ func _SliverRPC_StopService_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StopService", + FullMethod: SliverRPC_StopService_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StopService(ctx, req.(*sliverpb.StopServiceReq)) @@ -4851,7 +4985,7 @@ func _SliverRPC_RemoveService_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RemoveService", + FullMethod: SliverRPC_RemoveService_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RemoveService(ctx, req.(*sliverpb.RemoveServiceReq)) @@ -4869,7 +5003,7 @@ func _SliverRPC_MakeToken_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MakeToken", + FullMethod: SliverRPC_MakeToken_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MakeToken(ctx, req.(*sliverpb.MakeTokenReq)) @@ -4887,7 +5021,7 @@ func _SliverRPC_GetEnv_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetEnv", + FullMethod: SliverRPC_GetEnv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetEnv(ctx, req.(*sliverpb.EnvReq)) @@ -4905,7 +5039,7 @@ func _SliverRPC_SetEnv_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/SetEnv", + FullMethod: SliverRPC_SetEnv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).SetEnv(ctx, req.(*sliverpb.SetEnvReq)) @@ -4923,7 +5057,7 @@ func _SliverRPC_UnsetEnv_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/UnsetEnv", + FullMethod: SliverRPC_UnsetEnv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).UnsetEnv(ctx, req.(*sliverpb.UnsetEnvReq)) @@ -4941,7 +5075,7 @@ func _SliverRPC_Backdoor_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Backdoor", + FullMethod: SliverRPC_Backdoor_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Backdoor(ctx, req.(*clientpb.BackdoorReq)) @@ -4959,7 +5093,7 @@ func _SliverRPC_RegistryRead_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryRead", + FullMethod: SliverRPC_RegistryRead_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryRead(ctx, req.(*sliverpb.RegistryReadReq)) @@ -4977,7 +5111,7 @@ func _SliverRPC_RegistryWrite_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryWrite", + FullMethod: SliverRPC_RegistryWrite_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryWrite(ctx, req.(*sliverpb.RegistryWriteReq)) @@ -4995,7 +5129,7 @@ func _SliverRPC_RegistryCreateKey_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryCreateKey", + FullMethod: SliverRPC_RegistryCreateKey_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryCreateKey(ctx, req.(*sliverpb.RegistryCreateKeyReq)) @@ -5013,7 +5147,7 @@ func _SliverRPC_RegistryDeleteKey_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryDeleteKey", + FullMethod: SliverRPC_RegistryDeleteKey_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryDeleteKey(ctx, req.(*sliverpb.RegistryDeleteKeyReq)) @@ -5031,7 +5165,7 @@ func _SliverRPC_RegistryListSubKeys_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryListSubKeys", + FullMethod: SliverRPC_RegistryListSubKeys_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryListSubKeys(ctx, req.(*sliverpb.RegistrySubKeyListReq)) @@ -5049,7 +5183,7 @@ func _SliverRPC_RegistryListValues_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryListValues", + FullMethod: SliverRPC_RegistryListValues_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryListValues(ctx, req.(*sliverpb.RegistryListValuesReq)) @@ -5067,7 +5201,7 @@ func _SliverRPC_RunSSHCommand_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RunSSHCommand", + FullMethod: SliverRPC_RunSSHCommand_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RunSSHCommand(ctx, req.(*sliverpb.SSHCommandReq)) @@ -5085,7 +5219,7 @@ func _SliverRPC_HijackDLL_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/HijackDLL", + FullMethod: SliverRPC_HijackDLL_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).HijackDLL(ctx, req.(*clientpb.DllHijackReq)) @@ -5103,7 +5237,7 @@ func _SliverRPC_GetPrivs_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetPrivs", + FullMethod: SliverRPC_GetPrivs_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetPrivs(ctx, req.(*sliverpb.GetPrivsReq)) @@ -5121,7 +5255,7 @@ func _SliverRPC_StartRportFwdListener_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartRportFwdListener", + FullMethod: SliverRPC_StartRportFwdListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartRportFwdListener(ctx, req.(*sliverpb.RportFwdStartListenerReq)) @@ -5139,7 +5273,7 @@ func _SliverRPC_GetRportFwdListeners_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetRportFwdListeners", + FullMethod: SliverRPC_GetRportFwdListeners_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetRportFwdListeners(ctx, req.(*sliverpb.RportFwdListenersReq)) @@ -5157,7 +5291,7 @@ func _SliverRPC_StopRportFwdListener_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StopRportFwdListener", + FullMethod: SliverRPC_StopRportFwdListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StopRportFwdListener(ctx, req.(*sliverpb.RportFwdStopListenerReq)) @@ -5175,7 +5309,7 @@ func _SliverRPC_OpenSession_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/OpenSession", + FullMethod: SliverRPC_OpenSession_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).OpenSession(ctx, req.(*sliverpb.OpenSession)) @@ -5193,7 +5327,7 @@ func _SliverRPC_CloseSession_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CloseSession", + FullMethod: SliverRPC_CloseSession_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CloseSession(ctx, req.(*sliverpb.CloseSession)) @@ -5211,7 +5345,7 @@ func _SliverRPC_RegisterExtension_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegisterExtension", + FullMethod: SliverRPC_RegisterExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegisterExtension(ctx, req.(*sliverpb.RegisterExtensionReq)) @@ -5229,7 +5363,7 @@ func _SliverRPC_CallExtension_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CallExtension", + FullMethod: SliverRPC_CallExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CallExtension(ctx, req.(*sliverpb.CallExtensionReq)) @@ -5247,7 +5381,7 @@ func _SliverRPC_ListExtensions_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ListExtensions", + FullMethod: SliverRPC_ListExtensions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ListExtensions(ctx, req.(*sliverpb.ListExtensionsReq)) @@ -5265,7 +5399,7 @@ func _SliverRPC_RegisterWasmExtension_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegisterWasmExtension", + FullMethod: SliverRPC_RegisterWasmExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegisterWasmExtension(ctx, req.(*sliverpb.RegisterWasmExtensionReq)) @@ -5283,7 +5417,7 @@ func _SliverRPC_ListWasmExtensions_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ListWasmExtensions", + FullMethod: SliverRPC_ListWasmExtensions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ListWasmExtensions(ctx, req.(*sliverpb.ListWasmExtensionsReq)) @@ -5301,7 +5435,7 @@ func _SliverRPC_ExecWasmExtension_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ExecWasmExtension", + FullMethod: SliverRPC_ExecWasmExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ExecWasmExtension(ctx, req.(*sliverpb.ExecWasmExtensionReq)) @@ -5319,7 +5453,7 @@ func _SliverRPC_WGStartPortForward_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStartPortForward", + FullMethod: SliverRPC_WGStartPortForward_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStartPortForward(ctx, req.(*sliverpb.WGPortForwardStartReq)) @@ -5337,7 +5471,7 @@ func _SliverRPC_WGStopPortForward_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStopPortForward", + FullMethod: SliverRPC_WGStopPortForward_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStopPortForward(ctx, req.(*sliverpb.WGPortForwardStopReq)) @@ -5355,7 +5489,7 @@ func _SliverRPC_WGStartSocks_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStartSocks", + FullMethod: SliverRPC_WGStartSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStartSocks(ctx, req.(*sliverpb.WGSocksStartReq)) @@ -5373,7 +5507,7 @@ func _SliverRPC_WGStopSocks_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStopSocks", + FullMethod: SliverRPC_WGStopSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStopSocks(ctx, req.(*sliverpb.WGSocksStopReq)) @@ -5391,7 +5525,7 @@ func _SliverRPC_WGListForwarders_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGListForwarders", + FullMethod: SliverRPC_WGListForwarders_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGListForwarders(ctx, req.(*sliverpb.WGTCPForwardersReq)) @@ -5409,7 +5543,7 @@ func _SliverRPC_WGListSocksServers_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGListSocksServers", + FullMethod: SliverRPC_WGListSocksServers_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGListSocksServers(ctx, req.(*sliverpb.WGSocksServersReq)) @@ -5427,7 +5561,7 @@ func _SliverRPC_Shell_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Shell", + FullMethod: SliverRPC_Shell_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Shell(ctx, req.(*sliverpb.ShellReq)) @@ -5445,7 +5579,7 @@ func _SliverRPC_Portfwd_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Portfwd", + FullMethod: SliverRPC_Portfwd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Portfwd(ctx, req.(*sliverpb.PortfwdReq)) @@ -5463,7 +5597,7 @@ func _SliverRPC_CreateSocks_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CreateSocks", + FullMethod: SliverRPC_CreateSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CreateSocks(ctx, req.(*sliverpb.Socks)) @@ -5481,7 +5615,7 @@ func _SliverRPC_CloseSocks_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CloseSocks", + FullMethod: SliverRPC_CloseSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CloseSocks(ctx, req.(*sliverpb.Socks)) @@ -5525,7 +5659,7 @@ func _SliverRPC_CreateTunnel_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CreateTunnel", + FullMethod: SliverRPC_CreateTunnel_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CreateTunnel(ctx, req.(*sliverpb.Tunnel)) @@ -5543,7 +5677,7 @@ func _SliverRPC_CloseTunnel_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CloseTunnel", + FullMethod: SliverRPC_CloseTunnel_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CloseTunnel(ctx, req.(*sliverpb.Tunnel)) @@ -5609,10 +5743,6 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetVersion", Handler: _SliverRPC_GetVersion_Handler, }, - { - MethodName: "GetOperators", - Handler: _SliverRPC_GetOperators_Handler, - }, { MethodName: "Kill", Handler: _SliverRPC_Kill_Handler, diff --git a/protobuf/sliverpb/sliver.pb.go b/protobuf/sliverpb/sliver.pb.go index bb9da3af55..c5eee9774a 100644 --- a/protobuf/sliverpb/sliver.pb.go +++ b/protobuf/sliverpb/sliver.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.21.12 +// protoc-gen-go v1.31.0 +// protoc v3.15.8 // source: sliverpb/sliver.proto package sliverpb diff --git a/server/rpc/rpc-operators.go b/server/rpc/rpc-operators.go deleted file mode 100644 index 38ab232e89..0000000000 --- a/server/rpc/rpc-operators.go +++ /dev/null @@ -1,53 +0,0 @@ -package rpc - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" -) - -// GetOperators - Get a list of operators -func (s *Server) GetOperators(ctx context.Context, _ *commonpb.Empty) (*clientpb.Operators, error) { - operators := &clientpb.Operators{Operators: []*clientpb.Operator{}} - dbOperators, err := db.OperatorAll() - if err != nil { - return nil, ErrDatabaseFailure - } - for _, dbOperator := range dbOperators { - operators.Operators = append(operators.Operators, &clientpb.Operator{ - Name: dbOperator.Name, - Online: isOperatorOnline(dbOperator.Name), - }) - } - return operators, nil -} - -func isOperatorOnline(commonName string) bool { - for _, operator := range core.Clients.ActiveOperators() { - if commonName == operator { - return true - } - } - return false -} diff --git a/server/transport/rpc.go b/server/transport/rpc.go index 00ef9c6adc..c04fe457fd 100644 --- a/server/transport/rpc.go +++ b/server/transport/rpc.go @@ -21,6 +21,7 @@ package transport import ( "context" + "github.com/bishopfox/sliver/server/core" "github.com/reeflective/team/server" "github.com/reeflective/team/transports/grpc/proto" ) @@ -62,8 +63,9 @@ func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, erro userspb := make([]*proto.User, len(users)) for i, user := range users { userspb[i] = &proto.User{ - Name: user.Name, - Online: user.Online, + Name: user.Name, + Online: isOperatorOnline(user.Name), + // Online: user.Online, LastSeen: user.LastSeen.Unix(), Clients: int32(user.Clients), } @@ -71,3 +73,12 @@ func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, erro return &proto.Users{Users: userspb}, err } + +func isOperatorOnline(commonName string) bool { + for _, operator := range core.Clients.ActiveOperators() { + if commonName == operator { + return true + } + } + return false +} From 5583b65517ede65f86dd2f9c5d530947fe94a6d9 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 18:46:04 +0200 Subject: [PATCH 022/109] Remove client configs code --- client/assets/aliases.go | 6 +- client/assets/armories.go | 8 +- client/assets/assets.go | 18 ++--- client/assets/config.go | 123 ------------------------------ client/assets/extensions.go | 8 +- client/assets/settings.go | 6 +- server/command/builder/builder.go | 30 +++----- 7 files changed, 35 insertions(+), 164 deletions(-) delete mode 100644 client/assets/config.go diff --git a/client/assets/aliases.go b/client/assets/aliases.go index 2e372fdb73..182313c7f6 100644 --- a/client/assets/aliases.go +++ b/client/assets/aliases.go @@ -28,12 +28,12 @@ const ( AliasesDirName = "aliases" ) -// GetAliasesDir - Returns the path to the config dir +// GetAliasesDir - Returns the path to the config dir. func GetAliasesDir() string { rootDir, _ := filepath.Abs(GetRootAppDir()) dir := filepath.Join(rootDir, AliasesDirName) if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { log.Fatal(err) } @@ -41,7 +41,7 @@ func GetAliasesDir() string { return dir } -// GetInstalledAliasManifests - Returns a list of installed alias manifests +// GetInstalledAliasManifests - Returns a list of installed alias manifests. func GetInstalledAliasManifests() []string { aliasDir := GetAliasesDir() aliasDirContent, err := os.ReadDir(aliasDir) diff --git a/client/assets/armories.go b/client/assets/armories.go index 6e596423f1..ed2d26c249 100644 --- a/client/assets/armories.go +++ b/client/assets/armories.go @@ -31,9 +31,9 @@ const ( ) var ( - // DefaultArmoryPublicKey - The default public key for the armory + // DefaultArmoryPublicKey - The default public key for the armory. DefaultArmoryPublicKey string - // DefaultArmoryRepoURL - The default repo url for the armory + // DefaultArmoryRepoURL - The default repo url for the armory. DefaultArmoryRepoURL string defaultArmoryConfig = &ArmoryConfig{ @@ -42,7 +42,7 @@ var ( } ) -// ArmoryConfig - The armory config file +// ArmoryConfig - The armory config file. type ArmoryConfig struct { PublicKey string `json:"public_key"` RepoURL string `json:"repo_url"` @@ -50,7 +50,7 @@ type ArmoryConfig struct { AuthorizationCmd string `json:"authorization_cmd"` } -// GetArmoriesConfig - The parsed armory config file +// GetArmoriesConfig - The parsed armory config file. func GetArmoriesConfig() []*ArmoryConfig { armoryConfigPath := filepath.Join(GetRootAppDir(), armoryConfigFileName) if _, err := os.Stat(armoryConfigPath); os.IsNotExist(err) { diff --git a/client/assets/assets.go b/client/assets/assets.go index 06e4edb2c5..aa119af2d1 100644 --- a/client/assets/assets.go +++ b/client/assets/assets.go @@ -30,18 +30,18 @@ import ( ) const ( - // SliverClientDirName - Directory storing all of the client configs/logs + // SliverClientDirName - Directory storing all of the client configs/logs. SliverClientDirName = ".sliver-client" versionFileName = "version" ) -// GetRootAppDir - Get the Sliver app dir ~/.sliver-client/ +// GetRootAppDir - Get the Sliver app dir ~/.sliver-client/. func GetRootAppDir() string { user, _ := user.Current() dir := filepath.Join(user.HomeDir, SliverClientDirName) if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { log.Fatal(err) } @@ -49,11 +49,11 @@ func GetRootAppDir() string { return dir } -// GetClientLogsDir - Get the Sliver client logs dir ~/.sliver-client/logs/ +// GetClientLogsDir - Get the Sliver client logs dir ~/.sliver-client/logs/. func GetClientLogsDir() string { logsDir := filepath.Join(GetRootAppDir(), "logs") if _, err := os.Stat(logsDir); os.IsNotExist(err) { - err = os.MkdirAll(logsDir, 0700) + err = os.MkdirAll(logsDir, 0o700) if err != nil { log.Fatal(err) } @@ -61,11 +61,11 @@ func GetClientLogsDir() string { return logsDir } -// GetConsoleLogsDir - Get the Sliver client console logs dir ~/.sliver-client/logs/console/ +// GetConsoleLogsDir - Get the Sliver client console logs dir ~/.sliver-client/logs/console/. func GetConsoleLogsDir() string { consoleLogsDir := filepath.Join(GetClientLogsDir(), "console") if _, err := os.Stat(consoleLogsDir); os.IsNotExist(err) { - err = os.MkdirAll(consoleLogsDir, 0700) + err = os.MkdirAll(consoleLogsDir, 0o700) if err != nil { log.Fatal(err) } @@ -86,10 +86,10 @@ func saveAssetVersion(appDir string) { versionFilePath := filepath.Join(appDir, versionFileName) fVer, _ := os.Create(versionFilePath) defer fVer.Close() - fVer.Write([]byte(ver.GitCommit)) + fVer.WriteString(ver.GitCommit) } -// Setup - Extract or create local assets +// Setup - Extract or create local assets. func Setup(force bool, echo bool) { appDir := GetRootAppDir() localVer := assetVersion() diff --git a/client/assets/config.go b/client/assets/config.go deleted file mode 100644 index 6f334e1157..0000000000 --- a/client/assets/config.go +++ /dev/null @@ -1,123 +0,0 @@ -package assets - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "crypto/sha256" - "encoding/json" - "errors" - "fmt" - "io" - "log" - "os" - "path/filepath" -) - -const ( - // ConfigDirName - Directory name containing config files - ConfigDirName = "configs" -) - -// ClientConfig - Client JSON config -type ClientConfig struct { - Operator string `json:"operator"` // This value is actually ignored for the most part (cert CN is used instead) - LHost string `json:"lhost"` - LPort int `json:"lport"` - Token string `json:"token"` - CACertificate string `json:"ca_certificate"` - PrivateKey string `json:"private_key"` - Certificate string `json:"certificate"` -} - -// GetConfigDir - Returns the path to the config dir -func GetConfigDir() string { - rootDir, _ := filepath.Abs(GetRootAppDir()) - dir := filepath.Join(rootDir, ConfigDirName) - if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0o700) - if err != nil { - log.Fatal(err) - } - } - return dir -} - -// GetConfigs - Returns a list of available configs -func GetConfigs() map[string]*ClientConfig { - configDir := GetConfigDir() - configFiles, err := os.ReadDir(configDir) - if err != nil { - log.Printf("No configs found %v", err) - return map[string]*ClientConfig{} - } - - confs := map[string]*ClientConfig{} - for _, confFile := range configFiles { - confFilePath := filepath.Join(configDir, confFile.Name()) - // log.Printf("Parsing config %s", confFilePath) - - conf, err := ReadConfig(confFilePath) - if err != nil { - continue - } - digest := sha256.Sum256([]byte(conf.Certificate)) - confs[fmt.Sprintf("%s@%s (%x)", conf.Operator, conf.LHost, digest[:8])] = conf - } - return confs -} - -// ReadConfig - Load config into struct -func ReadConfig(confFilePath string) (*ClientConfig, error) { - confFile, err := os.Open(confFilePath) - if err != nil { - log.Printf("Open failed %v", err) - return nil, err - } - defer confFile.Close() - data, err := io.ReadAll(confFile) - if err != nil { - log.Printf("Read failed %v", err) - return nil, err - } - conf := &ClientConfig{} - err = json.Unmarshal(data, conf) - if err != nil { - log.Printf("Parse failed %v", err) - return nil, err - } - return conf, nil -} - -// SaveConfig - Save a config to disk -func SaveConfig(config *ClientConfig) error { - if config.LHost == "" || config.Operator == "" { - return errors.New("empty config") - } - configDir := GetConfigDir() - filename := fmt.Sprintf("%s_%s.cfg", filepath.Base(config.Operator), filepath.Base(config.LHost)) - saveTo, _ := filepath.Abs(filepath.Join(configDir, filename)) - configJSON, _ := json.Marshal(config) - err := os.WriteFile(saveTo, configJSON, 0o600) - if err != nil { - log.Printf("Failed to write config to: %s (%v)", saveTo, err) - return err - } - log.Printf("Saved new client config to: %s", saveTo) - return nil -} diff --git a/client/assets/extensions.go b/client/assets/extensions.go index 4e1034f1ae..1b7a0bc3e6 100644 --- a/client/assets/extensions.go +++ b/client/assets/extensions.go @@ -25,16 +25,16 @@ import ( ) const ( - // ExtensionsDirName - Directory storing the client side extensions + // ExtensionsDirName - Directory storing the client side extensions. ExtensionsDirName = "extensions" ) -// GetExtensionsDir - Get the Sliver extension directory: ~/.sliver-client/extensions +// GetExtensionsDir - Get the Sliver extension directory: ~/.sliver-client/extensions. func GetExtensionsDir() string { rootDir, _ := filepath.Abs(GetRootAppDir()) dir := filepath.Join(rootDir, ExtensionsDirName) if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { log.Fatal(err) } @@ -42,7 +42,7 @@ func GetExtensionsDir() string { return dir } -// GetInstalledExtensionManifests - Returns a list of installed extension manifests +// GetInstalledExtensionManifests - Returns a list of installed extension manifests. func GetInstalledExtensionManifests() []string { extDir := GetExtensionsDir() extDirContent, err := os.ReadDir(extDir) diff --git a/client/assets/settings.go b/client/assets/settings.go index 487e807b0e..341e4f30c2 100644 --- a/client/assets/settings.go +++ b/client/assets/settings.go @@ -28,7 +28,7 @@ const ( settingsFileName = "tui-settings.json" ) -// ClientSettings - Client JSON config +// ClientSettings - Client JSON config. type ClientSettings struct { TableStyle string `json:"tables"` AutoAdult bool `json:"autoadult"` @@ -40,7 +40,7 @@ type ClientSettings struct { ConsoleLogs bool `json:"console_logs"` } -// LoadSettings - Load the client settings from disk +// LoadSettings - Load the client settings from disk. func LoadSettings() (*ClientSettings, error) { rootDir, _ := filepath.Abs(GetRootAppDir()) data, err := os.ReadFile(filepath.Join(rootDir, settingsFileName)) @@ -67,7 +67,7 @@ func defaultSettings() *ClientSettings { } } -// SaveSettings - Save the current settings to disk +// SaveSettings - Save the current settings to disk. func SaveSettings(settings *ClientSettings) error { rootDir, _ := filepath.Abs(GetRootAppDir()) if settings == nil { diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 6bab0ac0e7..e47da09326 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -26,7 +26,6 @@ import ( "runtime/debug" "strings" - clientAssets "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -112,22 +111,6 @@ func runBuilderCmd(cmd *cobra.Command, args []string) { externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - config, err := clientAssets.ReadConfig(configPath) - if err != nil { - builderLog.Fatalf("Invalid config file: %s", err) - os.Exit(-1) - } - if externalBuilder.Name == "" { - builderLog.Infof("No builder name was specified, attempting to use hostname") - externalBuilder.Name, err = os.Hostname() - if err != nil { - builderLog.Errorf("Failed to get hostname: %s", err) - externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.Operator, runtime.GOOS) - } - } - builderLog.Infof("Hello my name is: %s", externalBuilder.Name) - - builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) startBuilderTeamclient(externalBuilder, configPath) } @@ -267,7 +250,6 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string gTeamclient := transport.NewTeamClient() // The teamclient requires hooks to bind RPC clients around its connection. - // NOTE: this might not be needed either if Sliver uses its own teamclient backend. bindClient := func(clientConn any) error { grpcClient, ok := clientConn.(*grpc.ClientConn) if !ok || grpcClient == nil { @@ -296,6 +278,18 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string os.Exit(-1) } + if externalBuilder.Name == "" { + builderLog.Infof("No builder name was specified, attempting to use hostname") + externalBuilder.Name, err = os.Hostname() + if err != nil { + builderLog.Errorf("Failed to get hostname: %s", err) + externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.User, runtime.GOOS) + } + } + builderLog.Infof("Hello my name is: %s", externalBuilder.Name) + + builderLog.Infof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) + // And immediately connect with it. teamclient.Connect(client.WithConfig(config)) defer teamclient.Disconnect() From d31592bd659b6fdbe996d3b903a50816b2f4c786 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 18:55:04 +0200 Subject: [PATCH 023/109] Go fmt --- server/msf/msf.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/msf/msf.go b/server/msf/msf.go index 18252d7ddf..7420b00d01 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -38,20 +38,20 @@ const ( var ( msfLog = log.NamedLogger("msf", "venom") - // ValidArches - Support CPU architectures + // ValidArches - Support CPU architectures. ValidArches = map[string]bool{ "x86": true, "x64": true, } - // ValidEncoders - Valid MSF encoders + // ValidEncoders - Valid MSF encoders. ValidEncoders = map[string]bool{ "": true, "x86/shikata_ga_nai": true, "x64/xor_dynamic": true, } - // ValidPayloads - Valid payloads and OS combos + // ValidPayloads - Valid payloads and OS combos. validPayloads = map[string]map[string]bool{ "windows": { "meterpreter_reverse_http": true, @@ -102,7 +102,7 @@ var ( } ) -// VenomConfig - +// VenomConfig -. type VenomConfig struct { Os string Arch string @@ -117,13 +117,13 @@ type VenomConfig struct { AdvOptions string } -// Version - Return the version of MSFVenom +// Version - Return the version of MSFVenom. func Version() (string, error) { stdout, err := consoleCmd([]string{"--version"}) return string(stdout), err } -// VenomPayload - Generates an MSFVenom payload +// VenomPayload - Generates an MSFVenom payload. func VenomPayload(config VenomConfig) ([]byte, error) { // Check if msfvenom is in the path if _, err := exec.LookPath(venomBin); err != nil { @@ -216,7 +216,7 @@ func VenomPayload(config VenomConfig) ([]byte, error) { return venomCmd(args) } -// venomCmd - Execute a msfvenom command +// venomCmd - Execute a msfvenom command. func venomCmd(args []string) ([]byte, error) { msfLog.Printf("%s %v", venomBin, args) cmd := exec.Command(venomBin, args...) @@ -235,7 +235,7 @@ func venomCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// consoleCmd - Execute a msfvenom command +// consoleCmd - Execute a msfvenom command. func consoleCmd(args []string) ([]byte, error) { cmd := exec.Command(consoleBin, args...) var stdout bytes.Buffer @@ -252,7 +252,7 @@ func consoleCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// Arch - Convert golang arch to msf arch +// Arch - Convert golang arch to msf arch. func Arch(arch string) string { if arch == "amd64" { return "x64" From 47a280cc165a3e2630600a633d8af274a305af4f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:04:20 +0200 Subject: [PATCH 024/109] Fix beacon compile flags + debug level for client asciicast --- client/command/generate/commands.go | 9 +++++---- server/rpc/rpc-client-logs.go | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index cd5b971859..089873f589 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -1,14 +1,13 @@ package generate import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -44,6 +43,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", generateBeaconCmd) compileImplantFlags("beacon", generateBeaconCmd) + coreBeaconFlags("beacon", generateBeaconCmd) coreImplantFlagCompletions(generateBeaconCmd, con) generateCmd.AddCommand(generateBeaconCmd) @@ -202,6 +202,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", profilesNewBeaconCmd) compileImplantFlags("beacon", profilesNewBeaconCmd) + coreBeaconFlags("beacon", profilesNewBeaconCmd) coreImplantFlagCompletions(profilesNewBeaconCmd, con) profilesRmCmd := &cobra.Command{ diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index 4f32302842..c12df0e731 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -114,7 +114,7 @@ func (rpc *Server) ClientLog(stream rpcpb.SliverRPC_ClientLogServer) error { return err } } - rpcClientLogs.Infof("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) + rpcClientLogs.Debugf("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) streams[streamName].Write(fromClient.GetData()) } return nil @@ -139,7 +139,7 @@ func openNewLogStream(logsDir string, stream string) (*LogStream, error) { } func randomSuffix(n int) string { - var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + letterRunes := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") buf := make([]rune, n) for i := range buf { buf[i] = letterRunes[insecureRand.Intn(len(letterRunes))] @@ -168,7 +168,7 @@ func gzipFile(filePath string) { return } defer inputFile.Close() - outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) + outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) if err != nil { rpcClientLogs.Errorf("Failed to open gz client console log file: %s", err) return From 163c11b60c5aeb1d00053fc8f9438de5b43aae86 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:04:44 +0200 Subject: [PATCH 025/109] Fmt --- client/command/generate/canaries.go | 9 ++-- client/command/generate/generate-beacon.go | 5 +-- client/command/generate/generate-info.go | 5 +-- client/command/generate/generate-stager.go | 5 +-- client/command/generate/generate.go | 45 ++++++++++---------- client/command/generate/helpers.go | 11 +++-- client/command/generate/implants-rm.go | 5 +-- client/command/generate/implants.go | 17 ++++---- client/command/generate/profiles-generate.go | 5 +-- client/command/generate/profiles-new.go | 7 ++- client/command/generate/profiles-rm.go | 5 +-- client/command/generate/profiles.go | 19 ++++----- client/command/generate/regenerate.go | 5 +-- client/command/generate/traffic-encoders.go | 33 +++++++------- 14 files changed, 81 insertions(+), 95 deletions(-) diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index e2a9ff240f..8900e0dd1c 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -4,16 +4,15 @@ import ( "context" "fmt" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CanariesCmd - Display canaries from the database and their status +// CanariesCmd - Display canaries from the database and their status. func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { canaries, err := con.Rpc.Canaries(context.Background(), &commonpb.Empty{}) if err != nil { @@ -28,7 +27,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -// PrintCanaries - Print the canaries tracked by the server +// PrintCanaries - Print the canaries tracked by the server. func PrintCanaries(con *console.SliverConsoleClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index 43820aa7d4..40466d7335 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -5,10 +5,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) var ( @@ -16,7 +15,7 @@ var ( ErrBeaconIntervalTooShort = fmt.Errorf("beacon interval must be %v or greater", minBeaconInterval) ) -// GenerateBeaconCmd - The main command used to generate implant binaries +// GenerateBeaconCmd - The main command used to generate implant binaries. func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index 9fe59c3321..9a9efe6d2a 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -3,13 +3,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// GenerateInfoCmd - Display information about the Sliver server's compiler configuration +// GenerateInfoCmd - Display information about the Sliver server's compiler configuration. func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index 6806ffb184..a6f99d7b08 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -27,13 +27,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// GenerateStagerCmd - Generate a stager using Metasploit +// GenerateStagerCmd - Generate a stager using Metasploit. func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var stageProto clientpb.StageProtocol lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index 9e105e31bd..677e8a4a29 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -33,39 +33,38 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) const ( - // DefaultMTLSLPort is the default port for mtls + // DefaultMTLSLPort is the default port for mtls. DefaultMTLSLPort = 8888 - // DefaultWGPort is the default port for wg + // DefaultWGPort is the default port for wg. DefaultWGLPort = 53 - // DefaultWGNPort is the default n port for wg + // DefaultWGNPort is the default n port for wg. DefaultWGNPort = 8888 - // DefaultWGKeyExPort is the default port for wg key exchange + // DefaultWGKeyExPort is the default port for wg key exchange. DefaultWGKeyExPort = 1337 - // DefaultHTTPLPort is the default port for http + // DefaultHTTPLPort is the default port for http. DefaultHTTPLPort = 80 - // DefaultHTTPSLPort is the default port for https + // DefaultHTTPSLPort is the default port for https. DefaultHTTPSLPort = 443 - // DefaultDNSLPortis the default port for dns + // DefaultDNSLPortis the default port for dns. DefaultDNSLPort = 53 - // DefaultTCPPivotPort is the default port for tcp pivots + // DefaultTCPPivotPort is the default port for tcp pivots. DefaultTCPPivotPort = 9898 - // DefaultReconnect is the default reconnect time + // DefaultReconnect is the default reconnect time. DefaultReconnect = 60 - // DefaultPollTimeout is the default poll timeout + // DefaultPollTimeout is the default poll timeout. DefaultPollTimeout = 360 // 6 minutes - // DefaultMaxErrors is the default max reconnection errors before giving up + // DefaultMaxErrors is the default max reconnection errors before giving up. DefaultMaxErrors = 1000 ) @@ -74,7 +73,7 @@ const ( ) var ( - // SupportedCompilerTargets - Supported compiler targets + // SupportedCompilerTargets - Supported compiler targets. SupportedCompilerTargets = map[string]bool{ "darwin/amd64": true, "darwin/arm64": true, @@ -88,7 +87,7 @@ var ( ErrNoValidBuilders = errors.New("no valid external builders for target") ) -// GenerateCmd - The main command used to generate implant binaries +// GenerateCmd - The main command used to generate implant binaries. func GenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { @@ -181,7 +180,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } } -// Shared function that extracts the compile flags from the grumble context +// Shared function that extracts the compile flags from the grumble context. func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *clientpb.ImplantConfig { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { @@ -404,7 +403,7 @@ func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *cl return config } -// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled +// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled. func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverConsoleClient) (bool, []*commonpb.File) { trafficEncoders, _ := cmd.Flags().GetString("traffic-encoders") encoders := []*commonpb.File{} @@ -461,7 +460,7 @@ func getTargets(targetOS string, targetArch string, con *console.SliverConsoleCl return targetOS, targetArch } -// ParseMTLSc2 - Parse mtls connection string arg +// ParseMTLSc2 - Parse mtls connection string arg. func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -496,7 +495,7 @@ func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseWGc2 - Parse wg connect string arg +// ParseWGc2 - Parse wg connect string arg. func ParseWGc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -612,7 +611,7 @@ func uriWithoutProxyOptions(uri *url.URL) { uri.RawQuery = options.Encode() } -// ParseHTTPc2 - Parse HTTP connection string arg +// ParseHTTPc2 - Parse HTTP connection string arg. func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -658,7 +657,7 @@ func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseDNSc2 - Parse DNS connection string arg +// ParseDNSc2 - Parse DNS connection string arg. func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -693,7 +692,7 @@ func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseNamedPipec2 - Parse named pipe connection string arg +// ParseNamedPipec2 - Parse named pipe connection string arg. func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -740,7 +739,7 @@ func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseTCPPivotc2 - Parse tcp pivot connection string arg +// ParseTCPPivotc2 - Parse tcp pivot connection string arg. func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index f234c09159..554128bb2d 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -4,14 +4,13 @@ import ( "context" "fmt" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" ) -// GetSliverBinary - Get the binary of an implant based on it's profile +// GetSliverBinary - Get the binary of an implant based on it's profile. func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverConsoleClient) ([]byte, error) { var data []byte // get implant builds @@ -92,7 +91,7 @@ func ArchCompleter(con *console.SliverConsoleClient) carapace.Action { }) } -// FormatCompleter completes build operating systems +// FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) @@ -126,7 +125,7 @@ func OSCompleter(con *console.SliverConsoleClient) carapace.Action { }) } -// FormatCompleter completes build formats +// FormatCompleter completes build formats. func FormatCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { return carapace.ActionValues([]string{ @@ -135,7 +134,7 @@ func FormatCompleter() carapace.Action { }) } -// TrafficEncoderCompleter - Completes the names of traffic encoders +// TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { grpcCtx, cancel := con.GrpcContext(nil) diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index acb6f6b92e..9a95a9f56c 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -5,13 +5,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ImplantsRmCmd - Deletes an archived implant build from the server +// ImplantsRmCmd - Deletes an archived implant build from the server. func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { name := args[0] // name := ctx.Args.String("name") diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 5553188b0a..cc59a6bd75 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -23,17 +23,16 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ImplantBuildFilter - Filter implant builds +// ImplantBuildFilter - Filter implant builds. type ImplantBuildFilter struct { GOOS string GOARCH string @@ -43,7 +42,7 @@ type ImplantBuildFilter struct { Debug bool } -// ImplantsCmd - Displays archived implant builds +// ImplantsCmd - Displays archived implant builds. func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { @@ -59,7 +58,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -// PrintImplantBuilds - Print the implant builds on the server +// PrintImplantBuilds - Print the implant builds on the server. func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverConsoleClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -123,7 +122,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl con.Println("\n") } -// ImplantBuildNameCompleter - Completer for implant build names +// ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -193,7 +192,7 @@ func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action return carapace.ActionCallback(comps) } -// ImplantBuildByName - Get an implant build by name +// ImplantBuildByName - Get an implant build by name. func ImplantBuildByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantConfig { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index f83ab231e2..7d127e7645 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -24,12 +24,11 @@ import ( "path/filepath" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ProfilesGenerateCmd - Generate an implant binary based on a profile +// ProfilesGenerateCmd - Generate an implant binary based on a profile. func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 8d04ff0a85..c4a6448cb7 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -20,13 +20,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesNewCmd - Create a new implant profile +// ProfilesNewCmd - Create a new implant profile. func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { @@ -49,7 +48,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } } -// ProfilesNewBeaconCmd - Create a new beacon profile +// ProfilesNewBeaconCmd - Create a new beacon profile. func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index 4015c4ea87..2df08c17a2 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -23,13 +23,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesRmCmd - Delete an implant profile +// ProfilesRmCmd - Delete an implant profile. func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 2fc45faa77..5190127d53 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -24,18 +24,17 @@ import ( "math" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ProfilesCmd - Display implant profiles +// ProfilesCmd - Display implant profiles. func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { profiles := getImplantProfiles(con) if profiles == nil { @@ -49,7 +48,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -// PrintProfiles - Print the profiles +// PrintProfiles - Print the profiles. func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverConsoleClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -106,7 +105,7 @@ func getImplantProfiles(con *console.SliverConsoleClient) []*clientpb.ImplantPro return pbProfiles.Profiles } -// GetImplantProfileByName - Get an implant profile by a specific name +// GetImplantProfileByName - Get an implant profile by a specific name. func GetImplantProfileByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { @@ -263,7 +262,7 @@ func populateProfileProperties(config *clientpb.ImplantConfig) map[string]string return properties } -// PrintProfileInfo - Print detailed information about a given profile +// PrintProfileInfo - Print detailed information about a given profile. func PrintProfileInfo(name string, con *console.SliverConsoleClient) { profile := GetImplantProfileByName(name, con) if profile == nil { @@ -273,7 +272,7 @@ func PrintProfileInfo(name string, con *console.SliverConsoleClient) { config := profile.Config properties := populateProfileProperties(config) - //con.Printf("--- Details for profile %s ---\n", profile.Name) + tw := table.NewWriter() // Implant Basics @@ -420,7 +419,7 @@ func PrintProfileInfo(name string, con *console.SliverConsoleClient) { } } -// ProfileNameCompleter - Completer for implant build names +// ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverConsoleClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 2720a383df..504bb044bd 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -22,13 +22,12 @@ import ( "context" "os" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// RegenerateCmd - Download an archived implant build/binary +// RegenerateCmd - Download an archived implant build/binary. func RegenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { save, _ := cmd.Flags().GetString("save") if save == "" { diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 539d4dd3c0..c7cb27cf55 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -27,22 +27,21 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/gofrs/uuid" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/text/cases" - "golang.org/x/text/language" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/gofrs/uuid" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "google.golang.org/protobuf/proto" ) -// TrafficEncodersCmd - Generate traffic encoders command implementation +// TrafficEncodersCmd - Generate traffic encoders command implementation. func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -54,7 +53,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar DisplayTrafficEncoders(encoderMap, con) } -// DisplayTrafficEncoders - Display traffic encoders map from server +// DisplayTrafficEncoders - Display traffic encoders map from server. func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverConsoleClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -83,7 +82,7 @@ func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console con.Println(tw.Render()) } -// TrafficEncodersAddCmd - Add a new traffic encoder to the server +// TrafficEncodersAddCmd - Add a new traffic encoder to the server. func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -138,7 +137,7 @@ func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, con.PrintInfof("Successfully added traffic encoder: %s\n", trafficEncoder.Wasm.Name) } -// saveFailedSample - Save the sample the encoder failed to properly encode/decode +// saveFailedSample - Save the sample the encoder failed to properly encode/decode. func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { confirm := false prompt := &survey.Confirm{ @@ -156,7 +155,7 @@ func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { } } -// allTestsPassed - Check if all tests passed +// allTestsPassed - Check if all tests passed. func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { for _, test := range tests.Tests { if !test.Success { @@ -166,7 +165,7 @@ func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { return true } -// displayTrafficEncoderTests - Display traffic encoder tests in real time +// displayTrafficEncoderTests - Display traffic encoder tests in real time. func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverConsoleClient) { listenerID, events := con.CreateEventListener() defer con.RemoveEventListener(listenerID) @@ -191,7 +190,7 @@ func displayTrafficEncoderTestProgress(testID string, completed chan interface{} } } -// clearLines - Clear a number of lines from the console +// clearLines - Clear a number of lines from the console. func clearLines(count int, con *console.SliverConsoleClient) { for i := 0; i < count; i++ { con.Printf(console.Clearln + "\r") @@ -199,7 +198,7 @@ func clearLines(count int, con *console.SliverConsoleClient) { } } -// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written +// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written. func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverConsoleClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -245,7 +244,7 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest return lineCount } -// TrafficEncodersRemoveCmd - Remove a traffic encoder +// TrafficEncodersRemoveCmd - Remove a traffic encoder. func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { _, cancel := con.GrpcContext(cmd) defer cancel() @@ -272,7 +271,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClie con.PrintInfof("Successfully removed traffic encoder: %s\n", name) } -// SelectTrafficEncoder - Select a traffic encoder from a list +// SelectTrafficEncoder - Select a traffic encoder from a list. func SelectTrafficEncoder(con *console.SliverConsoleClient) string { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() From be65f1ce58c47199126237bdbdad94aa1f9d751f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:23:13 +0200 Subject: [PATCH 026/109] Filter portfwd/socks commands out of beacons --- client/cli/cli.go | 9 ++- client/cli/config.go | 1 - client/cli/console.go | 7 +- client/cli/implant.go | 7 +- client/cli/import.go | 3 +- client/cli/version.go | 3 +- client/command/command.go | 3 +- client/command/cursed/commands.go | 16 ++--- client/command/cursed/cursed-chrome.go | 5 +- client/command/cursed/cursed-console.go | 5 +- client/command/cursed/cursed-cookies.go | 3 +- client/command/cursed/cursed-edge.go | 6 +- client/command/cursed/cursed-electron.go | 3 +- client/command/cursed/cursed-rm.go | 3 +- client/command/cursed/cursed-screenshot.go | 3 +- client/command/cursed/cursed.go | 9 ++- client/command/portfwd/commands.go | 16 ++--- client/command/portfwd/portfwd-add.go | 5 +- client/command/portfwd/portfwd-rm.go | 5 +- client/command/portfwd/portfwd.go | 15 ++-- client/command/rportfwd/commands.go | 16 ++--- client/command/rportfwd/portfwd-add.go | 5 +- client/command/rportfwd/portfwd-rm.go | 5 +- client/command/rportfwd/portfwd.go | 11 ++- client/command/server.go | 5 +- client/command/shell/commands.go | 15 ++-- client/command/shell/shell.go | 7 +- client/command/sliver.go | 6 +- client/command/socks/commands.go | 16 ++--- client/command/socks/socks-start.go | 8 +-- client/command/socks/socks-stop.go | 5 +- client/command/socks/socks.go | 13 ++-- client/command/wasm/commands.go | 7 +- client/command/wasm/wasm.go | 10 +-- client/command/wireguard/commands.go | 20 +++--- client/command/wireguard/wg-config.go | 5 +- client/command/wireguard/wg-portfwd-add.go | 5 +- client/command/wireguard/wg-portfwd-rm.go | 9 ++- client/command/wireguard/wg-portfwd.go | 7 +- client/command/wireguard/wg-socks-start.go | 5 +- client/command/wireguard/wg-socks-stop.go | 5 +- client/command/wireguard/wg-socks.go | 9 ++- client/constants/constants.go | 80 +++++++++++----------- 43 files changed, 183 insertions(+), 218 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index b36a37af99..5ebb7bd0f8 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,11 +24,10 @@ import ( "os" "path" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/version" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -37,7 +36,7 @@ const ( var sliverServerVersion = fmt.Sprintf("v%s", version.FullVersion()) -// Initialize logging +// Initialize logging. func initLogging(appDir string) *os.File { log.SetFlags(log.LstdFlags | log.Lshortfile) logFile, err := os.OpenFile(path.Join(appDir, logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) @@ -88,7 +87,7 @@ var rootCmd = &cobra.Command{ Long: ``, } -// Execute - Execute root command +// Execute - Execute root command. func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) diff --git a/client/cli/config.go b/client/cli/config.go index 71d858d3b3..c8f510ae40 100644 --- a/client/cli/config.go +++ b/client/cli/config.go @@ -23,7 +23,6 @@ import ( "sort" "github.com/bishopfox/sliver/client/assets" - "gopkg.in/AlecAivazis/survey.v1" ) diff --git a/client/cli/console.go b/client/cli/console.go index 67e208a382..5b0a8549e5 100644 --- a/client/cli/console.go +++ b/client/cli/console.go @@ -3,17 +3,16 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/spf13/cobra" + "google.golang.org/grpc" ) -// consoleCmd generates the console with required pre/post runners +// consoleCmd generates the console with required pre/post runners. func consoleCmd(con *console.SliverConsoleClient) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", diff --git a/client/cli/implant.go b/client/cli/implant.go index 1f24db8ba8..1952df7de9 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -3,14 +3,13 @@ package cli import ( "errors" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func implantCmd(con *console.SliverConsoleClient) *cobra.Command { diff --git a/client/cli/import.go b/client/cli/import.go index b953916b27..affb22be41 100644 --- a/client/cli/import.go +++ b/client/cli/import.go @@ -22,10 +22,9 @@ import ( "fmt" "os" + "github.com/bishopfox/sliver/client/assets" "github.com/rsteube/carapace" "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" ) func importCmd() *cobra.Command { diff --git a/client/cli/version.go b/client/cli/version.go index 24d640871a..89ad72e863 100644 --- a/client/cli/version.go +++ b/client/cli/version.go @@ -21,9 +21,8 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/version" + "github.com/spf13/cobra" ) var cmdVersion = &cobra.Command{ diff --git a/client/command/command.go b/client/command/command.go index 2afd028b3e..27831efe6a 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,12 +21,11 @@ package command import ( "strings" + client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 6680df71e4..a750f4632a 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -1,23 +1,23 @@ package cursed import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", - Long: help.GetHelpFor([]string{consts.Cursed}), - GroupID: consts.ExecutionHelpGroup, + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Long: help.GetHelpFor([]string{consts.Cursed}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { CursedCmd(cmd, con, args) }, diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 04cfa2146d..bc5ca88d7a 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -29,8 +29,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -38,6 +36,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var ( @@ -51,7 +50,7 @@ var ( cursedChromePermissionsAlt = []string{overlord.AllHTTP, overlord.AllHTTPS, overlord.WebRequest, overlord.WebRequestBlocking} ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedChromeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index 046bb45308..a17862fd87 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -27,12 +27,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/reeflective/readline" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" + "github.com/reeflective/readline" + "github.com/spf13/cobra" ) func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index 59859771d0..1e994a8b48 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -24,10 +24,9 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index a83da8c2f3..412a7d5f29 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -21,21 +21,19 @@ package cursed import ( "context" "os" - "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index 1d11bc2422..caab611e7a 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -27,8 +27,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -36,6 +34,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedElectronCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index 3220557f23..c2e5dcee7f 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -23,11 +23,10 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index d6cc8dc4ca..d851a0d449 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -23,10 +23,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index fe81219f6d..df34b76964 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -27,15 +27,14 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { // Collect existing curses from core cursedProcesses := [][]string{} @@ -71,7 +70,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } } -// selectCursedProcess - Interactively select a cursed process from a list +// selectCursedProcess - Interactively select a cursed process from a list. func selectCursedProcess(con *console.SliverConsoleClient) *core.CursedProcess { cursedProcesses := []*core.CursedProcess{} core.CursedProcesses.Range(func(key, value interface{}) bool { diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index 003c247443..629e56cfe6 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -1,27 +1,27 @@ package portfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { portfwdCmd := &cobra.Command{ - Use: consts.PortfwdStr, - Short: "In-band TCP port forwarding", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Use: consts.PortfwdStr, + Short: "In-band TCP port forwarding", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { PortfwdCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, portfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 36559441df..2b494cb9c2 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -25,16 +25,15 @@ import ( "regexp" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/tcpproxy" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// PortfwdAddCmd - Add a new tunneled port forward +// PortfwdAddCmd - Add a new tunneled port forward. func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index ebcc5f5bda..8f940e4abb 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -19,13 +19,12 @@ package portfwd */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// PortfwdRmCmd - Remove an existing tunneled port forward +// PortfwdRmCmd - Remove an existing tunneled port forward. func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { portfwdID, _ := cmd.Flags().GetInt("id") if portfwdID < 1 { diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 82c667168b..abbd7b660a 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -23,28 +23,27 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// PortfwdCmd - Display information about tunneled port forward(s) +// PortfwdCmd - Display information about tunneled port forward(s). func PortfwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { PrintPortfwd(con) } -// PrintPortfwd - Print the port forward(s) +// PrintPortfwd - Print the port forward(s). func PrintPortfwd(con *console.SliverConsoleClient) { portfwds := core.Portfwds.List() if len(portfwds) == 0 { con.PrintInfof("No port forwards\n") return } - sort.Slice(portfwds[:], func(i, j int) bool { + sort.Slice(portfwds, func(i, j int) bool { return portfwds[i].ID < portfwds[j].ID }) @@ -67,7 +66,7 @@ func PrintPortfwd(con *console.SliverConsoleClient) { con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of local portforwarders +// PortfwdIDCompleter completes IDs of local portforwarders. func PortfwdIDCompleter(_ *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index d2b35b6eb7..0f87656dad 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -1,27 +1,27 @@ package rportfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { rportfwdCmd := &cobra.Command{ - Use: consts.RportfwdStr, - Short: "reverse port forwardings", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Use: consts.RportfwdStr, + Short: "reverse port forwardings", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { RportFwdListenersCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, rportfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 55d8b00119..930f3f3800 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -23,15 +23,14 @@ import ( "fmt" "regexp" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index 0d10f9b706..445f048b94 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -21,13 +21,12 @@ package rportfwd import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 0afcdc7605..3cf929fcb7 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -23,17 +23,16 @@ import ( "fmt" "strconv" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -78,7 +77,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of remote portforwarders +// PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/server.go b/client/command/server.go index aca2735397..f30aebe52f 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -21,9 +21,6 @@ package command import ( "os" - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -51,6 +48,8 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index 4791cc8215..954d647712 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -1,26 +1,25 @@ package shell import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { shellCmd := &cobra.Command{ - Use: consts.ShellStr, - Short: "Start an interactive shell", - Long: help.GetHelpFor([]string{consts.ShellStr}), + Use: consts.ShellStr, + Short: "Start an interactive shell", + Long: help.GetHelpFor([]string{consts.ShellStr}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { ShellCmd(cmd, con, args) }, - GroupID: consts.ExecutionHelpGroup, - Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), } flags.Bind("", false, shellCmd, func(f *pflag.FlagSet) { f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index f7c03fea70..3775367c44 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -25,13 +25,12 @@ import ( "log" "os" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "golang.org/x/term" ) const ( @@ -40,7 +39,7 @@ const ( linux = "linux" ) -// ShellCmd - Start an interactive shell on the remote system +// ShellCmd - Start an interactive shell on the remote system. func ShellCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 0b9446b13c..3c4161ab2e 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,6 @@ package command */ import ( - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -50,6 +47,8 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // SliverCommands returns all commands bound to the implant menu. @@ -145,6 +144,7 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { con.PrintErrorf("Failed to load extension: %s", err) continue } + extensions.ExtensionRegisterCommand(ext, sliver, con) } diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 90f3571276..2768f24bbd 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -1,27 +1,27 @@ package socks import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { socksCmd := &cobra.Command{ - Use: consts.Socks5Str, - Short: "In-band SOCKS5 Proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), + Use: consts.Socks5Str, + Short: "In-band SOCKS5 Proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { SocksCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, socksCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 7922429305..9ecde46961 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -25,15 +25,13 @@ import ( "net" "time" - "gopkg.in/AlecAivazis/survey.v1" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" + "gopkg.in/AlecAivazis/survey.v1" ) -// SocksStartCmd - Add a new tunneled port forward +// SocksStartCmd - Add a new tunneled port forward. func SocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index d6e21e2c13..00bd5f7868 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -21,14 +21,13 @@ package socks import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// SocksStopCmd - Remove an existing tunneled port forward +// SocksStopCmd - Remove an existing tunneled port forward. func SocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { socksID, _ := cmd.Flags().GetUint64("id") if socksID < 1 { diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index ae006d91b3..412f37acd7 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -23,23 +23,22 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// SocksCmd - Display information about tunneled port forward(s) +// SocksCmd - Display information about tunneled port forward(s). func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { socks := core.SocksProxies.List() if len(socks) == 0 { con.PrintInfof("No socks5 proxies\n") return } - sort.Slice(socks[:], func(i, j int) bool { + sort.Slice(socks, func(i, j int) bool { return socks[i].ID < socks[j].ID }) @@ -59,7 +58,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin con.Printf("%s\n", tw.Render()) } -// SocksIDCompleter completes IDs of remote of socks proxy servers +// SocksIDCompleter completes IDs of remote of socks proxy servers. func SocksIDCompleter(_ *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 175eaed811..96fd6f29dc 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -1,14 +1,13 @@ package wasm import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index 3abb990aa4..0b517ab97a 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -36,16 +36,16 @@ import ( ) // wasmMaxModuleSize - Arbitrary 1.5Gb limit to put us well under the 2Gb max gRPC message size -// this is also the *compressed size* limit, so it's pretty generous +// this is also the *compressed size* limit, so it's pretty generous. const ( gb = 1024 * 1024 * 1024 wasmMaxModuleSize = gb + (gb / 2) ) -// WasmCmd - session/beacon id -> list of loaded wasm extension names +// WasmCmd - session/beacon id -> list of loaded wasm extension names. var wasmRegistrationCache = make(map[string][]string) -// WasmCmd - Execute a WASM module extension +// WasmCmd - Execute a WASM module extension. func WasmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -120,7 +120,7 @@ func isRegistered(name string, cmd *cobra.Command, con *console.SliverConsoleCli return false } -// idOf - Quickly return the id of the current session or beacon +// idOf - Quickly return the id of the current session or beacon. func idOf(con *console.SliverConsoleClient) string { if con.ActiveTarget != nil { if session := con.ActiveTarget.GetSession(); session != nil { @@ -253,7 +253,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console return nil } -// WasmLsCmd - Execute a WASM module extension +// WasmLsCmd - Execute a WASM module extension. func WasmLsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index daa4460539..dae1f74a09 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,14 +1,13 @@ package wireguard import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -39,14 +38,17 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { // SliverCommands returns all Wireguard commands that can be used on an active target. func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { wgPortFwdCmd := &cobra.Command{ - Use: consts.WgPortFwdStr, - Short: "List ports forwarded by the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + Use: consts.WgPortFwdStr, + Short: "List ports forwarded by the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets( + consts.WireguardCmdsFilter, + consts.SessionCmdsFilter, + ), Run: func(cmd *cobra.Command, args []string) { WGPortFwdListCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, - Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), } flags.Bind("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index 1568b51f04..7f08d3ec0a 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -28,10 +28,9 @@ import ( "strings" "text/template" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) var wgQuickTemplate = `[Interface] @@ -52,7 +51,7 @@ type wgQuickConfig struct { AllowedSubnet string } -// WGConfigCmd - Generate a WireGuard client configuration +// WGConfigCmd - Generate a WireGuard client configuration. func WGConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index c6817e38de..28899c94da 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -22,13 +22,12 @@ import ( "context" "net" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGPortFwdAddCmd - Add a new WireGuard port forward +// WGPortFwdAddCmd - Add a new WireGuard port forward. func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index b732719fdf..05ad176013 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -23,14 +23,13 @@ import ( "fmt" "strconv" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGPortFwdRmCmd - Remove a WireGuard port forward +// WGPortFwdRmCmd - Remove a WireGuard port forward. func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -66,7 +65,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } } -// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders +// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index e7eabd8db4..55614532ad 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -21,15 +21,14 @@ package wireguard import ( "context" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// WGPortFwdListCmd - List WireGuard port forwards +// WGPortFwdListCmd - List WireGuard port forwards. func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index a9062faff2..4c3df6fc31 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -21,13 +21,12 @@ package wireguard import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy +// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy. func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index ef9da5a69d..6a808bc95b 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -22,13 +22,12 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStopCmd - Stop a WireGuard SOCKS proxy +// WGSocksStopCmd - Stop a WireGuard SOCKS proxy. func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 1bc1b13385..f0fe2e2ea2 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -22,16 +22,15 @@ import ( "context" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGSocksListCmd - List WireGuard SOCKS proxies +// WGSocksListCmd - List WireGuard SOCKS proxies. func WGSocksListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/constants/constants.go b/client/constants/constants.go index 104b89a699..a906378154 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -18,105 +18,105 @@ package constants along with this program. If not, see . */ -// Meta +// Meta. const ( - // KeepAliveStr - Keep alive constant + // KeepAliveStr - Keep alive constant. KeepAliveStr = "keepalive" ) const ( - // LastUpdateCheckFileName - Last update check file name + // LastUpdateCheckFileName - Last update check file name. LastUpdateCheckFileName = "last_update_check" ) -// Console +// Console. const ( ImplantMenu = "implant" ServerMenu = "" ) -// Events +// Events. const ( - // UpdateStr - "update" + // UpdateStr - "update". UpdateStr = "update" - // VersionStr - "version" + // VersionStr - "version". VersionStr = "version" - // EventStr - "event" + // EventStr - "event". EventStr = "event" - // ServersStr - "server-error" + // ServersStr - "server-error". ServerErrorStr = "server-error" - // ConnectedEvent - Sliver Connected + // ConnectedEvent - Sliver Connected. SessionOpenedEvent = "session-connected" - // DisconnectedEvent - Sliver disconnected + // DisconnectedEvent - Sliver disconnected. SessionClosedEvent = "session-disconnected" - // UpdateEvent - Sliver updated + // UpdateEvent - Sliver updated. SessionUpdateEvent = "session-updated" - // JoinedEvent - Player joined the game + // JoinedEvent - Player joined the game. JoinedEvent = "client-joined" - // LeftEvent - Player left the game + // LeftEvent - Player left the game. LeftEvent = "client-left" - // CanaryEvent - A DNS canary was triggered + // CanaryEvent - A DNS canary was triggered. CanaryEvent = "canary" - // WatchtowerEvent - An implant hash has been identified on a threat intel platform + // WatchtowerEvent - An implant hash has been identified on a threat intel platform. WatchtowerEvent = "watchtower" - // StartedEvent - Job was started + // StartedEvent - Job was started. JobStartedEvent = "job-started" - // StoppedEvent - Job was stopped + // StoppedEvent - Job was stopped. JobStoppedEvent = "job-stopped" - // BuildEvent - Fires on change to builds + // BuildEvent - Fires on change to builds. BuildEvent = "build" - // BuildCompletedEvent - Fires when a build completes + // BuildCompletedEvent - Fires when a build completes. BuildCompletedEvent = "build-completed" - // ProfileEvent - Fires whenever there's a change to profiles + // ProfileEvent - Fires whenever there's a change to profiles. ProfileEvent = "profile" - // WebsiteEvent - Fires whenever there's a change to websites + // WebsiteEvent - Fires whenever there's a change to websites. WebsiteEvent = "website" - // LootAdded + // LootAdded. LootAddedEvent = "loot-added" - // LootRemoved + // LootRemoved. LootRemovedEvent = "loot-removed" - // BeaconRegisteredEvent - First connection from a new beacon + // BeaconRegisteredEvent - First connection from a new beacon. BeaconRegisteredEvent = "beacon-registered" - // BeaconTaskResult - Beacon task completed with a result + // BeaconTaskResult - Beacon task completed with a result. BeaconTaskResultEvent = "beacon-taskresult" - // ExternalBuildEvent + // ExternalBuildEvent. ExternalBuildEvent = "external-build" AcknowledgeBuildEvent = "external-acknowledge" ExternalBuildFailedEvent = "external-build-failed" ExternalBuildCompletedEvent = "external-build-completed" - // TrafficEncoder Events + // TrafficEncoder Events. TrafficEncoderTestProgressEvent = "traffic-encoder-test-progress" - // Crackstation Events + // Crackstation Events. CrackstationConnected = "crackstation-connected" CrackstationDisconnected = "crackstation-disconnected" - // Crack Events - Events consumed by crackstations + // Crack Events - Events consumed by crackstations. CrackBenchmark = "crack-benchmark" CrackStatusEvent = "crack-status" - // WireGuardNewPeer - New Wireguard peer added + // WireGuardNewPeer - New Wireguard peer added. WireGuardNewPeer = "wireguard-newpeer" ) -// Commands +// Commands. const ( OperatorsStr = "operators" NewOperatorStr = "new-operator" @@ -144,9 +144,9 @@ const ( SearchStr = "search" TrafficEncodersStr = "traffic-encoders" - // Generic + // Generic. - // NewStr - "new" + // NewStr - "new". NewStr = "new" AddStr = "add" StartStr = "start" @@ -294,16 +294,16 @@ const ( Hcstat2Str = "hcstat2" ) -// Groups +// Groups. const ( - // Server commands ===================== + // Server commands =====================. GenericHelpGroup = "Generic" NetworkHelpGroup = "Network" PayloadsHelpGroup = "Payload" DataHelpGroup = "Data" SliverHelpGroup = "Sliver" - // Sliver commands ===================== + // Sliver commands =====================. SliverCoreHelpGroup = "Core" InfoHelpGroup = "Info" FilesystemHelpGroup = "Filesystem" @@ -314,13 +314,13 @@ const ( AliasHelpGroup = "Sliver - 3rd Party macros" ExtensionHelpGroup = "Sliver - 3rd Party extensions" - // Useless + // Useless. SliverWinHelpGroup = "Sliver - Windows" MultiplayerHelpGroup = "Multiplayer" ) // Command types / filters (per OS/type/C2/etc) -// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below, +// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( SessionCmdsFilter = "session" BeaconCmdsFilter = "beacon" @@ -328,7 +328,7 @@ const ( WireguardCmdsFilter = "wireguard" ) -// Creds (needed here to avoid recursive imports) +// Creds (needed here to avoid recursive imports). const ( UserColonHashNewlineFormat = "user:hash" // username:hash\n HashNewlineFormat = "hash" // hash\n From d5c1daaa480482efb94fb7108d3e160269fd6451 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:36:57 +0200 Subject: [PATCH 027/109] Simplify binding commands with groups --- client/command/command.go | 66 +++++++++++++++++++++------------------ client/command/server.go | 14 ++++++--- client/command/sliver.go | 24 ++++++++------ 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/client/command/command.go b/client/command/command.go index 27831efe6a..e9f2c66601 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -77,6 +77,42 @@ func RestrictTargets(filters ...string) map[string]string { } } +// makeBind returns a commandBinder helper function +// @menu - The command menu to which the commands should be bound (either server or implant menu). +func makeBind(cmd *cobra.Command, con *client.SliverConsoleClient) func(group string, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { + return func(group string, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { + found := false + + // Ensure the given command group is available in the menu. + if group != "" { + for _, grp := range cmd.Groups() { + if grp.Title == group { + found = true + break + } + } + + if !found { + cmd.AddGroup(&cobra.Group{ + ID: group, + Title: group, + }) + } + } + + // Bind the command to the root + for _, command := range cmds { + cmd.AddCommand(command(con)...) + } + } +} + +// commandBinder is a helper used to bind commands to a given menu, for a given "command help group". +// +// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. +// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. +type commandBinder func(group string, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) + // [ Core ] // [ Sessions ] // [ Execution ] @@ -99,33 +135,3 @@ func RestrictTargets(filters ...string) map[string]string { // - double bind help command // - double bind session commands // - don't bind readline command in CLI. - -// bind is a helper used to bind a list of root commands to a given menu, for a given "command help group". -// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. -// @menu - The command menu to which the commands should be bound (either server or implant menu). -// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bind(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { - found := false - - // Ensure the given command group is available in the menu. - if group != "" { - for _, grp := range menu.Groups() { - if grp.Title == group { - found = true - break - } - } - - if !found { - menu.AddGroup(&cobra.Group{ - ID: group, - Title: group, - }) - } - } - - // Bind the command to the root - for _, command := range cmds { - menu.AddCommand(command(con)...) - } -} diff --git a/client/command/server.go b/client/command/server.go index f30aebe52f..ce694d550c 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -63,6 +63,12 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(server, con) + if serverCmds != nil { server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) server.AddCommand(serverCmds()...) @@ -77,7 +83,7 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. // the present calls. // Core - bind(consts.GenericHelpGroup, server, con, + bind(consts.GenericHelpGroup, exit.Command, licenses.Commands, settings.Commands, @@ -91,21 +97,21 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. ) // C2 Network - bind(consts.NetworkHelpGroup, server, con, + bind(consts.NetworkHelpGroup, jobs.Commands, websites.Commands, wireguard.Commands, ) // Payloads - bind(consts.PayloadsHelpGroup, server, con, + bind(consts.PayloadsHelpGroup, sgn.Commands, generate.Commands, builders.Commands, ) // Slivers - bind(consts.SliverHelpGroup, server, con, + bind(consts.SliverHelpGroup, use.Commands, info.Commands, sessions.Commands, diff --git a/client/command/sliver.go b/client/command/sliver.go index 3c4161ab2e..2ba0a8c68e 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -61,8 +61,14 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(sliver, con) + // [ Core ] - bind(consts.SliverCoreHelpGroup, sliver, con, + bind(consts.SliverCoreHelpGroup, reconfig.Commands, // sessions.Commands, sessions.SliverCommands, @@ -73,7 +79,7 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Info ] - bind(consts.InfoHelpGroup, sliver, con, + bind(consts.InfoHelpGroup, // info.Commands, info.SliverCommands, screenshot.Commands, @@ -82,12 +88,12 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Filesystem ] - bind(consts.FilesystemHelpGroup, sliver, con, + bind(consts.FilesystemHelpGroup, filesystem.Commands, ) // [ Network tools ] - bind(consts.NetworkHelpGroup, sliver, con, + bind(consts.NetworkHelpGroup, network.Commands, rportfwd.Commands, portfwd.Commands, @@ -96,7 +102,7 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Execution ] - bind(consts.ExecutionHelpGroup, sliver, con, + bind(consts.ExecutionHelpGroup, shell.Commands, exec.Commands, backdoor.Commands, @@ -106,20 +112,20 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Privileges ] - bind(consts.PrivilegesHelpGroup, sliver, con, + bind(consts.PrivilegesHelpGroup, privilege.Commands, ) // [ Processes ] - bind(consts.ProcessHelpGroup, sliver, con, + bind(consts.ProcessHelpGroup, processes.Commands, ) // [ Aliases ] - bind(consts.AliasHelpGroup, sliver, con) + bind(consts.AliasHelpGroup) // [ Extensions ] - bind(consts.ExtensionHelpGroup, sliver, con, + bind(consts.ExtensionHelpGroup, extensions.Commands, ) From af1e52b175133d513c8f225db02c3fb206dd1d41 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:41:30 +0200 Subject: [PATCH 028/109] Revert "Go fmt" This reverts commit d31592bd659b6fdbe996d3b903a50816b2f4c786. --- server/msf/msf.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/msf/msf.go b/server/msf/msf.go index 7420b00d01..18252d7ddf 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -38,20 +38,20 @@ const ( var ( msfLog = log.NamedLogger("msf", "venom") - // ValidArches - Support CPU architectures. + // ValidArches - Support CPU architectures ValidArches = map[string]bool{ "x86": true, "x64": true, } - // ValidEncoders - Valid MSF encoders. + // ValidEncoders - Valid MSF encoders ValidEncoders = map[string]bool{ "": true, "x86/shikata_ga_nai": true, "x64/xor_dynamic": true, } - // ValidPayloads - Valid payloads and OS combos. + // ValidPayloads - Valid payloads and OS combos validPayloads = map[string]map[string]bool{ "windows": { "meterpreter_reverse_http": true, @@ -102,7 +102,7 @@ var ( } ) -// VenomConfig -. +// VenomConfig - type VenomConfig struct { Os string Arch string @@ -117,13 +117,13 @@ type VenomConfig struct { AdvOptions string } -// Version - Return the version of MSFVenom. +// Version - Return the version of MSFVenom func Version() (string, error) { stdout, err := consoleCmd([]string{"--version"}) return string(stdout), err } -// VenomPayload - Generates an MSFVenom payload. +// VenomPayload - Generates an MSFVenom payload func VenomPayload(config VenomConfig) ([]byte, error) { // Check if msfvenom is in the path if _, err := exec.LookPath(venomBin); err != nil { @@ -216,7 +216,7 @@ func VenomPayload(config VenomConfig) ([]byte, error) { return venomCmd(args) } -// venomCmd - Execute a msfvenom command. +// venomCmd - Execute a msfvenom command func venomCmd(args []string) ([]byte, error) { msfLog.Printf("%s %v", venomBin, args) cmd := exec.Command(venomBin, args...) @@ -235,7 +235,7 @@ func venomCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// consoleCmd - Execute a msfvenom command. +// consoleCmd - Execute a msfvenom command func consoleCmd(args []string) ([]byte, error) { cmd := exec.Command(consoleBin, args...) var stdout bytes.Buffer @@ -252,7 +252,7 @@ func consoleCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// Arch - Convert golang arch to msf arch. +// Arch - Convert golang arch to msf arch func Arch(arch string) string { if arch == "amd64" { return "x64" From 2ecb88dfdc054e7e847ea99c5931f981092da2f6 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 21:24:42 +0200 Subject: [PATCH 029/109] Merge back beacon-commands client code --- client/cli/cli.go | 8 ++- client/command/alias/alias.go | 15 ++--- client/command/alias/commands.go | 5 +- client/command/alias/install.go | 9 ++- client/command/alias/load.go | 31 +++++---- client/command/alias/remove.go | 5 +- client/command/backdoor/backdoor.go | 5 +- client/command/builders/builders.go | 7 +- client/command/builders/commands.go | 5 +- client/command/command.go | 66 ++++++++++--------- client/command/crack/crack-files.go | 25 ++++--- client/command/creds/add.go | 4 +- client/command/creds/commands.go | 7 +- client/command/creds/creds.go | 13 ++-- client/command/creds/rm.go | 2 +- client/command/creds/select.go | 3 +- client/command/cursed/commands.go | 16 ++--- client/command/cursed/cursed-chrome.go | 5 +- client/command/cursed/cursed-console.go | 5 +- client/command/cursed/cursed-cookies.go | 3 +- client/command/cursed/cursed-edge.go | 6 +- client/command/cursed/cursed-electron.go | 3 +- client/command/cursed/cursed-rm.go | 3 +- client/command/cursed/cursed-screenshot.go | 3 +- client/command/cursed/cursed.go | 9 ++- client/command/exec/commands.go | 7 +- client/command/exec/execute-assembly.go | 7 +- client/command/exec/execute-shellcode.go | 12 ++-- client/command/exec/execute.go | 12 ++-- client/command/exec/migrate.go | 5 +- client/command/exec/msf-inject.go | 10 ++- client/command/exec/msf.go | 8 +-- client/command/exec/psexec.go | 6 +- client/command/exec/sideload.go | 8 +-- client/command/exec/spawndll.go | 8 +-- client/command/exec/ssh.go | 9 ++- client/command/exit/exit.go | 2 +- client/command/extensions/commands.go | 5 +- client/command/extensions/extensions.go | 13 ++-- client/command/extensions/install.go | 9 ++- client/command/extensions/list.go | 5 +- client/command/extensions/load.go | 25 ++++--- client/command/extensions/remove.go | 7 +- client/command/filesystem/cat.go | 9 ++- client/command/filesystem/cd.go | 8 +-- client/command/filesystem/chmod.go | 10 ++- client/command/filesystem/chown.go | 10 ++- client/command/filesystem/chtimes.go | 10 ++- client/command/filesystem/commands.go | 7 +- client/command/filesystem/cp.go | 6 +- client/command/filesystem/download.go | 7 +- client/command/filesystem/ls.go | 12 ++-- client/command/filesystem/memfiles-add.go | 9 ++- client/command/filesystem/memfiles-list.go | 9 ++- client/command/filesystem/memfiles-rm.go | 9 ++- client/command/filesystem/mkdir.go | 10 ++- client/command/filesystem/mv.go | 8 +-- client/command/filesystem/pwd.go | 10 ++- client/command/filesystem/rm.go | 10 ++- client/command/filesystem/upload.go | 10 ++- client/command/generate/commands.go | 11 +--- client/command/hosts/commands.go | 5 +- client/command/hosts/hosts-ioc-rm.go | 5 +- client/command/hosts/hosts-ioc.go | 7 +- client/command/hosts/hosts-rm.go | 5 +- client/command/hosts/hosts.go | 14 ++-- client/command/info/commands.go | 7 +- client/command/info/info.go | 15 ++--- client/command/info/ping.go | 5 +- client/command/pivots/graph.go | 5 +- client/command/pivots/helpers.go | 5 +- client/command/pivots/pivots.go | 11 ++-- client/command/pivots/start.go | 7 +- client/command/portfwd/commands.go | 16 ++--- client/command/portfwd/portfwd-add.go | 5 +- client/command/portfwd/portfwd-rm.go | 5 +- client/command/portfwd/portfwd.go | 15 ++--- client/command/reaction/commands.go | 7 +- client/command/reaction/helpers.go | 11 ++-- client/command/reaction/reaction.go | 9 ++- client/command/reaction/reload.go | 5 +- client/command/reaction/save.go | 5 +- client/command/reaction/set.go | 7 +- client/command/reaction/unset.go | 5 +- client/command/reconfig/commands.go | 5 +- client/command/reconfig/reconfig.go | 8 +-- client/command/reconfig/rename.go | 5 +- client/command/rportfwd/commands.go | 16 ++--- client/command/rportfwd/portfwd-add.go | 5 +- client/command/rportfwd/portfwd-rm.go | 5 +- client/command/rportfwd/portfwd.go | 11 ++-- client/command/screenshot/commands.go | 7 +- client/command/screenshot/screenshot.go | 10 ++- client/command/server.go | 24 ++++--- client/command/sessions/background.go | 5 +- client/command/sessions/close.go | 5 +- client/command/sessions/commands.go | 9 ++- client/command/sessions/helpers.go | 7 +- client/command/sessions/interactive.go | 5 +- client/command/sessions/prune.go | 5 +- client/command/sessions/sessions.go | 13 ++-- client/command/settings/beacons.go | 5 +- client/command/settings/commands.go | 5 +- client/command/settings/opsec.go | 9 ++- client/command/settings/settings.go | 19 +++--- client/command/settings/tables.go | 15 ++--- client/command/shell/commands.go | 15 ++--- client/command/shell/shell.go | 7 +- client/command/sliver.go | 25 ++++--- client/command/socks/commands.go | 16 ++--- client/command/socks/socks-start.go | 8 +-- client/command/socks/socks-stop.go | 5 +- client/command/socks/socks.go | 13 ++-- client/command/tasks/commands.go | 7 +- client/command/tasks/fetch.go | 15 ++--- client/command/tasks/helpers.go | 7 +- client/command/tasks/tasks-cancel.go | 5 +- client/command/tasks/tasks.go | 9 ++- client/command/update/commands.go | 7 +- client/command/update/update.go | 9 ++- client/command/wasm/commands.go | 7 +- client/command/wasm/wasm.go | 10 +-- client/command/websites/commands.go | 7 +- .../command/websites/websites-add-content.go | 5 +- .../command/websites/websites-rm-content.go | 5 +- client/command/websites/websites-rm.go | 5 +- .../websites/websites-update-content.go | 5 +- client/command/websites/websites.go | 13 ++-- client/command/wireguard/commands.go | 20 +++--- client/command/wireguard/wg-config.go | 5 +- client/command/wireguard/wg-portfwd-add.go | 5 +- client/command/wireguard/wg-portfwd-rm.go | 9 ++- client/command/wireguard/wg-portfwd.go | 7 +- client/command/wireguard/wg-socks-start.go | 5 +- client/command/wireguard/wg-socks-stop.go | 5 +- client/command/wireguard/wg-socks.go | 9 ++- server/cli/cli.go | 6 +- 137 files changed, 557 insertions(+), 684 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 892b335858..dd8fd6c30a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -99,11 +99,13 @@ func newSliverClient() *client.SliverClient { // getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() *cobra.Command { - return commands.Generate(con.Teamclient) + teamclientCmds := func() []*cobra.Command { + return []*cobra.Command{ + commands.Generate(con.Teamclient), + } } - serverCmds := command.ServerCommands(con, teamserverCmds) + serverCmds := command.ServerCommands(con, teamclientCmds) sliverCmds := command.SliverCommands(con) return serverCmds, sliverCmds diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 595c8831f9..47bddfb9bb 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -24,17 +24,16 @@ import ( "io/ioutil" "strings" + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" ) -// AliasesCmd - The alias command +// AliasesCmd - The alias command. func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) error { if 0 < len(loadedAliases) { PrintAliases(con) @@ -45,7 +44,7 @@ func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) er return nil } -// PrintAliases - Print a list of loaded aliases +// PrintAliases - Print a list of loaded aliases. func PrintAliases(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -88,7 +87,7 @@ func PrintAliases(con *console.SliverClient) { con.Println(tw.Render()) } -// AliasCommandNameCompleter - Completer for installed extensions command names +// AliasCommandNameCompleter - Completer for installed extensions command names. func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverClient) []string { results := []string{} for name := range loadedAliases { @@ -129,7 +128,7 @@ func getInstalledManifests() map[string]*AliasManifest { return installedManifests } -// AliasCommandNameCompleter - Completer for installed extensions command names +// AliasCommandNameCompleter - Completer for installed extensions command names. func AliasCompleter() carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := []string{} diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go index a30af147cd..d8b86be31f 100644 --- a/client/command/alias/commands.go +++ b/client/command/alias/commands.go @@ -1,13 +1,12 @@ package alias import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) // Commands returns the `alias` command and its child commands. diff --git a/client/command/alias/install.go b/client/command/alias/install.go index 6914c04085..663e9c0ebd 100644 --- a/client/command/alias/install.go +++ b/client/command/alias/install.go @@ -26,14 +26,13 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// AliasesInstallCmd - Install an alias +// AliasesInstallCmd - Install an alias. func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { aliasLocalPath := args[0] fi, err := os.Stat(aliasLocalPath) @@ -48,7 +47,7 @@ func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// Install an extension from a directory +// Install an extension from a directory. func installFromDir(aliasLocalPath string, con *console.SliverClient) { manifestData, err := ioutil.ReadFile(filepath.Join(aliasLocalPath, ManifestFileName)) if err != nil { @@ -101,7 +100,7 @@ func installFromDir(aliasLocalPath string, con *console.SliverClient) { con.Printf("done!\n") } -// Install an extension from a .tar.gz file +// Install an extension from a .tar.gz file. func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(aliasGzFilePath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { diff --git a/client/command/alias/load.go b/client/command/alias/load.go index ed4e31df32..7c684f1bab 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -28,11 +28,6 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - app "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -40,6 +35,10 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + app "github.com/reeflective/console" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) const ( @@ -53,7 +52,7 @@ const ( ) var ( - // alias name -> manifest/command + // alias name -> manifest/command. loadedAliases = map[string]*loadedAlias{} defaultHostProc = map[string]string{ @@ -63,20 +62,20 @@ var ( } ) -// Ties the manifest struct to the command struct +// Ties the manifest struct to the command struct. type loadedAlias struct { Manifest *AliasManifest Command *cobra.Command } -// AliasFile - An OS/Arch specific file +// AliasFile - An OS/Arch specific file. type AliasFile struct { OS string `json:"os"` Arch string `json:"arch"` Path string `json:"path"` } -// AliasManifest - The manifest for an alias, contains metadata +// AliasManifest - The manifest for an alias, contains metadata. type AliasManifest struct { Name string `json:"name"` Version string `json:"version"` @@ -135,7 +134,7 @@ func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// LoadAlias - Load an alias into the Sliver shell from a given directory +// LoadAlias - Load an alias into the Sliver shell from a given directory. func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverClient) (*AliasManifest, error) { // retrieve alias manifest var err error @@ -205,7 +204,7 @@ func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverClien return aliasManifest, nil } -// ParseAliasManifest - Parse an alias manifest +// ParseAliasManifest - Parse an alias manifest. func ParseAliasManifest(data []byte) (*AliasManifest, error) { // parse it alias := &AliasManifest{} @@ -474,25 +473,25 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintSpawnDLLOutput - Prints the output of a spawn dll command +// PrintSpawnDLLOutput - Prints the output of a spawn dll command. func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, spawnDllResp.GetResult()) if outFilePath != nil { - outFilePath.Write([]byte(spawnDllResp.GetResult())) + outFilePath.WriteString(spawnDllResp.GetResult()) con.PrintInfof("Output saved to %s\n", outFilePath.Name()) } } -// PrintSideloadOutput - Prints the output of a sideload command +// PrintSideloadOutput - Prints the output of a sideload command. func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, sideloadResp.GetResult()) if outFilePath != nil { - outFilePath.Write([]byte(sideloadResp.GetResult())) + outFilePath.WriteString(sideloadResp.GetResult()) con.PrintInfof("Output saved to %s\n", outFilePath.Name()) } } -// PrintAssemblyOutput - Prints the output of an execute-assembly command +// PrintAssemblyOutput - Prints the output of an execute-assembly command. func PrintAssemblyOutput(cmdName string, execAsmResp *sliverpb.ExecuteAssembly, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, string(execAsmResp.GetOutput())) if outFilePath != nil { diff --git a/client/command/alias/remove.go b/client/command/alias/remove.go index c3b075b5b7..850b2cd292 100644 --- a/client/command/alias/remove.go +++ b/client/command/alias/remove.go @@ -25,10 +25,9 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) // AliasesRemoveCmd - Locally load a alias into the Sliver shell. @@ -54,7 +53,7 @@ func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } } -// RemoveAliasByCommandName - Remove an alias by command name +// RemoveAliasByCommandName - Remove an alias by command name. func RemoveAliasByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index af220da2c4..474903358d 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -21,13 +21,12 @@ package backdoor import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// BackdoorCmd - Command to inject implant code into an existing binary +// BackdoorCmd - Command to inject implant code into an existing binary. func BackdoorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index 42e7b9a008..d7049d7263 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -23,16 +23,15 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// BuildersCmd - List external builders +// BuildersCmd - List external builders. func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go index d80cbe44fe..16478cd1fc 100644 --- a/client/command/builders/commands.go +++ b/client/command/builders/commands.go @@ -1,13 +1,12 @@ package builders import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/command.go b/client/command/command.go index 33318adf12..3e5cb16fff 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -77,6 +77,42 @@ func RestrictTargets(filters ...string) map[string]string { } } +// makeBind returns a commandBinder helper function +// @menu - The command menu to which the commands should be bound (either server or implant menu). +func makeBind(cmd *cobra.Command, con *client.SliverClient) func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { + return func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { + found := false + + // Ensure the given command group is available in the menu. + if group != "" { + for _, grp := range cmd.Groups() { + if grp.Title == group { + found = true + break + } + } + + if !found { + cmd.AddGroup(&cobra.Group{ + ID: group, + Title: group, + }) + } + } + + // Bind the command to the root + for _, command := range cmds { + cmd.AddCommand(command(con)...) + } + } +} + +// commandBinder is a helper used to bind commands to a given menu, for a given "command help group". +// +// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. +// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. +type commandBinder func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) + // [ Core ] // [ Sessions ] // [ Execution ] @@ -99,33 +135,3 @@ func RestrictTargets(filters ...string) map[string]string { // - double bind help command // - double bind session commands // - don't bind readline command in CLI. - -// bind is a helper used to bind a list of root commands to a given menu, for a given "command help group". -// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. -// @menu - The command menu to which the commands should be bound (either server or implant menu). -// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bind(group string, menu *cobra.Command, con *client.SliverClient, cmds ...func(con *client.SliverClient) []*cobra.Command) { - found := false - - // Ensure the given command group is available in the menu. - if group != "" { - for _, grp := range menu.Groups() { - if grp.Title == group { - found = true - break - } - } - - if !found { - menu.AddGroup(&cobra.Group{ - ID: group, - Title: group, - }) - } - } - - // Bind the command to the root - for _, command := range cmds { - menu.AddCommand(command(con)...) - } -} diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index e69de1bd1c..c31383d1ff 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -25,17 +25,16 @@ import ( "io" "os" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/klauspost/compress/zstd" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/klauspost/compress/zstd" + "github.com/spf13/cobra" ) -// CrackWordlistsCmd - Manage GPU cracking stations +// CrackWordlistsCmd - Manage GPU cracking stations. func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { @@ -55,7 +54,7 @@ func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// CrackRulesCmd - Manage GPU cracking stations +// CrackRulesCmd - Manage GPU cracking stations. func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { @@ -75,7 +74,7 @@ func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// CrackHcstat2Cmd - Manage GPU cracking stations +// CrackHcstat2Cmd - Manage GPU cracking stations. func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { @@ -162,7 +161,7 @@ func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverC ) } -// CrackWordlistsAddCmd - Manage GPU cracking stations +// CrackWordlistsAddCmd - Manage GPU cracking stations. func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") @@ -206,7 +205,7 @@ func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args [] addCrackFile(wordlist, crackFile, con) } -// CrackRulesAddCmd - add a rules file +// CrackRulesAddCmd - add a rules file. func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") @@ -250,7 +249,7 @@ func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []stri addCrackFile(rules, crackFile, con) } -// CrackHcstat2AddCmd - add a hcstat2 file +// CrackHcstat2AddCmd - add a hcstat2 file. func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") @@ -402,7 +401,7 @@ func readChunkAt(tmpFile *os.File, offset int64, chunkSize int64) ([]byte, error return chunkBuf[:n], nil } -// CrackWordlistsRmCmd - Manage GPU cracking stations +// CrackWordlistsRmCmd - Manage GPU cracking stations. func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var wordlistName string if len(args) > 0 { @@ -436,7 +435,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []s } } -// CrackRulesRmCmd - Manage GPU cracking stations +// CrackRulesRmCmd - Manage GPU cracking stations. func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var rulesName string if len(args) > 0 { @@ -470,7 +469,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// CrackHcstat2RmCmd - remove a hcstat2 file +// CrackHcstat2RmCmd - remove a hcstat2 file. func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var hcstat2Name string if len(args) > 0 { diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 4d84bb8574..6c4fef924d 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -37,7 +37,7 @@ const ( CSVFormat = "csv" // username,hash\n ) -// CredsCmd - Add new credentials +// CredsCmd - Add new credentials. func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") username, _ := cmd.Flags().GetString("username") @@ -76,7 +76,7 @@ func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintCreds(creds.Credentials, con) } -// CredsCmd - Add new credentials +// CredsCmd - Add new credentials. func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") filePath := args[0] diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go index aba841248e..65276e382b 100644 --- a/client/command/creds/commands.go +++ b/client/command/creds/commands.go @@ -1,14 +1,13 @@ package creds import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 012292aca8..63f36728b7 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -23,17 +23,16 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// CredsCmd - Manage credentials +// CredsCmd - Manage credentials. func CredsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { @@ -101,7 +100,7 @@ func CredsHashTypeCompleter(con *console.SliverClient) carapace.Action { }) } -// CredsHashFileFormatCompleter completes file formats for hash-files +// CredsHashFileFormatCompleter completes file formats for hash-files. func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValuesDescribed( UserColonHashNewlineFormat, "One hash per line.", @@ -110,7 +109,7 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { ).Tag("hash file formats") } -// CredsCollectionCompleter completes existing creds collection names +// CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index 2498327062..fcb88d828a 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -27,7 +27,7 @@ import ( "github.com/spf13/cobra" ) -// CredsCmd - Add new credentials +// CredsCmd - Add new credentials. func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var id string if len(args) > 0 { diff --git a/client/command/creds/select.go b/client/command/creds/select.go index 89f02a865f..80c3da1516 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -9,13 +9,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" ) -// SelectCredential - Interactive menu for the user to select a credentials from the database +// SelectCredential - Interactive menu for the user to select a credentials from the database. func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.SliverClient) (*clientpb.Credential, error) { var creds *clientpb.Credentials var err error diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index ba187a36b3..15162998aa 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -1,23 +1,23 @@ package cursed import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", - Long: help.GetHelpFor([]string{consts.Cursed}), - GroupID: consts.ExecutionHelpGroup, + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Long: help.GetHelpFor([]string{consts.Cursed}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { CursedCmd(cmd, con, args) }, diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 51656b9683..cf76c83da3 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -29,8 +29,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -38,6 +36,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var ( @@ -51,7 +50,7 @@ var ( cursedChromePermissionsAlt = []string{overlord.AllHTTP, overlord.AllHTTPS, overlord.WebRequest, overlord.WebRequestBlocking} ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedChromeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index f70bdcb42a..24fcc4cdc2 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -27,12 +27,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/reeflective/readline" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" + "github.com/reeflective/readline" + "github.com/spf13/cobra" ) func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index a2f46dfa4e..59c13d5e09 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -24,10 +24,9 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index 7ec9c67cdd..19623f35ef 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -21,21 +21,19 @@ package cursed import ( "context" "os" - "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index e990536da3..e9894315db 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -27,8 +27,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -36,6 +34,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedElectronCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index fdbf14c1a5..a2f47b1ad9 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -23,11 +23,10 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index 237ccf6908..1b0ab936d5 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -23,10 +23,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index 5c011ef963..da38a6eab6 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -27,15 +27,14 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Collect existing curses from core cursedProcesses := [][]string{} @@ -71,7 +70,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// selectCursedProcess - Interactively select a cursed process from a list +// selectCursedProcess - Interactively select a cursed process from a list. func selectCursedProcess(con *console.SliverClient) *core.CursedProcess { cursedProcesses := []*core.CursedProcess{} core.CursedProcesses.Range(func(key, value interface{}) bool { diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index d0be42aa9f..a2f913c25c 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -1,15 +1,14 @@ package exec import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index ef10f39715..69f649da90 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -25,15 +25,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ExecuteAssemblyCmd - Execute a .NET assembly in-memory +// ExecuteAssemblyCmd - Execute a .NET assembly in-memory. func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 4727e0fa40..586136b079 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -26,18 +26,16 @@ import ( "log" "os" - "golang.org/x/term" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "golang.org/x/term" + "google.golang.org/protobuf/proto" ) -// ExecuteShellcodeCmd - Execute shellcode in-memory +// ExecuteShellcodeCmd - Execute shellcode in-memory. func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -128,7 +126,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s } } -// PrintExecuteShellcode - Display result of shellcode execution +// PrintExecuteShellcode - Display result of shellcode execution. func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverClient) { if task.Response.GetErr() != "" { con.PrintErrorf("%s\n", task.Response.GetErr()) diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index 03513f9173..0fd15d98a0 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -23,17 +23,15 @@ import ( "strings" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ExecuteCmd - Run a command on the remote system +// ExecuteCmd - Run a command on the remote system. func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -136,7 +134,7 @@ func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName stri PrintExecute(exec, cmd, con) } -// PrintExecute - Print the output of an executed command +// PrintExecute - Print the output of an executed command. func PrintExecute(exec *sliverpb.Execute, cmd *cobra.Command, con *console.SliverClient) { ignoreStderr, _ := cmd.Flags().GetBool("ignore-stderr") stdout, _ := cmd.Flags().GetString("stdout") @@ -258,7 +256,7 @@ func SaveExecutionOutput(executionOutput string, commandName string, hostName st } if outFilePath != nil { - outFilePath.Write([]byte(executionOutput)) + outFilePath.WriteString(executionOutput) con.PrintInfof("Output saved to %s\n", outFilePath.Name()) } } diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 2e696f43fb..66a02fdeb5 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -23,14 +23,13 @@ import ( "fmt" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// MigrateCmd - Windows only, inject an implant into another process +// MigrateCmd - Windows only, inject an implant into another process. func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index 0b5bf257af..4039a2dcc9 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -22,17 +22,15 @@ import ( "context" "fmt" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MsfInjectCmd - Inject a metasploit payload into a remote process +// MsfInjectCmd - Inject a metasploit payload into a remote process. func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -99,7 +97,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintMsfRemote - Print the results of the remote injection attempt +// PrintMsfRemote - Print the results of the remote injection attempt. func PrintMsfRemote(msfRemote *sliverpb.Task, con *console.SliverClient) { if msfRemote.Response == nil { con.PrintErrorf("Empty response from msf payload injection task") diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 1b06a3e29f..1685b7de99 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -22,16 +22,14 @@ import ( "context" "fmt" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MsfCmd - Inject a metasploit payload into the current remote process +// MsfCmd - Inject a metasploit payload into the current remote process. func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index eb18442abb..790417a1ce 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -21,14 +21,11 @@ package exec import ( "context" "fmt" + insecureRand "math/rand" "os" "strings" "time" - insecureRand "math/rand" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" @@ -36,6 +33,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" ) // PsExecCmd - psexec command implementation. diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index 991ee835cb..f64c9eeb96 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -25,16 +25,14 @@ import ( "path/filepath" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// SideloadCmd - Sideload a shared library on the remote system +// SideloadCmd - Sideload a shared library on the remote system. func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index 068965113c..ff281187d2 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -24,16 +24,14 @@ import ( "os" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// SpawnDllCmd - Spawn execution of a DLL on the remote system +// SpawnDllCmd - Spawn execution of a DLL on the remote system. func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index 67dea6252d..5de8a37a6d 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -24,15 +24,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// SSHCmd - A built-in SSH client command for the remote system (doesn't shell out) +// SSHCmd - A built-in SSH client command for the remote system (doesn't shell out). func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( privKey []byte @@ -120,7 +119,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintSSHCmd - Print the ssh command response +// PrintSSHCmd - Print the ssh command response. func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverClient) { if sshCmd.Response != nil && sshCmd.Response.Err != "" { con.PrintErrorf("Error: %s\n", sshCmd.Response.Err) diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index f09f930b3e..af74dfc1eb 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -30,7 +30,7 @@ import ( "github.com/spf13/cobra" ) -// ExitCmd - Exit the console +// ExitCmd - Exit the console. func ExitCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { fmt.Println("Exiting...") if con.IsServer { diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 62df2bf6cc..5d5e5434ef 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -1,12 +1,11 @@ package extensions import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index 5bc6f0cd86..e47864a111 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -24,17 +24,16 @@ import ( "os" "strings" + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" ) -// ExtensionsCmd - List information about installed extensions +// ExtensionsCmd - List information about installed extensions. func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { if 0 < len(getInstalledManifests()) { PrintExtensions(con) @@ -43,7 +42,7 @@ func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { } } -// PrintExtensions - Print a list of loaded extensions +// PrintExtensions - Print a list of loaded extensions. func PrintExtensions(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -114,7 +113,7 @@ func getInstalledManifests() map[string]*ExtensionManifest { return installedManifests } -// ExtensionsCommandNameCompleter - Completer for installed extensions command names +// ExtensionsCommandNameCompleter - Completer for installed extensions command names. func ExtensionsCommandNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { installedManifests := getInstalledManifests() diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index d6053f1736..b084feddcc 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -24,14 +24,13 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// ExtensionsInstallCmd - Install an extension +// ExtensionsInstallCmd - Install an extension. func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { extLocalPath := args[0] @@ -47,7 +46,7 @@ func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args [] } } -// Install an extension from a directory +// Install an extension from a directory. func installFromDir(extLocalPath string, con *console.SliverClient) { manifestData, err := os.ReadFile(filepath.Join(extLocalPath, ManifestFileName)) if err != nil { @@ -98,7 +97,7 @@ func installFromDir(extLocalPath string, con *console.SliverClient) { } } -// InstallFromFilePath - Install an extension from a .tar.gz file +// InstallFromFilePath - Install an extension from a .tar.gz file. func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { diff --git a/client/command/extensions/list.go b/client/command/extensions/list.go index 6733e15779..52de4a9760 100644 --- a/client/command/extensions/list.go +++ b/client/command/extensions/list.go @@ -21,13 +21,12 @@ package extensions import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// ExtensionsListCmd - List all extension loaded on the active session/beacon +// ExtensionsListCmd - List all extension loaded on the active session/beacon. func ExtensionsListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index f794cea1a7..b70d8f76d2 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -30,12 +30,6 @@ import ( "strconv" "strings" - appConsole "github.com/reeflective/console" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -44,12 +38,17 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + appConsole "github.com/reeflective/console" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) const ( defaultTimeout = 60 - // ManifestFileName - Extension manifest file name + // ManifestFileName - Extension manifest file name. ManifestFileName = "extension.json" ) @@ -105,7 +104,7 @@ func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, ta return filePath, nil } -// ExtensionLoadCmd - Load extension command +// ExtensionLoadCmd - Load extension command. func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") @@ -123,7 +122,7 @@ func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []stri con.PrintInfof("Added %s command: %s\n", extCmd.CommandName, extCmd.Help) } -// LoadExtensionManifest - Parse extension files +// LoadExtensionManifest - Parse extension files. func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) { data, err := os.ReadFile(manifestPath) if err != nil { @@ -138,7 +137,7 @@ func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) { return extManifest, nil } -// ParseExtensionManifest - Parse extension manifest from buffer +// ParseExtensionManifest - Parse extension manifest from buffer. func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { extManifest := &ExtensionManifest{} err := json.Unmarshal(data, &extManifest) @@ -174,7 +173,7 @@ func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { return extManifest, nil } -// ExtensionRegisterCommand - Register a new extension command +// ExtensionRegisterCommand - Register a new extension command. func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) { if errInvalidArgs := checkExtensionArgs(extCmd); errInvalidArgs != nil { con.PrintErrorf(errInvalidArgs.Error()) @@ -388,7 +387,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintExtOutput - Print the ext execution output +// PrintExtOutput - Print the ext execution output. func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.CallExtension, con *console.SliverClient) { if extName == commandName { con.PrintInfof("Successfully executed %s", extName) @@ -509,7 +508,7 @@ func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *Extensio return extensionArgs, nil } -// CmdExists - checks if a command exists +// CmdExists - checks if a command exists. func CmdExists(name string, cmd *cobra.Command) bool { for _, c := range cmd.Commands() { if name == c.Name() { diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index f2c19c18cd..d64dc15334 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -25,14 +25,13 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// ExtensionsRemoveCmd - Remove an extension +// ExtensionsRemoveCmd - Remove an extension. func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] if name == "" { @@ -54,7 +53,7 @@ func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []s } } -// RemoveExtensionByCommandName - Remove an extension by command name +// RemoveExtensionByCommandName - Remove an extension by command name. func RemoveExtensionByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index aacb93b471..7226f13977 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -27,17 +27,16 @@ import ( "github.com/alecthomas/chroma/formatters" "github.com/alecthomas/chroma/lexers" "github.com/alecthomas/chroma/styles" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// CatCmd - Display the contents of a remote file +// CatCmd - Display the contents of a remote file. func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -80,7 +79,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintCat - Print the download to stdout +// PrintCat - Print the download to stdout. func PrintCat(download *sliverpb.Download, cmd *cobra.Command, con *console.SliverClient) { var ( lootDownload bool = true diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 325a45a659..58f2bc2c39 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// CdCmd - Change directory on the remote system +// CdCmd - Change directory on the remote system. func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 01439b7c44..5485bb08f2 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -20,16 +20,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ChmodCmd - Change the permissions of a file on the remote file system +// ChmodCmd - Change the permissions of a file on the remote file system. func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -77,7 +75,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintChmod - Print the chmod response +// PrintChmod - Print the chmod response. func PrintChmod(chmod *sliverpb.Chmod, con *console.SliverClient) { if chmod.Response != nil && chmod.Response.Err != "" { con.PrintErrorf("%s\n", chmod.Response.Err) diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index b9282fc8f3..5ea6d199cb 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -20,16 +20,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ChownCmd - Change the owner of a file on the remote file system +// ChownCmd - Change the owner of a file on the remote file system. func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -85,7 +83,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintChown - Print the chown response +// PrintChown - Print the chown response. func PrintChown(chown *sliverpb.Chown, con *console.SliverClient) { if chown.Response != nil && chown.Response.Err != "" { con.PrintErrorf("%s\n", chown.Response.Err) diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index 1535387111..2cf75b0dcb 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -21,16 +21,14 @@ import ( "context" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ChtimesCmd - Change the access and modified time of a file on the remote file system +// ChtimesCmd - Change the access and modified time of a file on the remote file system. func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -98,7 +96,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintChtimes - Print the Chtimes response +// PrintChtimes - Print the Chtimes response. func PrintChtimes(chtimes *sliverpb.Chtimes, con *console.SliverClient) { if chtimes.Response != nil && chtimes.Response.Err != "" { con.PrintErrorf("%s\n", chtimes.Response.Err) diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index d0b8c85775..caa8f8c9c7 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -1,15 +1,14 @@ package filesystem import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 9231806d9a..3f9724f1a0 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -21,13 +21,11 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 512332585f..5cf74140e4 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -28,15 +28,14 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "gopkg.in/AlecAivazis/survey.v1" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "gopkg.in/AlecAivazis/survey.v1" ) func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index b779dbe5af..84480548b8 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -27,18 +27,16 @@ import ( "text/tabwriter" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) -// LsCmd - List the contents of a remote directory +// LsCmd - List the contents of a remote directory. func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -75,7 +73,7 @@ func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintLs - Display an sliverpb.Ls object +// PrintLs - Display an sliverpb.Ls object. func PrintLs(ls *sliverpb.Ls, flags *pflag.FlagSet, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 073d260702..dfed97a4bb 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -20,15 +20,14 @@ package filesystem import ( "context" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MemfilesAddCmd - Add memfile +// MemfilesAddCmd - Add memfile. func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -57,7 +56,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// PrintAddMemfile - Print the memfiles response +// PrintAddMemfile - Print the memfiles response. func PrintAddMemfile(memfilesAdd *sliverpb.MemfilesAdd, con *console.SliverClient) { if memfilesAdd.Response != nil && memfilesAdd.Response.Err != "" { con.PrintErrorf("%s\n", memfilesAdd.Response.Err) diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index e8e9f661c1..a4bb45d8bc 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -25,16 +25,15 @@ import ( "text/tabwriter" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MemfilesListCmd - List memfiles +// MemfilesListCmd - List memfiles. func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -63,7 +62,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintMemfiles - Display an sliverpb.Ls object +// PrintMemfiles - Display an sliverpb.Ls object. func PrintMemfiles(ls *sliverpb.Ls, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 697e9205c6..9c90b46354 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -21,15 +21,14 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MemfilesRmCmd - Remove a memfile +// MemfilesRmCmd - Remove a memfile. func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -67,7 +66,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintRmMemfile - Remove a memfile +// PrintRmMemfile - Remove a memfile. func PrintRmMemfile(memfilesList *sliverpb.MemfilesRm, con *console.SliverClient) { if memfilesList.Response != nil && memfilesList.Response.Err != "" { con.PrintErrorf("%s\n", memfilesList.Response.Err) diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index ae0427767a..0699fe1ff5 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MkdirCmd - Make a remote directory +// MkdirCmd - Make a remote directory. func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -68,7 +66,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintMkdir - Print make directory +// PrintMkdir - Print make directory. func PrintMkdir(mkdir *sliverpb.Mkdir, con *console.SliverClient) { if mkdir.Response != nil && mkdir.Response.Err != "" { con.PrintErrorf("%s\n", mkdir.Response.Err) diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 784a9ec7aa..9e0b46e874 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -21,13 +21,11 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { @@ -77,7 +75,7 @@ func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er return } -// PrintMv - Print the renamed file +// PrintMv - Print the renamed file. func PrintMv(mv *sliverpb.Mv, con *console.SliverClient) { if mv.Response != nil && mv.Response.Err != "" { con.PrintErrorf("%s\n", mv.Response.Err) diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 01b0981561..5ed2b019b9 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// PwdCmd - Print the remote working directory +// PwdCmd - Print the remote working directory. func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -58,7 +56,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintPwd - Print the remote working directory +// PrintPwd - Print the remote working directory. func PrintPwd(pwd *sliverpb.Pwd, con *console.SliverClient) { if pwd.Response != nil && pwd.Response.Err != "" { con.PrintErrorf("%s\n", pwd.Response.Err) diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index e954b7b50f..7701c5a840 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RmCmd - Remove a directory from the remote file system +// RmCmd - Remove a directory from the remote file system. func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -73,7 +71,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRm - Print the rm response +// PrintRm - Print the rm response. func PrintRm(rm *sliverpb.Rm, con *console.SliverClient) { if rm.Response != nil && rm.Response.Err != "" { con.PrintErrorf("%s\n", rm.Response.Err) diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 63ef374ab5..86daef51bc 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -25,17 +25,15 @@ import ( "os" "path/filepath" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// UploadCmd - Upload a file to the remote system +// UploadCmd - Upload a file to the remote system. func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -110,7 +108,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintUpload - Print the result of the upload command +// PrintUpload - Print the result of the upload command. func PrintUpload(upload *sliverpb.Upload, con *console.SliverClient) { if upload.Response != nil && upload.Response.Err != "" { con.PrintErrorf("%s\n", upload.Response.Err) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 1580a87923..83e54fabd9 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -26,15 +26,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - preRun := func(_ *cobra.Command, _ []string) error { - con.Teamclient.Connect() - return nil - } - comps := carapace.Gen(generateCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) - }) - // Session flags and completions. coreImplantFlags("session", generateCmd) compileImplantFlags("session", generateCmd) @@ -52,6 +43,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", generateBeaconCmd) compileImplantFlags("beacon", generateBeaconCmd) + coreBeaconFlags("beacon", generateBeaconCmd) coreImplantFlagCompletions(generateBeaconCmd, con) generateCmd.AddCommand(generateBeaconCmd) @@ -210,6 +202,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", profilesNewBeaconCmd) compileImplantFlags("beacon", profilesNewBeaconCmd) + coreBeaconFlags("beacon", profilesNewBeaconCmd) coreImplantFlagCompletions(profilesNewBeaconCmd, con) profilesRmCmd := &cobra.Command{ diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index dcb7f97b6a..49f1906872 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -1,13 +1,12 @@ package hosts import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index f75ec4ec6e..f009e3ee92 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -21,12 +21,11 @@ package hosts import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// HostsIOCRmCmd - Remove a host from the database +// HostsIOCRmCmd - Remove a host from the database. func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index 2fa469eee2..4bc5657899 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -26,14 +26,13 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// HostsIOCCmd - Remove a host from the database +// HostsIOCCmd - Remove a host from the database. func HostsIOCCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index f0b4aca451..77a052f93c 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -21,12 +21,11 @@ package hosts import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// HostsRmCmd - Remove a host from the database +// HostsRmCmd - Remove a host from the database. func HostsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index ab81194921..c694bc1d61 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -29,24 +29,22 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) var ( - // ErrNoHosts - No hosts in database + // ErrNoHosts - No hosts in database. ErrNoHosts = errors.New("no hosts") - // ErrNoSelection - No selection made + // ErrNoSelection - No selection made. ErrNoSelection = errors.New("no selection") ) -// HostsCmd - Main hosts command +// HostsCmd - Main hosts command. func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { @@ -126,7 +124,7 @@ func hostBeacons(hostUUID string, con *console.SliverClient) string { } } -// SessionsForHost - Find session for a given host by id +// SessionsForHost - Find session for a given host by id. func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -141,7 +139,7 @@ func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Ses return hostSessions } -// SelectHost - Interactively select a host from the database +// SelectHost - Interactively select a host from the database. func SelectHost(con *console.SliverClient) (*clientpb.Host, error) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/info/commands.go b/client/command/info/commands.go index c33aef06d1..98f919dd28 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -1,15 +1,14 @@ package info import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/info/info.go b/client/command/info/info.go index 468e84fb71..6910370fd4 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -22,17 +22,16 @@ import ( "context" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// InfoCmd - Display information about the active session +// InfoCmd - Display information about the active session. func InfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error @@ -110,7 +109,7 @@ func InfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PIDCmd - Get the active session's PID +// PIDCmd - Get the active session's PID. func PIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -123,7 +122,7 @@ func PIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// UIDCmd - Get the active session's UID +// UIDCmd - Get the active session's UID. func UIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -136,7 +135,7 @@ func UIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// GIDCmd - Get the active session's GID +// GIDCmd - Get the active session's GID. func GIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -149,7 +148,7 @@ func GIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// WhoamiCmd - Displays the current user of the active session +// WhoamiCmd - Displays the current user of the active session. func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/info/ping.go b/client/command/info/ping.go index 600ef4c513..3dd75e1652 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -4,13 +4,12 @@ import ( "context" insecureRand "math/rand" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// PingCmd - Send a round trip C2 message to an implant (does not use ICMP) +// PingCmd - Send a round trip C2 message to an implant (does not use ICMP). func PingCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 5e067cc146..8872cd631a 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -23,13 +23,12 @@ import ( "encoding/json" "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// PivotsGraphCmd - Display pivots for all sessions +// PivotsGraphCmd - Display pivots for all sessions. func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { graph, err := con.Rpc.PivotGraph(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index ea933ce4c7..328043d0c6 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -28,13 +28,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/rsteube/carapace" ) -// SelectPivotListener - Interactive menu to select a pivot listener +// SelectPivotListener - Interactive menu to select a pivot listener. func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.SliverClient) (*sliverpb.PivotListener, error) { // Render selection table buf := bytes.NewBufferString("") diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index fef208f5ef..60de8dec39 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -21,15 +21,14 @@ package pivots import ( "context" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// PivotsCmd - Display pivots for all sessions +// PivotsCmd - Display pivots for all sessions. func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -54,7 +53,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintPivotListeners - Print a table of pivot listeners +// PrintPivotListeners - Print a table of pivot listeners. func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -75,7 +74,7 @@ func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console. con.Printf("%s\n", tw.Render()) } -// PivotTypeToString - Convert a pivot type to a human string +// PivotTypeToString - Convert a pivot type to a human string. func PivotTypeToString(pivotType sliverpb.PivotType) string { switch pivotType { case sliverpb.PivotType_TCP: diff --git a/client/command/pivots/start.go b/client/command/pivots/start.go index 69f38e8ddf..67e00e9041 100644 --- a/client/command/pivots/start.go +++ b/client/command/pivots/start.go @@ -22,13 +22,12 @@ import ( "context" "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StartTCPListenerCmd - Start a TCP pivot listener on the remote system +// StartTCPListenerCmd - Start a TCP pivot listener on the remote system. func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -52,7 +51,7 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []s con.PrintInfof("Started tcp pivot listener %s with id %d\n", listener.BindAddress, listener.ID) } -// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system +// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index bf4930a6c8..15c9b0a0b9 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -1,27 +1,27 @@ package portfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { portfwdCmd := &cobra.Command{ - Use: consts.PortfwdStr, - Short: "In-band TCP port forwarding", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Use: consts.PortfwdStr, + Short: "In-band TCP port forwarding", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { PortfwdCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, portfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index a85e03e6a1..42c481ea2d 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -25,16 +25,15 @@ import ( "regexp" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/tcpproxy" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// PortfwdAddCmd - Add a new tunneled port forward +// PortfwdAddCmd - Add a new tunneled port forward. func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index f09f1281c5..ab648b3f24 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -19,13 +19,12 @@ package portfwd */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// PortfwdRmCmd - Remove an existing tunneled port forward +// PortfwdRmCmd - Remove an existing tunneled port forward. func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { portfwdID, _ := cmd.Flags().GetInt("id") if portfwdID < 1 { diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index b7cfee7b5e..b8daedfd39 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -23,28 +23,27 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// PortfwdCmd - Display information about tunneled port forward(s) +// PortfwdCmd - Display information about tunneled port forward(s). func PortfwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintPortfwd(con) } -// PrintPortfwd - Print the port forward(s) +// PrintPortfwd - Print the port forward(s). func PrintPortfwd(con *console.SliverClient) { portfwds := core.Portfwds.List() if len(portfwds) == 0 { con.PrintInfof("No port forwards\n") return } - sort.Slice(portfwds[:], func(i, j int) bool { + sort.Slice(portfwds, func(i, j int) bool { return portfwds[i].ID < portfwds[j].ID }) @@ -67,7 +66,7 @@ func PrintPortfwd(con *console.SliverClient) { con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of local portforwarders +// PortfwdIDCompleter completes IDs of local portforwarders. func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index 56a05f88e4..4e4e9c7929 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -1,14 +1,13 @@ package reaction import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/reaction/helpers.go b/client/command/reaction/helpers.go index 41b264fc37..85787b8d1d 100644 --- a/client/command/reaction/helpers.go +++ b/client/command/reaction/helpers.go @@ -26,23 +26,22 @@ import ( "strconv" "strings" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/rsteube/carapace" ) const ( ReactionFileName = "reactions.json" ) -// GetReactionFilePath - Get the +// GetReactionFilePath - Get the. func GetReactionFilePath() string { return path.Join(assets.GetRootAppDir(), ReactionFileName) } -// SaveReactions - Save the reactions to the reaction file +// SaveReactions - Save the reactions to the reaction file. func SaveReactions(reactions []core.Reaction) error { reactionFilePath := GetReactionFilePath() data, err := json.MarshalIndent(reactions, "", " ") @@ -52,7 +51,7 @@ func SaveReactions(reactions []core.Reaction) error { return ioutil.WriteFile(reactionFilePath, data, 0o600) } -// LoadReactions - Save the reactions to the reaction file +// LoadReactions - Save the reactions to the reaction file. func LoadReactions() (int, error) { reactionFilePath := GetReactionFilePath() data, err := ioutil.ReadFile(reactionFilePath) @@ -85,7 +84,7 @@ func isReactable(reaction core.Reaction) bool { return false } -// ReactionIDCompleter completes saved/available reaction IDs +// ReactionIDCompleter completes saved/available reaction IDs. func ReactionIDCompleter(_ *console.SliverClient) carapace.Action { results := make([]string, 0) diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 9e41468e24..9caa2cf448 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -22,16 +22,15 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// ReactionCmd - Manage reactions to events +// ReactionCmd - Manage reactions to events. func ReactionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { totalReactions := 0 for _, eventType := range core.ReactableEvents { @@ -71,7 +70,7 @@ func displayReactionsTable(eventType string, reactions []core.Reaction, con *con con.Printf("%s\n", tw.Render()) } -// EventTypeToTitle - Convert an eventType to a more human friendly string +// EventTypeToTitle - Convert an eventType to a more human friendly string. func EventTypeToTitle(eventType string) string { switch eventType { diff --git a/client/command/reaction/reload.go b/client/command/reaction/reload.go index fb34a6271e..ff0d5553bc 100644 --- a/client/command/reaction/reload.go +++ b/client/command/reaction/reload.go @@ -22,12 +22,11 @@ import ( "os" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ReactionSaveCmd - Manage reactions to events +// ReactionSaveCmd - Manage reactions to events. func ReactionReloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if _, err := os.Stat(GetReactionFilePath()); os.IsNotExist(err) { con.PrintErrorf("Missing reaction file %s\n", GetReactionFilePath()) diff --git a/client/command/reaction/save.go b/client/command/reaction/save.go index c4d796390f..79ed192ad9 100644 --- a/client/command/reaction/save.go +++ b/client/command/reaction/save.go @@ -23,13 +23,12 @@ import ( "os" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// ReactionSaveCmd - Manage reactions to events +// ReactionSaveCmd - Manage reactions to events. func ReactionSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionPath := GetReactionFilePath() if _, err := os.Stat(reactionPath); !os.IsNotExist(err) { diff --git a/client/command/reaction/set.go b/client/command/reaction/set.go index 05c286f396..cf74c44e5e 100644 --- a/client/command/reaction/set.go +++ b/client/command/reaction/set.go @@ -23,16 +23,15 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// ErrNonReactableEvent - Event does not exist or is not supported by reactions +// ErrNonReactableEvent - Event does not exist or is not supported by reactions. var ErrNonReactableEvent = errors.New("non-reactable event type") -// ReactionSetCmd - Set a reaction upon an event +// ReactionSetCmd - Set a reaction upon an event. func ReactionSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { eventType, err := getEventType(cmd, con) if err != nil { diff --git a/client/command/reaction/unset.go b/client/command/reaction/unset.go index 7b785478d1..a95e7d5f27 100644 --- a/client/command/reaction/unset.go +++ b/client/command/reaction/unset.go @@ -26,13 +26,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// ReactionUnsetCmd - Unset a reaction upon an event +// ReactionUnsetCmd - Unset a reaction upon an event. func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionID, _ := cmd.Flags().GetInt("id") if reactionID == 0 { diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index 5022c9acf3..cc5178fd5b 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -1,13 +1,12 @@ package reconfig import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index fce35800d2..f0b5343aef 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -22,16 +22,14 @@ import ( "context" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ReconfigCmd - Reconfigure metadata about a sessions +// ReconfigCmd - Reconfigure metadata about a sessions. func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index d4012281dc..ba4cb518a9 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -21,14 +21,13 @@ package reconfig import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// RecnameCmd - Reconfigure metadata about a sessions +// RecnameCmd - Reconfigure metadata about a sessions. func RenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index 67c8ed193d..06a7b642a6 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -1,27 +1,27 @@ package rportfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { rportfwdCmd := &cobra.Command{ - Use: consts.RportfwdStr, - Short: "reverse port forwardings", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Use: consts.RportfwdStr, + Short: "reverse port forwardings", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { RportFwdListenersCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, rportfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 40e3ec0554..8dc20f2be9 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -23,15 +23,14 @@ import ( "fmt" "regexp" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index f86857777e..ac428a7b9b 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -21,13 +21,12 @@ package rportfwd import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 9090fc3ae1..2970812d8b 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -23,17 +23,16 @@ import ( "fmt" "strconv" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -78,7 +77,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of remote portforwarders +// PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go index e5c1fbac99..993cd8dcf7 100644 --- a/client/command/screenshot/commands.go +++ b/client/command/screenshot/commands.go @@ -1,14 +1,13 @@ package screenshot import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 39311d21fb..0741237c8c 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -26,18 +26,16 @@ import ( "path/filepath" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ScreenshotCmd - Take a screenshot of the remote system +// ScreenshotCmd - Take a screenshot of the remote system. func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -98,7 +96,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintScreenshot - Handle the screenshot command response +// PrintScreenshot - Handle the screenshot command response. func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobra.Command, con *console.SliverClient) { timestamp := time.Now().Format("20060102150405") diff --git a/client/command/server.go b/client/command/server.go index 931cde702f..964b689d73 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -40,7 +40,7 @@ import ( "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" - // "github.com/bishopfox/sliver/client/command/taskmany". + "github.com/bishopfox/sliver/client/command/taskmany" "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -54,7 +54,7 @@ import ( // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds console.Commands) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -63,9 +63,15 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(server, con) + if serverCmds != nil { - server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - server.AddCommand(serverCmds()) + server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) + server.AddCommand(serverCmds()...) } // [ Bind commands ] -------------------------------------------------------- @@ -77,7 +83,7 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso // the present calls. // Core - bind(consts.GenericHelpGroup, server, con, + bind(consts.GenericHelpGroup, exit.Command, licenses.Commands, settings.Commands, @@ -90,21 +96,21 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso ) // C2 Network - bind(consts.NetworkHelpGroup, server, con, + bind(consts.NetworkHelpGroup, jobs.Commands, websites.Commands, wireguard.Commands, ) // Payloads - bind(consts.PayloadsHelpGroup, server, con, + bind(consts.PayloadsHelpGroup, sgn.Commands, generate.Commands, builders.Commands, ) // Slivers - bind(consts.SliverHelpGroup, server, con, + bind(consts.SliverHelpGroup, use.Commands, info.Commands, sessions.Commands, @@ -113,7 +119,7 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso loot.Commands, hosts.Commands, reaction.Commands, - // taskmany.Command, + taskmany.Command, ) // [ Post-command declaration setup ]----------------------------------------- diff --git a/client/command/sessions/background.go b/client/command/sessions/background.go index e60c6a0caf..bc2449578c 100644 --- a/client/command/sessions/background.go +++ b/client/command/sessions/background.go @@ -1,12 +1,11 @@ package sessions import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// BackgroundCmd - Background the active session +// BackgroundCmd - Background the active session. func BackgroundCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.ActiveTarget.Background() con.PrintInfof("Background ...\n") diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index 13e5cb68cb..3968a1c11f 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -21,13 +21,12 @@ package sessions import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// CloseSessionCmd - Close an interactive session but do not kill the remote process +// CloseSessionCmd - Close an interactive session but do not kill the remote process. func CloseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Get the active session session := con.ActiveTarget.GetSessionInteractive() diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 7993731183..3e14771fc1 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -5,15 +5,14 @@ import ( "fmt" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the `sessions` command and its subcommands. @@ -61,7 +60,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{sessionsCmd} } -// SessionIDCompleter completes session IDs +// SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index a1b6d6780e..399fb19822 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -28,20 +28,19 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" ) var ( - // ErrNoSessions - No sessions available + // ErrNoSessions - No sessions available. ErrNoSessions = errors.New("no sessions") - // ErrNoSelection - No selection made + // ErrNoSelection - No selection made. ErrNoSelection = errors.New("no selection") ) -// SelectSession - Interactive menu for the user to select an session, optionally only display live sessions +// SelectSession - Interactive menu for the user to select an session, optionally only display live sessions. func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index 151ebaf55f..8b44007757 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -23,15 +23,14 @@ import ( "net/url" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// InteractiveCmd - Beacon only command to open an interactive session +// InteractiveCmd - Beacon only command to open an interactive session. func InteractiveCmd(cmd *cobra.Command, con *console.SliverClient, _ []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index eaa5010ec0..31d673464a 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -21,14 +21,13 @@ package sessions import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// SessionsPruneCmd - Forcefully kill stale sessions +// SessionsPruneCmd - Forcefully kill stale sessions. func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 5b8bbcda0e..6f056319f8 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -25,18 +25,17 @@ import ( "strings" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" ) -// SessionsCmd - Display/interact with sessions +// SessionsCmd - Display/interact with sessions. func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { interact, _ := cmd.Flags().GetString("interact") killFlag, _ := cmd.Flags().GetString("kill") @@ -126,7 +125,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintSessions - Print the current sessions +// PrintSessions - Print the current sessions. func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { @@ -237,7 +236,7 @@ func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterR con.Printf("%s\n", tw.Render()) } -// ShortSessionID - Shorten the session ID +// ShortSessionID - Shorten the session ID. func ShortSessionID(id string) string { return strings.Split(id, "-")[0] } diff --git a/client/command/settings/beacons.go b/client/command/settings/beacons.go index 6aafeaabab..60ab8796f5 100644 --- a/client/command/settings/beacons.go +++ b/client/command/settings/beacons.go @@ -19,13 +19,12 @@ package settings */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// SettingsBeaconsAutoResultCmd - The client settings command +// SettingsBeaconsAutoResultCmd - The client settings command. func SettingsBeaconsAutoResultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go index f312a6ed84..3bba3d0eaf 100644 --- a/client/command/settings/commands.go +++ b/client/command/settings/commands.go @@ -1,12 +1,11 @@ package settings import ( - "github.com/reeflective/console/commands/readline" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console/commands/readline" + "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/settings/opsec.go b/client/command/settings/opsec.go index 2fc964875d..c9e1ec7a70 100644 --- a/client/command/settings/opsec.go +++ b/client/command/settings/opsec.go @@ -20,13 +20,12 @@ package settings import ( "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// SettingsAutoAdultCmd - The client settings command +// SettingsAutoAdultCmd - The client settings command. func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -40,7 +39,7 @@ func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverClient, args [] con.PrintInfof("Auto Adult = %v\n", con.Settings.AutoAdult) } -// IsUserAnAdult - This should be called for any dangerous (OPSEC-wise) functions +// IsUserAnAdult - This should be called for any dangerous (OPSEC-wise) functions. func IsUserAnAdult(con *console.SliverClient) bool { if GetAutoAdult(con) { return true @@ -51,7 +50,7 @@ func IsUserAnAdult(con *console.SliverClient) bool { return confirm } -// GetAutoAdult - Get the current auto adult setting +// GetAutoAdult - Get the current auto adult setting. func GetAutoAdult(con *console.SliverClient) bool { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index 11b13626ad..621622a6fa 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -22,14 +22,13 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// SettingsCmd - The client settings command +// SettingsCmd - The client settings command. func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -53,7 +52,7 @@ func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.Printf("%s\n", tw.Render()) } -// SettingsAlwaysOverflow - Toggle always overflow +// SettingsAlwaysOverflow - Toggle always overflow. func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -67,7 +66,7 @@ func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverClient, args con.PrintInfof("Always overflow = %v\n", con.Settings.AlwaysOverflow) } -// SettingsConsoleLogs - Toggle console logs +// SettingsConsoleLogs - Toggle console logs. func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverClient) { var err error if con.Settings == nil { @@ -81,7 +80,7 @@ func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverClient) { con.PrintInfof("Console Logs = %v\n", con.Settings.ConsoleLogs) } -// SettingsSmallTerm - Modify small terminal width value +// SettingsSmallTerm - Modify small terminal width value. func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -111,7 +110,7 @@ func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverClient, args []str con.PrintInfof("Small terminal width set to %d\n", con.Settings.SmallTermWidth) } -// SettingsTablesCmd - The client settings command +// SettingsTablesCmd - The client settings command. func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -143,7 +142,7 @@ func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// SettingsSaveCmd - The client settings command +// SettingsSaveCmd - The client settings command. func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -161,7 +160,7 @@ func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// SettingsAlwaysOverflow - Toggle always overflow +// SettingsAlwaysOverflow - Toggle always overflow. func SettingsUserConnect(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index f895aba317..951eb64627 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -23,12 +23,11 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "golang.org/x/term" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/console" ) var ( @@ -127,7 +126,7 @@ var ( } ) -// GetTableStyle - Get the current table style +// GetTableStyle - Get the current table style. func GetTableStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() @@ -140,7 +139,7 @@ func GetTableStyle(con *console.SliverClient) table.Style { return tableStyles[SliverDefault.Name] } -// GetTableWithBordersStyle - Get the table style with borders +// GetTableWithBordersStyle - Get the table style with borders. func GetTableWithBordersStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() @@ -152,12 +151,12 @@ func GetTableWithBordersStyle(con *console.SliverClient) table.Style { return value } -// GetPageSize - Page size for tables +// GetPageSize - Page size for tables. func GetPageSize() int { return 10 } -// PagesOf - Return the pages of a table +// PagesOf - Return the pages of a table. func PagesOf(renderedTable string) [][]string { lines := strings.Split(renderedTable, "\n") if len(lines) < 2 { @@ -178,7 +177,7 @@ func PagesOf(renderedTable string) [][]string { return pages } -// PaginateTable - Render paginated table to console +// PaginateTable - Render paginated table to console. func PaginateTable(tw table.Writer, skipPages int, overflow bool, interactive bool, con *console.SliverClient) { renderedTable := tw.Render() lineCount := strings.Count(renderedTable, "\n") diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index d187bc4268..242794ee8a 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -1,26 +1,25 @@ package shell import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { shellCmd := &cobra.Command{ - Use: consts.ShellStr, - Short: "Start an interactive shell", - Long: help.GetHelpFor([]string{consts.ShellStr}), + Use: consts.ShellStr, + Short: "Start an interactive shell", + Long: help.GetHelpFor([]string{consts.ShellStr}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { ShellCmd(cmd, con, args) }, - GroupID: consts.ExecutionHelpGroup, - Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), } flags.Bind("", false, shellCmd, func(f *pflag.FlagSet) { f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index c00e949bdd..6dcebbbbe3 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -25,13 +25,12 @@ import ( "log" "os" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "golang.org/x/term" ) const ( @@ -40,7 +39,7 @@ const ( linux = "linux" ) -// ShellCmd - Start an interactive shell on the remote system +// ShellCmd - Start an interactive shell on the remote system. func ShellCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 381fd56d4b..cbb69f88a5 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -61,8 +61,14 @@ func SliverCommands(con *client.SliverClient) console.Commands { }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(sliver, con) + // [ Core ] - bind(consts.SliverCoreHelpGroup, sliver, con, + bind(consts.SliverCoreHelpGroup, reconfig.Commands, // sessions.Commands, sessions.SliverCommands, @@ -73,7 +79,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Info ] - bind(consts.InfoHelpGroup, sliver, con, + bind(consts.InfoHelpGroup, // info.Commands, info.SliverCommands, screenshot.Commands, @@ -82,12 +88,12 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Filesystem ] - bind(consts.FilesystemHelpGroup, sliver, con, + bind(consts.FilesystemHelpGroup, filesystem.Commands, ) // [ Network tools ] - bind(consts.NetworkHelpGroup, sliver, con, + bind(consts.NetworkHelpGroup, network.Commands, rportfwd.Commands, portfwd.Commands, @@ -96,7 +102,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Execution ] - bind(consts.ExecutionHelpGroup, sliver, con, + bind(consts.ExecutionHelpGroup, shell.Commands, exec.Commands, backdoor.Commands, @@ -106,20 +112,20 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Privileges ] - bind(consts.PrivilegesHelpGroup, sliver, con, + bind(consts.PrivilegesHelpGroup, privilege.Commands, ) // [ Processes ] - bind(consts.ProcessHelpGroup, sliver, con, + bind(consts.ProcessHelpGroup, processes.Commands, ) // [ Aliases ] - bind(consts.AliasHelpGroup, sliver, con) + bind(consts.AliasHelpGroup) // [ Extensions ] - bind(consts.ExtensionHelpGroup, sliver, con, + bind(consts.ExtensionHelpGroup, extensions.Commands, ) @@ -144,6 +150,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { con.PrintErrorf("Failed to load extension: %s", err) continue } + extensions.ExtensionRegisterCommand(ext, sliver, con) } diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index f6077a910a..710984d625 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -1,27 +1,27 @@ package socks import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { socksCmd := &cobra.Command{ - Use: consts.Socks5Str, - Short: "In-band SOCKS5 Proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), + Use: consts.Socks5Str, + Short: "In-band SOCKS5 Proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { SocksCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, socksCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index a2541c484c..63cf7a9fa7 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -25,15 +25,13 @@ import ( "net" "time" - "gopkg.in/AlecAivazis/survey.v1" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" + "gopkg.in/AlecAivazis/survey.v1" ) -// SocksStartCmd - Add a new tunneled port forward +// SocksStartCmd - Add a new tunneled port forward. func SocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index 2255d421b4..0fcb2565aa 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -21,14 +21,13 @@ package socks import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// SocksStopCmd - Remove an existing tunneled port forward +// SocksStopCmd - Remove an existing tunneled port forward. func SocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socksID, _ := cmd.Flags().GetUint64("id") if socksID < 1 { diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 24de779231..0301822383 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -23,23 +23,22 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// SocksCmd - Display information about tunneled port forward(s) +// SocksCmd - Display information about tunneled port forward(s). func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socks := core.SocksProxies.List() if len(socks) == 0 { con.PrintInfof("No socks5 proxies\n") return } - sort.Slice(socks[:], func(i, j int) bool { + sort.Slice(socks, func(i, j int) bool { return socks[i].ID < socks[j].ID }) @@ -59,7 +58,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.Printf("%s\n", tw.Render()) } -// SocksIDCompleter completes IDs of remote of socks proxy servers +// SocksIDCompleter completes IDs of remote of socks proxy servers. func SocksIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index 20036ddfc1..d92e1b2df0 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -1,14 +1,13 @@ package tasks import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 77eb28169f..1c2ba517ad 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -26,11 +26,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/environment" "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" @@ -45,9 +40,13 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) -// TasksFetchCmd - Manage beacon tasks +// TasksFetchCmd - Manage beacon tasks. func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { @@ -124,7 +123,7 @@ func filterTasksByTaskType(taskType string, tasks []*clientpb.BeaconTask) []*cli return filteredTasks } -// PrintTask - Print the details of a beacon task +// PrintTask - Print the details of a beacon task. func PrintTask(task *clientpb.BeaconTask, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableWithBordersStyle(con)) @@ -171,7 +170,7 @@ func emojiState(state string) string { } } -// Decode and render message specific content +// Decode and render message specific content. func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { reqEnvelope := &sliverpb.Envelope{} proto.Unmarshal(task.Request, reqEnvelope) diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 5d9393f84d..6cdf28cd49 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -10,13 +10,12 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/rsteube/carapace" ) -// SelectBeaconTask - Select a beacon task interactively +// SelectBeaconTask - Select a beacon task interactively. func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error) { // Render selection table buf := bytes.NewBufferString("") @@ -114,7 +113,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(callback) } -// BeaconPendingTasksCompleter completes pending tasks +// BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { beacon := con.ActiveTarget.GetBeacon() diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index c2c478348a..c184c33b39 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -3,13 +3,12 @@ package tasks import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// TasksCancelCmd - Cancel a beacon task before it's sent to the implant +// TasksCancelCmd - Cancel a beacon task before it's sent to the implant. func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 610aada08b..bd025867e6 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -24,15 +24,14 @@ import ( "strings" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// TasksCmd - Manage beacon tasks +// TasksCmd - Manage beacon tasks. func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { @@ -46,7 +45,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintBeaconTasks(beaconTasks.Tasks, cmd, con) } -// PrintBeaconTasks - Print beacon tasks +// PrintBeaconTasks - Print beacon tasks. func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 25e0709a7b..7528fa8e1f 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -1,15 +1,14 @@ package update import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/update/update.go b/client/command/update/update.go index 3769f37c6d..d9d9d36d5a 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -36,18 +36,17 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/cheggaaa/pb/v3" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/cheggaaa/pb/v3" + "github.com/spf13/cobra" ) -// UpdateCmd - Check for updates +// UpdateCmd - Check for updates. func UpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { VerboseVersionsCmd(cmd, con, args) @@ -126,7 +125,7 @@ func UpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// VerboseVersionsCmd - Get verbose version information about the client and server +// VerboseVersionsCmd - Get verbose version information about the client and server. func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { clientVer := version.FullVersion() serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 4327a6c93c..5567453e2a 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -1,14 +1,13 @@ package wasm import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index dc9f9b8c9b..a6b6c8c9aa 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -36,16 +36,16 @@ import ( ) // wasmMaxModuleSize - Arbitrary 1.5Gb limit to put us well under the 2Gb max gRPC message size -// this is also the *compressed size* limit, so it's pretty generous +// this is also the *compressed size* limit, so it's pretty generous. const ( gb = 1024 * 1024 * 1024 wasmMaxModuleSize = gb + (gb / 2) ) -// WasmCmd - session/beacon id -> list of loaded wasm extension names +// WasmCmd - session/beacon id -> list of loaded wasm extension names. var wasmRegistrationCache = make(map[string][]string) -// WasmCmd - Execute a WASM module extension +// WasmCmd - Execute a WASM module extension. func WasmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -120,7 +120,7 @@ func isRegistered(name string, cmd *cobra.Command, con *console.SliverClient) bo return false } -// idOf - Quickly return the id of the current session or beacon +// idOf - Quickly return the id of the current session or beacon. func idOf(con *console.SliverClient) string { if con.ActiveTarget != nil { if session := con.ActiveTarget.GetSession(); session != nil { @@ -253,7 +253,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console return nil } -// WasmLsCmd - Execute a WASM module extension +// WasmLsCmd - Execute a WASM module extension. func WasmLsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index e8c5773f47..727de3521b 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -1,14 +1,13 @@ package websites import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index f9bcd3992b..dc3e8386d4 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -28,13 +28,12 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsitesAddContentCmd - Add static content to a website +// WebsitesAddContentCmd - Add static content to a website. func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index 521b403bf2..95b7d1f621 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -22,13 +22,12 @@ import ( "context" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsitesRmContent - Remove static content from a website +// WebsitesRmContent - Remove static content from a website. func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("website") webPath, _ := cmd.Flags().GetString("web-path") diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index 7b702ebaa9..e81873cc17 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -21,13 +21,12 @@ package websites import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsiteRmCmd - Remove a website and all its static content +// WebsiteRmCmd - Remove a website and all its static content. func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index ab993526cf..d6d1b51919 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -21,13 +21,12 @@ package websites import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsitesUpdateContentCmd - Update metadata about static website content +// WebsitesUpdateContentCmd - Update metadata about static website content. func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index b2fe11f569..e4f6918c59 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -23,14 +23,13 @@ import ( "sort" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -38,7 +37,7 @@ const ( defaultMimeType = "application/octet-stream" ) -// WebsitesCmd - Manage websites +// WebsitesCmd - Manage websites. func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if len(args) > 0 { websiteName := args[0] @@ -48,7 +47,7 @@ func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// ListWebsites - Display a list of websites +// ListWebsites - Display a list of websites. func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { @@ -66,7 +65,7 @@ func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// ListWebsiteContent - List the static contents of a website +// ListWebsiteContent - List the static contents of a website. func ListWebsiteContent(websiteName string, con *console.SliverClient) { website, err := con.Rpc.Website(context.Background(), &clientpb.Website{ Name: websiteName, diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index dd0e60e9c5..5fab9a4e10 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,14 +1,13 @@ package wireguard import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -39,14 +38,17 @@ func Commands(con *console.SliverClient) []*cobra.Command { // SliverCommands returns all Wireguard commands that can be used on an active target. func SliverCommands(con *console.SliverClient) []*cobra.Command { wgPortFwdCmd := &cobra.Command{ - Use: consts.WgPortFwdStr, - Short: "List ports forwarded by the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + Use: consts.WgPortFwdStr, + Short: "List ports forwarded by the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets( + consts.WireguardCmdsFilter, + consts.SessionCmdsFilter, + ), Run: func(cmd *cobra.Command, args []string) { WGPortFwdListCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, - Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), } flags.Bind("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index fd5bf115ab..760306fd73 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -28,10 +28,9 @@ import ( "strings" "text/template" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) var wgQuickTemplate = `[Interface] @@ -52,7 +51,7 @@ type wgQuickConfig struct { AllowedSubnet string } -// WGConfigCmd - Generate a WireGuard client configuration +// WGConfigCmd - Generate a WireGuard client configuration. func WGConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index bf866bc34c..4ca36a7771 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -22,13 +22,12 @@ import ( "context" "net" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGPortFwdAddCmd - Add a new WireGuard port forward +// WGPortFwdAddCmd - Add a new WireGuard port forward. func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index e3b4c24494..bd3f3555cd 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -23,14 +23,13 @@ import ( "fmt" "strconv" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGPortFwdRmCmd - Remove a WireGuard port forward +// WGPortFwdRmCmd - Remove a WireGuard port forward. func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -66,7 +65,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders +// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index 2b42b1b374..38882eeb7d 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -21,15 +21,14 @@ package wireguard import ( "context" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// WGPortFwdListCmd - List WireGuard port forwards +// WGPortFwdListCmd - List WireGuard port forwards. func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index 4038008b5c..156aad40a3 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -21,13 +21,12 @@ package wireguard import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy +// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy. func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index 9494dfbfe0..c0239bfe74 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -22,13 +22,12 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStopCmd - Stop a WireGuard SOCKS proxy +// WGSocksStopCmd - Stop a WireGuard SOCKS proxy. func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 6046d20ed1..d2a88d5f00 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -22,16 +22,15 @@ import ( "context" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGSocksListCmd - List WireGuard SOCKS proxies +// WGSocksListCmd - List WireGuard SOCKS proxies. func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/server/cli/cli.go b/server/cli/cli.go index 5134c81173..95bc79b9c7 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -174,8 +174,10 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() *cobra.Command { - return commands.Generate(teamserver, con.Teamclient) + teamserverCmds := func() []*cobra.Command { + return []*cobra.Command{ + commands.Generate(teamserver, con.Teamclient), + } } serverCmds := command.ServerCommands(con, teamserverCmds) From e57f8e82b3356fcbdb54ff3bd87aa5b6e694eb6a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 22:11:29 +0200 Subject: [PATCH 030/109] Simplify binding server-binary-only commands --- client/command/command.go | 18 +++++++++++----- client/command/server.go | 7 ++++--- client/command/sliver.go | 2 +- client/constants/constants.go | 6 ++++-- server/cli/cli.go | 24 +++++++++++----------- server/{cli => command/version}/version.go | 23 ++++++++++++--------- 6 files changed, 47 insertions(+), 33 deletions(-) rename server/{cli => command/version}/version.go (73%) diff --git a/client/command/command.go b/client/command/command.go index 3e5cb16fff..21083729f8 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -30,11 +30,11 @@ import ( const defaultTimeout = 60 -// Bind is a convenience function to bind flags to a given command. +// bindFlags is a convenience function to bind flags to a given command. // name - The name of the flag set (can be empty). // cmd - The command to which the flags should be bound. // flags - A function exposing the flag set through which flags are declared. -func Bind(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { +func bindFlags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { flagSet := pflag.NewFlagSet(name, pflag.ContinueOnError) // Create the flag set. flags(flagSet) // Let the user bind any number of flags to it. @@ -77,9 +77,9 @@ func RestrictTargets(filters ...string) map[string]string { } } -// makeBind returns a commandBinder helper function +// MakeBind returns a commandBinder helper function. // @menu - The command menu to which the commands should be bound (either server or implant menu). -func makeBind(cmd *cobra.Command, con *client.SliverClient) func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { +func MakeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { return func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { found := false @@ -102,7 +102,15 @@ func makeBind(cmd *cobra.Command, con *client.SliverClient) func(group string, c // Bind the command to the root for _, command := range cmds { - cmd.AddCommand(command(con)...) + subcommands := command(con) + + // Always rudely overwrite the current + // command group: we don't cobra to panic. + for _, sub := range subcommands { + sub.GroupID = group + } + + cmd.AddCommand(subcommands...) } } } diff --git a/client/command/server.go b/client/command/server.go index 964b689d73..1862325604 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -67,11 +67,12 @@ func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := makeBind(server, con) + bind := MakeBind(server, con) if serverCmds != nil { - server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) - server.AddCommand(serverCmds()...) + bind(consts.TeamserverHelpGroup, + func(con *client.SliverClient) []*cobra.Command { return serverCmds() }, + ) } // [ Bind commands ] -------------------------------------------------------- diff --git a/client/command/sliver.go b/client/command/sliver.go index cbb69f88a5..d3bb8b4c7b 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -65,7 +65,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := makeBind(sliver, con) + bind := MakeBind(sliver, con) // [ Core ] bind(consts.SliverCoreHelpGroup, diff --git a/client/constants/constants.go b/client/constants/constants.go index a906378154..b5a61eb2a4 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -296,6 +296,9 @@ const ( // Groups. const ( + // "Server-binary-only" group. + TeamserverHelpGroup = "Teamserver" + // Server commands =====================. GenericHelpGroup = "Generic" NetworkHelpGroup = "Network" @@ -315,8 +318,7 @@ const ( ExtensionHelpGroup = "Sliver - 3rd Party extensions" // Useless. - SliverWinHelpGroup = "Sliver - Windows" - MultiplayerHelpGroup = "Multiplayer" + SliverWinHelpGroup = "Sliver - Windows" ) // Command types / filters (per OS/type/C2/etc) diff --git a/server/cli/cli.go b/server/cli/cli.go index 95bc79b9c7..4224be72db 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -40,6 +40,7 @@ import ( assetsCmds "github.com/bishopfox/sliver/server/command/assets" builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" + "github.com/bishopfox/sliver/server/command/version" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -75,14 +76,6 @@ func Execute() { rootCmd := serverCmds() rootCmd.Use = "sliver-server" // Needed by completion scripts. - // Bind additional commands peculiar to the one-exec CLI. - // NOTE: Down the road these commands should probably stripped of their - // os.Exit() calls and adapted so that they can be used in the console too. - rootCmd.AddCommand(versionCmd) - rootCmd.AddCommand(assetsCmds.Commands()...) - rootCmd.AddCommand(builderCmds.Commands()...) - rootCmd.AddCommand(certsCmds.Commands()...) - // Bind the closed-loop console: // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only @@ -174,10 +167,17 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() []*cobra.Command { - return []*cobra.Command{ - commands.Generate(teamserver, con.Teamclient), - } + teamserverCmds := func() (cmds []*cobra.Command) { + // Teamserver management + cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) + + // Sliver-specific + cmds = append(cmds, version.Commands()...) + cmds = append(cmds, assetsCmds.Commands()...) + cmds = append(cmds, builderCmds.Commands()...) + cmds = append(cmds, certsCmds.Commands()...) + + return cmds } serverCmds := command.ServerCommands(con, teamserverCmds) diff --git a/server/cli/version.go b/server/command/version/version.go similarity index 73% rename from server/cli/version.go rename to server/command/version/version.go index c3af479bf8..83ba186c15 100644 --- a/server/cli/version.go +++ b/server/command/version/version.go @@ -1,4 +1,4 @@ -package cli +package version /* Sliver Implant Framework @@ -21,16 +21,19 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/version" + "github.com/spf13/cobra" ) -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Print version and exit", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("%s\n", version.FullVersion()) - }, +func Commands() []*cobra.Command { + versionCmd := &cobra.Command{ + Use: "version", + Short: "Print version and exit", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("%s\n", version.FullVersion()) + }, + } + + return []*cobra.Command{versionCmd} } From c9cac6035e45d74994608feee5e4a2f87d9f73f0 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 23:16:29 +0200 Subject: [PATCH 031/109] Add completion for all builder flags Remove unused vendor code --- client/cli/cli.go | 2 +- client/command/generate/commands.go | 2 +- client/command/server.go | 6 +- server/builder/builder.go | 8 +- server/cli/cli.go | 8 +- server/command/builder/builder.go | 60 ++++- server/command/certs/certs.go | 3 +- server/command/version/version.go | 3 +- .../team/client/commands/commands.go | 40 ++++ .../team/server/commands/commands.go | 18 +- .../reeflective/team/server/users.go | 56 +++++ .../team/transports/grpc/client/client.go | 189 --------------- .../team/transports/grpc/client/middleware.go | 99 -------- .../team/transports/grpc/server/middleware.go | 218 ------------------ .../team/transports/grpc/server/rpc.go | 73 ------ .../team/transports/grpc/server/server.go | 204 ---------------- vendor/modules.txt | 2 - 17 files changed, 176 insertions(+), 815 deletions(-) delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/client.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/middleware.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/middleware.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/rpc.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/server.go diff --git a/client/cli/cli.go b/client/cli/cli.go index dd8fd6c30a..2137861e79 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -99,7 +99,7 @@ func newSliverClient() *client.SliverClient { // getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { - teamclientCmds := func() []*cobra.Command { + teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 83e54fabd9..67ed1ded0d 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/pflag" ) -// Commands returns the “ command and its subcommands. +// Commands returns all payload compilation commands. func Commands(con *console.SliverClient) []*cobra.Command { // [ Generate ] -------------------------------------------------------------- generateCmd := &cobra.Command{ diff --git a/client/command/server.go b/client/command/server.go index 1862325604..714b77ed52 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -52,9 +52,11 @@ import ( "github.com/spf13/cobra" ) +type CommandBinder func(con *client.SliverClient) []*cobra.Command + // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -71,7 +73,7 @@ func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command if serverCmds != nil { bind(consts.TeamserverHelpGroup, - func(con *client.SliverClient) []*cobra.Command { return serverCmds() }, + serverCmds, ) } diff --git a/server/builder/builder.go b/server/builder/builder.go index 9a3d3492e4..71c6a45cea 100644 --- a/server/builder/builder.go +++ b/server/builder/builder.go @@ -37,9 +37,7 @@ import ( "github.com/bishopfox/sliver/util" ) -var ( - builderLog = log.NamedLogger("builder", "sliver") -) +var builderLog = log.NamedLogger("builder", "sliver") type Config struct { GOOSs []string @@ -49,14 +47,14 @@ type Config struct { // StartBuilder - main entry point for the builder func StartBuilder(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient) { - sigint := make(chan os.Signal, 1) signal.Notify(sigint, os.Interrupt) builderLog.Infof("Attempting to register builder: %s", externalBuilder.Name) events, err := buildEvents(externalBuilder, rpc) if err != nil { - os.Exit(1) + builderLog.Errorf("Build events handler error: %s", err.Error()) + return } // Wait for signal or builds diff --git a/server/cli/cli.go b/server/cli/cli.go index 4224be72db..0ad8ad71eb 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -167,15 +167,15 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() (cmds []*cobra.Command) { + teamserverCmds := func(con *client.SliverClient) (cmds []*cobra.Command) { // Teamserver management cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) // Sliver-specific - cmds = append(cmds, version.Commands()...) + cmds = append(cmds, version.Commands(con)...) cmds = append(cmds, assetsCmds.Commands()...) - cmds = append(cmds, builderCmds.Commands()...) - cmds = append(cmds, certsCmds.Commands()...) + cmds = append(cmds, builderCmds.Commands(con)...) + cmds = append(cmds, certsCmds.Commands(con)...) return cmds } diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index e47da09326..6b29a93874 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -26,6 +26,8 @@ import ( "runtime/debug" "strings" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -34,6 +36,8 @@ import ( "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" "github.com/reeflective/team/client" + "github.com/reeflective/team/client/commands" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "google.golang.org/grpc" ) @@ -52,7 +56,7 @@ const ( ) // Commands returns all commands for using Sliver as a builder backend. -func Commands() []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { builderCmd := &cobra.Command{ Use: "builder", Short: "Start the process as an external builder", @@ -69,6 +73,12 @@ func Commands() []*cobra.Command { builderCmd.Flags().StringSlice(enableTargetFlagStr, []string{}, "force enable a target: format:goos/goarch") builderCmd.Flags().StringSlice(disableTargetFlagStr, []string{}, "force disable target arch: format:goos/goarch") + flags.BindFlagCompletions(builderCmd, func(comp *carapace.ActionMap) { + (*comp)["enable-target"] = builderFormatsCompleter() + (*comp)["disable-target"] = builderFormatsCompleter() + (*comp)["config"] = commands.ConfigsAppCompleter(con.Teamclient, "detected Sliver configs") + }) + return []*cobra.Command{builderCmd} } @@ -297,3 +307,51 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string // Let the builder do its work, blocking. builder.StartBuilder(externalBuilder, rpc) } + +// builderFormatsCompleter completes supported builders architectures. +func builderFormatsCompleter() carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + return carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action { + var results []string + + switch len(c.Parts) { + + // Binary targets + case 1: + for _, target := range generate.GetCompilerTargets() { + results = append(results, fmt.Sprintf("%s/%s", target.GOOS, target.GOARCH)) + } + + for _, target := range generate.GetUnsupportedTargets() { + results = append(results, fmt.Sprintf("%s/%s", target.GOOS, target.GOARCH)) + } + + return carapace.ActionValues(results...).Tag("architectures") + + // Binary formats + case 0: + for _, fmt := range []string{"executable", "exe", "exec", "pe"} { + results = append(results, fmt, clientpb.OutputFormat_EXECUTABLE.String()) + } + + for _, fmt := range []string{"shared-lib", "sharedlib", "dll", "so", "dylib"} { + results = append(results, fmt, clientpb.OutputFormat_SHARED_LIB.String()) + } + + for _, fmt := range []string{"service", "svc"} { + results = append(results, fmt, clientpb.OutputFormat_SERVICE.String()) + } + + for _, fmt := range []string{"shellcode", "shell", "sc"} { + results = append(results, fmt, clientpb.OutputFormat_SHELLCODE.String()) + } + + return carapace.ActionValuesDescribed(results...).Tag("formats").Suffix(":") + } + + return carapace.ActionValues() + }) + // Our flags --enable-target/--disable-targets are list, + // so users can coma-separate their values for a single flag. + }).UniqueList(",") +} diff --git a/server/command/certs/certs.go b/server/command/certs/certs.go index b81fa8349c..57e8cedd2f 100644 --- a/server/command/certs/certs.go +++ b/server/command/certs/certs.go @@ -25,6 +25,7 @@ import ( "path/filepath" "strings" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/certs" "github.com/spf13/cobra" ) @@ -57,7 +58,7 @@ func validCATypes() []string { } // Commands returns all commands for Sliver-specific Certificates management. -func Commands() []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { cmdImportCA := &cobra.Command{ Use: "import-ca", Short: "Import certificate authority", diff --git a/server/command/version/version.go b/server/command/version/version.go index 83ba186c15..c8fdbb365b 100644 --- a/server/command/version/version.go +++ b/server/command/version/version.go @@ -21,11 +21,12 @@ package version import ( "fmt" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/version" "github.com/spf13/cobra" ) -func Commands() []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { versionCmd := &cobra.Command{ Use: "version", Short: "Print version and exit", diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 8c0548d2a6..65651876d1 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -199,6 +199,46 @@ func ConfigsCompleter(cli *client.Client, filePath, ext, tag string, noSelf bool } } +// ConfigsAppCompleter completes file paths to the current application configs. +func ConfigsAppCompleter(cli *client.Client, tag string) carapace.Action { + return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { + var compErrors []carapace.Action + + configPath := cli.ConfigsDir() + + files, err := os.ReadDir(configPath) + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) + } + + var results []string + + for _, file := range files { + if !strings.HasSuffix(file.Name(), command.ClientConfigExt) { + continue + } + + filePath := filepath.Join(configPath, file.Name()) + + cfg, err := cli.ReadConfig(filePath) + if err != nil || cfg == nil { + continue + } + + results = append(results, filePath) + results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) + } + + configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(command.ClientConfigExt)) + + return carapace.Batch(append( + compErrors, + configsAction.Tag(tag), + carapace.ActionFiles())..., + ).ToA() + }) +} + func isConfigDir(cli *client.Client, dir fs.DirEntry, noSelf bool) bool { if !strings.HasPrefix(dir.Name(), ".") { return false diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index 618a32b6d0..ba1030f4d3 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -19,6 +19,8 @@ package commands */ import ( + "fmt" + "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" @@ -33,13 +35,13 @@ import ( // This is so that all CLI applications which can be a teamserver can also be a client of their own. // // ** Commands do: -// - Ensure they are connected to a server instance (in memory). // - Work even if the teamserver/client returns errors: those are returned &| printed &| logged. // - Use the cobra utilities OutOrStdout(), ErrOrStdErr(), ... for all and every command output. // - Have attached completions for users/listeners/config files of all sorts, and other things. // - Have the ability to be ran in closed-loop console applications ("single runtime shell"). // // ** Commands do NOT: +// - Ensure they are connected to a server instance before running (in memory). // - Call os.Exit() anywhere, thus will not exit the program embedding them. // - Ignite/start the teamserver core/filesystem/backends before they absolutely need to. // Consequently, do not touch the filesystem until they absolutely need to. @@ -51,23 +53,11 @@ func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Comma // On top, they need a listener in memory. servCmds := serverCommands(teamserver, teamclient) - // for _, cmd := range servCmds.Commands() { - // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - // return teamserver.Serve(teamclient) - // } - // } - // We bind the same runners to the client-side commands. cliCmds := cli.Generate(teamclient) cliCmds.Use = "client" cliCmds.GroupID = command.TeamServerGroup - // for _, cmd := range cliCmds.Commands() { - // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - // return teamserver.Serve(teamclient) - // } - // } - servCmds.AddCommand(cliCmds) return servCmds @@ -76,7 +66,7 @@ func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Comma func serverCommands(server *server.Server, client *client.Client) *cobra.Command { teamCmd := &cobra.Command{ Use: "teamserver", - Short: "Manage the application server-side teamserver and users", + Short: fmt.Sprintf("Manage the %s teamserver and users", server.Name()), SilenceUsage: true, } diff --git a/vendor/github.com/reeflective/team/server/users.go b/vendor/github.com/reeflective/team/server/users.go index f1ec242520..526dd72381 100644 --- a/vendor/github.com/reeflective/team/server/users.go +++ b/vendor/github.com/reeflective/team/server/users.go @@ -277,3 +277,59 @@ func (ts *Server) updateLastSeen(name string) { lastSeen := time.Now().Round(1 * time.Second) ts.dbSession().Model(&db.User{}).Where("name", name).Update("LastSeen", lastSeen) } + +// func TestRootOnlyVerifyCertificate(t *testing.T) { +// certs.SetupCAs() +// +// data, err := NewOperatorConfig("zerocool", "localhost", uint16(1337)) +// if err != nil { +// t.Fatalf("failed to generate test player profile %s", err) +// } +// config := &ClientConfig{} +// err = json.Unmarshal(data, config) +// if err != nil { +// t.Fatalf("failed to parse client config %s", err) +// } +// +// _, _, err = certs.OperatorServerGetCertificate("localhost") +// if err == certs.ErrCertDoesNotExist { +// certs.OperatorServerGenerateCertificate("localhost") +// } +// +// // Test with a valid certificate +// certPEM, _, _ := certs.OperatorServerGetCertificate("localhost") +// block, _ := pem.Decode(certPEM) +// err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) +// if err != nil { +// t.Fatalf("root only verify certificate error: %s", err) +// } +// +// // Test with wrong CA +// wrongCert, _ := certs.GenerateECCCertificate(certs.HTTPSCA, "foobar", false, false) +// block, _ = pem.Decode(wrongCert) +// err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) +// if err == nil { +// t.Fatal("root only verify cert verified a certificate with invalid ca!") +// } +// +// } + +// func TestOperatorGenerateCertificate(t *testing.T) { +// GenerateCertificateAuthority(OperatorCA, "") +// cert1, key1, err := OperatorClientGenerateCertificate("test3") +// if err != nil { +// t.Errorf("Failed to store ecc certificate %v", err) +// return +// } +// +// cert2, key2, err := OperatorClientGetCertificate("test3") +// if err != nil { +// t.Errorf("Failed to get ecc certificate %v", err) +// return +// } +// +// if !bytes.Equal(cert1, cert2) || !bytes.Equal(key1, key2) { +// t.Errorf("Stored ecc cert/key does match generated cert/key: %v != %v", cert1, cert2) +// return +// } +// } diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/client.go b/vendor/github.com/reeflective/team/transports/grpc/client/client.go deleted file mode 100644 index 4cdbafe95f..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/client/client.go +++ /dev/null @@ -1,189 +0,0 @@ -package client - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/reeflective/team" - "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/proto" - "google.golang.org/grpc" - "google.golang.org/grpc/status" -) - -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. - ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte - - defaultTimeout = 10 * time.Second -) - -var ( - // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client - // connection is available. The error is raised when the handler hasn't connected. - ErrNoRPC = errors.New("no working grpc.Teamclient available") - - // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try - // connecting with, TLS credentials. If such an error is raised, make sure your team - // client has correctly fetched -using client.Config()- a remote teamserver config. - ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") -) - -// Teamclient is a simple example gRPC teamclient and dialer backend. -// It comes correctly configured with Mutual TLS authentication and -// RPC connection/registration/use when created with NewTeamClient(). -// -// This teamclient embeds a team/client.Client core driver and uses -// it for fetching/setting up the transport credentials, dialers, etc... -// It also has a few internal types (clientConns, options) for working. -// -// Note that this teamclient is not able to be used as an in-memory dialer. -// See the counterpart `team/transports/grpc/server` package for creating one. -// Also note that this example transport has been made for a single use-case, -// and that your program might require more elaborated behavior. -// In this case, please use this simple code as a reference for what/not to do. -type Teamclient struct { - *client.Client - conn *grpc.ClientConn - rpc proto.TeamClient - options []grpc.DialOption -} - -// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. -// This client has by default only a few options, like max message buffer size. -// All options passed to this call are stored as is and will be used later. -func NewTeamClient(opts ...grpc.DialOption) *Teamclient { - client := &Teamclient{ - options: opts, - } - - client.options = append(client.options, - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), - ) - - return client -} - -// Init implements team/client.Dialer.Init(c). -// This implementation asks the teamclient core for its remote server -// configuration, and uses it to load a set of Mutual TLS dialing options. -func (h *Teamclient) Init(cli *client.Client) error { - h.Client = cli - config := cli.Config() - - options := LogMiddlewareOptions(cli) - - // If the configuration has no credentials, we are most probably - // an in-memory dialer, don't authenticate and encrypt the conn. - if config.PrivateKey != "" { - tlsOpts, err := tlsAuthMiddleware(cli) - if err != nil { - return err - } - - h.options = append(h.options, tlsOpts...) - } - - h.options = append(h.options, options...) - - return nil -} - -// Dial implements team/client.Dialer.Dial(). -// It uses the teamclient remote server configuration as a target of a dial call. -// If the connection is successful, the teamclient registers a proto.Teamclient -// RPC around its client connection, to provide the core teamclient functionality. -func (h *Teamclient) Dial() (rpcClient any, err error) { - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - - host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) - - h.conn, err = grpc.DialContext(ctx, host, h.options...) - if err != nil { - return nil, err - } - - h.rpc = proto.NewTeamClient(h.conn) - - return h.conn, nil -} - -// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. -func (h *Teamclient) Close() error { - return h.conn.Close() -} - -// Users returns a list of all users registered with the app teamserver. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. -func (h *Teamclient) Users() (users []team.User, err error) { - if h.rpc == nil { - return nil, ErrNoRPC - } - - res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) - if err != nil { - return nil, err - } - - for _, user := range res.GetUsers() { - users = append(users, team.User{ - Name: user.Name, - Online: user.Online, - LastSeen: time.Unix(user.LastSeen, 0), - }) - } - - return -} - -// ServerVersion returns the version information of the server to which -// the client is connected, or nil and an error if it could not retrieve it. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. -func (h *Teamclient) Version() (version team.Version, err error) { - if h.rpc == nil { - return version, ErrNoRPC - } - - ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) - if err != nil { - return version, errors.New(status.Convert(err).Message()) - } - - return team.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, nil -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go deleted file mode 100644 index e0f0f37619..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go +++ /dev/null @@ -1,99 +0,0 @@ -package client - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "encoding/json" - - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/common" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -// TokenAuth extracts authentication metadata from contexts, -// specifically the "Authorization": "Bearer" key:value pair. -type TokenAuth string - -// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. -// This function uses the core teamclient loggers to log the gRPC stack/requests events. -// The Teamclient of this package uses them by default. -func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { - logrusEntry := cli.NamedLogger("transport", "grpc") - logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), - } - - grpc_logrus.ReplaceGrpcLogger(logrusEntry) - - // Intercepting client requests. - requestIntercept := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - rawRequest, err := json.Marshal(req) - if err != nil { - logrusEntry.Errorf("Failed to serialize: %s", err) - return invoker(ctx, method, req, reply, cc, opts...) - } - - logrusEntry.Debugf("Raw request: %s", string(rawRequest)) - - return invoker(ctx, method, req, reply, cc, opts...) - } - - options := []grpc.DialOption{ - grpc.WithBlock(), - grpc.WithUnaryInterceptor(grpc_logrus.UnaryClientInterceptor(logrusEntry, logrusOpts...)), - grpc.WithUnaryInterceptor(requestIntercept), - } - - return options -} - -func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { - config := cli.Config() - if config.PrivateKey == "" { - return nil, ErrNoTLSCredentials - } - - tlsConfig, err := cli.NewTLSConfigFrom(config.CACertificate, config.Certificate, config.PrivateKey) - if err != nil { - return nil, err - } - - transportCreds := credentials.NewTLS(tlsConfig) - callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) - - return []grpc.DialOption{ - grpc.WithTransportCredentials(transportCreds), - grpc.WithPerRPCCredentials(callCreds), - }, nil -} - -// Return value is mapped to request headers. -func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { - return map[string]string{ - "Authorization": "Bearer " + string(t), - }, nil -} - -// RequireTransportSecurity always return true. -func (TokenAuth) RequireTransportSecurity() bool { - return true -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go deleted file mode 100644 index 9414ee1aa8..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go +++ /dev/null @@ -1,218 +0,0 @@ -package server - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "encoding/json" - - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" - grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/common" - "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/status" -) - -// BufferingOptions returns a list of server options with max send/receive -// message size, which value is that of the ServerMaxMessageSize variable (2GB). -func BufferingOptions() (options []grpc.ServerOption) { - options = append(options, - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - ) - - return -} - -// LogMiddlewareOptions is a set of logging middleware options -// preconfigured to perform the following tasks: -// - Log all connections/disconnections to/from the teamserver listener. -// - Log all raw client requests into a teamserver audit file (see server.AuditLog()). -func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { - var requestOpts []grpc.UnaryServerInterceptor - var streamOpts []grpc.StreamServerInterceptor - - cfg := s.GetConfig() - - // Audit-log all requests. Any failure to audit-log the requests - // of this server will themselves be logged to the root teamserver log. - auditLog, err := s.AuditLogger() - if err != nil { - return nil, err - } - - requestOpts = append(requestOpts, auditLogUnaryServerInterceptor(s, auditLog)) - - requestOpts = append(requestOpts, - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - ) - - streamOpts = append(streamOpts, - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - ) - - // Logging interceptors - logrusEntry := s.NamedLogger("transport", "grpc") - logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), - } - - grpc_logrus.ReplaceGrpcLogger(logrusEntry) - - requestOpts = append(requestOpts, - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { - return cfg.Log.GRPCUnaryPayloads - }), - ) - - streamOpts = append(streamOpts, - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { - return cfg.Log.GRPCStreamPayloads - }), - ) - - return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), - }, nil -} - -// TLSAuthMiddlewareOptions is a set of transport security options which will use -// the preconfigured teamserver TLS (credentials) configuration to authenticate -// incoming client connections. The authentication is Mutual TLS, used because -// all teamclients will connect with a known TLS credentials set. -func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { - var options []grpc.ServerOption - - tlsConfig, err := s.UsersTLSConfig() - if err != nil { - return nil, err - } - - creds := credentials.NewTLS(tlsConfig) - options = append(options, grpc.Creds(creds)) - - return options, nil -} - -// initAuthMiddleware - Initialize middleware logger. -func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { - var requestOpts []grpc.UnaryServerInterceptor - var streamOpts []grpc.StreamServerInterceptor - - // Authentication interceptors. - if ts.conn == nil { - // All remote connections are users who need authentication. - requestOpts = append(requestOpts, - grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), - ) - - streamOpts = append(streamOpts, - grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), - ) - } else { - // Local in-memory connections have no auth. - requestOpts = append(requestOpts, - grpc_auth.UnaryServerInterceptor(serverAuthFunc), - ) - streamOpts = append(streamOpts, - grpc_auth.StreamServerInterceptor(serverAuthFunc), - ) - } - - // Return middleware for all requests and stream interactions in gRPC. - return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), - }, nil -} - -// TODO: Should we change the default in-memory server name ? -func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, "transport", "local") - newCtx = context.WithValue(newCtx, "user", "server") - - return newCtx, nil -} - -func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { - log := ts.NamedLogger("transport", "grpc") - log.Debugf("Auth interceptor checking user token ...") - - rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") - if err != nil { - log.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - - user, authorized, err := ts.UserAuthenticate(rawToken) - if err != nil || !authorized || user == "" { - log.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - - newCtx := context.WithValue(ctx, "transport", "mtls") - newCtx = context.WithValue(newCtx, "user", user) - - return newCtx, nil -} - -type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` -} - -func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { - log := ts.NamedLogger("grpc", "audit") - - return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { - rawRequest, err := json.Marshal(req) - if err != nil { - log.Errorf("Failed to serialize %s", err) - return - } - - log.Debugf("Raw request: %s", string(rawRequest)) - - if err != nil { - log.Errorf("Middleware failed to insert details: %s", err) - } - - // Construct Log Message - msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, - } - - msgData, _ := json.Marshal(msg) - auditLog.Info(string(msgData)) - - resp, err := handler(ctx, req) - - return resp, err - } -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go b/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go deleted file mode 100644 index 2f206cde8f..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go +++ /dev/null @@ -1,73 +0,0 @@ -package server - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/proto" -) - -// rpcServer is the gRPC server implementation. -// It makes uses of the teamserver core to query users and version information. -type rpcServer struct { - server *server.Server - *proto.UnimplementedTeamServer -} - -func newServer(server *server.Server) *rpcServer { - return &rpcServer{ - server: server, - UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, - } -} - -// GetVersion returns the teamserver version. -func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { - ver, err := ts.server.Version() - - return &proto.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, err -} - -// GetUsers returns the list of teamserver users and their status. -func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { - users, err := ts.server.Users() - - userspb := make([]*proto.User, len(users)) - for i, user := range users { - userspb[i] = &proto.User{ - Name: user.Name, - Online: user.Online, - LastSeen: user.LastSeen.Unix(), - Clients: int32(user.Clients), - } - } - - return &proto.Users{Users: userspb}, err -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/server.go b/vendor/github.com/reeflective/team/transports/grpc/server/server.go deleted file mode 100644 index e86a01baa5..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/server/server.go +++ /dev/null @@ -1,204 +0,0 @@ -package server - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "net" - "runtime/debug" - "sync" - - teamserver "github.com/reeflective/team/server" - clientConn "github.com/reeflective/team/transports/grpc/client" - "github.com/reeflective/team/transports/grpc/proto" - "google.golang.org/grpc" - "google.golang.org/grpc/test/bufconn" -) - -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - bufSize = 2 * mb - - // ServerMaxMessageSize - Server-side max GRPC message size. - ServerMaxMessageSize = 2*gb - 1 -) - -// Teamserver is a simple example gRPC teamserver listener and server backend. -// This server can handle both remote and local (in-memory) connections, provided -// that it is being created with the correct grpc.Server options. -// -// This teamserver embeds a team/server.Server core driver and uses it for fetching -// server-side TLS configurations, use its loggers and access its database/users/list. -// -// By default, the server has no grpc.Server options attached. -// Please see the other functions of this package for pre-configured option sets. -type Teamserver struct { - *teamserver.Server - - options []grpc.ServerOption - conn *bufconn.Listener - mutex *sync.RWMutex - - hooks []func(server *grpc.Server) error -} - -// NewListener is a simple constructor returning a teamserver loaded with the -// provided list of server options. By default the server does not come with any. -func NewListener(opts ...grpc.ServerOption) *Teamserver { - listener := &Teamserver{ - mutex: &sync.RWMutex{}, - } - - listener.options = append(listener.options, opts...) - - return listener -} - -// NewClientFrom requires an existing grpc Teamserver to create an in-memory -// connection bound to both the teamserver and the teamclient backends. -// It returns a teamclient meant to be ran in memory, with TLS credentials disabled. -func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientConn.Teamclient { - conn := bufconn.Listen(bufSize) - - ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { - return conn.Dial() - }) - - opts = append(opts, []grpc.DialOption{ - ctxDialer, - grpc.WithInsecure(), - }...) - - // The server will use this conn as a listener. - // The reference is dropped after server start. - server.conn = conn - - return clientConn.NewTeamClient(opts...) -} - -// Name immplements team/server.Handler.Name(). -// It indicates the transport/rpc stack, in this case "gRPC". -func (h *Teamserver) Name() string { - return "gRPC" -} - -// PostServe registers one or more hook functions to be ran on the server -// before it is served to the listener. These hooks should naturally be -// used to register additional services to it. -func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { - h.hooks = append(h.hooks, hooks...) -} - -// Init implements team/server.Handler.Init(). -// It is used to initialize the listener with the correct TLS credentials -// middleware (or absence of if about to serve an in-memory connection). -func (h *Teamserver) Init(serv *teamserver.Server) (err error) { - h.Server = serv - - h.options, err = LogMiddlewareOptions(h.Server) - if err != nil { - return err - } - - // Logging/authentication/audit - serverOptions, err := h.initAuthMiddleware() - if err != nil { - return err - } - - h.options = append(h.options, serverOptions...) - - return nil -} - -// Listen implements team/server.Handler.Listen(). -// It starts listening on a network address for incoming gRPC clients. -// If the teamserver has previously been given an in-memory connection, -// it returns it as the listener without errors. -func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { - rpcLog := h.NamedLogger("transport", "mTLS") - - // Only wrap the connection in TLS when remote. - // In-memory connection are not authenticated. - if h.conn == nil { - ln, err = net.Listen("tcp", addr) - if err != nil { - return nil, err - } - - // Encryption. - tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) - if err != nil { - return nil, err - } - - h.options = append(h.options, tlsOptions...) - } else { - h.mutex.Lock() - ln = h.conn - h.conn = nil - h.mutex.Unlock() - } - - grpcServer := grpc.NewServer(h.options...) - - // Register the core teamserver service - proto.RegisterTeamServer(grpcServer, newServer(h.Server)) - - for _, hook := range h.hooks { - if err := hook(grpcServer); err != nil { - rpcLog.Errorf("service bind error: %s", err) - return nil, err - } - } - - rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) - - // Start serving the listener - go func() { - panicked := true - defer func() { - if panicked { - rpcLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - - if err := grpcServer.Serve(ln); err != nil { - rpcLog.Errorf("gRPC server exited with error: %v", err) - } else { - panicked = false - } - }() - - return ln, nil -} - -// Close implements team/server.Handler.Close(). -// In this implementation, the function does nothing. Thus the underlying -// *grpc.Server.Shutdown() method is not called, and only the listener -// will be closed by the server automatically when using CloseListener(). -// -// This is probably not optimal from a resource usage standpoint, but currently it -// fits most use cases. Feel free to reimplement or propose changes to this lib. -func (h *Teamserver) Close() error { - return nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index b74b65565f..4a534c0b54 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -549,10 +549,8 @@ github.com/reeflective/team/internal/systemd github.com/reeflective/team/internal/version github.com/reeflective/team/server github.com/reeflective/team/server/commands -github.com/reeflective/team/transports/grpc/client github.com/reeflective/team/transports/grpc/common github.com/reeflective/team/transports/grpc/proto -github.com/reeflective/team/transports/grpc/server # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft From b4f49caa35ef5d45acd2f44ff59466c6ba33378e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 23:37:14 +0200 Subject: [PATCH 032/109] Update team module dep --- vendor/github.com/reeflective/team/server/server.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index f9bcbd9686..27f04b743d 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -24,6 +24,7 @@ import ( "os" "os/signal" "regexp" + "runtime/debug" "syscall" "github.com/reeflective/team/client" @@ -114,11 +115,11 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er log.Debugf("No port specified, using config file default: %d", port) } - // defer func() { - // if r := recover(); r != nil { - // log.Errorf("panic:\n%s", debug.Stack()) - // } - // }() + defer func() { + if r := recover(); r != nil { + log.Errorf("panic:\n%s", debug.Stack()) + } + }() // Start the listener. log.Infof("Starting %s teamserver daemon on %s:%d ...", ts.Name(), host, port) From 0cbdadb455c349e55d8a28f64e6ac68262ded05a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 24 Jul 2023 17:44:43 +0200 Subject: [PATCH 033/109] Don't stream client output when completing --- client/cli/cli.go | 11 ++++++++++- client/console/console.go | 36 ++++++++++++++++++++++-------------- server/cli/cli.go | 11 ++++++++++- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 2137861e79..7793396d72 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -113,7 +113,16 @@ func getSliverCommands(con *client.SliverClient) (server, sliver console.Command // Before running any CLI entry command, require the Sliver client to connect to a teamserver. func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(_ *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, _ []string) error { + // Don't stream console asciicast/logs when using the completion subcommand. + // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + con.IsCompleting = true + break + } + } + return con.Teamclient.Connect() } } diff --git a/client/console/console.go b/client/console/console.go index aa583a7a3a..52e66c8e38 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -93,20 +93,23 @@ type ( ) type SliverClient struct { - App *console.Console + // Core client + Teamclient *client.Client + App *console.Console + IsServer bool + IsCLI bool + IsCompleting bool + + jsonHandler slog.Handler + printf func(format string, args ...any) (int, error) + + // Sliver-specific Rpc rpcpb.SliverRPCClient ActiveTarget *ActiveTarget EventListeners *sync.Map BeaconTaskCallbacks map[string]BeaconTaskCallback BeaconTaskCallbacksMutex *sync.Mutex Settings *assets.ClientSettings - IsServer bool - IsCLI bool - - jsonHandler slog.Handler - printf func(format string, args ...any) (int, error) - - Teamclient *client.Client } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -210,23 +213,28 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { go con.startEventLoop() go core.TunnelLoop(con.Rpc) - // console logger - if con.Settings.ConsoleLogs { + // Don't stream console logs and asciicast when the client + // is used within a completion subcommand: not only this + // output is not useful to anyone, but this strongly increases + // changes of stdio being wired to pipes it should not, etc. + if !con.IsCompleting && con.Settings.ConsoleLogs { // Classic logs consoleLog := getConsoleLogFile() + consoleLogStream, err := con.ClientLogStream("json") if err != nil { - log.Printf("Could not get client log stream: %s", err) + fmt.Printf("Could not get client log stream: %s", err) } + con.setupLogger(consoleLog, consoleLogStream) // defer consoleLog.Close() // // Ascii cast sessions (complete terminal interface). - // asciicastLog := getConsoleAsciicastFile() + asciicastLog := getConsoleAsciicastFile() // defer asciicastLog.Close() - // asciicastStream, err := con.ClientLogStream("asciicast") - // con.setupAsciicastRecord(asciicastLog, asciicastStream) + asciicastStream, err := con.ClientLogStream("asciicast") + con.setupAsciicastRecord(asciicastLog, asciicastStream) } } diff --git a/server/cli/cli.go b/server/cli/cli.go index 0ad8ad71eb..bea28110b7 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -189,7 +189,7 @@ func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (ser // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(_ *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, _ []string) error { // Ensure the server has what it needs. assets.Setup(false, true) encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? @@ -202,6 +202,15 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c serverConfig := configs.GetServerConfig() c2.StartPersistentJobs(serverConfig) + // Don't stream console asciicast/logs when using the completion subcommand. + // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + con.IsCompleting = true + break + } + } + // Let our in-memory teamclient be served. return teamserver.Serve(con.Teamclient) } From cc48d602d44eb4ab3dc04dba5dce4b5d35083d57 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 24 Jul 2023 20:41:47 +0200 Subject: [PATCH 034/109] Test caching completions. Much better --- client/command/beacons/beacons.go | 12 ++++++------ client/command/beacons/commands.go | 9 ++++----- client/command/beacons/helpers.go | 9 ++++----- client/command/beacons/prune.go | 5 ++--- client/command/beacons/rm.go | 5 ++--- client/command/beacons/watch.go | 5 ++--- client/command/generate/helpers.go | 3 ++- client/command/settings/tables.go | 27 +++++++++++++++++++++++++++ client/console/console.go | 6 +++--- 9 files changed, 52 insertions(+), 29 deletions(-) diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 5abfa659c9..81b77a7bcf 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -24,18 +24,17 @@ import ( "strings" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" ) -// BeaconsCmd - Display/interact with beacons +// BeaconsCmd - Display/interact with beacons. func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { killFlag, _ := cmd.Flags().GetString("kill") killAll, _ := cmd.Flags().GetBool("kill-all") @@ -93,7 +92,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintBeacons(beacons.Beacons, filter, filterRegex, con) } -// PrintBeacons - Display a list of beacons +// PrintBeacons - Display a list of beacons. func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { if len(beacons) == 0 { con.PrintInfof("No beacons 🙁\n") @@ -112,6 +111,7 @@ func renderBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regex tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) wideTermWidth := con.Settings.SmallTermWidth < width + settings.SetMaxTableSize(tw) if wideTermWidth { tw.AppendHeader(table.Row{ "ID", diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 9849017446..d44057c482 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -5,15 +5,14 @@ import ( "fmt" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -78,7 +77,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{beaconsCmd} } -// BeaconIDCompleter completes beacon IDs +// BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index 37473b9975..15125dbd63 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -27,22 +27,21 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" ) var ( - // ErrNoBeacons - No sessions available + // ErrNoBeacons - No sessions available. ErrNoBeacons = errors.New("no beacons") - // ErrNoSelection - No selection made + // ErrNoSelection - No selection made. ErrNoSelection = errors.New("no selection") - // ErrBeaconNotFound + // ErrBeaconNotFound. ErrBeaconNotFound = errors.New("no beacon found for this ID") ) -// SelectBeacon - Interactive menu for the user to select an session, optionally only display live sessions +// SelectBeacon - Interactive menu for the user to select an session, optionally only display live sessions. func SelectBeacon(con *console.SliverClient) (*clientpb.Beacon, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index b3e48cd0dd..b1a7910d9f 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -22,14 +22,13 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// BeaconsPruneCmd - Prune stale beacons automatically +// BeaconsPruneCmd - Prune stale beacons automatically. func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { duration, _ := cmd.Flags().GetString("duration") pruneDuration, err := time.ParseDuration(duration) diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index c8974b5d92..4924b6c8a1 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -19,12 +19,11 @@ package beacons */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// BeaconsRmCmd - Display/interact with beacons +// BeaconsRmCmd - Display/interact with beacons. func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := SelectBeacon(con) if err != nil { diff --git a/client/command/beacons/watch.go b/client/command/beacons/watch.go index f5a6699b75..242c365fb7 100644 --- a/client/command/beacons/watch.go +++ b/client/command/beacons/watch.go @@ -24,13 +24,12 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// BeaconsWatchCmd - Watch your beacons in real-ish time +// BeaconsWatchCmd - Watch your beacons in real-ish time. func BeaconsWatchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { done := waitForInput() defer func() { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index b545768661..186009bbfd 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -3,6 +3,7 @@ package generate import ( "context" "fmt" + "time" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -122,7 +123,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("operating systems") - }) + }).Cache(10 * time.Second) } // FormatCompleter completes build formats. diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index 951eb64627..fe02c42424 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -20,6 +20,7 @@ package settings import ( "fmt" + "os" "strings" "github.com/AlecAivazis/survey/v2" @@ -30,6 +31,21 @@ import ( "golang.org/x/term" ) +// Those variables are very important to realine low-level code: all virtual terminal +// escape sequences should always be sent and read through the raw terminal file, even +// if people start using io.MultiWriters and os.Pipes involving basic IO. +var ( + stdoutTerm *os.File + stdinTerm *os.File + stderrTerm *os.File +) + +func init() { + stdoutTerm = os.Stdout + stdoutTerm = os.Stderr + stderrTerm = os.Stdin +} + var ( tableStyles = map[string]table.Style{ // Sliver styles @@ -151,6 +167,17 @@ func GetTableWithBordersStyle(con *console.SliverClient) table.Style { return value } +// SetMaxTableSize automatically sets the maximum width of the table based on +// the current terminal width: excess columns are wrapped by the table itself. +func SetMaxTableSize(tb table.Writer) { + width, _, err := term.GetSize(int(stderrTerm.Fd())) + if err != nil { + width, _ = 80, 80 + } + + tb.SetAllowedRowLength(width) +} + // GetPageSize - Page size for tables. func GetPageSize() int { return 10 diff --git a/client/console/console.go b/client/console/console.go index 52e66c8e38..020953bb7f 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -230,11 +230,11 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { // defer consoleLog.Close() // // Ascii cast sessions (complete terminal interface). - asciicastLog := getConsoleAsciicastFile() + // asciicastLog := getConsoleAsciicastFile() // defer asciicastLog.Close() - asciicastStream, err := con.ClientLogStream("asciicast") - con.setupAsciicastRecord(asciicastLog, asciicastStream) + // asciicastStream, err := con.ClientLogStream("asciicast") + // con.setupAsciicastRecord(asciicastLog, asciicastStream) } } From 0c9f9186caf660b91707fdd4a20d3a2eebe1e40d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 25 Jul 2023 00:52:28 +0200 Subject: [PATCH 035/109] Fix of all client logstreams, optimized for completion Split console code in files. --- client/cli/cli.go | 4 +- client/command/server.go | 2 +- client/console/console.go | 649 ++++--------------------------------- client/console/events.go | 252 ++++++++++++++ client/console/implant.go | 191 +++++++++++ client/console/log.go | 78 ++++- client/console/readline.go | 158 +++++++++ client/transport/client.go | 4 + 8 files changed, 740 insertions(+), 598 deletions(-) create mode 100644 client/console/events.go create mode 100644 client/console/implant.go create mode 100644 client/console/readline.go diff --git a/client/cli/cli.go b/client/cli/cli.go index 7793396d72..7b54112e82 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -68,7 +68,7 @@ func Execute() { // Pre/post runners and completions. command.BindRunners(rootCmd, true, preRunClient(con)) - // command.BindRunners(rootCmd, false, postRunClient(con)) + command.BindRunners(rootCmd, false, postRunClient(con)) carapace.Gen(rootCmd) @@ -130,6 +130,6 @@ func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) e // After running any CLI entry command, correctly disconnect from the server. func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { return func(_ *cobra.Command, _ []string) error { - return con.Teamclient.Disconnect() + return con.Disconnect() } } diff --git a/client/command/server.go b/client/command/server.go index 714b77ed52..b76dc5a738 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -218,7 +218,7 @@ func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ if pre { cmdComps.PreRun(completionRun) } else { - cmdComps.PostRun(completionRun) + // cmdComps.PostRun(completionRun) } } } diff --git a/client/console/console.go b/client/console/console.go index 020953bb7f..8994f072ea 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -19,13 +19,10 @@ package console */ import ( - "bufio" "context" - "errors" "fmt" "io" "log" - insecureRand "math/rand" "os" "path/filepath" "strconv" @@ -36,21 +33,18 @@ import ( "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" - "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/gofrs/uuid" "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" - "google.golang.org/protobuf/proto" ) const ( @@ -100,8 +94,10 @@ type SliverClient struct { IsCLI bool IsCompleting bool + // Logging jsonHandler slog.Handler printf func(format string, args ...any) (int, error) + closeLogs func() // Sliver-specific Rpc rpcpb.SliverRPCClient @@ -122,7 +118,7 @@ func NewSliverClient(teamclient *transport.Teamclient) (*SliverClient, []client. bindClient := func(clientConn any) error { grpcClient, ok := clientConn.(*grpc.ClientConn) if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") + return client.ErrNoTeamclient } // Register our core Sliver RPC client, and start monitoring @@ -213,319 +209,66 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { go con.startEventLoop() go core.TunnelLoop(con.Rpc) - // Don't stream console logs and asciicast when the client - // is used within a completion subcommand: not only this - // output is not useful to anyone, but this strongly increases - // changes of stdio being wired to pipes it should not, etc. - if !con.IsCompleting && con.Settings.ConsoleLogs { - // Classic logs - consoleLog := getConsoleLogFile() - - consoleLogStream, err := con.ClientLogStream("json") - if err != nil { - fmt.Printf("Could not get client log stream: %s", err) - } - - con.setupLogger(consoleLog, consoleLogStream) - // defer consoleLog.Close() - // - // Ascii cast sessions (complete terminal interface). - // asciicastLog := getConsoleAsciicastFile() - // defer asciicastLog.Close() - - // asciicastStream, err := con.ClientLogStream("asciicast") - // con.setupAsciicastRecord(asciicastLog, asciicastStream) - } + // Stream logs/asciicasts + con.startClientLog() } -func (con *SliverClient) startEventLoop() { - eventStream, err := con.Rpc.Events(context.Background(), &commonpb.Empty{}) - if err != nil { - fmt.Printf(Warn+"%s\n", err) - return - } - for { - event, err := eventStream.Recv() - if err == io.EOF || event == nil { - return - } - - go con.triggerEventListeners(event) - - // Trigger event based on type - switch event.EventType { - - case consts.CanaryEvent: - con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (DNS Canary)", Normal, event.Session.Name) - sessions := con.GetSessionsByName(event.Session.Name) - for _, session := range sessions { - shortID := strings.Split(session.ID, "-")[0] - con.PrintErrorf("\t🔥 Session %s is affected", shortID) - } - - case consts.WatchtowerEvent: - msg := string(event.Data) - con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (seen on %s)", Normal, event.Session.Name, msg) - sessions := con.GetSessionsByName(event.Session.Name) - for _, session := range sessions { - shortID := strings.Split(session.ID, "-")[0] - con.PrintErrorf("\t🔥 Session %s is affected", shortID) - } - - case consts.JoinedEvent: - if con.Settings.UserConnect { - con.PrintInfof("%s has joined the game", event.Client.Operator.Name) - } - case consts.LeftEvent: - if con.Settings.UserConnect { - con.PrintInfof("%s left the game", event.Client.Operator.Name) - } - - case consts.JobStoppedEvent: - job := event.Job - con.PrintErrorf("Job #%d stopped (%s/%s)", job.ID, job.Protocol, job.Name) - - case consts.SessionOpenedEvent: - session := event.Session - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(session.ID, "-")[0] - con.PrintEventInfof("Session %s %s - %s (%s) - %s/%s - %v", - shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) - - // Prelude Operator - if prelude.ImplantMapper != nil { - err = prelude.ImplantMapper.AddImplant(session, nil) - if err != nil { - con.PrintErrorf("Could not add session to Operator: %s", err) - } - } - - case consts.SessionUpdateEvent: - session := event.Session - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(session.ID, "-")[0] - con.PrintInfof("Session %s has been updated - %v", shortID, currentTime) - - case consts.SessionClosedEvent: - session := event.Session - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(session.ID, "-")[0] - con.PrintEventErrorf("Lost session %s %s - %s (%s) - %s/%s - %v", - shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) - activeSession := con.ActiveTarget.GetSession() - core.GetTunnels().CloseForSession(session.ID) - core.CloseCursedProcesses(session.ID) - if activeSession != nil && activeSession.ID == session.ID { - con.ActiveTarget.Set(nil, nil) - con.PrintErrorf("Active session disconnected") - } - if prelude.ImplantMapper != nil { - err = prelude.ImplantMapper.RemoveImplant(session) - if err != nil { - con.PrintErrorf("Could not remove session from Operator: %s", err) - } - con.PrintInfof("Removed session %s from Operator", session.Name) - } - - case consts.BeaconRegisteredEvent: - beacon := &clientpb.Beacon{} - proto.Unmarshal(event.Data, beacon) - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(beacon.ID, "-")[0] - con.PrintEventInfof("Beacon %s %s - %s (%s) - %s/%s - %v", - shortID, beacon.Name, beacon.RemoteAddress, beacon.Hostname, beacon.OS, beacon.Arch, currentTime) - - // Prelude Operator - if prelude.ImplantMapper != nil { - err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) { - con.AddBeaconCallback(taskID, cb) - }) - if err != nil { - con.PrintErrorf("Could not add beacon to Operator: %s", err) - } - } - - case consts.BeaconTaskResultEvent: - con.triggerBeaconTaskCallback(event.Data) - } +func (con *SliverClient) Disconnect() error { + // Close all RPC streams and local files. + con.CloseClientLog() - con.triggerReactions(event) - } + // Close the RPC client connection. + return con.Teamclient.Disconnect() } -// CreateEventListener - creates a new event listener and returns its ID. -func (con *SliverClient) CreateEventListener() (string, <-chan *clientpb.Event) { - listener := make(chan *clientpb.Event, 100) - listenerID, _ := uuid.NewV4() - con.EventListeners.Store(listenerID.String(), listener) - return listenerID.String(), listener -} - -// RemoveEventListener - removes an event listener given its id. -func (con *SliverClient) RemoveEventListener(listenerID string) { - value, ok := con.EventListeners.LoadAndDelete(listenerID) - if ok { - close(value.(chan *clientpb.Event)) - } -} - -func (con *SliverClient) triggerEventListeners(event *clientpb.Event) { - con.EventListeners.Range(func(key, value interface{}) bool { - listener := value.(chan *clientpb.Event) - listener <- event // Do not block while sending the event to the listener - return true - }) -} +// Expose or hide commands if the active target does support them (or not). +// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. +func (con *SliverClient) ExposeCommands() { + con.App.ShowCommands() -func (con *SliverClient) triggerReactions(event *clientpb.Event) { - reactions := core.Reactions.On(event.EventType) - if len(reactions) == 0 { + if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { return } - // We need some special handling for SessionOpenedEvent to - // set the new session as the active session - currentActiveSession, currentActiveBeacon := con.ActiveTarget.Get() - defer func() { - con.ActiveTarget.Set(currentActiveSession, currentActiveBeacon) - }() - - if event.EventType == consts.SessionOpenedEvent { - con.ActiveTarget.Set(nil, nil) + filters := make([]string, 0) - con.ActiveTarget.Set(event.Session, nil) - } else if event.EventType == consts.BeaconRegisteredEvent { - con.ActiveTarget.Set(nil, nil) + // Target type. + switch { + case con.ActiveTarget.session != nil: + session := con.ActiveTarget.session - beacon := &clientpb.Beacon{} - proto.Unmarshal(event.Data, beacon) - con.ActiveTarget.Set(nil, beacon) - } + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) - for _, reaction := range reactions { - for _, line := range reaction.Commands { - con.PrintInfof(Bold+"Execute reaction: '%s'"+Normal, line) - err := con.App.ActiveMenu().RunCommand(line) - if err != nil { - con.PrintErrorf("Reaction command error: %s\n", err) - } + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) } - } -} -// triggerBeaconTaskCallback - Triggers the callback for a beacon task. -func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { - task := &clientpb.BeaconTask{} - err := proto.Unmarshal(data, task) - if err != nil { - con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) - return - } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) - - // If the callback is not in our map then we don't do anything, the beacon task - // was either issued by another operator in multiplayer mode or the client process - // was restarted between the time the task was created and when the server got the result - con.BeaconTaskCallbacksMutex.Lock() - defer con.BeaconTaskCallbacksMutex.Unlock() - if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { - if con.Settings.BeaconAutoResults { - if beacon != nil { - con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) - } - task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ - ID: task.ID, - }) - con.Printf(Clearln + "\r") - if err == nil { - callback(task_content) - } else { - con.PrintErrorf("Could not get beacon task content: %s", err) - } + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) } - delete(con.BeaconTaskCallbacks, task.ID) - } -} - -func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { - con.BeaconTaskCallbacksMutex.Lock() - defer con.BeaconTaskCallbacksMutex.Unlock() - con.BeaconTaskCallbacks[taskID] = callback -} -func (con *SliverClient) GetPrompt() string { - prompt := Underline + "sliver" + Normal - if con.IsServer { - prompt = Bold + "[server] " + Normal + Underline + "sliver" + Normal - } - if con.ActiveTarget.GetSession() != nil { - prompt += fmt.Sprintf(Bold+Red+" (%s)%s", con.ActiveTarget.GetSession().Name, Normal) - } else if con.ActiveTarget.GetBeacon() != nil { - prompt += fmt.Sprintf(Bold+Blue+" (%s)%s", con.ActiveTarget.GetBeacon().Name, Normal) - } - prompt += " > " - return Clearln + prompt -} + case con.ActiveTarget.beacon != nil: + beacon := con.ActiveTarget.beacon -func (con *SliverClient) PrintLogo() { - serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) - if err != nil { - panic(err.Error()) - } - dirty := "" - if serverVer.Dirty { - dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) - } - serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) - - logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] - fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) - fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") - fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) - if version.GitCommit != serverVer.Commit { - fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) - } - fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") - if serverVer.Major != int32(version.SemanticVersion()[0]) { - fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") - } - con.CheckLastUpdate() -} + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) -func (con *SliverClient) CheckLastUpdate() { - now := time.Now() - lastUpdate := getLastUpdateCheck() - compiledAt, err := version.Compiled() - if err != nil { - log.Printf("Failed to parse compiled at timestamp %s", err) - return - } + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } - day := 24 * time.Hour - if compiledAt.Add(30 * day).Before(now) { - if lastUpdate == nil || lastUpdate.Add(30*day).Before(now) { - con.Printf(Info + "Check for updates with the 'update' command\n\n") + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) } } -} -func getLastUpdateCheck() *time.Time { - appDir := assets.GetRootAppDir() - lastUpdateCheckPath := filepath.Join(appDir, consts.LastUpdateCheckFileName) - data, err := os.ReadFile(lastUpdateCheckPath) - if err != nil { - log.Printf("Failed to read last update check %s", err) - return nil - } - unixTime, err := strconv.Atoi(string(data)) - if err != nil { - log.Printf("Failed to parse last update check %s", err) - return nil - } - lastUpdate := time.Unix(int64(unixTime), 0) - return &lastUpdate + // Use all defined filters. + con.App.HideCommands(filters...) } func (con *SliverClient) GetSession(arg string) *clientpb.Session { @@ -586,25 +329,6 @@ func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { return config } -// exitConsole prompts the user for confirmation to exit the console. -func (c *SliverClient) exitConsole(_ *console.Console) { - reader := bufio.NewReader(os.Stdin) - fmt.Print("Confirm exit (Y/y, Ctrl-C): ") - text, _ := reader.ReadString('\n') - answer := strings.TrimSpace(text) - - if (answer == "Y") || (answer == "y") { - os.Exit(0) - } -} - -// exitImplantMenu uses the background command to detach from the implant menu. -func (c *SliverClient) exitImplantMenu(_ *console.Console) { - root := c.App.Menu(consts.ImplantMenu).Command - root.SetArgs([]string{"background"}) - root.Execute() -} - func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } @@ -651,281 +375,36 @@ func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, conte return context.WithTimeout(context.Background(), timeout) } -// -// -------------------------- [ Active Target ] -------------------------- -// - -type ActiveTarget struct { - session *clientpb.Session - beacon *clientpb.Beacon - observers map[int]Observer - observerID int - con *SliverClient -} - -// GetSessionInteractive - Get the active target(s). -func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { - if s.session == nil && s.beacon == nil { - fmt.Printf(Warn + "Please select a session or beacon via `use`\n") - return nil, nil - } - return s.session, s.beacon -} - -// GetSessionInteractive - Get the active target(s). -func (s *ActiveTarget) Get() (*clientpb.Session, *clientpb.Beacon) { - return s.session, s.beacon -} - -// GetSessionInteractive - GetSessionInteractive the active session. -func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { - if s.session == nil { - fmt.Printf(Warn + "Please select a session via `use`\n") - return nil - } - return s.session -} - -// GetSession - Same as GetSession() but doesn't print a warning. -func (s *ActiveTarget) GetSession() *clientpb.Session { - return s.session -} - -// GetBeaconInteractive - Get beacon interactive the active session. -func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { - if s.beacon == nil { - fmt.Printf(Warn + "Please select a beacon via `use`\n") - return nil - } - return s.beacon -} - -// GetBeacon - Same as GetBeacon() but doesn't print a warning. -func (s *ActiveTarget) GetBeacon() *clientpb.Beacon { - return s.beacon -} - -// IsSession - Is the current target a session? -func (s *ActiveTarget) IsSession() bool { - return s.session != nil -} - -// AddObserver - Observers to notify when the active session changes. -func (s *ActiveTarget) AddObserver(observer Observer) int { - s.observerID++ - s.observers[s.observerID] = observer - return s.observerID -} - -func (s *ActiveTarget) RemoveObserver(observerID int) { - delete(s.observers, observerID) -} - -func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { - if s.session == nil && s.beacon == nil { - return nil - } - - // One less than the gRPC timeout so that the server should timeout first - timeOutF := int64(defaultTimeout) - 1 - if cmd != nil { - timeOutF, _ = cmd.Flags().GetInt64("timeout") - } - timeout := (int64(time.Second) * timeOutF) - 1 - - req := &commonpb.Request{} - req.Timeout = timeout - - if s.session != nil { - req.Async = false - req.SessionID = s.session.ID - } - if s.beacon != nil { - req.Async = true - req.BeaconID = s.beacon.ID - } - return req -} - -// Set - Change the active session. -func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { - if session != nil && beacon != nil { - s.con.PrintErrorf("cannot set both an active beacon and an active session") - return - } - - defer s.con.ExposeCommands() - - // Backgrounding - if session == nil && beacon == nil { - s.session = nil - s.beacon = nil - for _, observer := range s.observers { - observer(s.session, s.beacon) - } - - if s.con.IsCLI { - return - } - - // Switch back to server menu. - if s.con.App.ActiveMenu().Name() == consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ServerMenu) - } - +func (con *SliverClient) CheckLastUpdate() { + now := time.Now() + lastUpdate := getLastUpdateCheck() + compiledAt, err := version.Compiled() + if err != nil { + log.Printf("Failed to parse compiled at timestamp %s", err) return } - // Foreground - if session != nil { - s.session = session - s.beacon = nil - for _, observer := range s.observers { - observer(s.session, s.beacon) - } - } else if beacon != nil { - s.beacon = beacon - s.session = nil - for _, observer := range s.observers { - observer(s.session, s.beacon) + day := 24 * time.Hour + if compiledAt.Add(30 * day).Before(now) { + if lastUpdate == nil || lastUpdate.Add(30*day).Before(now) { + con.Printf(Info + "Check for updates with the 'update' command\n\n") } } - - if s.con.IsCLI { - return - } - - // Update menus, prompts and commands - if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ImplantMenu) - } -} - -// Background - Background the active session. -func (s *ActiveTarget) Background() { - defer s.con.App.ShowCommands() - - s.session = nil - s.beacon = nil - for _, observer := range s.observers { - observer(nil, nil) - } - - // Switch back to server menu. - if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ServerMenu) - } } -// Expose or hide commands if the active target does support them (or not). -// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -func (con *SliverClient) ExposeCommands() { - con.App.ShowCommands() - - if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { - return +func getLastUpdateCheck() *time.Time { + appDir := assets.GetRootAppDir() + lastUpdateCheckPath := filepath.Join(appDir, consts.LastUpdateCheckFileName) + data, err := os.ReadFile(lastUpdateCheckPath) + if err != nil { + log.Printf("Failed to read last update check %s", err) + return nil } - - filters := make([]string, 0) - - // Target type. - switch { - case con.ActiveTarget.session != nil: - session := con.ActiveTarget.session - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case con.ActiveTarget.beacon != nil: - beacon := con.ActiveTarget.beacon - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } + unixTime, err := strconv.Atoi(string(data)) + if err != nil { + log.Printf("Failed to parse last update check %s", err) + return nil } - - // Use all defined filters. - con.App.HideCommands(filters...) -} - -var abilities = []string{ - "first strike", - "vigilance", - "haste", - "indestructible", - "hexproof", - "deathtouch", - "fear", - "epic", - "ninjitsu", - "recover", - "persist", - "conspire", - "reinforce", - "exalted", - "annihilator", - "infect", - "undying", - "living weapon", - "miracle", - "scavenge", - "cipher", - "evolve", - "dethrone", - "hidden agenda", - "prowess", - "dash", - "exploit", - "renown", - "skulk", - "improvise", - "assist", - "jump-start", -} - -var asciiLogos = []string{ - Red + ` - ██████ ██▓ ██▓ ██▒ █▓▓█████ ██▀███ - ▒██ ▒ ▓██▒ ▓██▒▓██░ █▒▓█ ▀ ▓██ ▒ ██▒ - ░ ▓██▄ ▒██░ ▒██▒ ▓██ █▒░▒███ ▓██ ░▄█ ▒ - ▒ ██▒▒██░ ░██░ ▒██ █░░▒▓█ ▄ ▒██▀▀█▄ - ▒██████▒▒░██████▒░██░ ▒▀█░ ░▒████▒░██▓ ▒██▒ - ▒ ▒▓▒ ▒ ░░ ▒░▓ ░░▓ ░ ▐░ ░░ ▒░ ░░ ▒▓ ░▒▓░ - ░ ░▒ ░ ░░ ░ ▒ ░ ▒ ░ ░ ░░ ░ ░ ░ ░▒ ░ ▒░ - ░ ░ ░ ░ ░ ▒ ░ ░░ ░ ░░ ░ - ░ ░ ░ ░ ░ ░ ░ ░ -` + Normal, - - Green + ` - ███████╗██╗ ██╗██╗ ██╗███████╗██████╗ - ██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗ - ███████╗██║ ██║██║ ██║█████╗ ██████╔╝ - ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗ - ███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║ - ╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ -` + Normal, - - Bold + Gray + ` -.------..------..------..------..------..------. -|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. | -| :/\: || :/\: || (\/) || :(): || (\/) || :(): | -| :\/: || (__) || :\/: || ()() || :\/: || ()() | -| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R| -` + "`------'`------'`------'`------'`------'`------'" + ` -` + Normal, + lastUpdate := time.Unix(int64(unixTime), 0) + return &lastUpdate } diff --git a/client/console/events.go b/client/console/events.go new file mode 100644 index 0000000000..ab2c660141 --- /dev/null +++ b/client/console/events.go @@ -0,0 +1,252 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "fmt" + "io" + "strings" + "time" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/core" + "github.com/bishopfox/sliver/client/prelude" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/gofrs/uuid" + "google.golang.org/protobuf/proto" +) + +func (con *SliverClient) startEventLoop() { + eventStream, err := con.Rpc.Events(context.Background(), &commonpb.Empty{}) + if err != nil { + fmt.Printf(Warn+"%s\n", err) + return + } + for { + event, err := eventStream.Recv() + if err == io.EOF || event == nil { + return + } + + go con.triggerEventListeners(event) + + // Trigger event based on type + switch event.EventType { + + case consts.CanaryEvent: + con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (DNS Canary)", Normal, event.Session.Name) + sessions := con.GetSessionsByName(event.Session.Name) + for _, session := range sessions { + shortID := strings.Split(session.ID, "-")[0] + con.PrintErrorf("\t🔥 Session %s is affected", shortID) + } + + case consts.WatchtowerEvent: + msg := string(event.Data) + con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (seen on %s)", Normal, event.Session.Name, msg) + sessions := con.GetSessionsByName(event.Session.Name) + for _, session := range sessions { + shortID := strings.Split(session.ID, "-")[0] + con.PrintErrorf("\t🔥 Session %s is affected", shortID) + } + + case consts.JoinedEvent: + if con.Settings.UserConnect { + con.PrintInfof("%s has joined the game", event.Client.Operator.Name) + } + case consts.LeftEvent: + if con.Settings.UserConnect { + con.PrintInfof("%s left the game", event.Client.Operator.Name) + } + + case consts.JobStoppedEvent: + job := event.Job + con.PrintErrorf("Job #%d stopped (%s/%s)", job.ID, job.Protocol, job.Name) + + case consts.SessionOpenedEvent: + session := event.Session + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(session.ID, "-")[0] + con.PrintEventInfof("Session %s %s - %s (%s) - %s/%s - %v", + shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) + + // Prelude Operator + if prelude.ImplantMapper != nil { + err = prelude.ImplantMapper.AddImplant(session, nil) + if err != nil { + con.PrintErrorf("Could not add session to Operator: %s", err) + } + } + + case consts.SessionUpdateEvent: + session := event.Session + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(session.ID, "-")[0] + con.PrintInfof("Session %s has been updated - %v", shortID, currentTime) + + case consts.SessionClosedEvent: + session := event.Session + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(session.ID, "-")[0] + con.PrintEventErrorf("Lost session %s %s - %s (%s) - %s/%s - %v", + shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) + activeSession := con.ActiveTarget.GetSession() + core.GetTunnels().CloseForSession(session.ID) + core.CloseCursedProcesses(session.ID) + if activeSession != nil && activeSession.ID == session.ID { + con.ActiveTarget.Set(nil, nil) + con.PrintErrorf("Active session disconnected") + } + if prelude.ImplantMapper != nil { + err = prelude.ImplantMapper.RemoveImplant(session) + if err != nil { + con.PrintErrorf("Could not remove session from Operator: %s", err) + } + con.PrintInfof("Removed session %s from Operator", session.Name) + } + + case consts.BeaconRegisteredEvent: + beacon := &clientpb.Beacon{} + proto.Unmarshal(event.Data, beacon) + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(beacon.ID, "-")[0] + con.PrintEventInfof("Beacon %s %s - %s (%s) - %s/%s - %v", + shortID, beacon.Name, beacon.RemoteAddress, beacon.Hostname, beacon.OS, beacon.Arch, currentTime) + + // Prelude Operator + if prelude.ImplantMapper != nil { + err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) { + con.AddBeaconCallback(taskID, cb) + }) + if err != nil { + con.PrintErrorf("Could not add beacon to Operator: %s", err) + } + } + + case consts.BeaconTaskResultEvent: + con.triggerBeaconTaskCallback(event.Data) + } + + con.triggerReactions(event) + } +} + +// CreateEventListener - creates a new event listener and returns its ID. +func (con *SliverClient) CreateEventListener() (string, <-chan *clientpb.Event) { + listener := make(chan *clientpb.Event, 100) + listenerID, _ := uuid.NewV4() + con.EventListeners.Store(listenerID.String(), listener) + return listenerID.String(), listener +} + +// RemoveEventListener - removes an event listener given its id. +func (con *SliverClient) RemoveEventListener(listenerID string) { + value, ok := con.EventListeners.LoadAndDelete(listenerID) + if ok { + close(value.(chan *clientpb.Event)) + } +} + +func (con *SliverClient) triggerEventListeners(event *clientpb.Event) { + con.EventListeners.Range(func(key, value interface{}) bool { + listener := value.(chan *clientpb.Event) + listener <- event // Do not block while sending the event to the listener + return true + }) +} + +func (con *SliverClient) triggerReactions(event *clientpb.Event) { + reactions := core.Reactions.On(event.EventType) + if len(reactions) == 0 { + return + } + + // We need some special handling for SessionOpenedEvent to + // set the new session as the active session + currentActiveSession, currentActiveBeacon := con.ActiveTarget.Get() + defer func() { + con.ActiveTarget.Set(currentActiveSession, currentActiveBeacon) + }() + + if event.EventType == consts.SessionOpenedEvent { + con.ActiveTarget.Set(nil, nil) + + con.ActiveTarget.Set(event.Session, nil) + } else if event.EventType == consts.BeaconRegisteredEvent { + con.ActiveTarget.Set(nil, nil) + + beacon := &clientpb.Beacon{} + proto.Unmarshal(event.Data, beacon) + con.ActiveTarget.Set(nil, beacon) + } + + for _, reaction := range reactions { + for _, line := range reaction.Commands { + con.PrintInfof(Bold+"Execute reaction: '%s'"+Normal, line) + err := con.App.ActiveMenu().RunCommand(line) + if err != nil { + con.PrintErrorf("Reaction command error: %s\n", err) + } + } + } +} + +// triggerBeaconTaskCallback - Triggers the callback for a beacon task. +func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { + task := &clientpb.BeaconTask{} + err := proto.Unmarshal(data, task) + if err != nil { + con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) + return + } + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) + + // If the callback is not in our map then we don't do anything, the beacon task + // was either issued by another operator in multiplayer mode or the client process + // was restarted between the time the task was created and when the server got the result + con.BeaconTaskCallbacksMutex.Lock() + defer con.BeaconTaskCallbacksMutex.Unlock() + if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { + if con.Settings.BeaconAutoResults { + if beacon != nil { + con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) + } + task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ + ID: task.ID, + }) + con.Printf(Clearln + "\r") + if err == nil { + callback(task_content) + } else { + con.PrintErrorf("Could not get beacon task content: %s", err) + } + } + delete(con.BeaconTaskCallbacks, task.ID) + } +} + +func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { + con.BeaconTaskCallbacksMutex.Lock() + defer con.BeaconTaskCallbacksMutex.Unlock() + con.BeaconTaskCallbacks[taskID] = callback +} diff --git a/client/console/implant.go b/client/console/implant.go new file mode 100644 index 0000000000..7d98d8a129 --- /dev/null +++ b/client/console/implant.go @@ -0,0 +1,191 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "time" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" +) + +type ActiveTarget struct { + session *clientpb.Session + beacon *clientpb.Beacon + observers map[int]Observer + observerID int + con *SliverClient +} + +// GetSessionInteractive - Get the active target(s). +func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { + if s.session == nil && s.beacon == nil { + fmt.Printf(Warn + "Please select a session or beacon via `use`\n") + return nil, nil + } + return s.session, s.beacon +} + +// GetSessionInteractive - Get the active target(s). +func (s *ActiveTarget) Get() (*clientpb.Session, *clientpb.Beacon) { + return s.session, s.beacon +} + +// GetSessionInteractive - GetSessionInteractive the active session. +func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { + if s.session == nil { + fmt.Printf(Warn + "Please select a session via `use`\n") + return nil + } + return s.session +} + +// GetSession - Same as GetSession() but doesn't print a warning. +func (s *ActiveTarget) GetSession() *clientpb.Session { + return s.session +} + +// GetBeaconInteractive - Get beacon interactive the active session. +func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { + if s.beacon == nil { + fmt.Printf(Warn + "Please select a beacon via `use`\n") + return nil + } + return s.beacon +} + +// GetBeacon - Same as GetBeacon() but doesn't print a warning. +func (s *ActiveTarget) GetBeacon() *clientpb.Beacon { + return s.beacon +} + +// IsSession - Is the current target a session? +func (s *ActiveTarget) IsSession() bool { + return s.session != nil +} + +// AddObserver - Observers to notify when the active session changes. +func (s *ActiveTarget) AddObserver(observer Observer) int { + s.observerID++ + s.observers[s.observerID] = observer + return s.observerID +} + +func (s *ActiveTarget) RemoveObserver(observerID int) { + delete(s.observers, observerID) +} + +func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { + if s.session == nil && s.beacon == nil { + return nil + } + + // One less than the gRPC timeout so that the server should timeout first + timeOutF := int64(defaultTimeout) - 1 + if cmd != nil { + timeOutF, _ = cmd.Flags().GetInt64("timeout") + } + timeout := (int64(time.Second) * timeOutF) - 1 + + req := &commonpb.Request{} + req.Timeout = timeout + + if s.session != nil { + req.Async = false + req.SessionID = s.session.ID + } + if s.beacon != nil { + req.Async = true + req.BeaconID = s.beacon.ID + } + return req +} + +// Set - Change the active session. +func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { + if session != nil && beacon != nil { + s.con.PrintErrorf("cannot set both an active beacon and an active session") + return + } + + defer s.con.ExposeCommands() + + // Backgrounding + if session == nil && beacon == nil { + s.session = nil + s.beacon = nil + for _, observer := range s.observers { + observer(s.session, s.beacon) + } + + if s.con.IsCLI { + return + } + + // Switch back to server menu. + if s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ServerMenu) + } + + return + } + + // Foreground + if session != nil { + s.session = session + s.beacon = nil + for _, observer := range s.observers { + observer(s.session, s.beacon) + } + } else if beacon != nil { + s.beacon = beacon + s.session = nil + for _, observer := range s.observers { + observer(s.session, s.beacon) + } + } + + if s.con.IsCLI { + return + } + + // Update menus, prompts and commands + if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ImplantMenu) + } +} + +// Background - Background the active session. +func (s *ActiveTarget) Background() { + defer s.con.App.ShowCommands() + + s.session = nil + s.beacon = nil + for _, observer := range s.observers { + observer(nil, nil) + } + + // Switch back to server menu. + if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ServerMenu) + } +} diff --git a/client/console/log.go b/client/console/log.go index dde03bf9d2..740074908a 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,6 +51,60 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } +func (con *SliverClient) startClientLog() error { + if con.IsCompleting { + return nil + } + + if !con.Settings.ConsoleLogs { + return nil + } + + // Classic logs. + clientLogFile := getConsoleLogFile() + + clientLogs, err := con.ClientLogStream("json") + if err != nil { + return fmt.Errorf("Could not get client log stream: %w", err) + } + + con.setupLogger(clientLogFile, clientLogs) + + // Asciicast sessions. + asciicastFile := getConsoleAsciicastFile() + + asciicastStream, err := con.ClientLogStream("asciicast") + if err != nil { + return fmt.Errorf("Could not get client log stream: %w", err) + } + + err = con.setupAsciicastRecord(asciicastFile, asciicastStream) + + con.closeLogs = func() { + // Local files + clientLogFile.Close() + asciicastFile.Close() + + // Server streams. + clientLogs.Stream.CloseAndRecv() + asciicastStream.Stream.CloseAndRecv() + } + + return nil +} + +func (con *SliverClient) CloseClientLog() { + if con.closeLogs == nil { + return + } + + defer func() { + con.closeLogs = nil + }() + + con.closeLogs() +} + // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { @@ -82,31 +136,35 @@ func (con *SliverClient) logCommand(args []string) ([]string, error) { return args, nil } -func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) { - x, y, err := term.GetSize(int(os.Stdin.Fd())) +func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) error { + width, height, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { - x, y = 80, 80 + width, height = 80, 80 } // Save the asciicast to the server and a local file. destinations := io.MultiWriter(logFile, server) - encoder := asciicast.NewEncoder(destinations, x, y) - encoder.WriteHeader() + encoder := asciicast.NewEncoder(destinations, width, height) + if err := encoder.WriteHeader(); err != nil { + return err + } // save existing stdout | MultiWriter writes to saved stdout and file out := os.Stdout - mw := io.MultiWriter(out, encoder) + multiOut := io.MultiWriter(out, encoder) // get pipe reader and writer | writes to pipe writer come out pipe reader - r, w, _ := os.Pipe() + read, write, _ := os.Pipe() // replace stdout,stderr with pipe writer | all writes to stdout, // stderr will go through pipe instead (fmt.print, log) - os.Stdout = w - os.Stderr = w + os.Stdout = write + os.Stderr = write + + go io.Copy(multiOut, read) - go io.Copy(mw, r) + return nil } func getConsoleLogFile() *os.File { diff --git a/client/console/readline.go b/client/console/readline.go new file mode 100644 index 0000000000..3f1f65e1e7 --- /dev/null +++ b/client/console/readline.go @@ -0,0 +1,158 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bufio" + "context" + "fmt" + insecureRand "math/rand" + "os" + "strings" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/version" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/reeflective/console" +) + +func (con *SliverClient) GetPrompt() string { + prompt := Underline + "sliver" + Normal + if con.IsServer { + prompt = Bold + "[server] " + Normal + Underline + "sliver" + Normal + } + if con.ActiveTarget.GetSession() != nil { + prompt += fmt.Sprintf(Bold+Red+" (%s)%s", con.ActiveTarget.GetSession().Name, Normal) + } else if con.ActiveTarget.GetBeacon() != nil { + prompt += fmt.Sprintf(Bold+Blue+" (%s)%s", con.ActiveTarget.GetBeacon().Name, Normal) + } + prompt += " > " + return Clearln + prompt +} + +func (con *SliverClient) PrintLogo() { + serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + if err != nil { + panic(err.Error()) + } + dirty := "" + if serverVer.Dirty { + dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) + } + serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) + + logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] + fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) + fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") + fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) + if version.GitCommit != serverVer.Commit { + fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) + } + fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") + if serverVer.Major != int32(version.SemanticVersion()[0]) { + fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") + } + con.CheckLastUpdate() +} + +// exitConsole prompts the user for confirmation to exit the console. +func (c *SliverClient) exitConsole(_ *console.Console) { + reader := bufio.NewReader(os.Stdin) + fmt.Print("Confirm exit (Y/y, Ctrl-C): ") + text, _ := reader.ReadString('\n') + answer := strings.TrimSpace(text) + + if (answer == "Y") || (answer == "y") { + os.Exit(0) + } +} + +// exitImplantMenu uses the background command to detach from the implant menu. +func (c *SliverClient) exitImplantMenu(_ *console.Console) { + root := c.App.Menu(consts.ImplantMenu).Command + root.SetArgs([]string{"background"}) + root.Execute() +} + +var abilities = []string{ + "first strike", + "vigilance", + "haste", + "indestructible", + "hexproof", + "deathtouch", + "fear", + "epic", + "ninjitsu", + "recover", + "persist", + "conspire", + "reinforce", + "exalted", + "annihilator", + "infect", + "undying", + "living weapon", + "miracle", + "scavenge", + "cipher", + "evolve", + "dethrone", + "hidden agenda", + "prowess", + "dash", + "exploit", + "renown", + "skulk", + "improvise", + "assist", + "jump-start", +} + +var asciiLogos = []string{ + Red + ` + ██████ ██▓ ██▓ ██▒ █▓▓█████ ██▀███ + ▒██ ▒ ▓██▒ ▓██▒▓██░ █▒▓█ ▀ ▓██ ▒ ██▒ + ░ ▓██▄ ▒██░ ▒██▒ ▓██ █▒░▒███ ▓██ ░▄█ ▒ + ▒ ██▒▒██░ ░██░ ▒██ █░░▒▓█ ▄ ▒██▀▀█▄ + ▒██████▒▒░██████▒░██░ ▒▀█░ ░▒████▒░██▓ ▒██▒ + ▒ ▒▓▒ ▒ ░░ ▒░▓ ░░▓ ░ ▐░ ░░ ▒░ ░░ ▒▓ ░▒▓░ + ░ ░▒ ░ ░░ ░ ▒ ░ ▒ ░ ░ ░░ ░ ░ ░ ░▒ ░ ▒░ + ░ ░ ░ ░ ░ ▒ ░ ░░ ░ ░░ ░ + ░ ░ ░ ░ ░ ░ ░ ░ +` + Normal, + + Green + ` + ███████╗██╗ ██╗██╗ ██╗███████╗██████╗ + ██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗ + ███████╗██║ ██║██║ ██║█████╗ ██████╔╝ + ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗ + ███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║ + ╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ +` + Normal, + + Bold + Gray + ` +.------..------..------..------..------..------. +|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. | +| :/\: || :/\: || (\/) || :(): || (\/) || :(): | +| :\/: || (__) || :\/: || ()() || :\/: || ()() | +| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R| +` + "`------'`------'`------'`------'`------'`------'" + ` +` + Normal, +} diff --git a/client/transport/client.go b/client/transport/client.go index 06130f59df..0440409d51 100644 --- a/client/transport/client.go +++ b/client/transport/client.go @@ -135,6 +135,10 @@ func (h *Teamclient) Dial() (rpcClient any, err error) { // Close implements team/client.Dialer.Close(), and closes the gRPC client connection. func (h *Teamclient) Close() error { + if h.conn == nil { + return nil + } + return h.conn.Close() } From e3d202661d61e8c04c4b792eb3e19e568c2026b8 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 25 Jul 2023 01:59:33 +0200 Subject: [PATCH 036/109] Find a way more efficient to pre-connect in completions --- client/cli/cli.go | 4 +- client/cli/implant.go | 64 ++++------------------- client/command/beacons/commands.go | 4 ++ client/command/crack/commands.go | 7 ++- client/command/crack/crack.go | 9 ++-- client/command/crack/helpers.go | 12 +++++ client/command/creds/creds.go | 8 +++ client/command/dllhijack/commands.go | 7 ++- client/command/dllhijack/dllhijack.go | 5 +- client/command/generate/helpers.go | 12 +++++ client/command/generate/implants.go | 4 ++ client/command/generate/profiles.go | 4 ++ client/command/jobs/jobs.go | 4 ++ client/command/loot/commands.go | 7 ++- client/command/loot/fetch.go | 5 +- client/command/loot/helpers.go | 13 +++-- client/command/loot/local.go | 5 +- client/command/loot/loot.go | 13 +++-- client/command/loot/remote.go | 9 ++-- client/command/loot/rename.go | 5 +- client/command/loot/rm.go | 3 +- client/command/pivots/commands.go | 7 ++- client/command/pivots/details.go | 9 ++-- client/command/pivots/helpers.go | 4 ++ client/command/pivots/stop.go | 5 +- client/command/rportfwd/portfwd.go | 4 ++ client/command/server.go | 14 ----- client/command/tasks/helpers.go | 8 +++ client/command/use/beacons.go | 5 +- client/command/use/commands.go | 7 ++- client/command/use/sessions.go | 5 +- client/command/use/use.go | 19 ++++--- client/command/websites/websites.go | 4 ++ client/command/wireguard/wg-portfwd-rm.go | 4 ++ client/command/wireguard/wg-socks.go | 4 ++ client/console/console.go | 23 +++++++- client/console/log.go | 42 +++++++-------- 37 files changed, 196 insertions(+), 172 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 7b54112e82..f29d61b7a1 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -64,12 +64,14 @@ func Execute() { // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - rootCmd.AddCommand(implantCmd(con)) // Pre/post runners and completions. command.BindRunners(rootCmd, true, preRunClient(con)) command.BindRunners(rootCmd, false, postRunClient(con)) + // For now don't include any pre-runners + rootCmd.AddCommand(implantCmd(con, sliverCmds)) + carapace.Gen(rootCmd) // Run the sliver client binary. diff --git a/client/cli/implant.go b/client/cli/implant.go index 6d609a7e19..2fa7537bd7 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -1,75 +1,29 @@ package cli import ( - "errors" - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" - "github.com/bishopfox/sliver/client/console" + client "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" ) -func implantCmd(con *console.SliverClient) *cobra.Command { - con.IsCLI = true - - makeCommands := command.SliverCommands(con) - cmd := makeCommands() - cmd.Use = constants.ImplantMenu +func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { + implantCmd := sliverCmds() + implantCmd.Use = constants.ImplantMenu - // Flags implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) implantFlags.StringP("use", "s", "", "interact with a session") - cmd.Flags().AddFlagSet(implantFlags) - - // Prerunners (console setup, connection, etc) - cmd.PersistentPreRunE, cmd.PersistentPostRunE = makeRunners(cmd, con) - - // Completions - makeCompleters(cmd, con) - - return cmd -} - -func makeRunners(implantCmd *cobra.Command, con *console.SliverClient) (pre, post func(cmd *cobra.Command, args []string) error) { - // startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient - - // The pre-run function connects to the server and sets up a "fake" console, - // so we can have access to active sessions/beacons, and other stuff needed. - pre = func(_ *cobra.Command, args []string) error { - // startConsole(implantCmd, args) - - // Set the active target. - target, _ := implantCmd.Flags().GetString("use") - if target == "" { - return errors.New("no target implant to run command on") - } + implantCmd.Flags().AddFlagSet(implantFlags) - session := con.GetSession(target) - if session != nil { - con.ActiveTarget.Set(session, nil) - } - - return nil - } - - return pre, nil -} - -func makeCompleters(cmd *cobra.Command, con *console.SliverClient) { - comps := carapace.Gen(cmd) - - comps.PreRun(func(cmd *cobra.Command, args []string) { - cmd.PersistentPreRunE(cmd, args) - }) - - // Bind completers to flags (wrap them to use the same pre-runners) - command.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { + command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - cmd.PersistentPreRunE(cmd, c.Args) return use.SessionIDCompleter(con) }) }) + + return implantCmd } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index d44057c482..791a2f9fc6 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -80,6 +80,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go index 7fc4e08df0..5ababc1579 100644 --- a/client/command/crack/commands.go +++ b/client/command/crack/commands.go @@ -1,14 +1,13 @@ package crack import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 163f0d8e9a..26ad3231a9 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -23,16 +23,15 @@ import ( "fmt" "sort" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CrackCmd - GPU password cracking interface +// CrackCmd - GPU password cracking interface. func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if !AreCrackersOnline(con) { PrintNoCrackstations(con) @@ -57,7 +56,7 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// CrackStationsCmd - Manage GPU cracking stations +// CrackStationsCmd - Manage GPU cracking stations. func CrackStationsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index 7cc947348a..a8b5f15870 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -12,6 +12,10 @@ import ( func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) @@ -35,6 +39,10 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) @@ -59,6 +67,10 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 63f36728b7..97228cb777 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -112,6 +112,10 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { // CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) @@ -135,6 +139,10 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { // CredsCredentialIDCompleter completes credential IDs. func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go index 54735cc958..86c5fc9e96 100644 --- a/client/command/dllhijack/commands.go +++ b/client/command/dllhijack/commands.go @@ -1,15 +1,14 @@ package dllhijack import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 5f9f40c8f0..360a84f6d1 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -23,17 +23,16 @@ import ( "fmt" "io/ioutil" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) // dllhijack --ref-path c:\windows\system32\msasn1.dll --file /tmp/runner.dll TARGET_PATH // dllhijack --ref-path c:\windows\system32\msasn1.dll --profile dll TARGET_PATH // dllhijack --ref-path c:\windows\system32\msasn1.dll --ref-file /tmp/ref.dll --profile dll TARGET_PATH -// DllHijackCmd -- implements the dllhijack command +// DllHijackCmd -- implements the dllhijack command. func DllHijackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( localRefData []byte diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 186009bbfd..d7db989262 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -61,6 +61,10 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // FormatCompleter completes builds' architectures. func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { return carapace.ActionMessage("No compiler info: %s", err.Error()) @@ -95,6 +99,10 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { // FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { return carapace.ActionMessage("No compiler info: %s", err.Error()) @@ -138,6 +146,10 @@ func FormatCompleter() carapace.Action { // TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + grpcCtx, cancel := con.GrpcContext(nil) defer cancel() trafficEncoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 4f69ea5c48..3f75345984 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -125,6 +125,10 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl // ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + var action carapace.Action builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index dd0f7ef925..ec70284e64 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -422,6 +422,10 @@ func PrintProfileInfo(name string, con *console.SliverClient) { // ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + var action carapace.Action pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index 9522bc4642..09c008b7f2 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -91,6 +91,10 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { // JobsIDCompleter completes jobs IDs with descriptions. func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { return carapace.ActionMessage("No active jobs") diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index dd22b06216..93413efe42 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -1,14 +1,13 @@ package loot import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index 5f778da404..a3583b355b 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -21,12 +21,11 @@ package loot import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// LootFetchCmd - Display the contents of or download a piece of loot +// LootFetchCmd - Display the contents of or download a piece of loot. func LootFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { diff --git a/client/command/loot/helpers.go b/client/command/loot/helpers.go index 36ee5e87a9..7175979855 100644 --- a/client/command/loot/helpers.go +++ b/client/command/loot/helpers.go @@ -32,23 +32,22 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/spf13/cobra" ) var ( - // ErrInvalidFileType - Invalid file type + // ErrInvalidFileType - Invalid file type. ErrInvalidFileType = errors.New("invalid file type") - // ErrInvalidLootType - Invalid loot type + // ErrInvalidLootType - Invalid loot type. ErrInvalidLootType = errors.New("invalid loot type") - // ErrNoLootFileData - No loot file data + // ErrNoLootFileData - No loot file data. ErrNoLootFileData = errors.New("no loot file data") ) -// AddLootFile - Add a file as loot +// AddLootFile - Add a file as loot. func AddLootFile(rpc rpcpb.SliverRPCClient, name string, fileName string, data []byte, isCredential bool) error { if len(data) < 1 { return ErrNoLootFileData @@ -73,7 +72,7 @@ func AddLootFile(rpc rpcpb.SliverRPCClient, name string, fileName string, data [ return err } -// SelectLoot - Interactive menu for the user to select a piece loot (all types) +// SelectLoot - Interactive menu for the user to select a piece loot (all types). func SelectLoot(cmd *cobra.Command, rpc rpcpb.SliverRPCClient) (*clientpb.Loot, error) { // Fetch data with optional filter var allLoot *clientpb.AllLoot diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 446a595f71..3e693062ae 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -25,14 +25,13 @@ import ( "path" "path/filepath" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// LootAddLocalCmd - Add a local file to the server as loot +// LootAddLocalCmd - Add a local file to the server as loot. func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { localPath := args[0] if _, err := os.Stat(localPath); os.IsNotExist(err) { diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index faf48d9fdb..686e3c5847 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -27,17 +27,16 @@ import ( "unicode/utf8" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// LootCmd - The loot root command +// LootCmd - The loot root command. func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allLoot, err := con.Rpc.LootAll(context.Background(), &commonpb.Empty{}) if err != nil { @@ -47,7 +46,7 @@ func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintAllFileLootTable(allLoot, con) } -// PrintAllFileLootTable - Displays a table of all file loot +// PrintAllFileLootTable - Displays a table of all file loot. func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) { if allLoot == nil || len(allLoot.Loot) == 0 { con.PrintInfof("No loot 🙁\n") @@ -76,7 +75,7 @@ func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) con.Printf("%s\n", tw.Render()) } -// PrintLootFile - Display the contents of a piece of loot +// PrintLootFile - Display the contents of a piece of loot. func PrintLootFile(loot *clientpb.Loot, con *console.SliverClient) { if loot.File == nil { return @@ -95,7 +94,7 @@ func PrintLootFile(loot *clientpb.Loot, con *console.SliverClient) { } } -// Any loot with a "File" can be saved to disk +// Any loot with a "File" can be saved to disk. func saveLootToDisk(cmd *cobra.Command, loot *clientpb.Loot) (string, error) { if loot.File == nil { return "", errors.New("loot does not contain a file") diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 940fbc4f25..da4ee056ab 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -28,14 +28,13 @@ import ( "path/filepath" "strings" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileType { @@ -53,7 +52,7 @@ func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileTy /* Eventually this function needs to be refactored out, but we made the decision to -duplicate it for now +duplicate it for now. */ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con *console.SliverClient) (*sliverpb.Download, error) { ctrl := make(chan bool) @@ -197,7 +196,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp } } -// LootAddRemoteCmd - Add a file from the remote system to the server as loot +// LootAddRemoteCmd - Add a file from the remote system to the server as loot. func LootAddRemoteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index 0666870d67..f664d9811e 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -22,13 +22,12 @@ import ( "context" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// LootRenameCmd - Rename a piece of loot +// LootRenameCmd - Rename a piece of loot. func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index 7377fba9d4..2e89c4df90 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -21,9 +21,8 @@ package loot import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index 92a0b7db73..cd848b4b08 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -1,15 +1,14 @@ package pivots import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index c7ab12571b..0070221c49 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -22,15 +22,14 @@ import ( "context" "fmt" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// PivotDetailsCmd - Display pivots for all sessions +// PivotDetailsCmd - Display pivots for all sessions. func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -70,7 +69,7 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintPivotListenerDetails - Print details of a single pivot listener +// PrintPivotListenerDetails - Print details of a single pivot listener. func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.SliverClient) { con.Printf("\n") con.Printf(" ID: %d\n", listener.ID) diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index 328043d0c6..8288a43680 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -68,6 +68,10 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive // PivotIDCompleter completes pivot listeners' IDs. func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) pivotListeners, err := con.Rpc.PivotSessionListeners(context.Background(), &sliverpb.PivotListenersReq{ diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 6487d08e4d..9f8d0cd419 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -21,13 +21,12 @@ package pivots import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StopPivotListenerCmd - Start a TCP pivot listener on the remote system +// StopPivotListenerCmd - Start a TCP pivot listener on the remote system. func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 2970812d8b..5f428a09b8 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -80,6 +80,10 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) rportfwdListeners, err := con.Rpc.GetRportFwdListeners(context.Background(), &sliverpb.RportFwdListenersReq{ diff --git a/client/command/server.go b/client/command/server.go index b76dc5a738..48af67eda9 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -48,7 +48,6 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -207,18 +206,5 @@ func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ } else { cmd.PostRunE = cRun } - - // Completions use this pre-runner as well. - cmdComps := carapace.Gen(cmd) - - completionRun := func(c *cobra.Command, args []string) { - cRun(c, args) - } - - if pre { - cmdComps.PreRun(completionRun) - } else { - // cmdComps.PostRun(completionRun) - } } } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 6cdf28cd49..33ce9f3f76 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -51,6 +51,10 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + beacon := con.ActiveTarget.GetBeacon() if beacon == nil { return carapace.ActionMessage("no active beacon") @@ -116,6 +120,10 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { // BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + beacon := con.ActiveTarget.GetBeacon() if beacon == nil { return carapace.ActionMessage("no active beacon") diff --git a/client/command/use/beacons.go b/client/command/use/beacons.go index 14328e8238..f7948351eb 100644 --- a/client/command/use/beacons.go +++ b/client/command/use/beacons.go @@ -19,13 +19,12 @@ package use */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// UseBeaconCmd - Change the active beacon +// UseBeaconCmd - Change the active beacon. func UseBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := beacons.SelectBeacon(con) if beacon != nil { diff --git a/client/command/use/commands.go b/client/command/use/commands.go index a8a0fe9177..c0ba8587e3 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -1,15 +1,14 @@ package use import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/use/sessions.go b/client/command/use/sessions.go index 3f8c8e64ee..dce1b81f4d 100644 --- a/client/command/use/sessions.go +++ b/client/command/use/sessions.go @@ -19,13 +19,12 @@ package use */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// UseSessionCmd - Change the active session +// UseSessionCmd - Change the active session. func UseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, err := sessions.SelectSession(false, con) if session != nil { diff --git a/client/command/use/use.go b/client/command/use/use.go index cae5a974ff..90cf0c36f9 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -28,18 +28,17 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) var ErrNoSelection = errors.New("no selection") -// UseCmd - Change the active session +// UseCmd - Change the active session. func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var session *clientpb.Session var beacon *clientpb.Beacon @@ -69,7 +68,7 @@ func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// SessionOrBeaconByID - Select a session or beacon by ID +// SessionOrBeaconByID - Select a session or beacon by ID. func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -94,7 +93,7 @@ func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Sessio return nil, nil, fmt.Errorf("no session or beacon found with ID %s", id) } -// SelectSessionOrBeacon - Select a session or beacon +// SelectSessionOrBeacon - Select a session or beacon. func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { // Get and sort sessions sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) @@ -182,7 +181,7 @@ func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clien return nil, nil, nil } -// BeaconAndSessionIDCompleter - BeaconAndSessionIDCompleter for beacon / session ids +// BeaconAndSessionIDCompleter - BeaconAndSessionIDCompleter for beacon / session ids. func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -196,9 +195,13 @@ func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(comps) } -// SessionIDCompleter completes session IDs +// SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index e4f6918c59..012625007f 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -112,6 +112,10 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { // WebsiteNameCompleter completes the names of available websites. func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index bd3f3555cd..f5837a1dcc 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -68,6 +68,10 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) fwdList, err := con.Rpc.WGListForwarders(context.Background(), &sliverpb.WGTCPForwardersReq{ diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index d2a88d5f00..8a061962bd 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -75,6 +75,10 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string // SocksIDCompleter IDs of WireGuard socks servers. func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) socksList, err := con.Rpc.WGListSocksServers(context.Background(), &sliverpb.WGSocksServersReq{ diff --git a/client/console/console.go b/client/console/console.go index 8994f072ea..3601df4099 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -42,6 +42,7 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" @@ -213,9 +214,29 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { con.startClientLog() } +// ConnectCompletion is a special connection mode which should be +// called in completer functions that need to use the client RPC. +// +// This function is safe to call regardless of the client being used +// as a closed-loop console mode or in an exec-once CLI mode. +func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { + con.IsCompleting = true + + err := con.Teamclient.Connect() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), nil + } + + return carapace.ActionValues(), nil +} + +// Disconnect disconnectss the client from its Sliver server, +// closing all its event/log streams and files, then closing +// the core Sliver RPC client connection. +// After this call, the client can reconnect should it want to. func (con *SliverClient) Disconnect() error { // Close all RPC streams and local files. - con.CloseClientLog() + con.closeClientLogs() // Close the RPC client connection. return con.Teamclient.Disconnect() diff --git a/client/console/log.go b/client/console/log.go index 740074908a..9cc14b6c78 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,6 +51,16 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } +// ClientLogStream requires a log stream name, used to save the logs +// going through this stream in a specific log subdirectory/file. +func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { + stream, err := con.Rpc.ClientLog(context.Background()) + if err != nil { + return nil, err + } + return &ConsoleClientLogger{name: name, Stream: stream}, nil +} + func (con *SliverClient) startClientLog() error { if con.IsCompleting { return nil @@ -93,7 +103,7 @@ func (con *SliverClient) startClientLog() error { return nil } -func (con *SliverClient) CloseClientLog() { +func (con *SliverClient) closeClientLogs() { if con.closeLogs == nil { return } @@ -105,16 +115,6 @@ func (con *SliverClient) CloseClientLog() { con.closeLogs() } -// ClientLogStream requires a log stream name, used to save the logs -// going through this stream in a specific log subdirectory/file. -func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { - stream, err := con.Rpc.ClientLog(context.Background()) - if err != nil { - return nil, err - } - return &ConsoleClientLogger{name: name, Stream: stream}, nil -} - func (con *SliverClient) setupLogger(writers ...io.Writer) { logWriter := io.MultiWriter(writers...) jsonOptions := &slog.HandlerOptions{ @@ -126,16 +126,6 @@ func (con *SliverClient) setupLogger(writers ...io.Writer) { con.App.PreCmdRunLineHooks = append(con.App.PreCmdRunLineHooks, con.logCommand) } -// logCommand logs non empty commands to the client log file. -func (con *SliverClient) logCommand(args []string) ([]string, error) { - if len(args) == 0 { - return args, nil - } - logger := slog.New(con.jsonHandler).With(slog.String("type", "command")) - logger.Debug(strings.Join(args, " ")) - return args, nil -} - func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) error { width, height, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { @@ -167,6 +157,16 @@ func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer return nil } +// logCommand logs non empty commands to the client log file. +func (con *SliverClient) logCommand(args []string) ([]string, error) { + if len(args) == 0 { + return args, nil + } + logger := slog.New(con.jsonHandler).With(slog.String("type", "command")) + logger.Debug(strings.Join(args, " ")) + return args, nil +} + func getConsoleLogFile() *os.File { logsDir := assets.GetConsoleLogsDir() dateTime := time.Now().Format("2006-01-02_15-04-05") From 4fa2c7a0a8148fd44cf4e27d91526a77125dbc30 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 25 Jul 2023 21:01:45 +0200 Subject: [PATCH 037/109] Specify socks/portforwarders IDs as arguments --- client/command/portfwd/commands.go | 11 ++++----- client/command/portfwd/portfwd-rm.go | 28 +++++++++++++-------- client/command/portfwd/portfwd.go | 6 +++-- client/command/rportfwd/commands.go | 10 +++----- client/command/rportfwd/portfwd-rm.go | 31 +++++++++++++++++------- client/command/rportfwd/portfwd.go | 6 +++-- client/command/socks/commands.go | 11 ++++----- client/command/socks/socks-stop.go | 35 +++++++++++++++++---------- client/command/socks/socks.go | 6 +++-- server/rpc/rpc-client-logs.go | 6 ++--- 10 files changed, 91 insertions(+), 59 deletions(-) diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index 15c9b0a0b9..aeebf5484c 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -48,17 +48,16 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Remove a port forwarding tunnel", Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { PortfwdRmCmd(cmd, con, args) }, } + + rmComps := flags.NewCompletions(portfwdRmCmd) + rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) + portfwdCmd.AddCommand(portfwdRmCmd) - flags.Bind("", false, portfwdRmCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of portfwd to remove") - }) - flags.BindFlagCompletions(portfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PortfwdIDCompleter(con) - }) return []*cobra.Command{portfwdCmd} } diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index ab648b3f24..37d0ab7342 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -19,6 +19,8 @@ package portfwd */ import ( + "strconv" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/spf13/cobra" @@ -26,15 +28,21 @@ import ( // PortfwdRmCmd - Remove an existing tunneled port forward. func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - portfwdID, _ := cmd.Flags().GetInt("id") - if portfwdID < 1 { - con.PrintErrorf("Must specify a valid portfwd id\n") - return - } - found := core.Portfwds.Remove(portfwdID) - if !found { - con.PrintErrorf("No portfwd with id %d\n", portfwdID) - } else { - con.PrintInfof("Removed portfwd\n") + for _, arg := range args { + portfwdID, err := strconv.Atoi(arg) + if err != nil { + con.PrintErrorf("Failed to parse portfwd id: %s\n", err) + } + if portfwdID < 1 { + con.PrintErrorf("Must specify a valid portfwd id\n") + return + } + + found := core.Portfwds.Remove(portfwdID) + if !found { + con.PrintErrorf("No portfwd with id %d\n", portfwdID) + } else { + con.PrintInfof("Removed portfwd\n") + } } } diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index b8daedfd39..712e975690 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -68,7 +68,7 @@ func PrintPortfwd(con *console.SliverClient) { // PortfwdIDCompleter completes IDs of local portforwarders. func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { results := make([]string, 0) portfwds := core.Portfwds.List() @@ -85,7 +85,9 @@ func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { return carapace.ActionMessage("no local port forwarders") } - return carapace.ActionValuesDescribed(results...).Tag("local port forwarders") + comps := carapace.ActionValuesDescribed(results...).Tag("local port forwarders") + + return comps.Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index 06a7b642a6..c213623cce 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -48,17 +48,15 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Stop and remove reverse port forwarding", Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { StopRportFwdListenerCmd(cmd, con, args) }, } + rmComps := flags.NewCompletions(rportfwdRmCmd) + rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) + rportfwdCmd.AddCommand(rportfwdRmCmd) - flags.Bind("", false, rportfwdRmCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of portfwd to remove") - }) - flags.BindFlagCompletions(rportfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PortfwdIDCompleter(con) - }) return []*cobra.Command{rportfwdCmd} } diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index ac428a7b9b..a801c1a5ff 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -20,6 +20,7 @@ package rportfwd import ( "context" + "strconv" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" @@ -33,16 +34,28 @@ func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args return } - listenerID, _ := cmd.Flags().GetUint32("id") - rportfwdListener, err := con.Rpc.StopRportFwdListener(context.Background(), &sliverpb.RportFwdStopListenerReq{ - Request: con.ActiveTarget.Request(cmd), - ID: listenerID, - }) - if err != nil { - con.PrintWarnf("%s\n", err) - return + for _, arg := range args { + listenerID, err := strconv.ParseUint(arg, 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse portfwd id: %s\n", err) + } + + if listenerID < 1 { + con.PrintErrorf("Must specify a valid portfwd id\n") + return + } + + rportfwdListener, err := con.Rpc.StopRportFwdListener(context.Background(), &sliverpb.RportFwdStopListenerReq{ + Request: con.ActiveTarget.Request(cmd), + ID: uint32(listenerID), + }) + if err != nil { + con.PrintWarnf("%s\n", err) + return + } + + printStoppedRportFwdListener(rportfwdListener, con) } - printStoppedRportFwdListener(rportfwdListener, con) } func printStoppedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 5f428a09b8..0f4d9b4d62 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -79,7 +79,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { if msg, err := con.ConnectCompletion(); err != nil { return msg } @@ -104,7 +104,9 @@ func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionMessage("no remote port forwarders") } - return carapace.ActionValuesDescribed(results...).Tag("remote port forwarders") + comps := carapace.ActionValuesDescribed(results...).Tag("remote port forwarders") + + return comps.Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 710984d625..80975e5c70 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -49,17 +49,16 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.StopStr, Short: "Stop a SOCKS5 proxy", Long: help.GetHelpFor([]string{consts.Socks5Str}), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { SocksStopCmd(cmd, con, args) }, } + + rmComps := flags.NewCompletions(socksStopCmd) + rmComps.PositionalAnyCompletion(SocksIDCompleter(con).Usage("ID of Socks server(s) to remove")) + socksCmd.AddCommand(socksStopCmd) - flags.Bind("", false, socksStopCmd, func(f *pflag.FlagSet) { - f.Uint64P("id", "i", 0, "id of portfwd to remove") - }) - flags.BindFlagCompletions(socksStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = SocksIDCompleter(con) - }) return []*cobra.Command{socksCmd} } diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index 0fcb2565aa..f0f8d21d65 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -20,6 +20,7 @@ package socks import ( "context" + "strconv" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" @@ -29,18 +30,26 @@ import ( // SocksStopCmd - Remove an existing tunneled port forward. func SocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - socksID, _ := cmd.Flags().GetUint64("id") - if socksID < 1 { - con.PrintErrorf("Must specify a valid socks5 id\n") - return + for _, arg := range args { + socksID, err := strconv.ParseUint(arg, 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse Socks ID: %s\n", err) + } + + if socksID < 1 { + con.PrintErrorf("Must specify a valid socks5 ID\n") + return + } + + found := core.SocksProxies.Remove(socksID) + + if !found { + con.PrintErrorf("No socks5 with ID %d\n", socksID) + } else { + con.PrintInfof("Removed socks5\n") + } + + // close + con.Rpc.CloseSocks(context.Background(), &sliverpb.Socks{}) } - found := core.SocksProxies.Remove(socksID) - if !found { - con.PrintErrorf("No socks5 with id %d\n", socksID) - } else { - con.PrintInfof("Removed socks5\n") - } - - // close - con.Rpc.CloseSocks(context.Background(), &sliverpb.Socks{}) } diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 0301822383..8cb0ecfea4 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -60,7 +60,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // SocksIDCompleter completes IDs of remote of socks proxy servers. func SocksIDCompleter(_ *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { results := make([]string, 0) socks := core.SocksProxies.List() @@ -77,7 +77,9 @@ func SocksIDCompleter(_ *console.SliverClient) carapace.Action { return carapace.ActionMessage("no Socks servers") } - return carapace.ActionValuesDescribed(results...).Tag("socks servers") + comps := carapace.ActionValuesDescribed(results...).Tag("socks servers") + + return comps.Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index 4f32302842..c12df0e731 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -114,7 +114,7 @@ func (rpc *Server) ClientLog(stream rpcpb.SliverRPC_ClientLogServer) error { return err } } - rpcClientLogs.Infof("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) + rpcClientLogs.Debugf("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) streams[streamName].Write(fromClient.GetData()) } return nil @@ -139,7 +139,7 @@ func openNewLogStream(logsDir string, stream string) (*LogStream, error) { } func randomSuffix(n int) string { - var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + letterRunes := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") buf := make([]rune, n) for i := range buf { buf[i] = letterRunes[insecureRand.Intn(len(letterRunes))] @@ -168,7 +168,7 @@ func gzipFile(filePath string) { return } defer inputFile.Close() - outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) + outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) if err != nil { rpcClientLogs.Errorf("Failed to open gz client console log file: %s", err) return From c793aa547e92c5cd66dfd715eb0999fa28a4a3db Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 26 Jul 2023 20:30:19 +0200 Subject: [PATCH 038/109] Fix dymanic sliver target parsing/applying --- client/cli/cli.go | 4 +- client/cli/implant.go | 91 ++++++++++++++++++++++++++++++- client/command/console/console.go | 2 +- client/command/cursed/commands.go | 5 +- client/command/server.go | 3 +- client/command/sliver.go | 3 +- client/console/console.go | 76 +++++++++----------------- client/console/implant.go | 48 ++++++++++++++++ 8 files changed, 172 insertions(+), 60 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index f29d61b7a1..c7d580371e 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -64,14 +64,12 @@ func Execute() { // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. + rootCmd.AddCommand(implantCmd(con, sliverCmds)) // Pre/post runners and completions. command.BindRunners(rootCmd, true, preRunClient(con)) command.BindRunners(rootCmd, false, postRunClient(con)) - // For now don't include any pre-runners - rootCmd.AddCommand(implantCmd(con, sliverCmds)) - carapace.Gen(rootCmd) // Run the sliver client binary. diff --git a/client/cli/implant.go b/client/cli/implant.go index 2fa7537bd7..dfe0c10a42 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -1,6 +1,9 @@ package cli import ( + "errors" + "strings" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" client "github.com/bishopfox/sliver/client/console" @@ -16,14 +19,98 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co implantCmd.Use = constants.ImplantMenu implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) - implantFlags.StringP("use", "s", "", "interact with a session") + implantFlags.StringP("use", "s", "", "Set the active target session/beacon") implantCmd.Flags().AddFlagSet(implantFlags) + // Setup the active target before going down the implant command tree. + implantCmd.PersistentPreRunE = sliverPrerun(implantCmd, con) + + // Completions: command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - return use.SessionIDCompleter(con) + return use.BeaconAndSessionIDCompleter(con) }) }) + // Hide all commands not available for the current target. + comps := carapace.Gen(implantCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + err := implantCmd.PersistentPreRunE(cmd, args) + if err != nil { + return + } + + hideUnavailableCommands(implantCmd, con) + }) + return implantCmd } + +// hide commands that are filtered so that they are not +// shown in the help strings or proposed as completions. +func hideUnavailableCommands(rootCmd *cobra.Command, con *client.SliverClient) { + targetFilters := con.ActiveTarget.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + +func isFiltered(cmd *cobra.Command, targetFilters []string) bool { + if cmd.Annotations == nil { + return false + } + + // Get the filters on the command + filterStr := cmd.Annotations[console.CommandFilterKey] + filters := strings.Split(filterStr, ",") + + for _, cmdFilter := range filters { + for _, filter := range targetFilters { + if cmdFilter != "" && cmdFilter == filter { + return true + } + } + } + + return false +} + +func sliverPrerun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + if err := preRunClient(con)(cmd, args); err != nil { + return err + } + + if err := implantCmd.ParseFlags(args); err != nil { + return err + } + + target, _ := implantCmd.Flags().GetString("use") + if target == "" { + return errors.New("no target implant to run command on") + } + + // Load either the session or the beacon. + session := con.GetSession(target) + if session != nil { + con.ActiveTarget.Set(session, nil) + return nil + } + + beacon := con.GetBeacon(target) + if beacon != nil { + con.ActiveTarget.Set(nil, beacon) + return nil + } + + return nil + } +} diff --git a/client/command/console/console.go b/client/command/console/console.go index 09ee56e1c2..0bff089286 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -40,7 +40,7 @@ func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) sliver.SetCommands(sliverCmds) // Start the console, blocking until player exit. - return con.App.Start() + return con.StartConsole() }, } diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 15162998aa..74722753eb 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -13,8 +13,9 @@ import ( // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + // Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", Long: help.GetHelpFor([]string{consts.Cursed}), GroupID: consts.ExecutionHelpGroup, Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), diff --git a/client/command/server.go b/client/command/server.go index 48af67eda9..abcdd7f2be 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -58,7 +58,8 @@ type CommandBinder func(con *client.SliverClient) []*cobra.Command func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ - Short: "Server commands", + Short: "Server commands", + TraverseChildren: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, diff --git a/client/command/sliver.go b/client/command/sliver.go index d3bb8b4c7b..17d8dfaced 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -55,7 +55,8 @@ import ( func SliverCommands(con *client.SliverClient) console.Commands { sliverCommands := func() *cobra.Command { sliver := &cobra.Command{ - Short: "Implant commands", + Short: "Implant commands", + TraverseChildren: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, diff --git a/client/console/console.go b/client/console/console.go index 3601df4099..6bc3ab06a7 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -155,6 +155,7 @@ func newConsole() *SliverClient { BeaconTaskCallbacksMutex: &sync.Mutex{}, Settings: settings, IsCLI: true, + printf: fmt.Printf, } con.App.SetPrintLogo(func(_ *console.Console) { @@ -196,16 +197,6 @@ func newConsole() *SliverClient { func (con *SliverClient) connect(conn *grpc.ClientConn) { con.Rpc = rpcpb.NewSliverRPCClient(conn) - // The console application needs to query the terminal for cursor positions - // when asynchronously printing logs (that is, when no command is running). - // If ran from a system shell, however, those queries will block because - // the system shell is in control of stdin. So just use the classic Printf. - if con.IsCLI { - con.printf = fmt.Printf - } else { - con.printf = con.App.TransientPrintf - } - // Events go con.startEventLoop() go core.TunnelLoop(con.Rpc) @@ -214,6 +205,16 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { con.startClientLog() } +// StartConsole is a blocking call that starts the Sliver closed console. +// The command/events/log outputs use the specific-console fmt.Printer, +// because the console needs to query the terminal for cursor positions +// when asynchronously printing logs (that is, when no command is running). +func (con *SliverClient) StartConsole() error { + con.printf = con.App.TransientPrintf + + return con.App.Start() +} + // ConnectCompletion is a special connection mode which should be // called in completer functions that need to use the client RPC. // @@ -247,46 +248,7 @@ func (con *SliverClient) Disconnect() error { func (con *SliverClient) ExposeCommands() { con.App.ShowCommands() - if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { - return - } - - filters := make([]string, 0) - - // Target type. - switch { - case con.ActiveTarget.session != nil: - session := con.ActiveTarget.session - - // Forbid all beacon-only commands. - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case con.ActiveTarget.beacon != nil: - beacon := con.ActiveTarget.beacon - - // Forbid all session-only commands. - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - } + filters := con.ActiveTarget.Filters() // Use all defined filters. con.App.HideCommands(filters...) @@ -306,6 +268,20 @@ func (con *SliverClient) GetSession(arg string) *clientpb.Session { return nil } +func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintWarnf("%s", err) + return nil + } + for _, session := range beacons.GetBeacons() { + if session.Name == arg || strings.HasPrefix(session.ID, arg) { + return session + } + } + return nil +} + // GetSessionsByName - Return all sessions for an Implant by name. func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) diff --git a/client/console/implant.go b/client/console/implant.go index 7d98d8a129..0b59970fce 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -174,6 +174,54 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } +// Filters returns list of constants describing which types of commands +// should NOT be available for the current target, eg. beacon commands if +// the target is a session, Windows commands if the target host is Linux. +func (s *ActiveTarget) Filters() []string { + if s.session == nil && s.beacon == nil { + return nil + } + + filters := make([]string, 0) + + // Target type. + switch { + case s.session != nil: + session := s.session + + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) + + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + + case s.beacon != nil: + beacon := s.beacon + + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) + + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + } + + return filters +} + // Background - Background the active session. func (s *ActiveTarget) Background() { defer s.con.App.ShowCommands() From e0e1992e18bee321747cb9c19cde34d5f3408b1a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 26 Jul 2023 20:40:05 +0200 Subject: [PATCH 039/109] Cache armory completions to disk --- client/command/armory/armory.go | 80 +++++----------- client/command/armory/commands.go | 7 +- client/command/armory/completion.go | 136 ++++++++++++++++++++++++++++ client/command/armory/install.go | 7 +- client/command/armory/parsers.go | 16 ++-- client/command/armory/search.go | 5 +- client/command/armory/update.go | 5 +- 7 files changed, 179 insertions(+), 77 deletions(-) create mode 100644 client/command/armory/completion.go diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index c32ef13fb2..b098b4b8e6 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -26,20 +26,22 @@ import ( "sync" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/cryptography/minisign" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" +) + +const ( + armoryCacheFileName = "armory-cache.json" ) -// ArmoryIndex - Index JSON containing alias/extension/bundle information +// ArmoryIndex - Index JSON containing alias/extension/bundle information. type ArmoryIndex struct { ArmoryConfig *assets.ArmoryConfig `json:"-"` Aliases []*ArmoryPackage `json:"aliases"` @@ -47,7 +49,7 @@ type ArmoryIndex struct { Bundles []*ArmoryBundle `json:"bundles"` } -// ArmoryPackage - JSON metadata for alias or extension +// ArmoryPackage - JSON metadata for alias or extension. type ArmoryPackage struct { Name string `json:"name"` CommandName string `json:"command_name"` @@ -57,13 +59,13 @@ type ArmoryPackage struct { IsAlias bool `json:"-"` } -// ArmoryBundle - A list of packages +// ArmoryBundle - A list of packages. type ArmoryBundle struct { Name string `json:"name"` Packages []string `json:"packages"` } -// ArmoryHTTPConfig - Configuration for armory HTTP client +// ArmoryHTTPConfig - Configuration for armory HTTP client. type ArmoryHTTPConfig struct { ArmoryConfig *assets.ArmoryConfig IgnoreCache bool @@ -92,19 +94,19 @@ type pkgCacheEntry struct { } var ( - // public key -> armoryCacheEntry + // public key -> armoryCacheEntry. indexCache = sync.Map{} - // public key -> armoryPkgCacheEntry + // public key -> armoryPkgCacheEntry. pkgCache = sync.Map{} - // cacheTime - How long to cache the index/pkg manifests + // cacheTime - How long to cache the index/pkg manifests. cacheTime = time.Hour - // This will kill a download if exceeded so needs to be large + // This will kill a download if exceeded so needs to be large. defaultTimeout = 15 * time.Minute ) -// ArmoryCmd - The main armory command +// ArmoryCmd - The main armory command. func ArmoryCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { armoriesConfig := assets.GetArmoriesConfig() con.PrintInfof("Fetching %d armory index(es) ... ", len(armoriesConfig)) @@ -172,6 +174,12 @@ func refresh(clientConfig ArmoryHTTPConfig) { armoriesConfig := assets.GetArmoriesConfig() indexes := fetchIndexes(armoriesConfig, clientConfig) fetchPackageSignatures(indexes, clientConfig) + + // Save the list of bundles/exts/aliases on disk. + // This is only for completion purposes, so this + // does not include ANY cryptographic or remote + // information on the packages. + saveArmoryCompletionCache() } func packagesInCache() ([]*alias.AliasManifest, []*extensions.ExtensionManifest) { @@ -201,45 +209,7 @@ func bundlesInCache() []*ArmoryBundle { return bundles } -// AliasExtensionOrBundleCompleter - Completer for alias, extension, and bundle names -func AliasExtensionOrBundleCompleter() carapace.Action { - comps := func(ctx carapace.Context) carapace.Action { - var action carapace.Action - - results := []string{} - aliases, exts := packagesInCache() - bundles := bundlesInCache() - - for _, aliasPkg := range aliases { - results = append(results, aliasPkg.CommandName) - results = append(results, aliasPkg.Help) - } - aliasesComps := carapace.ActionValuesDescribed(results...).Tag("aliases").Invoke(ctx) - results = make([]string, 0) - - for _, extensionPkg := range exts { - results = append(results, extensionPkg.CommandName) - results = append(results, extensionPkg.Help) - } - extentionComps := carapace.ActionValuesDescribed(results...).Tag("extensions").Invoke(ctx) - results = make([]string, 0) - - for _, bundle := range bundles { - results = append(results, bundle.Name) - } - bundleComps := carapace.ActionValues(results...).Tag("bundles").Invoke(ctx) - - return action.Invoke(ctx).Merge( - aliasesComps, - extentionComps, - bundleComps, - ).ToA() - } - - return carapace.ActionCallback(comps) -} - -// PrintArmoryPackages - Prints the armory packages +// PrintArmoryPackages - Prints the armory packages. func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { @@ -330,7 +300,7 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte con.Printf("%s\n", tw.Render()) } -// PrintArmoryBundles - Prints the armory bundles +// PrintArmoryBundles - Prints the armory bundles. func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -397,7 +367,7 @@ func parseArmoryHTTPConfig(cmd *cobra.Command) ArmoryHTTPConfig { } // fetch armory indexes, only returns indexes that were fetched successfully -// errors are still in the cache objects however and can be checked +// errors are still in the cache objects however and can be checked. func fetchIndexes(armoryConfigs []*assets.ArmoryConfig, clientConfig ArmoryHTTPConfig) []ArmoryIndex { wg := &sync.WaitGroup{} for _, armoryConfig := range armoryConfigs { diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 80cb290e18..87157225cf 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -1,15 +1,14 @@ package armory import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the `armory` command and its subcommands. diff --git a/client/command/armory/completion.go b/client/command/armory/completion.go new file mode 100644 index 0000000000..fd592e1062 --- /dev/null +++ b/client/command/armory/completion.go @@ -0,0 +1,136 @@ +package armory + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "errors" + "os" + "path/filepath" + "time" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/alias" + "github.com/bishopfox/sliver/client/command/extensions" + "github.com/rsteube/carapace" +) + +// AliasExtensionOrBundleCompleter - Completer for alias, extension, and bundle names. +func AliasExtensionOrBundleCompleter() carapace.Action { + comps := func(ctx carapace.Context) carapace.Action { + var action carapace.Action + + results := []string{} + + // In-memory packages are newer. + aliases, exts := packagesInCache() + bundles := bundlesInCache() + + // Or load the cache from file if in-memory cache is empty. + // Inform user if the cache file is old (1 week or more). + if len(aliases)+len(exts)+len(bundles) == 0 { + filePath := filepath.Join(assets.GetRootAppDir(), armoryCacheFileName) + + info, err := os.Stat(filePath) + if err == nil { + mustUpdateCache := time.Since(info.ModTime()) > (24 * 7 * time.Hour) + if mustUpdateCache { + modTime := time.Since(info.ModTime()).Truncate(time.Hour) + action = carapace.ActionMessage("armory cache is %d old, `sliver armory update` recommended", modTime) + } + + aliases, exts, bundles, err = loadArmoryCompletionCache(filePath) + if err != nil { + return carapace.ActionMessage("failed to read armory file cache: %s", err) + } + } + } + + for _, aliasPkg := range aliases { + results = append(results, aliasPkg.CommandName) + results = append(results, aliasPkg.Help) + } + aliasesComps := carapace.ActionValuesDescribed(results...).Tag("aliases").Invoke(ctx) + results = make([]string, 0) + + for _, extensionPkg := range exts { + results = append(results, extensionPkg.CommandName) + results = append(results, extensionPkg.Help) + } + extentionComps := carapace.ActionValuesDescribed(results...).Tag("extensions").Invoke(ctx) + results = make([]string, 0) + + for _, bundle := range bundles { + results = append(results, bundle.Name) + } + bundleComps := carapace.ActionValues(results...).Tag("bundles").Invoke(ctx) + + return action.Invoke(ctx).Merge( + aliasesComps, + extentionComps, + bundleComps, + ).ToA() + } + + return carapace.ActionCallback(comps) +} + +func saveArmoryCompletionCache() error { + aliases, exts := packagesInCache() + bundles := bundlesInCache() + + ArmoryCache := struct { + Aliases []*alias.AliasManifest + Extensions []*extensions.ExtensionManifest + Bundles []*ArmoryBundle + }{ + Aliases: aliases, + Extensions: exts, + Bundles: bundles, + } + + data, err := json.MarshalIndent(ArmoryCache, "", " ") + if err != nil { + return err + } + + filePath := filepath.Join(assets.GetRootAppDir(), armoryCacheFileName) + + return os.WriteFile(filePath, data, 0o600) +} + +func loadArmoryCompletionCache(filePath string) ([]*alias.AliasManifest, []*extensions.ExtensionManifest, []*ArmoryBundle, error) { + data, err := os.ReadFile(filePath) + if err != nil && os.IsNotExist(err) { + return nil, nil, nil, errors.New("no armory file cache") + } + + ArmoryCache := struct { + Aliases []*alias.AliasManifest + Extensions []*extensions.ExtensionManifest + Bundles []*ArmoryBundle + }{} + + err = json.Unmarshal(data, &ArmoryCache) + if err != nil { + return nil, nil, nil, err + } + + return ArmoryCache.Aliases, ArmoryCache.Extensions, ArmoryCache.Bundles, nil +} diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 8c53a093c2..1df01e720d 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -26,19 +26,18 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/cryptography/minisign" + "github.com/spf13/cobra" ) -// ErrPackageNotFound - The package was not found +// ErrPackageNotFound - The package was not found. var ErrPackageNotFound = errors.New("package not found") -// ArmoryInstallCmd - The armory install command +// ArmoryInstallCmd - The armory install command. func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") diff --git a/client/command/armory/parsers.go b/client/command/armory/parsers.go index d4ca08f921..147977368c 100644 --- a/client/command/armory/parsers.go +++ b/client/command/armory/parsers.go @@ -36,10 +36,10 @@ import ( "github.com/bishopfox/sliver/server/cryptography/minisign" ) -// ArmoryIndexParser - Generic interface to fetch armory indexes +// ArmoryIndexParser - Generic interface to fetch armory indexes. type ArmoryIndexParser func(*assets.ArmoryConfig, ArmoryHTTPConfig) (*ArmoryIndex, error) -// ArmoryPackageParser - Generic interface to fetch armory package manifests +// ArmoryPackageParser - Generic interface to fetch armory package manifests. type ArmoryPackageParser func(*assets.ArmoryConfig, *ArmoryPackage, bool, ArmoryHTTPConfig) (*minisign.Signature, []byte, error) var ( @@ -71,7 +71,7 @@ type armoryPkgResponse struct { // Default Parsers for Self-Hosted Armories // -// DefaultArmoryParser - Parse the armory index directly from the url +// DefaultArmoryParser - Parse the armory index directly from the url. func DefaultArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig ArmoryHTTPConfig) (*ArmoryIndex, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryConfig.PublicKey)) @@ -114,7 +114,7 @@ func DefaultArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig Ar return armoryIndex, nil } -// DefaultArmoryPkgParser - Parse the armory package manifest directly from the url +// DefaultArmoryPkgParser - Parse the armory package manifest directly from the url. func DefaultArmoryPkgParser(armoryConfig *assets.ArmoryConfig, armoryPkg *ArmoryPackage, sigOnly bool, clientConfig ArmoryHTTPConfig) (*minisign.Signature, []byte, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryPkg.PublicKey)) @@ -183,7 +183,7 @@ type GithubRelease struct { Assets []GithubAsset `json:"assets"` } -// GithubAPIArmoryIndexParser - Parse the armory index from a GitHub release +// GithubAPIArmoryIndexParser - Parse the armory index from a GitHub release. func GithubAPIArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig ArmoryHTTPConfig) (*ArmoryIndex, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryConfig.PublicKey)) @@ -245,7 +245,7 @@ func GithubAPIArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig return armoryIndex, nil } -// GithubAPIArmoryPackageParser - Retrieve the minisig and tar.gz for an armory package from a GitHub release +// GithubAPIArmoryPackageParser - Retrieve the minisig and tar.gz for an armory package from a GitHub release. func GithubAPIArmoryPackageParser(armoryConfig *assets.ArmoryConfig, armoryPkg *ArmoryPackage, sigOnly bool, clientConfig ArmoryHTTPConfig) (*minisign.Signature, []byte, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryPkg.PublicKey)) @@ -298,7 +298,7 @@ func GithubAPIArmoryPackageParser(armoryConfig *assets.ArmoryConfig, armoryPkg * // GitHub Parsers // -// GithubArmoryPackageParser - Uses github.com instead of api.github.com to download packages +// GithubArmoryPackageParser - Uses github.com instead of api.github.com to download packages. func GithubArmoryPackageParser(_ *assets.ArmoryConfig, armoryPkg *ArmoryPackage, sigOnly bool, clientConfig ArmoryHTTPConfig) (*minisign.Signature, []byte, error) { latestTag, err := githubLatestTagParser(armoryPkg, clientConfig) if err != nil { @@ -341,7 +341,7 @@ func GithubArmoryPackageParser(_ *assets.ArmoryConfig, armoryPkg *ArmoryPackage, return sig, tarGz, nil } -// We need to intercept the 302 redirect to determine the latest version tag +// We need to intercept the 302 redirect to determine the latest version tag. func githubLatestTagParser(armoryPkg *ArmoryPackage, clientConfig ArmoryHTTPConfig) (string, error) { client := httpClient(clientConfig) client.CheckRedirect = func(req *http.Request, via []*http.Request) error { diff --git a/client/command/armory/search.go b/client/command/armory/search.go index dda619ac50..3e51acc8fd 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -21,14 +21,13 @@ package armory import ( "regexp" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ArmorySearchCmd - Search for packages by name +// ArmorySearchCmd - Search for packages by name. func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) diff --git a/client/command/armory/update.go b/client/command/armory/update.go index 4f14d0006b..3fb3a622d7 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -22,15 +22,14 @@ import ( "os" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ArmoryUpdateCmd - Update all installed extensions/aliases +// ArmoryUpdateCmd - Update all installed extensions/aliases. func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) From eee1dc21c60807abef5694136d8a8e10eb403764 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 26 Jul 2023 21:03:49 +0200 Subject: [PATCH 040/109] Simplify sliver implant command tree entry --- client/cli/cli.go | 1 + client/cli/implant.go | 76 ++++++++++++++------------------------- client/console/implant.go | 63 ++++++++++++++++++++++++++------ 3 files changed, 80 insertions(+), 60 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index c7d580371e..f2e109ccb5 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -70,6 +70,7 @@ func Execute() { command.BindRunners(rootCmd, true, preRunClient(con)) command.BindRunners(rootCmd, false, postRunClient(con)) + // Generate the root completion command. carapace.Gen(rootCmd) // Run the sliver client binary. diff --git a/client/cli/implant.go b/client/cli/implant.go index dfe0c10a42..4f6ec6776f 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -2,7 +2,6 @@ package cli import ( "errors" - "strings" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" @@ -15,24 +14,24 @@ import ( ) func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { + // Generate a not-yet filtered tree of all commands + // usable in the context of an active target implant. implantCmd := sliverCmds() implantCmd.Use = constants.ImplantMenu + // But let the user set this implant with a flag. implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) implantFlags.StringP("use", "s", "", "Set the active target session/beacon") implantCmd.Flags().AddFlagSet(implantFlags) - // Setup the active target before going down the implant command tree. - implantCmd.PersistentPreRunE = sliverPrerun(implantCmd, con) + // And when pre-running any of the commands in this tree, + // connect to the server as we always do, but also set the + // active target for this binary run. + implantCmd.PersistentPreRunE = implantPreRun(implantCmd, con) - // Completions: - command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { - (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - return use.BeaconAndSessionIDCompleter(con) - }) - }) - - // Hide all commands not available for the current target. + // Completions. + // Unlike the server-only command tree, we need to unconditionally + // pre-connect when completing commands, so that we can filter commands. comps := carapace.Gen(implantCmd) comps.PreRun(func(cmd *cobra.Command, args []string) { err := implantCmd.PersistentPreRunE(cmd, args) @@ -40,55 +39,28 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return } - hideUnavailableCommands(implantCmd, con) + // And let the console and its active target decide + // what should be available to us, and what should not. + con.ActiveTarget.FilterCommands(implantCmd) }) - return implantCmd -} - -// hide commands that are filtered so that they are not -// shown in the help strings or proposed as completions. -func hideUnavailableCommands(rootCmd *cobra.Command, con *client.SliverClient) { - targetFilters := con.ActiveTarget.Filters() - - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true - } - } -} - -func isFiltered(cmd *cobra.Command, targetFilters []string) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[console.CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range targetFilters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } + // This completer will try connect to the server anyway, if not done already. + command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { + (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { + return use.BeaconAndSessionIDCompleter(con) + }) + }) - return false + return implantCmd } -func sliverPrerun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { +func implantPreRun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { if err := preRunClient(con)(cmd, args); err != nil { return err } + // Pre-parse the flags and get our active target. if err := implantCmd.ParseFlags(args); err != nil { return err } @@ -111,6 +83,10 @@ func sliverPrerun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd return nil } + // And let the console and its active target decide + // what should be available to us, and what should not. + con.ActiveTarget.FilterCommands(implantCmd) + return nil } } diff --git a/client/console/implant.go b/client/console/implant.go index 0b59970fce..b3b26ce245 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -20,11 +20,13 @@ package console import ( "fmt" + "strings" "time" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/reeflective/console" "github.com/spf13/cobra" ) @@ -174,6 +176,22 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } +// Background - Background the active session. +func (s *ActiveTarget) Background() { + defer s.con.App.ShowCommands() + + s.session = nil + s.beacon = nil + for _, observer := range s.observers { + observer(nil, nil) + } + + // Switch back to server menu. + if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ServerMenu) + } +} + // Filters returns list of constants describing which types of commands // should NOT be available for the current target, eg. beacon commands if // the target is a session, Windows commands if the target host is Linux. @@ -222,18 +240,43 @@ func (s *ActiveTarget) Filters() []string { return filters } -// Background - Background the active session. -func (s *ActiveTarget) Background() { - defer s.con.App.ShowCommands() +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } - s.session = nil - s.beacon = nil - for _, observer := range s.observers { - observer(nil, nil) + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } } +} - // Switch back to server menu. - if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ServerMenu) +func isFiltered(cmd *cobra.Command, targetFilters []string) bool { + if cmd.Annotations == nil { + return false + } + + // Get the filters on the command + filterStr := cmd.Annotations[console.CommandFilterKey] + filters := strings.Split(filterStr, ",") + + for _, cmdFilter := range filters { + for _, filter := range targetFilters { + if cmdFilter != "" && cmdFilter == filter { + return true + } + } } + + return false } From 5d60a3cc665bcb0a5bb0590eb0217356c46a2548 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 00:09:31 +0200 Subject: [PATCH 041/109] Add active target method to filter a command tree --- client/command/cursed/commands.go | 3 +++ client/console/implant.go | 42 +++++++++++++++---------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 74722753eb..d61dbd51f3 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -131,6 +131,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "save to file") }) + flags.BindFlagCompletions(CursedCookiesCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles() + }) cursedScreenshotCmd := &cobra.Command{ Use: consts.ScreenshotStr, diff --git a/client/console/implant.go b/client/console/implant.go index b3b26ce245..fa2409f616 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -192,6 +192,27 @@ func (s *ActiveTarget) Background() { } } +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + // Filters returns list of constants describing which types of commands // should NOT be available for the current target, eg. beacon commands if // the target is a session, Windows commands if the target host is Linux. @@ -240,27 +261,6 @@ func (s *ActiveTarget) Filters() []string { return filters } -// FilterCommands - The active target may have various transport stacks, -// run on different hosts and operating systems, have networking tools, etc. -// -// Given a tree of commands which may or may not all act on a given target, -// the implant adds a series of annotations and hide directives to those which -// should not be available in the current state of things. -func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { - targetFilters := s.Filters() - - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true - } - } -} - func isFiltered(cmd *cobra.Command, targetFilters []string) bool { if cmd.Annotations == nil { return false From 1404c233c13a170a69be528a4f48f08ec5b7a917 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 00:48:25 +0200 Subject: [PATCH 042/109] Remove dependency buildinfo embeddings --- .../team/client/commands/version.go | 9 +- .../team/internal/version/version.go | 87 +++++++++++-------- .../reeflective/team/server/core.go | 6 +- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index ffd5b9a1b8..f3dfa5993e 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -56,7 +56,14 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) // Client - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client %s\n", version.Full()) + cdirty := "" + if version.GitDirty() { + cdirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) + } + + cliVer := version.Semantic() + cliSemVer := fmt.Sprintf("%d.%d.%d", cliVer[0], cliVer[1], cliVer[2]) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, version.GitCommit(), cdirty) return nil } diff --git a/vendor/github.com/reeflective/team/internal/version/version.go b/vendor/github.com/reeflective/team/internal/version/version.go index 67a700668c..113acd9f46 100644 --- a/vendor/github.com/reeflective/team/internal/version/version.go +++ b/vendor/github.com/reeflective/team/internal/version/version.go @@ -20,45 +20,30 @@ package version import ( _ "embed" - "fmt" + "errors" + "runtime/debug" "strconv" "strings" "time" ) -//go:generate bash teamserver_version_info -var ( - // Version - The semantic version in string form - //go:embed client_version.compiled - Version string - - // GoVersion - Go compiler version - //go:embed go_version.compiled - GoVersion string - - // GitCommit - The commit id at compile time - //go:embed commit_version.compiled - GitCommit string - - // GitDirty - Was the commit dirty at compile time - //go:embed dirty_version.compiled - GitDirty string - - // CompiledAt - When was this binary compiled - //go:embed compiled_version.compiled - CompiledAt string -) - const ( semVerLen = 3 ) +var ErrNoBuildInfo = errors.New("No binary build info") + // Semantic - Get the structured semantic // version of the application binary. func Semantic() []int { semVer := make([]int, semVerLen) - version := strings.TrimSuffix(Version, "\n") - version = strings.TrimPrefix(version, "v") + + info, ok := debug.ReadBuildInfo() + if !ok { + return semVer + } + + version := info.Main.Version for i, part := range strings.Split(version, ".") { number, _ := strconv.ParseInt(part, 10, 32) @@ -70,7 +55,19 @@ func Semantic() []int { // Compiled - Get time this binary was compiled. func Compiled() (time.Time, error) { - compiledAt := strings.TrimSuffix(CompiledAt, "\n") + info, ok := debug.ReadBuildInfo() + if !ok { + return time.Unix(0, 0), ErrNoBuildInfo + } + + var compiledAt string + + for _, set := range info.Settings { + if set.Key == "vcs.time" { + compiledAt = set.Value + break + } + } compiled, err := strconv.ParseInt(compiledAt, 10, 64) if err != nil { @@ -80,17 +77,35 @@ func Compiled() (time.Time, error) { return time.Unix(compiled, 0), nil } -// Full - Full version string. -func Full() string { - ver := strings.TrimSuffix(Version, "\n") - if GitCommit != "" { - ver += fmt.Sprintf(" - %s", GitCommit) +// GitCommit returns the last commit hash. +func GitCommit() string { + info, ok := debug.ReadBuildInfo() + if !ok { + return "" + } + + for _, set := range info.Settings { + if set.Key == "vcs.revision" { + return set.Value + } + } + + return "" +} + +// GitDirty returns true if the binary was compiled +// with modified files in the VCS working area. +func GitDirty() bool { + info, ok := debug.ReadBuildInfo() + if !ok { + return false } - compiled, err := Compiled() - if err == nil { - ver += fmt.Sprintf(" - Compiled %s", compiled.String()) + for _, set := range info.Settings { + if set.Key == "vcs.modified" { + return set.Key == "true" + } } - return ver + return false } diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 7c5e9390e3..9025720512 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -22,7 +22,6 @@ import ( "os/user" "path/filepath" "runtime" - "strings" "sync" "github.com/reeflective/team" @@ -164,7 +163,6 @@ func (ts *Server) Self(opts ...client.Options) *client.Client { // Version returns the teamserver binary version information. func (ts *Server) Version() (team.Version, error) { - dirty := version.GitDirty != "" semVer := version.Semantic() compiled, _ := version.Compiled() @@ -180,8 +178,8 @@ func (ts *Server) Version() (team.Version, error) { Major: major, Minor: minor, Patch: patch, - Commit: strings.TrimSuffix(version.GitCommit, "\n"), - Dirty: dirty, + Commit: version.GitCommit(), + Dirty: version.GitDirty(), CompiledAt: compiled.Unix(), OS: runtime.GOOS, Arch: runtime.GOARCH, From 7a2fe672dd430900b67819b16740f1e2fa53ffcd Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 13:41:53 +0200 Subject: [PATCH 043/109] Add per-implant history stream and commands for query. Added these history sources in closed console (sliver menu), and through a command to be used by external tools (like fzf) --- client/command/history/history.go | 93 + client/command/sliver.go | 3 + client/console/console.go | 25 +- client/console/history.go | 162 + client/console/log.go | 19 +- protobuf/clientpb/client.pb.go | 4483 +++++++++++++++------------- protobuf/clientpb/client.proto | 31 + protobuf/rpcpb/services.pb.go | 2281 +++++++------- protobuf/rpcpb/services.proto | 3 + protobuf/rpcpb/services_grpc.pb.go | 118 +- server/rpc/rpc-client-logs.go | 2 +- server/rpc/rpc-history.go | 178 ++ 12 files changed, 4173 insertions(+), 3225 deletions(-) create mode 100644 client/command/history/history.go create mode 100644 client/console/history.go create mode 100644 server/rpc/rpc-history.go diff --git a/client/command/history/history.go b/client/command/history/history.go new file mode 100644 index 0000000000..30eb32c78a --- /dev/null +++ b/client/command/history/history.go @@ -0,0 +1,93 @@ +package history + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +import ( + "context" + "fmt" + "strconv" + "time" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/fatih/color" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Commands returns all commands related to implant history. +func Commands(con *console.SliverClient) []*cobra.Command { + history := &cobra.Command{ + Use: "history", + Short: "Print the implant command history", + RunE: func(cmd *cobra.Command, args []string) error { + sess, beac := con.ActiveTarget.Get() + if sess == nil && beac == nil { + return nil + } + + user, _ := cmd.Flags().GetBool("user") + showTime, _ := cmd.Flags().GetBool("time") + clientUser := con.Teamclient.Config().User + + req := &clientpb.HistoryRequest{ + UserOnly: user, + } + + if sess != nil { + req.ImplantID = sess.ID + req.ImplantName = sess.Name + } else if beac != nil { + req.ImplantID = beac.ID + req.ImplantName = beac.Name + } + + history, err := con.Rpc.GetImplantHistory(context.Background(), req) + if err != nil { + return err + } + + for i, command := range history.GetCommands() { + if user && command.GetUser() != clientUser { + continue + } + + preLine := color.HiBlackString("%-3s", strconv.Itoa(i)) + + if !user { + preLine += fmt.Sprintf("%*s\t", 5, color.YellowString(command.User)) + } + if showTime { + preLine += color.BlueString(time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp)) + "\t" + } + + fmt.Println(preLine + command.Block) + } + + return nil + }, + } + + flags.Bind("history", false, history, func(f *pflag.FlagSet) { + f.BoolP("user", "u", false, "Only print implant commands executed by user") + f.BoolP("time", "t", false, "Print the exec time before the command line (tab separated)") + }) + + return []*cobra.Command{history} +} diff --git a/client/command/sliver.go b/client/command/sliver.go index 17d8dfaced..65b6310b65 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -28,6 +28,7 @@ import ( "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/filesystem" + "github.com/bishopfox/sliver/client/command/history" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/network" @@ -57,6 +58,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { sliver := &cobra.Command{ Short: "Implant commands", TraverseChildren: true, + SilenceUsage: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, @@ -77,6 +79,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // use.Commands, tasks.Commands, pivots.Commands, + history.Commands, ) // [ Info ] diff --git a/client/console/console.go b/client/console/console.go index 6bc3ab06a7..ee00c6c710 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -98,7 +98,7 @@ type SliverClient struct { // Logging jsonHandler slog.Handler printf func(format string, args ...any) (int, error) - closeLogs func() + closeLogs []func() // Sliver-specific Rpc rpcpb.SliverRPCClient @@ -177,7 +177,8 @@ func newConsole() *SliverClient { server.Prompt().Primary = con.GetPrompt server.AddInterrupt(readline.ErrInterrupt, con.exitConsole) // Ctrl-C - server.AddHistorySourceFile("server history", filepath.Join(assets.GetRootAppDir(), "history")) + histPath := filepath.Join(assets.GetRootAppDir(), "history") + server.AddHistorySourceFile("server history", histPath) // Implant menu. sliver := con.App.NewMenu(consts.ImplantMenu) @@ -203,6 +204,24 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { // Stream logs/asciicasts con.startClientLog() + + // History sources + sliver := con.App.NewMenu(consts.ImplantMenu) + + histuser, err := con.newImplantHistory(true) + if err == nil { + sliver.AddHistorySource("implant history (user)", histuser) + } + + histAll, err := con.newImplantHistory(false) + if err == nil { + sliver.AddHistorySource("implant history (all users)", histAll) + } + + con.closeLogs = append(con.closeLogs, func() { + histuser.Close() + histAll.Close() + }) } // StartConsole is a blocking call that starts the Sliver closed console. @@ -237,7 +256,7 @@ func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { // After this call, the client can reconnect should it want to. func (con *SliverClient) Disconnect() error { // Close all RPC streams and local files. - con.closeClientLogs() + con.closeClientStreams() // Close the RPC client connection. return con.Teamclient.Disconnect() diff --git a/client/console/history.go b/client/console/history.go new file mode 100644 index 0000000000..32fb3f234e --- /dev/null +++ b/client/console/history.go @@ -0,0 +1,162 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "time" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" +) + +type implantHistory struct { + con *SliverClient + items []*clientpb.ImplantCommand + Stream rpcpb.SliverRPC_ImplantHistoryClient + pos int + user bool +} + +func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { + hist := &implantHistory{ + con: con, + user: user, + } + + // Always refresh our cache when connecting. + defer hist.Dump() + + // Important; in Write(), user should not use this tream. + if hist.user { + return hist, nil + } + + stream, err := con.Rpc.ImplantHistory(context.Background()) + if err != nil { + return nil, err + } + + // Refresh the list. + hist.Stream = stream + + return hist, nil +} + +// Write - Sends the last command to the server for saving. +func (h *implantHistory) Write(s string) (int, error) { + sess, beac := h.con.ActiveTarget.Get() + if sess == nil && beac == nil { + return len(h.items), nil + } + + // Don't save queries for the list of commands. + if s == "history" { + return len(h.items), nil + } + + // Populate a command line with its context. + cmd := &clientpb.ImplantCommand{} + + cmd.Block = s + cmd.ExecutedAt = time.Now().Unix() + + if sess != nil { + cmd.ImplantID = sess.ID + cmd.ImplantName = sess.Name + } else if beac != nil { + cmd.ImplantID = beac.ID + cmd.ImplantName = beac.Name + } + + // Save it in memory + h.items = append(h.items, cmd) + + if h.user { + return len(h.items), nil + } + + err := h.Stream.Send(cmd) + + return len(h.items), err +} + +// GetLine returns a line from history. +func (h *implantHistory) GetLine(i int) (string, error) { + if i < 0 { + return "", nil + } + + // Refresh the command history. + if len(h.items) == 0 { + h.Dump() + } + + if i >= len(h.items) { + return "", errors.New("Invalid history index") + } + + return h.items[i].Block, nil +} + +// Len returns the number of lines in history. +func (h *implantHistory) Len() int { + h.Dump() + return len(h.items) +} + +// Dump returns the entire history. +func (h *implantHistory) Dump() interface{} { + sess, beac := h.con.ActiveTarget.Get() + if sess == nil && beac == nil { + return h.items + } + + req := &clientpb.HistoryRequest{ + UserOnly: h.user, + } + + if sess != nil { + req.ImplantID = sess.ID + req.ImplantName = sess.Name + } else if beac != nil { + req.ImplantID = beac.ID + req.ImplantName = beac.Name + } + + history, err := h.con.Rpc.GetImplantHistory(context.Background(), req) + if err != nil { + return h.items + } + + h.items = history.Commands + + return h.items +} + +// Close closes the implant history stream. +func (h *implantHistory) Close() error { + if h.Stream == nil { + return nil + } + + _, err := h.Stream.CloseAndRecv() + return err +} diff --git a/client/console/log.go b/client/console/log.go index 9cc14b6c78..5a459a16b2 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -90,7 +90,7 @@ func (con *SliverClient) startClientLog() error { err = con.setupAsciicastRecord(asciicastFile, asciicastStream) - con.closeLogs = func() { + con.closeLogs = append(con.closeLogs, func() { // Local files clientLogFile.Close() asciicastFile.Close() @@ -98,12 +98,12 @@ func (con *SliverClient) startClientLog() error { // Server streams. clientLogs.Stream.CloseAndRecv() asciicastStream.Stream.CloseAndRecv() - } + }) return nil } -func (con *SliverClient) closeClientLogs() { +func (con *SliverClient) closeClientStreams() { if con.closeLogs == nil { return } @@ -112,7 +112,9 @@ func (con *SliverClient) closeClientLogs() { con.closeLogs = nil }() - con.closeLogs() + for _, closeLog := range con.closeLogs { + closeLog() + } } func (con *SliverClient) setupLogger(writers ...io.Writer) { @@ -162,7 +164,16 @@ func (con *SliverClient) logCommand(args []string) ([]string, error) { if len(args) == 0 { return args, nil } + logger := slog.New(con.jsonHandler).With(slog.String("type", "command")) + + sess, beac := con.ActiveTarget.Get() + if sess != nil { + logger = logger.With(slog.String("implant_id", sess.ID)) + } else if beac != nil { + logger = logger.With(slog.String("implant_id", beac.ID)) + } + logger.Debug(strings.Join(args, " ")) return args, nil } diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index ebd03832cd..f4665ada7f 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1171,6 +1171,252 @@ func (x *ClientLogData) GetData() []byte { return nil } +type ImplantCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Stream string `protobuf:"bytes,1,opt,name=Stream,proto3" json:"Stream,omitempty"` + User string `protobuf:"bytes,2,opt,name=User,proto3" json:"User,omitempty"` + ImplantID string `protobuf:"bytes,3,opt,name=ImplantID,proto3" json:"ImplantID,omitempty"` + ImplantName string `protobuf:"bytes,4,opt,name=ImplantName,proto3" json:"ImplantName,omitempty"` + ExecutedAt int64 `protobuf:"varint,5,opt,name=ExecutedAt,proto3" json:"ExecutedAt,omitempty"` + Block string `protobuf:"bytes,6,opt,name=Block,proto3" json:"Block,omitempty"` + Request *commonpb.Request `protobuf:"bytes,9,opt,name=Request,proto3" json:"Request,omitempty"` +} + +func (x *ImplantCommand) Reset() { + *x = ImplantCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImplantCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImplantCommand) ProtoMessage() {} + +func (x *ImplantCommand) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImplantCommand.ProtoReflect.Descriptor instead. +func (*ImplantCommand) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{2} +} + +func (x *ImplantCommand) GetStream() string { + if x != nil { + return x.Stream + } + return "" +} + +func (x *ImplantCommand) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *ImplantCommand) GetImplantID() string { + if x != nil { + return x.ImplantID + } + return "" +} + +func (x *ImplantCommand) GetImplantName() string { + if x != nil { + return x.ImplantName + } + return "" +} + +func (x *ImplantCommand) GetExecutedAt() int64 { + if x != nil { + return x.ExecutedAt + } + return 0 +} + +func (x *ImplantCommand) GetBlock() string { + if x != nil { + return x.Block + } + return "" +} + +func (x *ImplantCommand) GetRequest() *commonpb.Request { + if x != nil { + return x.Request + } + return nil +} + +type HistoryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserOnly bool `protobuf:"varint,1,opt,name=UserOnly,proto3" json:"UserOnly,omitempty"` + MaxLines int32 `protobuf:"varint,2,opt,name=MaxLines,proto3" json:"MaxLines,omitempty"` + ImplantID string `protobuf:"bytes,3,opt,name=ImplantID,proto3" json:"ImplantID,omitempty"` + ImplantName string `protobuf:"bytes,4,opt,name=ImplantName,proto3" json:"ImplantName,omitempty"` + Request *commonpb.Request `protobuf:"bytes,9,opt,name=Request,proto3" json:"Request,omitempty"` +} + +func (x *HistoryRequest) Reset() { + *x = HistoryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequest) ProtoMessage() {} + +func (x *HistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. +func (*HistoryRequest) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{3} +} + +func (x *HistoryRequest) GetUserOnly() bool { + if x != nil { + return x.UserOnly + } + return false +} + +func (x *HistoryRequest) GetMaxLines() int32 { + if x != nil { + return x.MaxLines + } + return 0 +} + +func (x *HistoryRequest) GetImplantID() string { + if x != nil { + return x.ImplantID + } + return "" +} + +func (x *HistoryRequest) GetImplantName() string { + if x != nil { + return x.ImplantName + } + return "" +} + +func (x *HistoryRequest) GetRequest() *commonpb.Request { + if x != nil { + return x.Request + } + return nil +} + +// History - Command history content. +type History struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + HistoryLen int32 `protobuf:"varint,2,opt,name=HistoryLen,proto3" json:"HistoryLen,omitempty"` + UserOnly bool `protobuf:"varint,3,opt,name=UserOnly,proto3" json:"UserOnly,omitempty"` + Commands []*ImplantCommand `protobuf:"bytes,4,rep,name=Commands,proto3" json:"Commands,omitempty"` + Response *commonpb.Response `protobuf:"bytes,9,opt,name=Response,proto3" json:"Response,omitempty"` +} + +func (x *History) Reset() { + *x = History{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *History) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*History) ProtoMessage() {} + +func (x *History) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use History.ProtoReflect.Descriptor instead. +func (*History) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{4} +} + +func (x *History) GetHistoryLen() int32 { + if x != nil { + return x.HistoryLen + } + return 0 +} + +func (x *History) GetUserOnly() bool { + if x != nil { + return x.UserOnly + } + return false +} + +func (x *History) GetCommands() []*ImplantCommand { + if x != nil { + return x.Commands + } + return nil +} + +func (x *History) GetResponse() *commonpb.Response { + if x != nil { + return x.Response + } + return nil +} + type Session struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1207,7 +1453,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1220,7 +1466,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1233,7 +1479,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{2} + return file_clientpb_client_proto_rawDescGZIP(), []int{5} } func (x *Session) GetID() string { @@ -1449,7 +1695,7 @@ type Beacon struct { func (x *Beacon) Reset() { *x = Beacon{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1462,7 +1708,7 @@ func (x *Beacon) String() string { func (*Beacon) ProtoMessage() {} func (x *Beacon) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1475,7 +1721,7 @@ func (x *Beacon) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacon.ProtoReflect.Descriptor instead. func (*Beacon) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{3} + return file_clientpb_client_proto_rawDescGZIP(), []int{6} } func (x *Beacon) GetID() string { @@ -1685,7 +1931,7 @@ type Beacons struct { func (x *Beacons) Reset() { *x = Beacons{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1944,7 @@ func (x *Beacons) String() string { func (*Beacons) ProtoMessage() {} func (x *Beacons) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1957,7 @@ func (x *Beacons) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacons.ProtoReflect.Descriptor instead. func (*Beacons) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{4} + return file_clientpb_client_proto_rawDescGZIP(), []int{7} } func (x *Beacons) GetBeacons() []*Beacon { @@ -1740,7 +1986,7 @@ type BeaconTask struct { func (x *BeaconTask) Reset() { *x = BeaconTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1753,7 +1999,7 @@ func (x *BeaconTask) String() string { func (*BeaconTask) ProtoMessage() {} func (x *BeaconTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1766,7 +2012,7 @@ func (x *BeaconTask) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTask.ProtoReflect.Descriptor instead. func (*BeaconTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{5} + return file_clientpb_client_proto_rawDescGZIP(), []int{8} } func (x *BeaconTask) GetID() string { @@ -1844,7 +2090,7 @@ type BeaconTasks struct { func (x *BeaconTasks) Reset() { *x = BeaconTasks{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1857,7 +2103,7 @@ func (x *BeaconTasks) String() string { func (*BeaconTasks) ProtoMessage() {} func (x *BeaconTasks) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1870,7 +2116,7 @@ func (x *BeaconTasks) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTasks.ProtoReflect.Descriptor instead. func (*BeaconTasks) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{6} + return file_clientpb_client_proto_rawDescGZIP(), []int{9} } func (x *BeaconTasks) GetBeaconID() string { @@ -1900,7 +2146,7 @@ type ImplantC2 struct { func (x *ImplantC2) Reset() { *x = ImplantC2{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1913,7 +2159,7 @@ func (x *ImplantC2) String() string { func (*ImplantC2) ProtoMessage() {} func (x *ImplantC2) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1926,7 +2172,7 @@ func (x *ImplantC2) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantC2.ProtoReflect.Descriptor instead. func (*ImplantC2) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{7} + return file_clientpb_client_proto_rawDescGZIP(), []int{10} } func (x *ImplantC2) GetPriority() uint32 { @@ -2009,7 +2255,7 @@ type ImplantConfig struct { func (x *ImplantConfig) Reset() { *x = ImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2022,7 +2268,7 @@ func (x *ImplantConfig) String() string { func (*ImplantConfig) ProtoMessage() {} func (x *ImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2035,7 +2281,7 @@ func (x *ImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantConfig.ProtoReflect.Descriptor instead. func (*ImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{8} + return file_clientpb_client_proto_rawDescGZIP(), []int{11} } func (x *ImplantConfig) GetID() string { @@ -2388,7 +2634,7 @@ type TrafficEncoder struct { func (x *TrafficEncoder) Reset() { *x = TrafficEncoder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2401,7 +2647,7 @@ func (x *TrafficEncoder) String() string { func (*TrafficEncoder) ProtoMessage() {} func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2414,7 +2660,7 @@ func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoder.ProtoReflect.Descriptor instead. func (*TrafficEncoder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{9} + return file_clientpb_client_proto_rawDescGZIP(), []int{12} } func (x *TrafficEncoder) GetID() uint64 { @@ -2457,7 +2703,7 @@ type TrafficEncoderMap struct { func (x *TrafficEncoderMap) Reset() { *x = TrafficEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2470,7 +2716,7 @@ func (x *TrafficEncoderMap) String() string { func (*TrafficEncoderMap) ProtoMessage() {} func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2483,7 +2729,7 @@ func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderMap.ProtoReflect.Descriptor instead. func (*TrafficEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{10} + return file_clientpb_client_proto_rawDescGZIP(), []int{13} } func (x *TrafficEncoderMap) GetEncoders() map[string]*TrafficEncoder { @@ -2509,7 +2755,7 @@ type TrafficEncoderTest struct { func (x *TrafficEncoderTest) Reset() { *x = TrafficEncoderTest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2522,7 +2768,7 @@ func (x *TrafficEncoderTest) String() string { func (*TrafficEncoderTest) ProtoMessage() {} func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2535,7 +2781,7 @@ func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTest.ProtoReflect.Descriptor instead. func (*TrafficEncoderTest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{11} + return file_clientpb_client_proto_rawDescGZIP(), []int{14} } func (x *TrafficEncoderTest) GetName() string { @@ -2594,7 +2840,7 @@ type TrafficEncoderTests struct { func (x *TrafficEncoderTests) Reset() { *x = TrafficEncoderTests{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2607,7 +2853,7 @@ func (x *TrafficEncoderTests) String() string { func (*TrafficEncoderTests) ProtoMessage() {} func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2620,7 +2866,7 @@ func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTests.ProtoReflect.Descriptor instead. func (*TrafficEncoderTests) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{12} + return file_clientpb_client_proto_rawDescGZIP(), []int{15} } func (x *TrafficEncoderTests) GetEncoder() *TrafficEncoder { @@ -2663,7 +2909,7 @@ type ExternalImplantConfig struct { func (x *ExternalImplantConfig) Reset() { *x = ExternalImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2676,7 +2922,7 @@ func (x *ExternalImplantConfig) String() string { func (*ExternalImplantConfig) ProtoMessage() {} func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2689,7 +2935,7 @@ func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantConfig.ProtoReflect.Descriptor instead. func (*ExternalImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{13} + return file_clientpb_client_proto_rawDescGZIP(), []int{16} } func (x *ExternalImplantConfig) GetConfig() *ImplantConfig { @@ -2719,7 +2965,7 @@ type ExternalImplantBinary struct { func (x *ExternalImplantBinary) Reset() { *x = ExternalImplantBinary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2732,7 +2978,7 @@ func (x *ExternalImplantBinary) String() string { func (*ExternalImplantBinary) ProtoMessage() {} func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2745,7 +2991,7 @@ func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantBinary.ProtoReflect.Descriptor instead. func (*ExternalImplantBinary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{14} + return file_clientpb_client_proto_rawDescGZIP(), []int{17} } func (x *ExternalImplantBinary) GetName() string { @@ -2781,7 +3027,7 @@ type ImplantBuilds struct { func (x *ImplantBuilds) Reset() { *x = ImplantBuilds{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2794,7 +3040,7 @@ func (x *ImplantBuilds) String() string { func (*ImplantBuilds) ProtoMessage() {} func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2807,7 +3053,7 @@ func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantBuilds.ProtoReflect.Descriptor instead. func (*ImplantBuilds) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{15} + return file_clientpb_client_proto_rawDescGZIP(), []int{18} } func (x *ImplantBuilds) GetConfigs() map[string]*ImplantConfig { @@ -2830,7 +3076,7 @@ type CompilerTarget struct { func (x *CompilerTarget) Reset() { *x = CompilerTarget{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2843,7 +3089,7 @@ func (x *CompilerTarget) String() string { func (*CompilerTarget) ProtoMessage() {} func (x *CompilerTarget) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2856,7 +3102,7 @@ func (x *CompilerTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use CompilerTarget.ProtoReflect.Descriptor instead. func (*CompilerTarget) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{16} + return file_clientpb_client_proto_rawDescGZIP(), []int{19} } func (x *CompilerTarget) GetGOOS() string { @@ -2894,7 +3140,7 @@ type CrossCompiler struct { func (x *CrossCompiler) Reset() { *x = CrossCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2907,7 +3153,7 @@ func (x *CrossCompiler) String() string { func (*CrossCompiler) ProtoMessage() {} func (x *CrossCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2920,7 +3166,7 @@ func (x *CrossCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use CrossCompiler.ProtoReflect.Descriptor instead. func (*CrossCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{17} + return file_clientpb_client_proto_rawDescGZIP(), []int{20} } func (x *CrossCompiler) GetTargetGOOS() string { @@ -2966,7 +3212,7 @@ type Compiler struct { func (x *Compiler) Reset() { *x = Compiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2979,7 +3225,7 @@ func (x *Compiler) String() string { func (*Compiler) ProtoMessage() {} func (x *Compiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2992,7 +3238,7 @@ func (x *Compiler) ProtoReflect() protoreflect.Message { // Deprecated: Use Compiler.ProtoReflect.Descriptor instead. func (*Compiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{18} + return file_clientpb_client_proto_rawDescGZIP(), []int{21} } func (x *Compiler) GetGOOS() string { @@ -3041,7 +3287,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3054,7 +3300,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3067,7 +3313,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{19} + return file_clientpb_client_proto_rawDescGZIP(), []int{22} } func (x *DeleteReq) GetName() string { @@ -3094,7 +3340,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3107,7 +3353,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3120,7 +3366,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{20} + return file_clientpb_client_proto_rawDescGZIP(), []int{23} } func (x *DNSCanary) GetImplantName() string { @@ -3176,7 +3422,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3189,7 +3435,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3202,7 +3448,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{21} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3224,7 +3470,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3237,7 +3483,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3250,7 +3496,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{25} } func (x *UniqueWGIP) GetIP() string { @@ -3272,7 +3518,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3285,7 +3531,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3298,7 +3544,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } func (x *ImplantProfile) GetName() string { @@ -3326,7 +3572,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3339,7 +3585,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3352,7 +3598,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3373,7 +3619,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3386,7 +3632,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3399,7 +3645,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *RegenerateReq) GetImplantName() string { @@ -3426,7 +3672,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3439,7 +3685,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3452,7 +3698,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *Job) GetID() uint32 { @@ -3515,7 +3761,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3528,7 +3774,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3541,7 +3787,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *Jobs) GetActive() []*Job { @@ -3562,7 +3808,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3575,7 +3821,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3588,7 +3834,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *KillJobReq) GetID() uint32 { @@ -3610,7 +3856,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3623,7 +3869,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3636,7 +3882,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *KillJob) GetID() uint32 { @@ -3666,7 +3912,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3679,7 +3925,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3692,7 +3938,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *MTLSListenerReq) GetHost() string { @@ -3727,7 +3973,7 @@ type MTLSListener struct { func (x *MTLSListener) Reset() { *x = MTLSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3740,7 +3986,7 @@ func (x *MTLSListener) String() string { func (*MTLSListener) ProtoMessage() {} func (x *MTLSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3753,7 +3999,7 @@ func (x *MTLSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListener.ProtoReflect.Descriptor instead. func (*MTLSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *MTLSListener) GetJobID() uint32 { @@ -3779,7 +4025,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3792,7 +4038,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3805,7 +4051,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *WGListenerReq) GetHost() string { @@ -3861,7 +4107,7 @@ type WGListener struct { func (x *WGListener) Reset() { *x = WGListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3874,7 +4120,7 @@ func (x *WGListener) String() string { func (*WGListener) ProtoMessage() {} func (x *WGListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3887,7 +4133,7 @@ func (x *WGListener) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListener.ProtoReflect.Descriptor instead. func (*WGListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *WGListener) GetJobID() uint32 { @@ -3913,7 +4159,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3926,7 +4172,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3939,7 +4185,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *DNSListenerReq) GetDomains() []string { @@ -3995,7 +4241,7 @@ type DNSListener struct { func (x *DNSListener) Reset() { *x = DNSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4008,7 +4254,7 @@ func (x *DNSListener) String() string { func (*DNSListener) ProtoMessage() {} func (x *DNSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4021,7 +4267,7 @@ func (x *DNSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListener.ProtoReflect.Descriptor instead. func (*DNSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *DNSListener) GetJobID() uint32 { @@ -4054,7 +4300,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4067,7 +4313,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4080,7 +4326,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *HTTPListenerReq) GetDomain() string { @@ -4187,7 +4433,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4200,7 +4446,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4213,7 +4459,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *NamedPipesReq) GetPipeName() string { @@ -4243,7 +4489,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4256,7 +4502,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4269,7 +4515,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *NamedPipes) GetSuccess() bool { @@ -4306,7 +4552,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4319,7 +4565,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4332,7 +4578,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *TCPPivotReq) GetAddress() string { @@ -4362,7 +4608,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4375,7 +4621,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4388,7 +4634,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *TCPPivot) GetSuccess() bool { @@ -4423,7 +4669,7 @@ type HTTPListener struct { func (x *HTTPListener) Reset() { *x = HTTPListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4436,7 +4682,7 @@ func (x *HTTPListener) String() string { func (*HTTPListener) ProtoMessage() {} func (x *HTTPListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4449,7 +4695,7 @@ func (x *HTTPListener) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListener.ProtoReflect.Descriptor instead. func (*HTTPListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *HTTPListener) GetJobID() uint32 { @@ -4470,7 +4716,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4483,7 +4729,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4496,7 +4742,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *Sessions) GetSessions() []*Session { @@ -4519,7 +4765,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4532,7 +4778,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4545,7 +4791,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *RenameReq) GetSessionID() string { @@ -4580,7 +4826,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4593,7 +4839,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4606,7 +4852,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -4627,7 +4873,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4640,7 +4886,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4653,7 +4899,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *Generate) GetFile() *commonpb.File { @@ -4679,7 +4925,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4692,7 +4938,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4705,7 +4951,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *MSFReq) GetPayload() string { @@ -4767,7 +5013,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4780,7 +5026,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4793,7 +5039,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *MSFRemoteReq) GetPayload() string { @@ -4863,7 +5109,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4876,7 +5122,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4889,7 +5135,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -4959,7 +5205,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4972,7 +5218,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4985,7 +5231,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *StagerListener) GetJobID() uint32 { @@ -5008,7 +5254,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5021,7 +5267,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5034,7 +5280,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5069,7 +5315,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5082,7 +5328,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5095,7 +5341,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *ShellcodeRDI) GetData() []byte { @@ -5123,7 +5369,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5136,7 +5382,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5149,7 +5395,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *MsfStagerReq) GetArch() string { @@ -5219,7 +5465,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5232,7 +5478,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5245,7 +5491,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5271,7 +5517,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5284,7 +5530,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5297,7 +5543,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5338,7 +5584,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5351,7 +5597,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5364,7 +5610,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *MigrateReq) GetPid() uint32 { @@ -5407,7 +5653,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5420,7 +5666,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5433,7 +5679,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5455,7 +5701,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5468,7 +5714,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5481,7 +5727,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5510,7 +5756,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5523,7 +5769,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5536,7 +5782,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -5568,7 +5814,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5581,7 +5827,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5594,7 +5840,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -5636,7 +5882,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5649,7 +5895,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5662,7 +5908,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -5686,7 +5932,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5699,7 +5945,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5712,7 +5958,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *Client) GetID() uint32 { @@ -5752,7 +5998,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5765,7 +6011,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5778,7 +6024,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *Event) GetEventType() string { @@ -5835,7 +6081,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5848,7 +6094,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5861,7 +6107,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *Operator) GetOnline() bool { @@ -5893,7 +6139,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5906,7 +6152,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5919,7 +6165,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *WebContent) GetPath() string { @@ -5962,7 +6208,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5975,7 +6221,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5988,7 +6234,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *WebsiteAddContent) GetName() string { @@ -6017,7 +6263,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6030,7 +6276,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6043,7 +6289,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *WebsiteRemoveContent) GetName() string { @@ -6072,7 +6318,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6085,7 +6331,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6098,7 +6344,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Website) GetName() string { @@ -6126,7 +6372,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6139,7 +6385,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6152,7 +6398,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *Websites) GetWebsites() []*Website { @@ -6176,7 +6422,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6189,7 +6435,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6202,7 +6448,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6249,7 +6495,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6262,7 +6508,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6275,7 +6521,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *Loot) GetID() string { @@ -6331,7 +6577,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6344,7 +6590,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6357,7 +6603,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *AllLoot) GetLoot() []*Loot { @@ -6381,7 +6627,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6394,7 +6640,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6407,7 +6653,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *IOC) GetPath() string { @@ -6442,7 +6688,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6455,7 +6701,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6468,7 +6714,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *ExtensionData) GetOutput() string { @@ -6495,7 +6741,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6508,7 +6754,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6521,7 +6767,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *Host) GetHostname() string { @@ -6584,7 +6830,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6597,7 +6843,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6610,7 +6856,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *AllHosts) GetHosts() []*Host { @@ -6637,7 +6883,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6650,7 +6896,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6663,7 +6909,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -6719,7 +6965,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6732,7 +6978,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6745,7 +6991,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -6768,7 +7014,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6781,7 +7027,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6794,7 +7040,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *BackdoorReq) GetFilePath() string { @@ -6829,7 +7075,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6842,7 +7088,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6855,7 +7101,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -6881,7 +7127,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6894,7 +7140,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6907,7 +7153,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -6964,7 +7210,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6977,7 +7223,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6990,7 +7236,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *ShellcodeEncode) GetData() []byte { @@ -7018,7 +7264,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7031,7 +7277,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7044,7 +7290,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7066,7 +7312,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7079,7 +7325,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7092,7 +7338,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7120,7 +7366,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7133,7 +7379,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7146,7 +7392,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *Builders) GetBuilders() []*Builder { @@ -7173,7 +7419,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7186,7 +7432,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7199,7 +7445,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *Builder) GetName() string { @@ -7269,7 +7515,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7282,7 +7528,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7295,7 +7541,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *Credential) GetID() string { @@ -7365,7 +7611,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7378,7 +7624,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7391,7 +7637,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *Credentials) GetCredentials() []*Credential { @@ -7413,7 +7659,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7426,7 +7672,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7439,7 +7685,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7465,7 +7711,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7478,7 +7724,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7491,7 +7737,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *CrackstationStatus) GetName() string { @@ -7548,7 +7794,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7561,7 +7807,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7574,7 +7820,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -7604,7 +7850,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7617,7 +7863,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7630,7 +7876,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *CrackBenchmark) GetName() string { @@ -7671,7 +7917,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7684,7 +7930,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7697,7 +7943,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *CrackTask) GetID() string { @@ -7770,7 +8016,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7783,7 +8029,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7796,7 +8042,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *Crackstation) GetName() string { @@ -7896,7 +8142,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7909,7 +8155,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7922,7 +8168,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CUDABackendInfo) GetType() string { @@ -8016,7 +8262,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8029,7 +8275,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8042,7 +8288,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *OpenCLBackendInfo) GetType() string { @@ -8142,7 +8388,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8155,7 +8401,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8168,7 +8414,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *MetalBackendInfo) GetType() string { @@ -8366,7 +8612,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8379,7 +8625,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8392,7 +8638,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9123,7 +9369,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9136,7 +9382,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9149,7 +9395,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *CrackConfig) GetAutoFire() bool { @@ -9193,7 +9439,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9206,7 +9452,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9219,7 +9465,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9264,7 +9510,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9277,7 +9523,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9290,7 +9536,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *CrackFile) GetID() string { @@ -9384,7 +9630,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9397,7 +9643,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9410,7 +9656,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *CrackFileChunk) GetID() string { @@ -9463,1486 +9709,1522 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x93, 0x05, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, - 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, - 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, - 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, - 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, - 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, - 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, - 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, - 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, - 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, - 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, - 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, - 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, - 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, + 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, + 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, + 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, + 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, + 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, + 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, + 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, + 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, + 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, + 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, + 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, + 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, + 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, + 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, + 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, + 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, + 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, + 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, + 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, + 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, + 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, + 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, + 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, + 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, - 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, - 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, - 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, - 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, - 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, - 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, - 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, - 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, - 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, - 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, - 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, + 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, + 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, + 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, + 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, + 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, + 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, + 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, - 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, - 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, - 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, - 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, - 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, - 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, - 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, - 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, - 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, - 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, - 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, - 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, - 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, - 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, - 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, - 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, - 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, - 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, - 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, - 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, + 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, + 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, + 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, + 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, + 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, + 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, + 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, + 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, + 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, - 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, - 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, - 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, - 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, - 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, - 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, - 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, - 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, - 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, - 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, - 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, - 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, - 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, - 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, - 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, - 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, - 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, - 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, - 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, - 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, - 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, - 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, - 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, - 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, - 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, + 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, + 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, + 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, + 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, + 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, + 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, + 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, + 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, + 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, + 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, + 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, + 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, + 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, + 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, + 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, + 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, + 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, + 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, + 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, + 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, - 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, - 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, - 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, - 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, - 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, - 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, - 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, - 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, - 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, - 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, - 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, - 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, - 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, - 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, - 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, - 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, - 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, - 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, - 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, + 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, + 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, + 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, + 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, - 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, - 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, - 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, - 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, - 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, - 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, - 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, - 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, - 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, - 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, - 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, + 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, + 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, + 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, + 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, + 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, - 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, - 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, - 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, - 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, + 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, + 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, + 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, + 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, + 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, + 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, + 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, + 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, + 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, + 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, + 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, + 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, + 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, - 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, - 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, - 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, - 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, - 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, - 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, - 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, - 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, - 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, - 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, - 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, - 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, - 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, - 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, - 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, - 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, - 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, - 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, - 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, - 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, - 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, - 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, - 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, - 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, - 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, - 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, - 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, - 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, - 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, - 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, - 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, - 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, - 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, - 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, - 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, - 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, - 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, - 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, - 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, - 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, - 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, - 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, - 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, - 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, - 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, - 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, - 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, - 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, - 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, - 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, - 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, - 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, - 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, - 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, - 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, - 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, - 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, - 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, - 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, - 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, - 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, + 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, + 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, + 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, + 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, + 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, + 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, + 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, + 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, + 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, + 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, + 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, + 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, + 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, + 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, + 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, + 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, + 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, + 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, + 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, + 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, + 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, + 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, + 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, + 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, + 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, + 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, + 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, + 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, + 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, + 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, + 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, + 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, + 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, + 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, + 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, + 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, + 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, + 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, + 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, + 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, + 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, + 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, + 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, + 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, + 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, + 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, + 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, + 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, + 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, + 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, + 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, + 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, + 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, + 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, - 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, - 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, - 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, - 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, - 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, - 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, - 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, - 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, - 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, - 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, - 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, - 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, - 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, - 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, - 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, - 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, - 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, - 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, - 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, - 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, - 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, - 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, - 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, - 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, - 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, - 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, - 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, - 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, - 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, - 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, - 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, - 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, - 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, - 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, - 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, - 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, - 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, - 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, - 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, - 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, - 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, - 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, - 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, - 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, - 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, - 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, - 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, - 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, - 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, - 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, - 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, - 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, - 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, - 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, - 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, - 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, - 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, - 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, - 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, - 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, - 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, - 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, - 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, - 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, - 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, - 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, - 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, - 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, - 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, - 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, - 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, - 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, - 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, - 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, - 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, - 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, - 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, - 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, - 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, - 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, - 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, - 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, - 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, - 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, - 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, - 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, - 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, - 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, - 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, - 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, - 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, - 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, - 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, - 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, - 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, - 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, - 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, - 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, - 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, - 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, - 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, - 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, - 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, - 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, - 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, - 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, - 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, - 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, - 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, - 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, - 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, - 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, - 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, - 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, - 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, - 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, - 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, - 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, - 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, - 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, - 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, - 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, - 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, - 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, - 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, - 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, - 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, - 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, - 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, - 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, - 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, - 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, - 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, - 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, - 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, - 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, - 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, - 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, - 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, - 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, - 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, - 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, - 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, - 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, - 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, - 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, - 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, - 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, - 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, - 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, - 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, - 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, - 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, - 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, - 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, - 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, - 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, + 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, + 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, + 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, + 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, + 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, + 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, + 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, + 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, + 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, + 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, + 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, + 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, + 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, + 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, + 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, + 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, + 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, + 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, + 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, + 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, + 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, + 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, + 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, + 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, + 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, + 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, + 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, + 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, + 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, + 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, + 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, + 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, + 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, + 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, + 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, + 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, + 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, + 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, + 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, + 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, + 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, + 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, + 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, + 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, + 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, + 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, + 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, + 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, + 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, + 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, + 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, + 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, + 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, + 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, + 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, + 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, + 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, + 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, + 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, + 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, + 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, + 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, + 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, + 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, + 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, + 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, + 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, + 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, + 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, + 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, + 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, + 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, + 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, + 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, + 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, + 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, + 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, + 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, + 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, + 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, + 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, + 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, + 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, + 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, + 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, + 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, + 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, + 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, + 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, + 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, + 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, + 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, + 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, + 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, + 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, + 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, + 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, + 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, + 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, + 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, + 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, + 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, + 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, + 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, + 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, + 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, + 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, + 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, + 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, + 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, + 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, + 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, + 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, + 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, + 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, + 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, + 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, + 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, + 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, + 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, + 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, + 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, + 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, + 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, + 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, + 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, + 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, + 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, + 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, + 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, + 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, + 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, + 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, + 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, + 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, + 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, + 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, + 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, + 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, + 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, + 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, + 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, + 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, + 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, + 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, + 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, + 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, + 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, + 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, + 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10958,7 +11240,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 111) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 114) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -10974,219 +11256,226 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (CrackFileType)(0), // 11: clientpb.CrackFileType (*Version)(nil), // 12: clientpb.Version (*ClientLogData)(nil), // 13: clientpb.ClientLogData - (*Session)(nil), // 14: clientpb.Session - (*Beacon)(nil), // 15: clientpb.Beacon - (*Beacons)(nil), // 16: clientpb.Beacons - (*BeaconTask)(nil), // 17: clientpb.BeaconTask - (*BeaconTasks)(nil), // 18: clientpb.BeaconTasks - (*ImplantC2)(nil), // 19: clientpb.ImplantC2 - (*ImplantConfig)(nil), // 20: clientpb.ImplantConfig - (*TrafficEncoder)(nil), // 21: clientpb.TrafficEncoder - (*TrafficEncoderMap)(nil), // 22: clientpb.TrafficEncoderMap - (*TrafficEncoderTest)(nil), // 23: clientpb.TrafficEncoderTest - (*TrafficEncoderTests)(nil), // 24: clientpb.TrafficEncoderTests - (*ExternalImplantConfig)(nil), // 25: clientpb.ExternalImplantConfig - (*ExternalImplantBinary)(nil), // 26: clientpb.ExternalImplantBinary - (*ImplantBuilds)(nil), // 27: clientpb.ImplantBuilds - (*CompilerTarget)(nil), // 28: clientpb.CompilerTarget - (*CrossCompiler)(nil), // 29: clientpb.CrossCompiler - (*Compiler)(nil), // 30: clientpb.Compiler - (*DeleteReq)(nil), // 31: clientpb.DeleteReq - (*DNSCanary)(nil), // 32: clientpb.DNSCanary - (*Canaries)(nil), // 33: clientpb.Canaries - (*UniqueWGIP)(nil), // 34: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 35: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 36: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 37: clientpb.RegenerateReq - (*Job)(nil), // 38: clientpb.Job - (*Jobs)(nil), // 39: clientpb.Jobs - (*KillJobReq)(nil), // 40: clientpb.KillJobReq - (*KillJob)(nil), // 41: clientpb.KillJob - (*MTLSListenerReq)(nil), // 42: clientpb.MTLSListenerReq - (*MTLSListener)(nil), // 43: clientpb.MTLSListener - (*WGListenerReq)(nil), // 44: clientpb.WGListenerReq - (*WGListener)(nil), // 45: clientpb.WGListener - (*DNSListenerReq)(nil), // 46: clientpb.DNSListenerReq - (*DNSListener)(nil), // 47: clientpb.DNSListener - (*HTTPListenerReq)(nil), // 48: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 49: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 50: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 51: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 52: clientpb.TCPPivot - (*HTTPListener)(nil), // 53: clientpb.HTTPListener - (*Sessions)(nil), // 54: clientpb.Sessions - (*RenameReq)(nil), // 55: clientpb.RenameReq - (*GenerateReq)(nil), // 56: clientpb.GenerateReq - (*Generate)(nil), // 57: clientpb.Generate - (*MSFReq)(nil), // 58: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 59: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 60: clientpb.StagerListenerReq - (*StagerListener)(nil), // 61: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 62: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 63: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 64: clientpb.MsfStagerReq - (*MsfStager)(nil), // 65: clientpb.MsfStager - (*GetSystemReq)(nil), // 66: clientpb.GetSystemReq - (*MigrateReq)(nil), // 67: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 68: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 69: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 70: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 71: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 72: clientpb.PivotGraph - (*Client)(nil), // 73: clientpb.Client - (*Event)(nil), // 74: clientpb.Event - (*Operator)(nil), // 75: clientpb.Operator - (*WebContent)(nil), // 76: clientpb.WebContent - (*WebsiteAddContent)(nil), // 77: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 78: clientpb.WebsiteRemoveContent - (*Website)(nil), // 79: clientpb.Website - (*Websites)(nil), // 80: clientpb.Websites - (*WGClientConfig)(nil), // 81: clientpb.WGClientConfig - (*Loot)(nil), // 82: clientpb.Loot - (*AllLoot)(nil), // 83: clientpb.AllLoot - (*IOC)(nil), // 84: clientpb.IOC - (*ExtensionData)(nil), // 85: clientpb.ExtensionData - (*Host)(nil), // 86: clientpb.Host - (*AllHosts)(nil), // 87: clientpb.AllHosts - (*DllHijackReq)(nil), // 88: clientpb.DllHijackReq - (*DllHijack)(nil), // 89: clientpb.DllHijack - (*BackdoorReq)(nil), // 90: clientpb.BackdoorReq - (*Backdoor)(nil), // 91: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 92: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 93: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 94: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 95: clientpb.ExternalGenerateReq - (*Builders)(nil), // 96: clientpb.Builders - (*Builder)(nil), // 97: clientpb.Builder - (*Credential)(nil), // 98: clientpb.Credential - (*Credentials)(nil), // 99: clientpb.Credentials - (*Crackstations)(nil), // 100: clientpb.Crackstations - (*CrackstationStatus)(nil), // 101: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 102: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 103: clientpb.CrackBenchmark - (*CrackTask)(nil), // 104: clientpb.CrackTask - (*Crackstation)(nil), // 105: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 106: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 107: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 108: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 109: clientpb.CrackCommand - (*CrackConfig)(nil), // 110: clientpb.CrackConfig - (*CrackFiles)(nil), // 111: clientpb.CrackFiles - (*CrackFile)(nil), // 112: clientpb.CrackFile - (*CrackFileChunk)(nil), // 113: clientpb.CrackFileChunk - nil, // 114: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 115: clientpb.ImplantBuilds.ConfigsEntry - nil, // 116: clientpb.WebsiteAddContent.ContentsEntry - nil, // 117: clientpb.Website.ContentsEntry - nil, // 118: clientpb.Host.ExtensionDataEntry - nil, // 119: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 120: clientpb.CrackSyncStatus.ProgressEntry - nil, // 121: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 122: clientpb.Crackstation.BenchmarksEntry - (*commonpb.File)(nil), // 123: commonpb.File - (*commonpb.Request)(nil), // 124: commonpb.Request - (*commonpb.Response)(nil), // 125: commonpb.Response + (*ImplantCommand)(nil), // 14: clientpb.ImplantCommand + (*HistoryRequest)(nil), // 15: clientpb.HistoryRequest + (*History)(nil), // 16: clientpb.History + (*Session)(nil), // 17: clientpb.Session + (*Beacon)(nil), // 18: clientpb.Beacon + (*Beacons)(nil), // 19: clientpb.Beacons + (*BeaconTask)(nil), // 20: clientpb.BeaconTask + (*BeaconTasks)(nil), // 21: clientpb.BeaconTasks + (*ImplantC2)(nil), // 22: clientpb.ImplantC2 + (*ImplantConfig)(nil), // 23: clientpb.ImplantConfig + (*TrafficEncoder)(nil), // 24: clientpb.TrafficEncoder + (*TrafficEncoderMap)(nil), // 25: clientpb.TrafficEncoderMap + (*TrafficEncoderTest)(nil), // 26: clientpb.TrafficEncoderTest + (*TrafficEncoderTests)(nil), // 27: clientpb.TrafficEncoderTests + (*ExternalImplantConfig)(nil), // 28: clientpb.ExternalImplantConfig + (*ExternalImplantBinary)(nil), // 29: clientpb.ExternalImplantBinary + (*ImplantBuilds)(nil), // 30: clientpb.ImplantBuilds + (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget + (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler + (*Compiler)(nil), // 33: clientpb.Compiler + (*DeleteReq)(nil), // 34: clientpb.DeleteReq + (*DNSCanary)(nil), // 35: clientpb.DNSCanary + (*Canaries)(nil), // 36: clientpb.Canaries + (*UniqueWGIP)(nil), // 37: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 38: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 39: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 40: clientpb.RegenerateReq + (*Job)(nil), // 41: clientpb.Job + (*Jobs)(nil), // 42: clientpb.Jobs + (*KillJobReq)(nil), // 43: clientpb.KillJobReq + (*KillJob)(nil), // 44: clientpb.KillJob + (*MTLSListenerReq)(nil), // 45: clientpb.MTLSListenerReq + (*MTLSListener)(nil), // 46: clientpb.MTLSListener + (*WGListenerReq)(nil), // 47: clientpb.WGListenerReq + (*WGListener)(nil), // 48: clientpb.WGListener + (*DNSListenerReq)(nil), // 49: clientpb.DNSListenerReq + (*DNSListener)(nil), // 50: clientpb.DNSListener + (*HTTPListenerReq)(nil), // 51: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 52: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 53: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 54: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 55: clientpb.TCPPivot + (*HTTPListener)(nil), // 56: clientpb.HTTPListener + (*Sessions)(nil), // 57: clientpb.Sessions + (*RenameReq)(nil), // 58: clientpb.RenameReq + (*GenerateReq)(nil), // 59: clientpb.GenerateReq + (*Generate)(nil), // 60: clientpb.Generate + (*MSFReq)(nil), // 61: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 62: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 63: clientpb.StagerListenerReq + (*StagerListener)(nil), // 64: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 65: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 66: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 67: clientpb.MsfStagerReq + (*MsfStager)(nil), // 68: clientpb.MsfStager + (*GetSystemReq)(nil), // 69: clientpb.GetSystemReq + (*MigrateReq)(nil), // 70: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 71: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 72: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 73: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 74: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 75: clientpb.PivotGraph + (*Client)(nil), // 76: clientpb.Client + (*Event)(nil), // 77: clientpb.Event + (*Operator)(nil), // 78: clientpb.Operator + (*WebContent)(nil), // 79: clientpb.WebContent + (*WebsiteAddContent)(nil), // 80: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 81: clientpb.WebsiteRemoveContent + (*Website)(nil), // 82: clientpb.Website + (*Websites)(nil), // 83: clientpb.Websites + (*WGClientConfig)(nil), // 84: clientpb.WGClientConfig + (*Loot)(nil), // 85: clientpb.Loot + (*AllLoot)(nil), // 86: clientpb.AllLoot + (*IOC)(nil), // 87: clientpb.IOC + (*ExtensionData)(nil), // 88: clientpb.ExtensionData + (*Host)(nil), // 89: clientpb.Host + (*AllHosts)(nil), // 90: clientpb.AllHosts + (*DllHijackReq)(nil), // 91: clientpb.DllHijackReq + (*DllHijack)(nil), // 92: clientpb.DllHijack + (*BackdoorReq)(nil), // 93: clientpb.BackdoorReq + (*Backdoor)(nil), // 94: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 95: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 96: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 97: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 98: clientpb.ExternalGenerateReq + (*Builders)(nil), // 99: clientpb.Builders + (*Builder)(nil), // 100: clientpb.Builder + (*Credential)(nil), // 101: clientpb.Credential + (*Credentials)(nil), // 102: clientpb.Credentials + (*Crackstations)(nil), // 103: clientpb.Crackstations + (*CrackstationStatus)(nil), // 104: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 105: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 106: clientpb.CrackBenchmark + (*CrackTask)(nil), // 107: clientpb.CrackTask + (*Crackstation)(nil), // 108: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 109: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 110: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 111: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 112: clientpb.CrackCommand + (*CrackConfig)(nil), // 113: clientpb.CrackConfig + (*CrackFiles)(nil), // 114: clientpb.CrackFiles + (*CrackFile)(nil), // 115: clientpb.CrackFile + (*CrackFileChunk)(nil), // 116: clientpb.CrackFileChunk + nil, // 117: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 118: clientpb.ImplantBuilds.ConfigsEntry + nil, // 119: clientpb.WebsiteAddContent.ContentsEntry + nil, // 120: clientpb.Website.ContentsEntry + nil, // 121: clientpb.Host.ExtensionDataEntry + nil, // 122: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 123: clientpb.CrackSyncStatus.ProgressEntry + nil, // 124: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 125: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 126: commonpb.Request + (*commonpb.Response)(nil), // 127: commonpb.Response + (*commonpb.File)(nil), // 128: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 15, // 0: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon - 17, // 1: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask - 19, // 2: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 - 0, // 3: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 123, // 4: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 123, // 5: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 114, // 6: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry - 21, // 7: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder - 23, // 8: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest - 20, // 9: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 123, // 10: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 115, // 11: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry - 0, // 12: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat - 28, // 13: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget - 29, // 14: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler - 28, // 15: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 32, // 16: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 20, // 17: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 35, // 18: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 38, // 19: clientpb.Jobs.Active:type_name -> clientpb.Job - 124, // 20: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 125, // 21: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 124, // 22: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 125, // 23: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 14, // 24: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 20, // 25: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 123, // 26: clientpb.Generate.File:type_name -> commonpb.File - 124, // 27: clientpb.MSFReq.Request:type_name -> commonpb.Request - 124, // 28: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 29: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 30: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 123, // 31: clientpb.MsfStager.File:type_name -> commonpb.File - 20, // 32: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 124, // 33: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 20, // 34: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 35: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 124, // 36: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 124, // 37: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 124, // 38: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 14, // 39: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 71, // 40: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 71, // 41: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 75, // 42: clientpb.Client.Operator:type_name -> clientpb.Operator - 14, // 43: clientpb.Event.Session:type_name -> clientpb.Session - 38, // 44: clientpb.Event.Job:type_name -> clientpb.Job - 73, // 45: clientpb.Event.Client:type_name -> clientpb.Client - 116, // 46: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 117, // 47: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 79, // 48: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 49: clientpb.Loot.FileType:type_name -> clientpb.FileType - 123, // 50: clientpb.Loot.File:type_name -> commonpb.File - 82, // 51: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 84, // 52: clientpb.Host.IOCs:type_name -> clientpb.IOC - 118, // 53: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 86, // 54: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 124, // 55: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 125, // 56: clientpb.DllHijack.Response:type_name -> commonpb.Response - 124, // 57: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 125, // 58: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 59: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 124, // 60: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 125, // 61: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 119, // 62: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 20, // 63: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 97, // 64: clientpb.Builders.Builders:type_name -> clientpb.Builder - 28, // 65: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 29, // 66: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 67: clientpb.Credential.HashType:type_name -> clientpb.HashType - 98, // 68: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 105, // 69: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 70: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 102, // 71: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 120, // 72: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 121, // 73: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 109, // 74: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 122, // 75: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 106, // 76: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 108, // 77: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 107, // 78: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 79: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 80: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 81: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 82: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 83: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 84: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 112, // 85: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 86: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 113, // 87: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 21, // 88: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 20, // 89: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 76, // 90: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 76, // 91: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 85, // 92: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 93: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 94, // [94:94] is the sub-list for method output_type - 94, // [94:94] is the sub-list for method input_type - 94, // [94:94] is the sub-list for extension type_name - 94, // [94:94] is the sub-list for extension extendee - 0, // [0:94] is the sub-list for field type_name + 126, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 126, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 14, // 2: clientpb.History.Commands:type_name -> clientpb.ImplantCommand + 127, // 3: clientpb.History.Response:type_name -> commonpb.Response + 18, // 4: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon + 20, // 5: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask + 22, // 6: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 + 0, // 7: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat + 128, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 128, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 117, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 24, // 11: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder + 26, // 12: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest + 23, // 13: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig + 128, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 118, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 0, // 16: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat + 31, // 17: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget + 32, // 18: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler + 31, // 19: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget + 35, // 20: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 23, // 21: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 38, // 22: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 41, // 23: clientpb.Jobs.Active:type_name -> clientpb.Job + 126, // 24: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 127, // 25: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 126, // 26: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 127, // 27: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 17, // 28: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 23, // 29: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 128, // 30: clientpb.Generate.File:type_name -> commonpb.File + 126, // 31: clientpb.MSFReq.Request:type_name -> commonpb.Request + 126, // 32: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 33: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 34: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 128, // 35: clientpb.MsfStager.File:type_name -> commonpb.File + 23, // 36: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 126, // 37: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 23, // 38: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 39: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 126, // 40: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 126, // 41: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 126, // 42: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 17, // 43: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 74, // 44: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 74, // 45: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 78, // 46: clientpb.Client.Operator:type_name -> clientpb.Operator + 17, // 47: clientpb.Event.Session:type_name -> clientpb.Session + 41, // 48: clientpb.Event.Job:type_name -> clientpb.Job + 76, // 49: clientpb.Event.Client:type_name -> clientpb.Client + 119, // 50: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 120, // 51: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 82, // 52: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 53: clientpb.Loot.FileType:type_name -> clientpb.FileType + 128, // 54: clientpb.Loot.File:type_name -> commonpb.File + 85, // 55: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 87, // 56: clientpb.Host.IOCs:type_name -> clientpb.IOC + 121, // 57: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 89, // 58: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 126, // 59: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 127, // 60: clientpb.DllHijack.Response:type_name -> commonpb.Response + 126, // 61: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 127, // 62: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 63: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 126, // 64: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 127, // 65: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 122, // 66: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 23, // 67: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 100, // 68: clientpb.Builders.Builders:type_name -> clientpb.Builder + 31, // 69: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 32, // 70: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 71: clientpb.Credential.HashType:type_name -> clientpb.HashType + 101, // 72: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 108, // 73: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 74: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 105, // 75: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 123, // 76: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 124, // 77: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 112, // 78: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 125, // 79: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 109, // 80: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 111, // 81: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 110, // 82: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 83: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 84: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 85: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 86: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 87: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 88: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 115, // 89: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 90: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 116, // 91: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 24, // 92: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 23, // 93: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 79, // 94: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 79, // 95: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 88, // 96: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 97: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 98, // [98:98] is the sub-list for method output_type + 98, // [98:98] is the sub-list for method input_type + 98, // [98:98] is the sub-list for extension type_name + 98, // [98:98] is the sub-list for extension extendee + 0, // [0:98] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -11220,7 +11509,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*ImplantCommand); i { case 0: return &v.state case 1: @@ -11232,7 +11521,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacon); i { + switch v := v.(*HistoryRequest); i { case 0: return &v.state case 1: @@ -11244,7 +11533,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacons); i { + switch v := v.(*History); i { case 0: return &v.state case 1: @@ -11256,7 +11545,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTask); i { + switch v := v.(*Session); i { case 0: return &v.state case 1: @@ -11268,7 +11557,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTasks); i { + switch v := v.(*Beacon); i { case 0: return &v.state case 1: @@ -11280,7 +11569,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantC2); i { + switch v := v.(*Beacons); i { case 0: return &v.state case 1: @@ -11292,7 +11581,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantConfig); i { + switch v := v.(*BeaconTask); i { case 0: return &v.state case 1: @@ -11304,7 +11593,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoder); i { + switch v := v.(*BeaconTasks); i { case 0: return &v.state case 1: @@ -11316,7 +11605,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderMap); i { + switch v := v.(*ImplantC2); i { case 0: return &v.state case 1: @@ -11328,7 +11617,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTest); i { + switch v := v.(*ImplantConfig); i { case 0: return &v.state case 1: @@ -11340,7 +11629,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTests); i { + switch v := v.(*TrafficEncoder); i { case 0: return &v.state case 1: @@ -11352,7 +11641,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantConfig); i { + switch v := v.(*TrafficEncoderMap); i { case 0: return &v.state case 1: @@ -11364,7 +11653,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantBinary); i { + switch v := v.(*TrafficEncoderTest); i { case 0: return &v.state case 1: @@ -11376,7 +11665,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantBuilds); i { + switch v := v.(*TrafficEncoderTests); i { case 0: return &v.state case 1: @@ -11388,7 +11677,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompilerTarget); i { + switch v := v.(*ExternalImplantConfig); i { case 0: return &v.state case 1: @@ -11400,7 +11689,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrossCompiler); i { + switch v := v.(*ExternalImplantBinary); i { case 0: return &v.state case 1: @@ -11412,7 +11701,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Compiler); i { + switch v := v.(*ImplantBuilds); i { case 0: return &v.state case 1: @@ -11424,7 +11713,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteReq); i { + switch v := v.(*CompilerTarget); i { case 0: return &v.state case 1: @@ -11436,7 +11725,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSCanary); i { + switch v := v.(*CrossCompiler); i { case 0: return &v.state case 1: @@ -11448,7 +11737,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Canaries); i { + switch v := v.(*Compiler); i { case 0: return &v.state case 1: @@ -11460,7 +11749,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueWGIP); i { + switch v := v.(*DeleteReq); i { case 0: return &v.state case 1: @@ -11472,7 +11761,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfile); i { + switch v := v.(*DNSCanary); i { case 0: return &v.state case 1: @@ -11484,7 +11773,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfiles); i { + switch v := v.(*Canaries); i { case 0: return &v.state case 1: @@ -11496,7 +11785,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegenerateReq); i { + switch v := v.(*UniqueWGIP); i { case 0: return &v.state case 1: @@ -11508,7 +11797,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ImplantProfile); i { case 0: return &v.state case 1: @@ -11520,7 +11809,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Jobs); i { + switch v := v.(*ImplantProfiles); i { case 0: return &v.state case 1: @@ -11532,7 +11821,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJobReq); i { + switch v := v.(*RegenerateReq); i { case 0: return &v.state case 1: @@ -11544,7 +11833,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJob); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -11556,7 +11845,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListenerReq); i { + switch v := v.(*Jobs); i { case 0: return &v.state case 1: @@ -11568,7 +11857,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListener); i { + switch v := v.(*KillJobReq); i { case 0: return &v.state case 1: @@ -11580,7 +11869,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListenerReq); i { + switch v := v.(*KillJob); i { case 0: return &v.state case 1: @@ -11592,7 +11881,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListener); i { + switch v := v.(*MTLSListenerReq); i { case 0: return &v.state case 1: @@ -11604,7 +11893,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListenerReq); i { + switch v := v.(*MTLSListener); i { case 0: return &v.state case 1: @@ -11616,7 +11905,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListener); i { + switch v := v.(*WGListenerReq); i { case 0: return &v.state case 1: @@ -11628,7 +11917,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListenerReq); i { + switch v := v.(*WGListener); i { case 0: return &v.state case 1: @@ -11640,7 +11929,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipesReq); i { + switch v := v.(*DNSListenerReq); i { case 0: return &v.state case 1: @@ -11652,7 +11941,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipes); i { + switch v := v.(*DNSListener); i { case 0: return &v.state case 1: @@ -11664,7 +11953,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivotReq); i { + switch v := v.(*HTTPListenerReq); i { case 0: return &v.state case 1: @@ -11676,7 +11965,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivot); i { + switch v := v.(*NamedPipesReq); i { case 0: return &v.state case 1: @@ -11688,7 +11977,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListener); i { + switch v := v.(*NamedPipes); i { case 0: return &v.state case 1: @@ -11700,7 +11989,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Sessions); i { + switch v := v.(*TCPPivotReq); i { case 0: return &v.state case 1: @@ -11712,7 +12001,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenameReq); i { + switch v := v.(*TCPPivot); i { case 0: return &v.state case 1: @@ -11724,7 +12013,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateReq); i { + switch v := v.(*HTTPListener); i { case 0: return &v.state case 1: @@ -11736,7 +12025,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Generate); i { + switch v := v.(*Sessions); i { case 0: return &v.state case 1: @@ -11748,7 +12037,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFReq); i { + switch v := v.(*RenameReq); i { case 0: return &v.state case 1: @@ -11760,7 +12049,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFRemoteReq); i { + switch v := v.(*GenerateReq); i { case 0: return &v.state case 1: @@ -11772,7 +12061,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListenerReq); i { + switch v := v.(*Generate); i { case 0: return &v.state case 1: @@ -11784,7 +12073,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListener); i { + switch v := v.(*MSFReq); i { case 0: return &v.state case 1: @@ -11796,7 +12085,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDIReq); i { + switch v := v.(*MSFRemoteReq); i { case 0: return &v.state case 1: @@ -11808,7 +12097,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDI); i { + switch v := v.(*StagerListenerReq); i { case 0: return &v.state case 1: @@ -11820,7 +12109,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStagerReq); i { + switch v := v.(*StagerListener); i { case 0: return &v.state case 1: @@ -11832,7 +12121,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStager); i { + switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state case 1: @@ -11844,7 +12133,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSystemReq); i { + switch v := v.(*ShellcodeRDI); i { case 0: return &v.state case 1: @@ -11856,7 +12145,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MigrateReq); i { + switch v := v.(*MsfStagerReq); i { case 0: return &v.state case 1: @@ -11868,7 +12157,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelReq); i { + switch v := v.(*MsfStager); i { case 0: return &v.state case 1: @@ -11880,7 +12169,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnel); i { + switch v := v.(*GetSystemReq); i { case 0: return &v.state case 1: @@ -11892,7 +12181,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseTunnelReq); i { + switch v := v.(*MigrateReq); i { case 0: return &v.state case 1: @@ -11904,7 +12193,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraphEntry); i { + switch v := v.(*CreateTunnelReq); i { case 0: return &v.state case 1: @@ -11916,7 +12205,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraph); i { + switch v := v.(*CreateTunnel); i { case 0: return &v.state case 1: @@ -11928,7 +12217,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { + switch v := v.(*CloseTunnelReq); i { case 0: return &v.state case 1: @@ -11940,7 +12229,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*PivotGraphEntry); i { case 0: return &v.state case 1: @@ -11952,7 +12241,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operator); i { + switch v := v.(*PivotGraph); i { case 0: return &v.state case 1: @@ -11964,7 +12253,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebContent); i { + switch v := v.(*Client); i { case 0: return &v.state case 1: @@ -11976,7 +12265,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteAddContent); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -11988,7 +12277,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteRemoveContent); i { + switch v := v.(*Operator); i { case 0: return &v.state case 1: @@ -12000,7 +12289,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Website); i { + switch v := v.(*WebContent); i { case 0: return &v.state case 1: @@ -12012,7 +12301,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Websites); i { + switch v := v.(*WebsiteAddContent); i { case 0: return &v.state case 1: @@ -12024,7 +12313,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGClientConfig); i { + switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state case 1: @@ -12036,7 +12325,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Loot); i { + switch v := v.(*Website); i { case 0: return &v.state case 1: @@ -12048,7 +12337,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllLoot); i { + switch v := v.(*Websites); i { case 0: return &v.state case 1: @@ -12060,7 +12349,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOC); i { + switch v := v.(*WGClientConfig); i { case 0: return &v.state case 1: @@ -12072,7 +12361,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionData); i { + switch v := v.(*Loot); i { case 0: return &v.state case 1: @@ -12084,7 +12373,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Host); i { + switch v := v.(*AllLoot); i { case 0: return &v.state case 1: @@ -12096,7 +12385,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllHosts); i { + switch v := v.(*IOC); i { case 0: return &v.state case 1: @@ -12108,7 +12397,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijackReq); i { + switch v := v.(*ExtensionData); i { case 0: return &v.state case 1: @@ -12120,7 +12409,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijack); i { + switch v := v.(*Host); i { case 0: return &v.state case 1: @@ -12132,7 +12421,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BackdoorReq); i { + switch v := v.(*AllHosts); i { case 0: return &v.state case 1: @@ -12144,7 +12433,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Backdoor); i { + switch v := v.(*DllHijackReq); i { case 0: return &v.state case 1: @@ -12156,7 +12445,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncodeReq); i { + switch v := v.(*DllHijack); i { case 0: return &v.state case 1: @@ -12168,7 +12457,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncode); i { + switch v := v.(*BackdoorReq); i { case 0: return &v.state case 1: @@ -12180,7 +12469,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncoderMap); i { + switch v := v.(*Backdoor); i { case 0: return &v.state case 1: @@ -12192,7 +12481,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalGenerateReq); i { + switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state case 1: @@ -12204,7 +12493,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builders); i { + switch v := v.(*ShellcodeEncode); i { case 0: return &v.state case 1: @@ -12216,7 +12505,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builder); i { + switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state case 1: @@ -12228,7 +12517,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credential); i { + switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state case 1: @@ -12240,7 +12529,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credentials); i { + switch v := v.(*Builders); i { case 0: return &v.state case 1: @@ -12252,7 +12541,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstations); i { + switch v := v.(*Builder); i { case 0: return &v.state case 1: @@ -12264,7 +12553,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackstationStatus); i { + switch v := v.(*Credential); i { case 0: return &v.state case 1: @@ -12276,7 +12565,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackSyncStatus); i { + switch v := v.(*Credentials); i { case 0: return &v.state case 1: @@ -12288,7 +12577,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackBenchmark); i { + switch v := v.(*Crackstations); i { case 0: return &v.state case 1: @@ -12300,7 +12589,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackTask); i { + switch v := v.(*CrackstationStatus); i { case 0: return &v.state case 1: @@ -12312,7 +12601,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstation); i { + switch v := v.(*CrackSyncStatus); i { case 0: return &v.state case 1: @@ -12324,7 +12613,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CUDABackendInfo); i { + switch v := v.(*CrackBenchmark); i { case 0: return &v.state case 1: @@ -12336,7 +12625,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenCLBackendInfo); i { + switch v := v.(*CrackTask); i { case 0: return &v.state case 1: @@ -12348,7 +12637,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetalBackendInfo); i { + switch v := v.(*Crackstation); i { case 0: return &v.state case 1: @@ -12360,7 +12649,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackCommand); i { + switch v := v.(*CUDABackendInfo); i { case 0: return &v.state case 1: @@ -12372,7 +12661,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackConfig); i { + switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state case 1: @@ -12384,7 +12673,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFiles); i { + switch v := v.(*MetalBackendInfo); i { case 0: return &v.state case 1: @@ -12396,7 +12685,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFile); i { + switch v := v.(*CrackCommand); i { case 0: return &v.state case 1: @@ -12408,6 +12697,42 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12426,7 +12751,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 111, + NumMessages: 114, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index ec42e85758..18b3021899 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -25,6 +25,37 @@ message ClientLogData { bytes Data = 2; } +// [ History commands ] ---------------------------------------- + +message ImplantCommand { + string Stream = 1; + string User = 2; + string ImplantID = 3; + string ImplantName = 4; + int64 ExecutedAt = 5; + string Block = 6; + + commonpb.Request Request = 9; +} + +message HistoryRequest { + bool UserOnly = 1; + int32 MaxLines = 2; + string ImplantID = 3; + string ImplantName = 4; + + commonpb.Request Request = 9; +} + +// History - Command history content. +message History { + int32 HistoryLen = 2; + bool UserOnly = 3; + repeated ImplantCommand Commands = 4; + + commonpb.Response Response = 9; +} + // [ Core ] ---------------------------------------- message Session { diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index 9f77e54f9d..512be4c7a8 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -31,7 +31,7 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xe6, 0x4d, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xe7, 0x4e, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, @@ -48,616 +48,624 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, - 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, - 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, - 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, - 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, - 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, + 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, + 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, + 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, + 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, + 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, + 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, + 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, + 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, + 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, - 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, - 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, + 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, + 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, + 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, - 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, - 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, + 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, + 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, + 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, + 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, + 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, - 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, - 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, - 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, + 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, + 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, - 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, - 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, - 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, + 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, + 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, - 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, - 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, + 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, + 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, - 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, - 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, - 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, - 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, - 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, + 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, + 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, + 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, + 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, - 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, - 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, - 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, - 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, - 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, - 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, - 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, - 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, - 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, + 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, + 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, + 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, + 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, + 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, + 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, + 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, + 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, + 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, + 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, + 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, + 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, + 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, + 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, + 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, + 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, + 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, + 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, + 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, + 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, - 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, - 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, - 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, - 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, - 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, - 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, - 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, - 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, - 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, - 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, - 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, - 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, - 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, - 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, - 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, + 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, + 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, + 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, + 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, - 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, - 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, + 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, + 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, + 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, + 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, - 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, + 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, + 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, - 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, - 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, - 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, - 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, - 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, - 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, - 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, - 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, - 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, + 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, + 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, + 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, + 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, + 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, + 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, + 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, + 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -666,214 +674,217 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.KillReq)(nil), // 2: sliverpb.KillReq (*sliverpb.ReconfigureReq)(nil), // 3: sliverpb.ReconfigureReq (*clientpb.RenameReq)(nil), // 4: clientpb.RenameReq - (*clientpb.Beacon)(nil), // 5: clientpb.Beacon - (*clientpb.BeaconTask)(nil), // 6: clientpb.BeaconTask - (*clientpb.KillJobReq)(nil), // 7: clientpb.KillJobReq - (*clientpb.MTLSListenerReq)(nil), // 8: clientpb.MTLSListenerReq - (*clientpb.WGListenerReq)(nil), // 9: clientpb.WGListenerReq - (*clientpb.DNSListenerReq)(nil), // 10: clientpb.DNSListenerReq - (*clientpb.HTTPListenerReq)(nil), // 11: clientpb.HTTPListenerReq - (*clientpb.StagerListenerReq)(nil), // 12: clientpb.StagerListenerReq - (*clientpb.Loot)(nil), // 13: clientpb.Loot - (*clientpb.Credentials)(nil), // 14: clientpb.Credentials - (*clientpb.Credential)(nil), // 15: clientpb.Credential - (*clientpb.Host)(nil), // 16: clientpb.Host - (*clientpb.IOC)(nil), // 17: clientpb.IOC - (*clientpb.GenerateReq)(nil), // 18: clientpb.GenerateReq - (*clientpb.ExternalGenerateReq)(nil), // 19: clientpb.ExternalGenerateReq - (*clientpb.ExternalImplantBinary)(nil), // 20: clientpb.ExternalImplantBinary - (*clientpb.ImplantConfig)(nil), // 21: clientpb.ImplantConfig - (*clientpb.Builder)(nil), // 22: clientpb.Builder - (*clientpb.Event)(nil), // 23: clientpb.Event - (*clientpb.Crackstation)(nil), // 24: clientpb.Crackstation - (*clientpb.CrackBenchmark)(nil), // 25: clientpb.CrackBenchmark - (*clientpb.CrackTask)(nil), // 26: clientpb.CrackTask - (*clientpb.CrackFile)(nil), // 27: clientpb.CrackFile - (*clientpb.CrackFileChunk)(nil), // 28: clientpb.CrackFileChunk - (*clientpb.RegenerateReq)(nil), // 29: clientpb.RegenerateReq - (*clientpb.DeleteReq)(nil), // 30: clientpb.DeleteReq - (*clientpb.ImplantProfile)(nil), // 31: clientpb.ImplantProfile - (*clientpb.MsfStagerReq)(nil), // 32: clientpb.MsfStagerReq - (*clientpb.ShellcodeRDIReq)(nil), // 33: clientpb.ShellcodeRDIReq - (*clientpb.ShellcodeEncodeReq)(nil), // 34: clientpb.ShellcodeEncodeReq - (*clientpb.TrafficEncoder)(nil), // 35: clientpb.TrafficEncoder - (*clientpb.Website)(nil), // 36: clientpb.Website - (*clientpb.WebsiteAddContent)(nil), // 37: clientpb.WebsiteAddContent - (*clientpb.WebsiteRemoveContent)(nil), // 38: clientpb.WebsiteRemoveContent - (*sliverpb.Ping)(nil), // 39: sliverpb.Ping - (*sliverpb.PsReq)(nil), // 40: sliverpb.PsReq - (*sliverpb.TerminateReq)(nil), // 41: sliverpb.TerminateReq - (*sliverpb.IfconfigReq)(nil), // 42: sliverpb.IfconfigReq - (*sliverpb.NetstatReq)(nil), // 43: sliverpb.NetstatReq - (*sliverpb.LsReq)(nil), // 44: sliverpb.LsReq - (*sliverpb.CdReq)(nil), // 45: sliverpb.CdReq - (*sliverpb.PwdReq)(nil), // 46: sliverpb.PwdReq - (*sliverpb.MvReq)(nil), // 47: sliverpb.MvReq - (*sliverpb.CpReq)(nil), // 48: sliverpb.CpReq - (*sliverpb.RmReq)(nil), // 49: sliverpb.RmReq - (*sliverpb.MkdirReq)(nil), // 50: sliverpb.MkdirReq - (*sliverpb.DownloadReq)(nil), // 51: sliverpb.DownloadReq - (*sliverpb.UploadReq)(nil), // 52: sliverpb.UploadReq - (*sliverpb.ChmodReq)(nil), // 53: sliverpb.ChmodReq - (*sliverpb.ChownReq)(nil), // 54: sliverpb.ChownReq - (*sliverpb.ChtimesReq)(nil), // 55: sliverpb.ChtimesReq - (*sliverpb.MemfilesListReq)(nil), // 56: sliverpb.MemfilesListReq - (*sliverpb.MemfilesAddReq)(nil), // 57: sliverpb.MemfilesAddReq - (*sliverpb.MemfilesRmReq)(nil), // 58: sliverpb.MemfilesRmReq - (*sliverpb.ProcessDumpReq)(nil), // 59: sliverpb.ProcessDumpReq - (*sliverpb.RunAsReq)(nil), // 60: sliverpb.RunAsReq - (*sliverpb.ImpersonateReq)(nil), // 61: sliverpb.ImpersonateReq - (*sliverpb.RevToSelfReq)(nil), // 62: sliverpb.RevToSelfReq - (*clientpb.GetSystemReq)(nil), // 63: clientpb.GetSystemReq - (*sliverpb.TaskReq)(nil), // 64: sliverpb.TaskReq - (*clientpb.MSFReq)(nil), // 65: clientpb.MSFReq - (*clientpb.MSFRemoteReq)(nil), // 66: clientpb.MSFRemoteReq - (*sliverpb.ExecuteAssemblyReq)(nil), // 67: sliverpb.ExecuteAssemblyReq - (*clientpb.MigrateReq)(nil), // 68: clientpb.MigrateReq - (*sliverpb.ExecuteReq)(nil), // 69: sliverpb.ExecuteReq - (*sliverpb.ExecuteWindowsReq)(nil), // 70: sliverpb.ExecuteWindowsReq - (*sliverpb.SideloadReq)(nil), // 71: sliverpb.SideloadReq - (*sliverpb.InvokeSpawnDllReq)(nil), // 72: sliverpb.InvokeSpawnDllReq - (*sliverpb.ScreenshotReq)(nil), // 73: sliverpb.ScreenshotReq - (*sliverpb.CurrentTokenOwnerReq)(nil), // 74: sliverpb.CurrentTokenOwnerReq - (*sliverpb.PivotStartListenerReq)(nil), // 75: sliverpb.PivotStartListenerReq - (*sliverpb.PivotStopListenerReq)(nil), // 76: sliverpb.PivotStopListenerReq - (*sliverpb.PivotListenersReq)(nil), // 77: sliverpb.PivotListenersReq - (*sliverpb.StartServiceReq)(nil), // 78: sliverpb.StartServiceReq - (*sliverpb.StopServiceReq)(nil), // 79: sliverpb.StopServiceReq - (*sliverpb.RemoveServiceReq)(nil), // 80: sliverpb.RemoveServiceReq - (*sliverpb.MakeTokenReq)(nil), // 81: sliverpb.MakeTokenReq - (*sliverpb.EnvReq)(nil), // 82: sliverpb.EnvReq - (*sliverpb.SetEnvReq)(nil), // 83: sliverpb.SetEnvReq - (*sliverpb.UnsetEnvReq)(nil), // 84: sliverpb.UnsetEnvReq - (*clientpb.BackdoorReq)(nil), // 85: clientpb.BackdoorReq - (*sliverpb.RegistryReadReq)(nil), // 86: sliverpb.RegistryReadReq - (*sliverpb.RegistryWriteReq)(nil), // 87: sliverpb.RegistryWriteReq - (*sliverpb.RegistryCreateKeyReq)(nil), // 88: sliverpb.RegistryCreateKeyReq - (*sliverpb.RegistryDeleteKeyReq)(nil), // 89: sliverpb.RegistryDeleteKeyReq - (*sliverpb.RegistrySubKeyListReq)(nil), // 90: sliverpb.RegistrySubKeyListReq - (*sliverpb.RegistryListValuesReq)(nil), // 91: sliverpb.RegistryListValuesReq - (*sliverpb.SSHCommandReq)(nil), // 92: sliverpb.SSHCommandReq - (*clientpb.DllHijackReq)(nil), // 93: clientpb.DllHijackReq - (*sliverpb.GetPrivsReq)(nil), // 94: sliverpb.GetPrivsReq - (*sliverpb.RportFwdStartListenerReq)(nil), // 95: sliverpb.RportFwdStartListenerReq - (*sliverpb.RportFwdListenersReq)(nil), // 96: sliverpb.RportFwdListenersReq - (*sliverpb.RportFwdStopListenerReq)(nil), // 97: sliverpb.RportFwdStopListenerReq - (*sliverpb.OpenSession)(nil), // 98: sliverpb.OpenSession - (*sliverpb.CloseSession)(nil), // 99: sliverpb.CloseSession - (*sliverpb.RegisterExtensionReq)(nil), // 100: sliverpb.RegisterExtensionReq - (*sliverpb.CallExtensionReq)(nil), // 101: sliverpb.CallExtensionReq - (*sliverpb.ListExtensionsReq)(nil), // 102: sliverpb.ListExtensionsReq - (*sliverpb.RegisterWasmExtensionReq)(nil), // 103: sliverpb.RegisterWasmExtensionReq - (*sliverpb.ListWasmExtensionsReq)(nil), // 104: sliverpb.ListWasmExtensionsReq - (*sliverpb.ExecWasmExtensionReq)(nil), // 105: sliverpb.ExecWasmExtensionReq - (*sliverpb.WGPortForwardStartReq)(nil), // 106: sliverpb.WGPortForwardStartReq - (*sliverpb.WGPortForwardStopReq)(nil), // 107: sliverpb.WGPortForwardStopReq - (*sliverpb.WGSocksStartReq)(nil), // 108: sliverpb.WGSocksStartReq - (*sliverpb.WGSocksStopReq)(nil), // 109: sliverpb.WGSocksStopReq - (*sliverpb.WGTCPForwardersReq)(nil), // 110: sliverpb.WGTCPForwardersReq - (*sliverpb.WGSocksServersReq)(nil), // 111: sliverpb.WGSocksServersReq - (*sliverpb.ShellReq)(nil), // 112: sliverpb.ShellReq - (*sliverpb.PortfwdReq)(nil), // 113: sliverpb.PortfwdReq - (*sliverpb.Socks)(nil), // 114: sliverpb.Socks - (*sliverpb.SocksData)(nil), // 115: sliverpb.SocksData - (*sliverpb.Tunnel)(nil), // 116: sliverpb.Tunnel - (*sliverpb.TunnelData)(nil), // 117: sliverpb.TunnelData - (*clientpb.Version)(nil), // 118: clientpb.Version - (*sliverpb.Reconfigure)(nil), // 119: sliverpb.Reconfigure - (*clientpb.Sessions)(nil), // 120: clientpb.Sessions - (*clientpb.Beacons)(nil), // 121: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 122: clientpb.BeaconTasks - (*commonpb.Response)(nil), // 123: commonpb.Response - (*clientpb.Jobs)(nil), // 124: clientpb.Jobs - (*clientpb.KillJob)(nil), // 125: clientpb.KillJob - (*clientpb.MTLSListener)(nil), // 126: clientpb.MTLSListener - (*clientpb.WGListener)(nil), // 127: clientpb.WGListener - (*clientpb.DNSListener)(nil), // 128: clientpb.DNSListener - (*clientpb.HTTPListener)(nil), // 129: clientpb.HTTPListener - (*clientpb.StagerListener)(nil), // 130: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 131: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 132: clientpb.AllHosts - (*clientpb.Generate)(nil), // 133: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 134: clientpb.ExternalImplantConfig - (*clientpb.Builders)(nil), // 135: clientpb.Builders - (*clientpb.Crackstations)(nil), // 136: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 137: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 138: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 139: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 140: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 141: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 142: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 143: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 144: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 145: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 146: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 147: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 148: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 149: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 150: clientpb.Websites - (*sliverpb.Ps)(nil), // 151: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 152: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 153: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 154: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 155: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 156: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 157: sliverpb.Mv - (*sliverpb.Cp)(nil), // 158: sliverpb.Cp - (*sliverpb.Rm)(nil), // 159: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 160: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 161: sliverpb.Download - (*sliverpb.Upload)(nil), // 162: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 163: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 164: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 165: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 166: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 167: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 168: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 169: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 170: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 171: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 172: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 173: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 174: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 175: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 176: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 177: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 178: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 179: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 180: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 181: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 182: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 183: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 184: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 185: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 186: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 187: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 188: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 189: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 190: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 191: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 192: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 193: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 194: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 195: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 196: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 197: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 198: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 199: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 200: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 201: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 202: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 203: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 204: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 205: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 206: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 207: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 208: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 209: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 210: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 211: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 212: sliverpb.Portfwd + (*clientpb.ImplantCommand)(nil), // 5: clientpb.ImplantCommand + (*clientpb.HistoryRequest)(nil), // 6: clientpb.HistoryRequest + (*clientpb.Beacon)(nil), // 7: clientpb.Beacon + (*clientpb.BeaconTask)(nil), // 8: clientpb.BeaconTask + (*clientpb.KillJobReq)(nil), // 9: clientpb.KillJobReq + (*clientpb.MTLSListenerReq)(nil), // 10: clientpb.MTLSListenerReq + (*clientpb.WGListenerReq)(nil), // 11: clientpb.WGListenerReq + (*clientpb.DNSListenerReq)(nil), // 12: clientpb.DNSListenerReq + (*clientpb.HTTPListenerReq)(nil), // 13: clientpb.HTTPListenerReq + (*clientpb.StagerListenerReq)(nil), // 14: clientpb.StagerListenerReq + (*clientpb.Loot)(nil), // 15: clientpb.Loot + (*clientpb.Credentials)(nil), // 16: clientpb.Credentials + (*clientpb.Credential)(nil), // 17: clientpb.Credential + (*clientpb.Host)(nil), // 18: clientpb.Host + (*clientpb.IOC)(nil), // 19: clientpb.IOC + (*clientpb.GenerateReq)(nil), // 20: clientpb.GenerateReq + (*clientpb.ExternalGenerateReq)(nil), // 21: clientpb.ExternalGenerateReq + (*clientpb.ExternalImplantBinary)(nil), // 22: clientpb.ExternalImplantBinary + (*clientpb.ImplantConfig)(nil), // 23: clientpb.ImplantConfig + (*clientpb.Builder)(nil), // 24: clientpb.Builder + (*clientpb.Event)(nil), // 25: clientpb.Event + (*clientpb.Crackstation)(nil), // 26: clientpb.Crackstation + (*clientpb.CrackBenchmark)(nil), // 27: clientpb.CrackBenchmark + (*clientpb.CrackTask)(nil), // 28: clientpb.CrackTask + (*clientpb.CrackFile)(nil), // 29: clientpb.CrackFile + (*clientpb.CrackFileChunk)(nil), // 30: clientpb.CrackFileChunk + (*clientpb.RegenerateReq)(nil), // 31: clientpb.RegenerateReq + (*clientpb.DeleteReq)(nil), // 32: clientpb.DeleteReq + (*clientpb.ImplantProfile)(nil), // 33: clientpb.ImplantProfile + (*clientpb.MsfStagerReq)(nil), // 34: clientpb.MsfStagerReq + (*clientpb.ShellcodeRDIReq)(nil), // 35: clientpb.ShellcodeRDIReq + (*clientpb.ShellcodeEncodeReq)(nil), // 36: clientpb.ShellcodeEncodeReq + (*clientpb.TrafficEncoder)(nil), // 37: clientpb.TrafficEncoder + (*clientpb.Website)(nil), // 38: clientpb.Website + (*clientpb.WebsiteAddContent)(nil), // 39: clientpb.WebsiteAddContent + (*clientpb.WebsiteRemoveContent)(nil), // 40: clientpb.WebsiteRemoveContent + (*sliverpb.Ping)(nil), // 41: sliverpb.Ping + (*sliverpb.PsReq)(nil), // 42: sliverpb.PsReq + (*sliverpb.TerminateReq)(nil), // 43: sliverpb.TerminateReq + (*sliverpb.IfconfigReq)(nil), // 44: sliverpb.IfconfigReq + (*sliverpb.NetstatReq)(nil), // 45: sliverpb.NetstatReq + (*sliverpb.LsReq)(nil), // 46: sliverpb.LsReq + (*sliverpb.CdReq)(nil), // 47: sliverpb.CdReq + (*sliverpb.PwdReq)(nil), // 48: sliverpb.PwdReq + (*sliverpb.MvReq)(nil), // 49: sliverpb.MvReq + (*sliverpb.CpReq)(nil), // 50: sliverpb.CpReq + (*sliverpb.RmReq)(nil), // 51: sliverpb.RmReq + (*sliverpb.MkdirReq)(nil), // 52: sliverpb.MkdirReq + (*sliverpb.DownloadReq)(nil), // 53: sliverpb.DownloadReq + (*sliverpb.UploadReq)(nil), // 54: sliverpb.UploadReq + (*sliverpb.ChmodReq)(nil), // 55: sliverpb.ChmodReq + (*sliverpb.ChownReq)(nil), // 56: sliverpb.ChownReq + (*sliverpb.ChtimesReq)(nil), // 57: sliverpb.ChtimesReq + (*sliverpb.MemfilesListReq)(nil), // 58: sliverpb.MemfilesListReq + (*sliverpb.MemfilesAddReq)(nil), // 59: sliverpb.MemfilesAddReq + (*sliverpb.MemfilesRmReq)(nil), // 60: sliverpb.MemfilesRmReq + (*sliverpb.ProcessDumpReq)(nil), // 61: sliverpb.ProcessDumpReq + (*sliverpb.RunAsReq)(nil), // 62: sliverpb.RunAsReq + (*sliverpb.ImpersonateReq)(nil), // 63: sliverpb.ImpersonateReq + (*sliverpb.RevToSelfReq)(nil), // 64: sliverpb.RevToSelfReq + (*clientpb.GetSystemReq)(nil), // 65: clientpb.GetSystemReq + (*sliverpb.TaskReq)(nil), // 66: sliverpb.TaskReq + (*clientpb.MSFReq)(nil), // 67: clientpb.MSFReq + (*clientpb.MSFRemoteReq)(nil), // 68: clientpb.MSFRemoteReq + (*sliverpb.ExecuteAssemblyReq)(nil), // 69: sliverpb.ExecuteAssemblyReq + (*clientpb.MigrateReq)(nil), // 70: clientpb.MigrateReq + (*sliverpb.ExecuteReq)(nil), // 71: sliverpb.ExecuteReq + (*sliverpb.ExecuteWindowsReq)(nil), // 72: sliverpb.ExecuteWindowsReq + (*sliverpb.SideloadReq)(nil), // 73: sliverpb.SideloadReq + (*sliverpb.InvokeSpawnDllReq)(nil), // 74: sliverpb.InvokeSpawnDllReq + (*sliverpb.ScreenshotReq)(nil), // 75: sliverpb.ScreenshotReq + (*sliverpb.CurrentTokenOwnerReq)(nil), // 76: sliverpb.CurrentTokenOwnerReq + (*sliverpb.PivotStartListenerReq)(nil), // 77: sliverpb.PivotStartListenerReq + (*sliverpb.PivotStopListenerReq)(nil), // 78: sliverpb.PivotStopListenerReq + (*sliverpb.PivotListenersReq)(nil), // 79: sliverpb.PivotListenersReq + (*sliverpb.StartServiceReq)(nil), // 80: sliverpb.StartServiceReq + (*sliverpb.StopServiceReq)(nil), // 81: sliverpb.StopServiceReq + (*sliverpb.RemoveServiceReq)(nil), // 82: sliverpb.RemoveServiceReq + (*sliverpb.MakeTokenReq)(nil), // 83: sliverpb.MakeTokenReq + (*sliverpb.EnvReq)(nil), // 84: sliverpb.EnvReq + (*sliverpb.SetEnvReq)(nil), // 85: sliverpb.SetEnvReq + (*sliverpb.UnsetEnvReq)(nil), // 86: sliverpb.UnsetEnvReq + (*clientpb.BackdoorReq)(nil), // 87: clientpb.BackdoorReq + (*sliverpb.RegistryReadReq)(nil), // 88: sliverpb.RegistryReadReq + (*sliverpb.RegistryWriteReq)(nil), // 89: sliverpb.RegistryWriteReq + (*sliverpb.RegistryCreateKeyReq)(nil), // 90: sliverpb.RegistryCreateKeyReq + (*sliverpb.RegistryDeleteKeyReq)(nil), // 91: sliverpb.RegistryDeleteKeyReq + (*sliverpb.RegistrySubKeyListReq)(nil), // 92: sliverpb.RegistrySubKeyListReq + (*sliverpb.RegistryListValuesReq)(nil), // 93: sliverpb.RegistryListValuesReq + (*sliverpb.SSHCommandReq)(nil), // 94: sliverpb.SSHCommandReq + (*clientpb.DllHijackReq)(nil), // 95: clientpb.DllHijackReq + (*sliverpb.GetPrivsReq)(nil), // 96: sliverpb.GetPrivsReq + (*sliverpb.RportFwdStartListenerReq)(nil), // 97: sliverpb.RportFwdStartListenerReq + (*sliverpb.RportFwdListenersReq)(nil), // 98: sliverpb.RportFwdListenersReq + (*sliverpb.RportFwdStopListenerReq)(nil), // 99: sliverpb.RportFwdStopListenerReq + (*sliverpb.OpenSession)(nil), // 100: sliverpb.OpenSession + (*sliverpb.CloseSession)(nil), // 101: sliverpb.CloseSession + (*sliverpb.RegisterExtensionReq)(nil), // 102: sliverpb.RegisterExtensionReq + (*sliverpb.CallExtensionReq)(nil), // 103: sliverpb.CallExtensionReq + (*sliverpb.ListExtensionsReq)(nil), // 104: sliverpb.ListExtensionsReq + (*sliverpb.RegisterWasmExtensionReq)(nil), // 105: sliverpb.RegisterWasmExtensionReq + (*sliverpb.ListWasmExtensionsReq)(nil), // 106: sliverpb.ListWasmExtensionsReq + (*sliverpb.ExecWasmExtensionReq)(nil), // 107: sliverpb.ExecWasmExtensionReq + (*sliverpb.WGPortForwardStartReq)(nil), // 108: sliverpb.WGPortForwardStartReq + (*sliverpb.WGPortForwardStopReq)(nil), // 109: sliverpb.WGPortForwardStopReq + (*sliverpb.WGSocksStartReq)(nil), // 110: sliverpb.WGSocksStartReq + (*sliverpb.WGSocksStopReq)(nil), // 111: sliverpb.WGSocksStopReq + (*sliverpb.WGTCPForwardersReq)(nil), // 112: sliverpb.WGTCPForwardersReq + (*sliverpb.WGSocksServersReq)(nil), // 113: sliverpb.WGSocksServersReq + (*sliverpb.ShellReq)(nil), // 114: sliverpb.ShellReq + (*sliverpb.PortfwdReq)(nil), // 115: sliverpb.PortfwdReq + (*sliverpb.Socks)(nil), // 116: sliverpb.Socks + (*sliverpb.SocksData)(nil), // 117: sliverpb.SocksData + (*sliverpb.Tunnel)(nil), // 118: sliverpb.Tunnel + (*sliverpb.TunnelData)(nil), // 119: sliverpb.TunnelData + (*clientpb.Version)(nil), // 120: clientpb.Version + (*sliverpb.Reconfigure)(nil), // 121: sliverpb.Reconfigure + (*clientpb.History)(nil), // 122: clientpb.History + (*clientpb.Sessions)(nil), // 123: clientpb.Sessions + (*clientpb.Beacons)(nil), // 124: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 125: clientpb.BeaconTasks + (*commonpb.Response)(nil), // 126: commonpb.Response + (*clientpb.Jobs)(nil), // 127: clientpb.Jobs + (*clientpb.KillJob)(nil), // 128: clientpb.KillJob + (*clientpb.MTLSListener)(nil), // 129: clientpb.MTLSListener + (*clientpb.WGListener)(nil), // 130: clientpb.WGListener + (*clientpb.DNSListener)(nil), // 131: clientpb.DNSListener + (*clientpb.HTTPListener)(nil), // 132: clientpb.HTTPListener + (*clientpb.StagerListener)(nil), // 133: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 134: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 135: clientpb.AllHosts + (*clientpb.Generate)(nil), // 136: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 137: clientpb.ExternalImplantConfig + (*clientpb.Builders)(nil), // 138: clientpb.Builders + (*clientpb.Crackstations)(nil), // 139: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 140: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 141: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 142: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 143: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 144: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 145: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 146: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 147: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 148: clientpb.Compiler + (*clientpb.ShellcodeEncode)(nil), // 149: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 150: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 151: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 152: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 153: clientpb.Websites + (*sliverpb.Ps)(nil), // 154: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 155: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 156: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 157: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 158: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 159: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 160: sliverpb.Mv + (*sliverpb.Cp)(nil), // 161: sliverpb.Cp + (*sliverpb.Rm)(nil), // 162: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 163: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 164: sliverpb.Download + (*sliverpb.Upload)(nil), // 165: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 166: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 167: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 168: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 169: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 170: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 171: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 172: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 173: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 174: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 175: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 176: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 177: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 178: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 179: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 180: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 181: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 182: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 183: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 184: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 185: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 186: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 187: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 188: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 189: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 190: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 191: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 192: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 193: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 194: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 195: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 196: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 197: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 198: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 199: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 200: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 201: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 202: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 203: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 204: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 205: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 206: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 207: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 208: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 209: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 210: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 211: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 212: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 213: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 214: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 215: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty @@ -881,333 +892,337 @@ var file_rpcpb_services_proto_depIdxs = []int32{ 2, // 2: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq 3, // 3: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq 4, // 4: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 0, // 5: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 6: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 5, // 7: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 5, // 8: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 5, // 9: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 6, // 10: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 6, // 11: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 12: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 13: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 14: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 7, // 15: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 8, // 16: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 9, // 17: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 10, // 18: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 11, // 19: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 11, // 20: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 12, // 21: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 12, // 22: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq - 13, // 23: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 13, // 24: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 13, // 25: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 13, // 26: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 27: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 28: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 14, // 29: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 14, // 30: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 14, // 31: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 15, // 32: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 15, // 33: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 15, // 34: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 15, // 35: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 36: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 16, // 37: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 16, // 38: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 17, // 39: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 18, // 40: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 19, // 41: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 20, // 42: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 21, // 43: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig - 22, // 44: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 23, // 45: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 46: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 24, // 47: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 23, // 48: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 25, // 49: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 50: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 26, // 51: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 26, // 52: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 27, // 53: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 27, // 54: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 28, // 55: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 28, // 56: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 27, // 57: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 27, // 58: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 29, // 59: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 60: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 30, // 61: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 62: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 63: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 64: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 65: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 30, // 66: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 31, // 67: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 32, // 68: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 33, // 69: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 70: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 34, // 71: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 72: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 73: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 35, // 74: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 35, // 75: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 76: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 36, // 77: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 36, // 78: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 37, // 79: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 37, // 80: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 38, // 81: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 39, // 82: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 40, // 83: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 41, // 84: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 42, // 85: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 43, // 86: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 44, // 87: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 45, // 88: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 46, // 89: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 47, // 90: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 48, // 91: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 49, // 92: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 50, // 93: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 51, // 94: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 52, // 95: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 53, // 96: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 54, // 97: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 55, // 98: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 56, // 99: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 57, // 100: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 58, // 101: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 59, // 102: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 60, // 103: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 61, // 104: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 62, // 105: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 63, // 106: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 64, // 107: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 65, // 108: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 66, // 109: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 67, // 110: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 68, // 111: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 69, // 112: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 70, // 113: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 71, // 114: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 72, // 115: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 73, // 116: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 74, // 117: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 75, // 118: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 76, // 119: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 77, // 120: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 121: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 78, // 122: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 79, // 123: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 80, // 124: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 81, // 125: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 82, // 126: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 83, // 127: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 84, // 128: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 85, // 129: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 86, // 130: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 87, // 131: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 88, // 132: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 89, // 133: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 90, // 134: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 91, // 135: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 92, // 136: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 93, // 137: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 94, // 138: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 95, // 139: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 96, // 140: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 97, // 141: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 98, // 142: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 99, // 143: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 100, // 144: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 101, // 145: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 102, // 146: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 103, // 147: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 104, // 148: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 105, // 149: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 106, // 150: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 107, // 151: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 108, // 152: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 109, // 153: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 110, // 154: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 111, // 155: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 112, // 156: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 113, // 157: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 114, // 158: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 114, // 159: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 115, // 160: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 116, // 161: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 116, // 162: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 117, // 163: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 164: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 118, // 165: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 166: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 0, // 167: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 119, // 168: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 169: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 120, // 170: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 121, // 171: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 5, // 172: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 173: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 122, // 174: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 6, // 175: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 6, // 176: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 123, // 177: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 178: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 124, // 179: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 125, // 180: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 126, // 181: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 127, // 182: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 128, // 183: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 129, // 184: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 129, // 185: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 130, // 186: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 130, // 187: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 13, // 188: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 189: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 13, // 190: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 13, // 191: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 131, // 192: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 14, // 193: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 194: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 195: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 196: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 15, // 197: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 14, // 198: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 14, // 199: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 15, // 200: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 132, // 201: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 16, // 202: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 203: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 204: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 133, // 205: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 134, // 206: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 207: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 134, // 208: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 23, // 209: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 210: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 135, // 211: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 23, // 212: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 213: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 214: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 136, // 215: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 26, // 216: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 217: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 137, // 218: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 27, // 219: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 220: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 28, // 221: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 222: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 223: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 133, // 224: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 138, // 225: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 226: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 139, // 227: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 140, // 228: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 141, // 229: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 142, // 230: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 231: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 31, // 232: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 143, // 233: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 144, // 234: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 145, // 235: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 146, // 236: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 147, // 237: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 148, // 238: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 149, // 239: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 240: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 150, // 241: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 36, // 242: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 243: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 36, // 244: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 36, // 245: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 36, // 246: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 39, // 247: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 151, // 248: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 152, // 249: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 153, // 250: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 154, // 251: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 155, // 252: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 156, // 253: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 156, // 254: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 157, // 255: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 158, // 256: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 159, // 257: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 160, // 258: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 161, // 259: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 162, // 260: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 163, // 261: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 164, // 262: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 165, // 263: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 155, // 264: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 166, // 265: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 167, // 266: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 168, // 267: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 169, // 268: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 170, // 269: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 171, // 270: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 172, // 271: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 173, // 272: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 173, // 273: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 173, // 274: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 174, // 275: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 175, // 276: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 176, // 277: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 176, // 278: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 177, // 279: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 178, // 280: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 179, // 281: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 180, // 282: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 181, // 283: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 284: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 182, // 285: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 183, // 286: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 184, // 287: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 184, // 288: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 184, // 289: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 185, // 290: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 186, // 291: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 187, // 292: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 188, // 293: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 189, // 294: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 190, // 295: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 191, // 296: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 192, // 297: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 193, // 298: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 194, // 299: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 195, // 300: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 196, // 301: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 197, // 302: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 198, // 303: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 199, // 304: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 200, // 305: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 199, // 306: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 98, // 307: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 308: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 201, // 309: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 202, // 310: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 203, // 311: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 204, // 312: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 205, // 313: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 206, // 314: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 207, // 315: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 207, // 316: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 208, // 317: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 208, // 318: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 209, // 319: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 210, // 320: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 211, // 321: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 212, // 322: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 114, // 323: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 324: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 115, // 325: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 116, // 326: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 327: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 117, // 328: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 23, // 329: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 165, // [165:330] is the sub-list for method output_type - 0, // [0:165] is the sub-list for method input_type + 5, // 5: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand + 6, // 6: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest + 0, // 7: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 8: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 7, // 9: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 7, // 10: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 7, // 11: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 8, // 12: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 8, // 13: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 14: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 15: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 16: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 9, // 17: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 10, // 18: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 11, // 19: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 12, // 20: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 13, // 21: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 13, // 22: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 14, // 23: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 14, // 24: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq + 15, // 25: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 15, // 26: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 15, // 27: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 15, // 28: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 29: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 30: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 16, // 31: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 16, // 32: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 16, // 33: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 17, // 34: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 17, // 35: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 17, // 36: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 17, // 37: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 38: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 18, // 39: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 18, // 40: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 19, // 41: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 20, // 42: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 21, // 43: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 22, // 44: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 23, // 45: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig + 24, // 46: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 25, // 47: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 48: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 26, // 49: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 25, // 50: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 27, // 51: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 52: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 28, // 53: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 28, // 54: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 29, // 55: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 29, // 56: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 30, // 57: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 30, // 58: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 29, // 59: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 29, // 60: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 31, // 61: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 62: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 32, // 63: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 64: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 65: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 66: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 67: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 32, // 68: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 33, // 69: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 34, // 70: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 35, // 71: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 72: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 36, // 73: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 74: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 75: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 37, // 76: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 37, // 77: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 78: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 38, // 79: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 38, // 80: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 39, // 81: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 39, // 82: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 40, // 83: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 41, // 84: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 42, // 85: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 43, // 86: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 44, // 87: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 45, // 88: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 46, // 89: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 47, // 90: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 48, // 91: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 49, // 92: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 50, // 93: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 51, // 94: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 52, // 95: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 53, // 96: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 54, // 97: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 55, // 98: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 56, // 99: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 57, // 100: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 58, // 101: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 59, // 102: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 60, // 103: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 61, // 104: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 62, // 105: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 63, // 106: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 64, // 107: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 65, // 108: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 66, // 109: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 67, // 110: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 68, // 111: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 69, // 112: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 70, // 113: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 71, // 114: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 72, // 115: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 73, // 116: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 74, // 117: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 75, // 118: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 76, // 119: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 77, // 120: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 78, // 121: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 79, // 122: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 123: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 80, // 124: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 81, // 125: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 82, // 126: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 83, // 127: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 84, // 128: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 85, // 129: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 86, // 130: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 87, // 131: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 88, // 132: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 89, // 133: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 90, // 134: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 91, // 135: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 92, // 136: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 93, // 137: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 94, // 138: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 95, // 139: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 96, // 140: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 97, // 141: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 98, // 142: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 99, // 143: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 100, // 144: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 101, // 145: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 102, // 146: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 103, // 147: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 104, // 148: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 105, // 149: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 106, // 150: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 107, // 151: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 108, // 152: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 109, // 153: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 110, // 154: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 111, // 155: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 112, // 156: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 113, // 157: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 114, // 158: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 115, // 159: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 116, // 160: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 116, // 161: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 117, // 162: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 118, // 163: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 118, // 164: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 119, // 165: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 166: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 120, // 167: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 0, // 168: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 169: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 121, // 170: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 171: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 172: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 122, // 173: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 123, // 174: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 124, // 175: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 7, // 176: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 177: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 125, // 178: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 8, // 179: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 8, // 180: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 126, // 181: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 182: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 127, // 183: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 128, // 184: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 129, // 185: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 130, // 186: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 131, // 187: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 132, // 188: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 132, // 189: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 133, // 190: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 133, // 191: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 15, // 192: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 193: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 15, // 194: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 15, // 195: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 134, // 196: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 16, // 197: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 198: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 199: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 200: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 17, // 201: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 16, // 202: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 16, // 203: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 17, // 204: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 135, // 205: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 18, // 206: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 207: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 208: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 136, // 209: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 137, // 210: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 211: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 137, // 212: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 25, // 213: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 214: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 138, // 215: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 25, // 216: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 217: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 218: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 139, // 219: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 28, // 220: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 221: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 140, // 222: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 29, // 223: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 224: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 30, // 225: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 226: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 227: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 136, // 228: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 141, // 229: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 230: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 142, // 231: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 143, // 232: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 144, // 233: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 145, // 234: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 235: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 33, // 236: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 146, // 237: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 147, // 238: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 148, // 239: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 149, // 240: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 150, // 241: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 151, // 242: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 152, // 243: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 244: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 153, // 245: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 38, // 246: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 247: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 38, // 248: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 38, // 249: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 38, // 250: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 41, // 251: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 154, // 252: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 155, // 253: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 156, // 254: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 157, // 255: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 158, // 256: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 159, // 257: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 159, // 258: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 160, // 259: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 161, // 260: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 162, // 261: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 163, // 262: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 164, // 263: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 165, // 264: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 166, // 265: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 167, // 266: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 168, // 267: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 158, // 268: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 169, // 269: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 170, // 270: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 171, // 271: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 172, // 272: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 173, // 273: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 174, // 274: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 175, // 275: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 176, // 276: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 176, // 277: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 176, // 278: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 177, // 279: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 178, // 280: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 179, // 281: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 179, // 282: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 180, // 283: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 181, // 284: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 182, // 285: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 183, // 286: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 184, // 287: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 288: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 185, // 289: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 186, // 290: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 187, // 291: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 187, // 292: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 187, // 293: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 188, // 294: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 189, // 295: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 190, // 296: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 191, // 297: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 192, // 298: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 193, // 299: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 194, // 300: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 195, // 301: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 196, // 302: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 197, // 303: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 198, // 304: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 199, // 305: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 200, // 306: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 201, // 307: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 202, // 308: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 203, // 309: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 202, // 310: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 100, // 311: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 312: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 204, // 313: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 205, // 314: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 206, // 315: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 207, // 316: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 208, // 317: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 209, // 318: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 210, // 319: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 210, // 320: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 211, // 321: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 211, // 322: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 212, // 323: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 213, // 324: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 214, // 325: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 215, // 326: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 116, // 327: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 328: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 117, // 329: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 118, // 330: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 331: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 119, // 332: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 25, // 333: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 167, // [167:334] is the sub-list for method output_type + 0, // [0:167] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 71c74fe2d5..2ef6bc2f8c 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -19,6 +19,9 @@ service SliverRPC { rpc Reconfigure(sliverpb.ReconfigureReq) returns (sliverpb.Reconfigure); rpc Rename(clientpb.RenameReq) returns (commonpb.Empty); + rpc ImplantHistory(stream clientpb.ImplantCommand) returns (commonpb.Empty); + rpc GetImplantHistory(clientpb.HistoryRequest) returns (clientpb.History); + // *** Sessions *** rpc GetSessions(commonpb.Empty) returns (clientpb.Sessions); diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 0128953350..247e58c04e 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -27,6 +27,8 @@ const ( SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" SliverRPC_Rename_FullMethodName = "/rpcpb.SliverRPC/Rename" + SliverRPC_ImplantHistory_FullMethodName = "/rpcpb.SliverRPC/ImplantHistory" + SliverRPC_GetImplantHistory_FullMethodName = "/rpcpb.SliverRPC/GetImplantHistory" SliverRPC_GetSessions_FullMethodName = "/rpcpb.SliverRPC/GetSessions" SliverRPC_GetBeacons_FullMethodName = "/rpcpb.SliverRPC/GetBeacons" SliverRPC_GetBeacon_FullMethodName = "/rpcpb.SliverRPC/GetBeacon" @@ -201,6 +203,8 @@ type SliverRPCClient interface { Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) Rename(ctx context.Context, in *clientpb.RenameReq, opts ...grpc.CallOption) (*commonpb.Empty, error) + ImplantHistory(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ImplantHistoryClient, error) + GetImplantHistory(ctx context.Context, in *clientpb.HistoryRequest, opts ...grpc.CallOption) (*clientpb.History, error) // *** Sessions *** GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) // *** Beacons *** @@ -465,6 +469,49 @@ func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, op return out, nil } +func (c *sliverRPCClient) ImplantHistory(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ImplantHistoryClient, error) { + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_ImplantHistory_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &sliverRPCImplantHistoryClient{stream} + return x, nil +} + +type SliverRPC_ImplantHistoryClient interface { + Send(*clientpb.ImplantCommand) error + CloseAndRecv() (*commonpb.Empty, error) + grpc.ClientStream +} + +type sliverRPCImplantHistoryClient struct { + grpc.ClientStream +} + +func (x *sliverRPCImplantHistoryClient) Send(m *clientpb.ImplantCommand) error { + return x.ClientStream.SendMsg(m) +} + +func (x *sliverRPCImplantHistoryClient) CloseAndRecv() (*commonpb.Empty, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(commonpb.Empty) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *sliverRPCClient) GetImplantHistory(ctx context.Context, in *clientpb.HistoryRequest, opts ...grpc.CallOption) (*clientpb.History, error) { + out := new(clientpb.History) + err := c.cc.Invoke(ctx, SliverRPC_GetImplantHistory_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) { out := new(clientpb.Sessions) err := c.cc.Invoke(ctx, SliverRPC_GetSessions_FullMethodName, in, out, opts...) @@ -817,7 +864,7 @@ func (c *sliverRPCClient) GenerateExternalGetImplantConfig(ctx context.Context, } func (c *sliverRPCClient) BuilderRegister(ctx context.Context, in *clientpb.Builder, opts ...grpc.CallOption) (SliverRPC_BuilderRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_BuilderRegister_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_BuilderRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -867,7 +914,7 @@ func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts } func (c *sliverRPCClient) CrackstationRegister(ctx context.Context, in *clientpb.Crackstation, opts ...grpc.CallOption) (SliverRPC_CrackstationRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_CrackstationRegister_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_CrackstationRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -1907,7 +1954,7 @@ func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, op } func (c *sliverRPCClient) SocksProxy(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_SocksProxyClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_SocksProxy_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_SocksProxy_FullMethodName, opts...) if err != nil { return nil, err } @@ -1956,7 +2003,7 @@ func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, } func (c *sliverRPCClient) TunnelData(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_TunnelDataClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_TunnelData_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_TunnelData_FullMethodName, opts...) if err != nil { return nil, err } @@ -1987,7 +2034,7 @@ func (x *sliverRPCTunnelDataClient) Recv() (*sliverpb.TunnelData, error) { } func (c *sliverRPCClient) Events(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (SliverRPC_EventsClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_Events_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[6], SliverRPC_Events_FullMethodName, opts...) if err != nil { return nil, err } @@ -2030,6 +2077,8 @@ type SliverRPCServer interface { Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) Reconfigure(context.Context, *sliverpb.ReconfigureReq) (*sliverpb.Reconfigure, error) Rename(context.Context, *clientpb.RenameReq) (*commonpb.Empty, error) + ImplantHistory(SliverRPC_ImplantHistoryServer) error + GetImplantHistory(context.Context, *clientpb.HistoryRequest) (*clientpb.History, error) // *** Sessions *** GetSessions(context.Context, *commonpb.Empty) (*clientpb.Sessions, error) // *** Beacons *** @@ -2236,6 +2285,12 @@ func (UnimplementedSliverRPCServer) Reconfigure(context.Context, *sliverpb.Recon func (UnimplementedSliverRPCServer) Rename(context.Context, *clientpb.RenameReq) (*commonpb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Rename not implemented") } +func (UnimplementedSliverRPCServer) ImplantHistory(SliverRPC_ImplantHistoryServer) error { + return status.Errorf(codes.Unimplemented, "method ImplantHistory not implemented") +} +func (UnimplementedSliverRPCServer) GetImplantHistory(context.Context, *clientpb.HistoryRequest) (*clientpb.History, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetImplantHistory not implemented") +} func (UnimplementedSliverRPCServer) GetSessions(context.Context, *commonpb.Empty) (*clientpb.Sessions, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSessions not implemented") } @@ -2827,6 +2882,50 @@ func _SliverRPC_Rename_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _SliverRPC_ImplantHistory_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(SliverRPCServer).ImplantHistory(&sliverRPCImplantHistoryServer{stream}) +} + +type SliverRPC_ImplantHistoryServer interface { + SendAndClose(*commonpb.Empty) error + Recv() (*clientpb.ImplantCommand, error) + grpc.ServerStream +} + +type sliverRPCImplantHistoryServer struct { + grpc.ServerStream +} + +func (x *sliverRPCImplantHistoryServer) SendAndClose(m *commonpb.Empty) error { + return x.ServerStream.SendMsg(m) +} + +func (x *sliverRPCImplantHistoryServer) Recv() (*clientpb.ImplantCommand, error) { + m := new(clientpb.ImplantCommand) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _SliverRPC_GetImplantHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(clientpb.HistoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetImplantHistory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetImplantHistory_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetImplantHistory(ctx, req.(*clientpb.HistoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_GetSessions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(commonpb.Empty) if err := dec(in); err != nil { @@ -5755,6 +5854,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "Rename", Handler: _SliverRPC_Rename_Handler, }, + { + MethodName: "GetImplantHistory", + Handler: _SliverRPC_GetImplantHistory_Handler, + }, { MethodName: "GetSessions", Handler: _SliverRPC_GetSessions_Handler, @@ -6382,6 +6485,11 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ Handler: _SliverRPC_ClientLog_Handler, ClientStreams: true, }, + { + StreamName: "ImplantHistory", + Handler: _SliverRPC_ImplantHistory_Handler, + ClientStreams: true, + }, { StreamName: "BuilderRegister", Handler: _SliverRPC_BuilderRegister_Handler, diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index c12df0e731..e99a2a09c3 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -40,7 +40,7 @@ var ( ErrInvalidStreamName = status.Error(codes.InvalidArgument, "Invalid stream name") rpcClientLogs = log.NamedLogger("rpc", "client-logs") - streamNamePattern = regexp.MustCompile("^[a-z0-9_-]+$") + streamNamePattern = regexp.MustCompile("^[a-zA-Z0-9_-]+$") ) type LogStream struct { diff --git a/server/rpc/rpc-history.go b/server/rpc/rpc-history.go new file mode 100644 index 0000000000..7c72e9b986 --- /dev/null +++ b/server/rpc/rpc-history.go @@ -0,0 +1,178 @@ +package rpc + +import ( + "context" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/log" +) + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// GetImplantHistory returns a list of commands ran on an implant, by a given user or all of them. +func (rpc *Server) GetImplantHistory(ctx context.Context, req *clientpb.HistoryRequest) (*clientpb.History, error) { + commonName := rpc.getClientCommonName(ctx) + logsDir, err := getImplantHistoryDir() + if err != nil { + rpcClientLogs.Errorf("Failed to get implant log directory: %s", err) + return nil, err + } + + // Don't create if the history file does not exist. + streamName := fmt.Sprintf("%s_%s", req.ImplantName, req.ImplantID) + rpcClientLogs.Infof("Opening file %s", streamName) + logPath := filepath.Join(logsDir, streamName+".history") + if _, err := os.Stat(logPath); err != nil { + if os.IsNotExist(err) { + return &clientpb.History{}, nil + } + + return nil, err + } + + // Read the file and unmarshal in here. + var commands []*clientpb.ImplantCommand + + data, err := os.ReadFile(logPath) + if err != nil { + rpcClientLogs.Errorf("Failed to read implant history file: %s", err) + return nil, err + } + + err = json.Unmarshal(formatJSONList(data), &commands) + if err != nil { + rpcClientLogs.Error(err) + } + + history := &clientpb.History{} + + // Get only user commands if required to. + if req.UserOnly { + history.UserOnly = true + + for _, cmd := range commands { + if cmd.GetUser() == commonName { + history.Commands = append(history.Commands, cmd) + } + } + } else { + history.Commands = commands + } + + // And if requested for only a certain number of commands, cut the list. + if req.MaxLines > 0 && int(req.MaxLines) < len(history.Commands) { + oldest := len(history.Commands) - int(req.MaxLines) + history.Commands = history.Commands[oldest:] + } + + history.HistoryLen = int32(len(commands)) + + return history, nil +} + +// ImplantHistory is used by clients to log the command lines they execute on implants. +func (rpc *Server) ImplantHistory(stream rpcpb.SliverRPC_ImplantHistoryServer) error { + commonName := rpc.getClientCommonName(stream.Context()) + logsDir, err := getImplantHistoryDir() + if err != nil { + rpcClientLogs.Errorf("Failed to get implant log directory: %s", err) + return err + } + + streams := make(map[string]*LogStream) + defer func() { + for _, stream := range streams { + rpcClientLogs.Infof("Closing implant log file: %s", stream.logFile.Name()) + stream.logFile.Close() + } + }() + + for { + fromClient, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + rpcClientLogs.Errorf("Failed to receive implant history data: %s", err) + return err + } + + streamName := fmt.Sprintf("%s_%s", fromClient.ImplantName, fromClient.ImplantID) + + // Remove useless fields and write to file. + fromClient.User = commonName + fromClient.Request = nil + + data, err := json.Marshal(fromClient) + if err != nil { + return err + } + + data = append([]byte(",\n"), data...) + + if _, ok := streams[streamName]; !ok { + streams[streamName], err = openNewHistoryStream(logsDir, streamName) + if err != nil { + rpcClientLogs.Errorf("Failed to open implant history log file: %s", err) + return err + } + } + rpcClientLogs.Debugf("Received %d bytes of implant history data for %s", len(data), streamName) + streams[streamName].Write(data) + } + return nil +} + +func getImplantHistoryDir() (string, error) { + parentLogDir := filepath.Join(log.GetLogDir(), "implants") + if err := os.MkdirAll(parentLogDir, 0o700); err != nil { + rpcClientLogs.Warnf("Failed to create client console log directory: %s", err) + return "", err + } + return parentLogDir, nil +} + +func openNewHistoryStream(logsDir string, stream string) (*LogStream, error) { + if !streamNamePattern.MatchString(stream) { + return nil, ErrInvalidStreamName + } + stream = filepath.Base(stream) + logPath := filepath.Join(logsDir, filepath.Base(stream+".history")) + logFile, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) + if err != nil { + return nil, err + } + return &LogStream{stream: stream, parts: 0, logFile: logFile, lock: &sync.Mutex{}}, nil +} + +func formatJSONList(data []byte) []byte { + data = []byte(strings.TrimPrefix(string(data), ",\n")) + data = append(data, ']') + data = append([]byte("["), data...) + + return data +} From c17c6d082cf488fff9a73e77203b888e67ac41d3 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 15:25:06 +0200 Subject: [PATCH 044/109] Fix command history not being saved in implant CLI --- client/cli/implant.go | 25 +++++++++++++-- client/command/history/history.go | 18 +++++++---- client/console/console.go | 17 +++++------ client/console/history.go | 51 ++++++++++++++++++++++++++----- client/console/implant.go | 10 ++++++ 5 files changed, 97 insertions(+), 24 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 4f6ec6776f..6f9a2fe7b0 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -2,6 +2,7 @@ package cli import ( "errors" + "os" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" @@ -11,6 +12,7 @@ import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + "golang.org/x/exp/slices" ) func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { @@ -27,7 +29,8 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co // And when pre-running any of the commands in this tree, // connect to the server as we always do, but also set the // active target for this binary run. - implantCmd.PersistentPreRunE = implantPreRun(implantCmd, con) + implantCmd.PersistentPreRunE = preRunImplant(implantCmd, con) + implantCmd.PersistentPostRunE = postRunImplant(implantCmd, con) // Completions. // Unlike the server-only command tree, we need to unconditionally @@ -54,7 +57,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return implantCmd } -func implantPreRun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { +func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { if err := preRunClient(con)(cmd, args); err != nil { return err @@ -90,3 +93,21 @@ func implantPreRun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd return nil } } + +func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, args []string) error { + var saveArgs []string + + for i, arg := range os.Args { + if arg == cmd.Name() { + saveArgs = os.Args[i:] + } else if slices.Contains(cmd.Aliases, arg) { + saveArgs = os.Args[i:] + } + } + + con.ActiveTarget.SaveCommandLine(saveArgs) + + return con.Disconnect() + } +} diff --git a/client/command/history/history.go b/client/command/history/history.go index 30eb32c78a..a88254c28b 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -25,6 +25,7 @@ import ( "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/fatih/color" "github.com/spf13/cobra" @@ -33,9 +34,10 @@ import ( // Commands returns all commands related to implant history. func Commands(con *console.SliverClient) []*cobra.Command { - history := &cobra.Command{ - Use: "history", - Short: "Print the implant command history", + historyCmd := &cobra.Command{ + Use: "history", + Short: "Print the implant command history", + GroupID: constants.SliverCoreHelpGroup, RunE: func(cmd *cobra.Command, args []string) error { sess, beac := con.ActiveTarget.Get() if sess == nil && beac == nil { @@ -63,7 +65,11 @@ func Commands(con *console.SliverClient) []*cobra.Command { return err } - for i, command := range history.GetCommands() { + commands := history.GetCommands() + + for i := len(commands) - 1; i >= 0; i-- { + command := commands[i] + if user && command.GetUser() != clientUser { continue } @@ -84,10 +90,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } - flags.Bind("history", false, history, func(f *pflag.FlagSet) { + flags.Bind("history", false, historyCmd, func(f *pflag.FlagSet) { f.BoolP("user", "u", false, "Only print implant commands executed by user") f.BoolP("time", "t", false, "Print the exec time before the command line (tab separated)") }) - return []*cobra.Command{history} + return []*cobra.Command{historyCmd} } diff --git a/client/console/console.go b/client/console/console.go index ee00c6c710..04938679aa 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -91,6 +91,7 @@ type SliverClient struct { // Core client Teamclient *client.Client App *console.Console + Settings *assets.ClientSettings IsServer bool IsCLI bool IsCompleting bool @@ -106,7 +107,6 @@ type SliverClient struct { EventListeners *sync.Map BeaconTaskCallbacks map[string]BeaconTaskCallback BeaconTaskCallbacksMutex *sync.Mutex - Settings *assets.ClientSettings } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -145,17 +145,14 @@ func newConsole() *SliverClient { settings, _ := assets.LoadSettings() con := &SliverClient{ - App: console.New("sliver"), - ActiveTarget: &ActiveTarget{ - observers: map[int]Observer{}, - observerID: 0, - }, - EventListeners: &sync.Map{}, - BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, - BeaconTaskCallbacksMutex: &sync.Mutex{}, + App: console.New("sliver"), Settings: settings, IsCLI: true, printf: fmt.Printf, + ActiveTarget: newActiveTarget(), + EventListeners: &sync.Map{}, + BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, + BeaconTaskCallbacksMutex: &sync.Mutex{}, } con.App.SetPrintLogo(func(_ *console.Console) { @@ -218,6 +215,8 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { sliver.AddHistorySource("implant history (all users)", histAll) } + con.ActiveTarget.hist = histAll + con.closeLogs = append(con.closeLogs, func() { histuser.Close() histAll.Close() diff --git a/client/console/history.go b/client/console/history.go index 32fb3f234e..9981cea48f 100644 --- a/client/console/history.go +++ b/client/console/history.go @@ -21,6 +21,7 @@ package console import ( "context" "errors" + "strings" "time" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -35,6 +36,19 @@ type implantHistory struct { user bool } +// SaveCommandLine sends a command-line to the server for saving, +// with information about the currrent active target and user. +// Called in the implant-command tree root persistent post-runner. +func (s *ActiveTarget) SaveCommandLine(args []string) { + if s.hist == nil { + return + } + + cmdline := strings.Join(args, " ") + + s.hist.Write(cmdline) +} + func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { hist := &implantHistory{ con: con, @@ -61,21 +75,23 @@ func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { } // Write - Sends the last command to the server for saving. -func (h *implantHistory) Write(s string) (int, error) { +func (h *implantHistory) Write(cmdline string) (int, error) { sess, beac := h.con.ActiveTarget.Get() if sess == nil && beac == nil { return len(h.items), nil } + cmdline = strings.TrimSpace(cmdline) + // Don't save queries for the list of commands. - if s == "history" { + if isTrivialCommand(cmdline) { return len(h.items), nil } // Populate a command line with its context. cmd := &clientpb.ImplantCommand{} - cmd.Block = s + cmd.Block = cmdline cmd.ExecutedAt = time.Now().Unix() if sess != nil { @@ -99,8 +115,8 @@ func (h *implantHistory) Write(s string) (int, error) { } // GetLine returns a line from history. -func (h *implantHistory) GetLine(i int) (string, error) { - if i < 0 { +func (h *implantHistory) GetLine(pos int) (string, error) { + if pos < 0 { return "", nil } @@ -109,11 +125,11 @@ func (h *implantHistory) GetLine(i int) (string, error) { h.Dump() } - if i >= len(h.items) { + if pos >= len(h.items) { return "", errors.New("Invalid history index") } - return h.items[i].Block, nil + return h.items[pos].Block, nil } // Len returns the number of lines in history. @@ -160,3 +176,24 @@ func (h *implantHistory) Close() error { _, err := h.Stream.CloseAndRecv() return err } + +func isTrivialCommand(cmdline string) bool { + ignoreCmds := map[string]bool{ + "": true, + "background": true, + "history": true, + } + + for key := range ignoreCmds { + if key != "" && strings.HasPrefix(cmdline, key) { + return true + } + } + + ignore, found := ignoreCmds[cmdline] + if !found { + return false + } + + return ignore +} diff --git a/client/console/implant.go b/client/console/implant.go index fa2409f616..0bd05496cc 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -36,6 +36,16 @@ type ActiveTarget struct { observers map[int]Observer observerID int con *SliverClient + hist *implantHistory +} + +func newActiveTarget() *ActiveTarget { + at := &ActiveTarget{ + observers: map[int]Observer{}, + observerID: 0, + } + + return at } // GetSessionInteractive - Get the active target(s). From 984b334bb80b6cf6cfb4da8226348e330bf2906f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 16:35:28 +0200 Subject: [PATCH 045/109] Unwrap all gRPC errors returned by calls in commands --- client/cli/implant.go | 6 +++- client/command/backdoor/backdoor.go | 2 +- client/command/backdoor/commands.go | 7 ++--- client/command/beacons/beacons.go | 2 +- client/command/beacons/helpers.go | 6 ++-- client/command/beacons/prune.go | 6 ++-- client/command/beacons/rm.go | 2 +- client/command/builders/builders.go | 2 +- client/command/crack/crack-files.go | 28 +++++++++---------- client/command/crack/crack.go | 6 ++-- client/command/crack/helpers.go | 6 ++-- client/command/creds/add.go | 8 +++--- client/command/creds/creds.go | 6 ++-- client/command/creds/rm.go | 4 +-- client/command/creds/select.go | 4 +-- client/command/cursed/cursed-chrome.go | 16 +++++------ client/command/cursed/cursed-edge.go | 4 +-- client/command/cursed/cursed-electron.go | 8 +++--- client/command/cursed/cursed-rm.go | 2 +- client/command/dllhijack/dllhijack.go | 2 +- client/command/environment/commands.go | 7 ++--- client/command/environment/get.go | 12 ++++---- client/command/environment/set.go | 12 ++++---- client/command/environment/unset.go | 12 ++++---- client/command/exec/execute-assembly.go | 2 +- client/command/exec/execute-shellcode.go | 10 +++---- client/command/exec/execute.go | 2 +- client/command/exec/migrate.go | 4 +-- client/command/exec/msf-inject.go | 2 +- client/command/exec/msf.go | 2 +- client/command/exec/psexec.go | 8 +++--- client/command/exec/sideload.go | 2 +- client/command/exec/spawndll.go | 2 +- client/command/exec/ssh.go | 2 +- client/command/filesystem/cat.go | 2 +- client/command/filesystem/cd.go | 2 +- client/command/filesystem/chmod.go | 2 +- client/command/filesystem/chown.go | 2 +- client/command/filesystem/chtimes.go | 2 +- client/command/filesystem/cp.go | 2 +- client/command/filesystem/download.go | 2 +- client/command/filesystem/memfiles-add.go | 2 +- client/command/filesystem/memfiles-list.go | 2 +- client/command/filesystem/memfiles-rm.go | 2 +- client/command/filesystem/mkdir.go | 2 +- client/command/filesystem/mv.go | 2 +- client/command/filesystem/pwd.go | 2 +- client/command/filesystem/rm.go | 2 +- client/command/filesystem/upload.go | 2 +- client/command/generate/generate-info.go | 2 +- client/command/generate/generate-stager.go | 2 +- client/command/generate/generate.go | 12 ++++---- client/command/generate/helpers.go | 14 +++++----- client/command/generate/implants-rm.go | 2 +- client/command/generate/implants.go | 4 +-- client/command/generate/profiles-generate.go | 2 +- client/command/generate/profiles-new.go | 2 +- client/command/generate/profiles-rm.go | 2 +- client/command/generate/profiles.go | 6 ++-- client/command/generate/regenerate.go | 2 +- client/command/generate/traffic-encoders.go | 8 +++--- client/command/history/history.go | 2 +- client/command/hosts/hosts-ioc-rm.go | 2 +- client/command/hosts/hosts-rm.go | 2 +- client/command/hosts/hosts.go | 4 +-- client/command/info/info.go | 2 +- client/command/info/ping.go | 2 +- client/command/jobs/dns.go | 2 +- client/command/jobs/http.go | 2 +- client/command/jobs/https.go | 2 +- client/command/jobs/jobs.go | 8 +++--- client/command/jobs/mtls.go | 2 +- client/command/jobs/stage.go | 6 ++-- client/command/jobs/wg.go | 2 +- client/command/kill/commands.go | 5 ++-- client/command/kill/kill.go | 9 +++--- client/command/loot/fetch.go | 2 +- client/command/loot/local.go | 2 +- client/command/loot/loot.go | 2 +- client/command/loot/remote.go | 4 +-- client/command/loot/rename.go | 4 +-- client/command/loot/rm.go | 4 +-- client/command/monitor/commands.go | 3 +- client/command/monitor/start.go | 7 ++--- client/command/monitor/stop.go | 7 ++--- client/command/network/commands.go | 5 ++-- client/command/network/ifconfig.go | 13 ++++----- client/command/network/netstat.go | 11 ++++---- client/command/pivots/details.go | 2 +- client/command/pivots/graph.go | 2 +- client/command/pivots/helpers.go | 2 +- client/command/pivots/pivots.go | 2 +- client/command/pivots/start.go | 4 +-- client/command/pivots/stop.go | 4 +-- client/command/prelude-operator/commands.go | 7 ++--- client/command/prelude-operator/connect.go | 7 ++--- client/command/prelude-operator/operator.go | 3 +- client/command/privilege/commands.go | 7 ++--- client/command/privilege/getprivs.go | 11 ++++---- client/command/privilege/getsystem.go | 12 ++++---- client/command/privilege/impersonate.go | 12 ++++---- client/command/privilege/make-token.go | 12 ++++---- client/command/privilege/rev2self.go | 12 ++++---- client/command/privilege/runas.go | 12 ++++---- client/command/processes/commands.go | 7 ++--- client/command/processes/procdump.go | 11 ++++---- client/command/processes/ps.go | 23 ++++++++------- client/command/processes/pstree.go | 7 ++--- client/command/processes/terminate.go | 11 ++++---- client/command/reconfig/reconfig.go | 2 +- client/command/reconfig/rename.go | 2 +- client/command/registry/commands.go | 7 ++--- client/command/registry/reg-create.go | 12 ++++---- client/command/registry/reg-delete.go | 12 ++++---- client/command/registry/reg-list.go | 18 ++++++------ client/command/registry/reg-read.go | 12 ++++---- client/command/registry/reg-write.go | 12 ++++---- client/command/rportfwd/portfwd-add.go | 2 +- client/command/rportfwd/portfwd-rm.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/screenshot/screenshot.go | 2 +- client/command/sessions/close.go | 2 +- client/command/sessions/helpers.go | 2 +- client/command/sessions/interactive.go | 2 +- client/command/sessions/prune.go | 2 +- client/command/sessions/sessions.go | 2 +- client/command/shell/shell.go | 6 ++-- client/command/shikata-ga-nai/commands.go | 7 ++--- client/command/shikata-ga-nai/sgn.go | 7 ++--- client/command/taskmany/taskmany.go | 13 ++++----- client/command/tasks/fetch.go | 12 ++++---- client/command/tasks/helpers.go | 4 +-- client/command/tasks/tasks-cancel.go | 6 ++-- client/command/tasks/tasks.go | 2 +- client/command/update/update.go | 2 +- client/command/use/use.go | 8 +++--- client/command/wasm/wasm.go | 12 ++++---- .../command/websites/websites-add-content.go | 2 +- .../command/websites/websites-rm-content.go | 4 +-- client/command/websites/websites-rm.go | 2 +- .../websites/websites-update-content.go | 2 +- client/command/websites/websites.go | 6 ++-- client/command/wireguard/wg-config.go | 2 +- client/command/wireguard/wg-portfwd-add.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 4 +-- client/command/wireguard/wg-portfwd.go | 2 +- client/command/wireguard/wg-socks-start.go | 2 +- client/command/wireguard/wg-socks-stop.go | 2 +- client/command/wireguard/wg-socks.go | 4 +-- client/console/console.go | 8 ++++++ 150 files changed, 379 insertions(+), 417 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 6f9a2fe7b0..85eaff1379 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -70,7 +70,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd target, _ := implantCmd.Flags().GetString("use") if target == "" { - return errors.New("no target implant to run command on") + return errors.New("no active implant target to run command") } // Load either the session or the beacon. @@ -98,6 +98,10 @@ func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(_ return func(cmd *cobra.Command, args []string) error { var saveArgs []string + // Save only the subset of the command line starting + // at the implant root (not the server one). This + // is quite hackish, but I could not come up with + // a better solution. for i, arg := range os.Args { if arg == cmd.Name() { saveArgs = os.Args[i:] diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index 474903358d..b4de5bd30a 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -55,7 +55,7 @@ func BackdoorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go index 615750479c..72f893e788 100644 --- a/client/command/backdoor/commands.go +++ b/client/command/backdoor/commands.go @@ -1,15 +1,14 @@ package backdoor import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 81b77a7bcf..a92f992e55 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -86,7 +86,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintBeacons(beacons.Beacons, filter, filterRegex, con) diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index 15125dbd63..6a651cb07c 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -47,7 +47,7 @@ func SelectBeacon(con *console.SliverClient) (*clientpb.Beacon, error) { defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(beacons.Beacons) == 0 { return nil, ErrNoBeacons @@ -106,7 +106,7 @@ func GetBeacon(con *console.SliverClient, beaconID string) (*clientpb.Beacon, er defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(beacons.Beacons) == 0 { return nil, ErrNoBeacons @@ -124,7 +124,7 @@ func GetBeacons(con *console.SliverClient) (*clientpb.Beacons, error) { defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(beacons.Beacons) == 0 { return nil, ErrNoBeacons diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index b1a7910d9f..478c98aa21 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -41,7 +41,7 @@ func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []strin defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } pruneBeacons := []*clientpb.Beacon{} @@ -63,7 +63,7 @@ func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []strin for index, beacon := range pruneBeacons { beacon, err := con.Rpc.GetBeacon(grpcCtx, &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) continue } con.Printf("\t%d. %s (%s)\n", (index + 1), beacon.Name, beacon.ID) @@ -79,7 +79,7 @@ func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []strin for _, beacon := range pruneBeacons { _, err := con.Rpc.RmBeacon(grpcCtx, &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) errCount++ } } diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index 4924b6c8a1..c42fa11ff8 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -34,7 +34,7 @@ func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) defer cancel() _, err = con.Rpc.RmBeacon(grpcCtx, beacon) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Beacon removed (%s)\n", beacon.ID) diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index d7049d7263..2c14e4f1ec 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -35,7 +35,7 @@ import ( func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } if len(builders.Builders) == 0 { diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index c31383d1ff..d6dc856deb 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -38,7 +38,7 @@ import ( func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(wordlists.Files) == 0 { @@ -58,7 +58,7 @@ func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []str func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(rules.Files) == 0 { @@ -78,7 +78,7 @@ func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(hcstat2.Files) == 0 { @@ -195,7 +195,7 @@ func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args [] IsCompressed: true, }) if err != nil { - con.PrintErrorf("Failed to create file: %s\n", err) + con.PrintErrorf("Failed to create file: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Adding new wordlist '%s' (uncompressed: %s)\n", @@ -239,7 +239,7 @@ func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []stri IsCompressed: true, }) if err != nil { - con.PrintErrorf("Failed to create file: %s\n", err) + con.PrintErrorf("Failed to create file: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Adding new rules file '%s' (uncompressed: %s)\n", @@ -283,7 +283,7 @@ func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverClient, args []st IsCompressed: true, }) if err != nil { - con.PrintErrorf("Failed to create file: %s\n", err) + con.PrintErrorf("Failed to create file: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Adding new markov hcstat2 file '%s' (uncompressed: %s)\n", @@ -320,7 +320,7 @@ func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *consol }) n++ if err != nil { - errors = append(errors, err) + errors = append(errors, con.UnwrapServerErr(err)) continue } } @@ -340,7 +340,7 @@ func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *consol Sha2_256: hex.EncodeToString(digest.Sum(nil)), }) if err != nil { - con.PrintErrorf("Failed to complete file upload: %s\n", err) + con.PrintErrorf("Failed to complete file upload: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Upload completed (compressed: %s)\n", util.ByteCountBinary(total)) @@ -413,7 +413,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []s } wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } found := false @@ -422,7 +422,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []s found = true _, err := con.Rpc.CrackFileDelete(context.Background(), wordlist) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } break @@ -447,7 +447,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } found := false @@ -456,7 +456,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []strin found = true _, err := con.Rpc.CrackFileDelete(context.Background(), rulesFile) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } break @@ -481,7 +481,7 @@ func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []str } hcstat2s, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } found := false @@ -490,7 +490,7 @@ func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []str found = true _, err := con.Rpc.CrackFileDelete(context.Background(), hcstat2File) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } break diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 26ad3231a9..0ce322eefb 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -38,14 +38,14 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } else { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("%d crackstation(s) connected to server\n", len(crackers.Crackstations)) } crackFiles, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(crackFiles.Files) == 0 { @@ -60,7 +60,7 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func CrackStationsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(crackers.Crackstations) == 0 { diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index a8b5f15870..d2eed38a45 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -18,7 +18,7 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) + return carapace.ActionMessage("failed to fetch crack files: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) @@ -45,7 +45,7 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) + return carapace.ActionMessage("failed to fetch crack files: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) @@ -73,7 +73,7 @@ func CrackRulesCompleter(con *console.SliverClient) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) + return carapace.ActionMessage("failed to fetch crack files: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 6c4fef924d..67798e9fd8 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -65,12 +65,12 @@ func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { }, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintCreds(creds.Credentials, con) @@ -116,12 +116,12 @@ func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverClient, args []s con.PrintInfof("Adding %d credential(s) ...\n", len(creds.Credentials)) _, err = con.Rpc.CredsAdd(context.Background(), creds) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } creds, err = con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintCreds(creds.Credentials, con) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 97228cb777..2bc5072a89 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -36,7 +36,7 @@ import ( func CredsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(creds.Credentials) == 0 { @@ -120,7 +120,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to fetch credentials: %s", err.Error()) + return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { return carapace.Action{} @@ -147,7 +147,7 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to fetch credentials: %s", err.Error()) + return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { return carapace.Action{} diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index fcb88d828a..e10d54c41a 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -49,12 +49,12 @@ func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { }, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(creds.Credentials) == 0 { diff --git a/client/command/creds/select.go b/client/command/creds/select.go index 80c3da1516..1988a296b7 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -21,12 +21,12 @@ func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.S if hashType == clientpb.HashType_INVALID { creds, err = con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } } else { creds, err = con.Rpc.GetCredsByHashType(context.Background(), &clientpb.Credential{HashType: hashType}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } } if len(creds.Credentials) == 0 { diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index cf76c83da3..1a5dac1881 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -137,7 +137,7 @@ func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *cons Pid: chromeProcess.GetPid(), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } if terminateResp.Response != nil && terminateResp.Response.Err != "" { @@ -206,7 +206,7 @@ func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra }) if err != nil { con.Printf("failure!\n") - return nil, err + return nil, con.UnwrapServerErr(err) } con.Printf("(pid: %d) success!\n", chromeExec.GetPid()) @@ -276,7 +276,7 @@ func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Co Path: userDataDir, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return userDataDir, nil @@ -294,7 +294,7 @@ func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Co Path: userDataDir, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return userDataDir, nil @@ -341,7 +341,7 @@ func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra Path: chromeExecutablePath, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return chromeExecutablePath, nil @@ -361,7 +361,7 @@ func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra Path: defaultChromePath, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return defaultChromePath, nil @@ -387,7 +387,7 @@ func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra Path: chromePath, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return chromePath, nil @@ -421,7 +421,7 @@ func getChromeProcess(session *clientpb.Session, cmd *cobra.Command, con *consol Request: con.ActiveTarget.Request(cmd), }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } for _, process := range ps.Processes { if process.GetOwner() != session.GetUsername() { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index 19623f35ef..82aa122518 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -120,7 +120,7 @@ func avadaKedavraEdge(session *clientpb.Session, cmd *cobra.Command, con *consol Pid: edgeProcess.GetPid(), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } if terminateResp.Response != nil && terminateResp.Response.Err != "" { @@ -156,7 +156,7 @@ func getEdgeProcess(session *clientpb.Session, cmd *cobra.Command, con *console. Request: con.ActiveTarget.Request(cmd), }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } for _, process := range ps.Processes { if process.GetOwner() != session.GetUsername() { diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index e9894315db..5d42594787 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -102,7 +102,7 @@ func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *co Pid: electronProcess.Pid, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } if terminateResp.Response != nil && terminateResp.Response.Err != "" { @@ -124,7 +124,7 @@ func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra Path: electronExe, }) if err != nil { - return false, err + return false, con.UnwrapServerErr(err) } return ls.GetExists(), nil } @@ -134,7 +134,7 @@ func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *co Request: con.ActiveTarget.Request(cmd), }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } for _, process := range ps.Processes { if process.GetOwner() != session.GetUsername() { @@ -168,7 +168,7 @@ func startCursedElectronProcess(electronExe string, session *clientpb.Session, c }) if err != nil { con.Printf("failure!\n") - return nil, err + return nil, con.UnwrapServerErr(err) } con.Printf("(pid: %d) success!\n", electronExec.GetPid()) diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index a2f47b1ad9..d5772c289a 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -70,7 +70,7 @@ func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Pid: int32(cursedProc.PID), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if terminateResp.Response != nil && terminateResp.Response.Err != "" { diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 360a84f6d1..3e6033f1e0 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -90,7 +90,7 @@ func DllHijackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go index 6c030ae77c..5ecef21500 100644 --- a/client/command/environment/commands.go +++ b/client/command/environment/commands.go @@ -1,14 +1,13 @@ package environment import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/environment/get.go b/client/command/environment/get.go index 5cd630bfaf..1220a21d8d 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -21,16 +21,14 @@ package environment import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// EnvGetCmd - Get a remote environment variable +// EnvGetCmd - Get a remote environment variable. func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -47,7 +45,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if envInfo.Response != nil && envInfo.Response.Async { @@ -65,7 +63,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintGetEnvInfo - Print the results of the env get command +// PrintGetEnvInfo - Print the results of the env get command. func PrintGetEnvInfo(envInfo *sliverpb.EnvInfo, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) diff --git a/client/command/environment/set.go b/client/command/environment/set.go index 7db6d4124f..db40bed37e 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -21,17 +21,15 @@ package environment import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// EnvSetCmd - Set a remote environment variable +// EnvSetCmd - Set a remote environment variable. func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -53,7 +51,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if envInfo.Response != nil && envInfo.Response.Async { @@ -71,7 +69,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintSetEnvInfo - Print the set environment info +// PrintSetEnvInfo - Print the set environment info. func PrintSetEnvInfo(name string, value string, envInfo *sliverpb.SetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index c5b7b2773a..8e21fefd38 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -21,16 +21,14 @@ package environment import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// EnvUnsetCmd - Unset a remote environment variable +// EnvUnsetCmd - Unset a remote environment variable. func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -48,7 +46,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if unsetResp.Response != nil && unsetResp.Response.Async { @@ -66,7 +64,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintUnsetEnvInfo - Print the set environment info +// PrintUnsetEnvInfo - Print the set environment info. func PrintUnsetEnvInfo(name string, envInfo *sliverpb.UnsetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index 69f649da90..15f55d779e 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -111,7 +111,7 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []st ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } hostName := getHostname(session, beacon) diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 586136b079..e85a2839cb 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -81,7 +81,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s Data: shellcodeBin, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } oldSize := len(shellcodeBin) @@ -107,7 +107,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -151,7 +151,7 @@ func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, r SessionID: session.ID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -164,7 +164,7 @@ func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, r TunnelID: tunnel.ID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } // Retrieve PID and start remote task @@ -183,7 +183,7 @@ func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, r <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index 0fd15d98a0..e64049af1a 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -92,7 +92,7 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 66a02fdeb5..0ccdca7222 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -49,7 +49,7 @@ func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v\n", err) + con.PrintErrorf("Error: %v\n", con.UnwrapServerErr(err)) return } procCtrl <- true @@ -84,7 +84,7 @@ func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } if !migrate.Success { diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index 4039a2dcc9..c0cda6d239 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -78,7 +78,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 1685b7de99..02302ab730 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -71,7 +71,7 @@ func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index 790417a1ce..310d3dbcb4 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -75,7 +75,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.SpinUntil(fmt.Sprintf("Generating sliver binary for %s\n", profile), generateCtrl) profiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } generateCtrl <- true @@ -116,7 +116,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { uploadCtrl <- true <-uploadCtrl if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Uploaded service binary to %s\n", upload.GetPath()) @@ -142,7 +142,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { serviceCtrl <- true <-serviceCtrl if err != nil { - con.PrintErrorf("Error: %v\n", err) + con.PrintErrorf("Error: %v\n", con.UnwrapServerErr(err)) return } if start.Response != nil && start.Response.Err != "" { @@ -162,7 +162,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { removeChan <- true <-removeChan if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } if removed.Response != nil && removed.Response.Err != "" { diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index f64c9eeb96..1c036a4b18 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -73,7 +73,7 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index ff281187d2..83d064c36d 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -60,7 +60,7 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Kill: !keepAlive, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } ctrl <- true diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index 5de8a37a6d..67e8fac562 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -101,7 +101,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if sshCmd.Response != nil && sshCmd.Response.Async { diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 7226f13977..5fa1d54d89 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -61,7 +61,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if download.Response != nil && download.Response.Async { diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 58f2bc2c39..411a36dfcf 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -45,7 +45,7 @@ func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Path: filePath, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pwd.Response != nil && pwd.Response.Async { diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 5485bb08f2..b25bb983de 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -57,7 +57,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Recursive: recursive, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if chmod.Response != nil && chmod.Response.Async { diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index 5ea6d199cb..9f980fe5e6 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -65,7 +65,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Recursive: recursive, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if chown.Response != nil && chown.Response.Async { diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index 2cf75b0dcb..fdb2784174 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -78,7 +78,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { MTime: unixMtime, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if chtimes.Response != nil && chtimes.Response.Async { diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 3f9724f1a0..7e73bf6059 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -48,7 +48,7 @@ func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er Dst: dst, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 5cf74140e4..01d6d111e6 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -57,7 +57,7 @@ func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if download.Response != nil && download.Response.Async { diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index dfed97a4bb..26db52ae24 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -38,7 +38,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if memfilesAdd.Response != nil && memfilesAdd.Response.Async { diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index a4bb45d8bc..cc7c87cd54 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -44,7 +44,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if memfilesList.Response != nil && memfilesList.Response.Async { diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 9c90b46354..ea1b9e6157 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -48,7 +48,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Fd: fdInt, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if memfilesList.Response != nil && memfilesList.Response.Async { diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index 0699fe1ff5..4be6d66136 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -48,7 +48,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Path: filePath, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if mkdir.Response != nil && mkdir.Response.Async { diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 9e0b46e874..7828eae797 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -54,7 +54,7 @@ func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er Dst: dst, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 5ed2b019b9..576cc32005 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -38,7 +38,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pwd.Response != nil && pwd.Response.Async { diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index 7701c5a840..d2ba107f78 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -53,7 +53,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Force: force, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if rm.Response != nil && rm.Response.Async { diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 86daef51bc..340b4f24e1 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -90,7 +90,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if upload.Response != nil && upload.Response.Async { diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index f9b2a3901a..b5a656c334 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -12,7 +12,7 @@ import ( func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to get compiler information: %s\n", err) + con.PrintErrorf("Failed to get compiler information: %s\n", con.UnwrapServerErr(err)) return } con.Printf("%sServer:%s %s/%s\n", console.Bold, console.Normal, compiler.GOOS, compiler.GOARCH) diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index b30831c1dd..88dffe3e7f 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -108,7 +108,7 @@ func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverClient, args []str <-ctrl if err != nil { - con.PrintErrorf("Error: %v - Please make sure Metasploit framework >= v6.2 is installed and msfvenom/msfconsole are in your PATH", err) + con.PrintErrorf("Error: %v - Please make sure Metasploit framework >= v6.2 is installed and msfvenom/msfconsole are in your PATH", con.UnwrapServerErr(err)) return } diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index a4c1fd29d6..248b088845 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -821,7 +821,7 @@ func externalBuild(config *clientpb.ImplantConfig, save string, con *console.Sli BuilderName: externalBuilder.Name, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil, err } con.Printf("done\n") @@ -881,7 +881,7 @@ func externalBuild(config *clientpb.ImplantConfig, save string, con *console.Sli ImplantName: name, }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } con.PrintInfof("Build name: %s (%d bytes)\n", name, len(generated.File.Data)) @@ -923,7 +923,7 @@ func compile(config *clientpb.ImplantConfig, save string, con *console.SliverCli ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil, err } @@ -948,7 +948,7 @@ func compile(config *clientpb.ImplantConfig, save string, con *console.SliverCli Data: fileData, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.Printf("success!\n") fileData = resp.GetData() @@ -1000,7 +1000,7 @@ func checkBuildTargetCompatibility(format clientpb.OutputFormat, targetOS string compilers, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to check target compatibility: %s\n", err) + con.PrintErrorf("Failed to check target compatibility: %s\n", con.UnwrapServerErr(err)) return true } @@ -1055,7 +1055,7 @@ func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, tar func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverClient) ([]*clientpb.Builder, error) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(builders.Builders) < 1 { return []*clientpb.Builder{}, ErrNoExternalBuilder diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index d7db989262..9c6e7eacee 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -17,7 +17,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // get implant builds builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { - return data, err + return data, con.UnwrapServerErr(err) } implantName := buildImplantName(profile.GetConfig().GetFileName()) @@ -35,14 +35,14 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient <-ctrl if err != nil { con.PrintErrorf("Error generating implant\n") - return data, err + return data, con.UnwrapServerErr(err) } data = generated.GetFile().GetData() profile.Config.FileName = generated.File.Name _, err = con.Rpc.SaveImplantProfile(context.Background(), profile) if err != nil { con.PrintErrorf("Error updating implant profile\n") - return data, err + return data, con.UnwrapServerErr(err) } } else { // Found a build, reuse that one @@ -51,7 +51,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient ImplantName: implantName, }) if err != nil { - return data, err + return data, con.UnwrapServerErr(err) } data = regenerate.GetFile().GetData() } @@ -67,7 +67,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("No compiler info: %s", err.Error()) + return carapace.ActionMessage("No compiler info: %s", con.UnwrapServerErr(err)) } var results []string @@ -105,7 +105,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("No compiler info: %s", err.Error()) + return carapace.ActionMessage("No compiler info: %s", con.UnwrapServerErr(err)) } var results []string @@ -154,7 +154,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { defer cancel() trafficEncoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to fetch traffic encoders: %s", err.Error()) + return carapace.ActionMessage("failed to fetch traffic encoders: %s", con.UnwrapServerErr(err)) } results := []string{} diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index edf09a9c46..e63620a924 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -33,7 +33,7 @@ func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: name, }) if err != nil { - con.PrintErrorf("Failed to delete implant %s\n", err) + con.PrintErrorf("Failed to delete implant %s\n", con.UnwrapServerErr(err)) return } } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 3f75345984..c6c7f4cd0a 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -46,7 +46,7 @@ type ImplantBuildFilter struct { func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } implantBuildFilters := ImplantBuildFilter{} @@ -133,7 +133,7 @@ func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to get implant builds: %s", err.Error()) + return carapace.ActionMessage("failed to get implant builds: %s", con.UnwrapServerErr(err)) } filters := &ImplantBuildFilter{} diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index f0f2cf229d..9d00135f48 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -56,7 +56,7 @@ func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []s profile.Config.Name = buildImplantName(implantFile.Name) _, err = con.Rpc.SaveImplantProfile(context.Background(), profile) if err != nil { - con.PrintErrorf("could not update implant profile: %v\n", err) + con.PrintErrorf("could not update implant profile: %v\n", con.UnwrapServerErr(err)) return } } else { diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 4a481bf49c..a46d659100 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -42,7 +42,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string } resp, err := con.Rpc.SaveImplantProfile(context.Background(), profile) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Saved new implant profile %s\n", resp.Name) } diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index f0ab60b5b1..d7351a9cef 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -54,7 +54,7 @@ func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: name, }) if err != nil { - con.PrintErrorf("Failed to delete profile %s\n", err) + con.PrintErrorf("Failed to delete profile %s\n", con.UnwrapServerErr(err)) return } } diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index ec70284e64..161c623ed5 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -99,7 +99,7 @@ func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClien func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } return pbProfiles.Profiles @@ -109,7 +109,7 @@ func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { func GetImplantProfileByName(name string, con *console.SliverClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } for _, profile := range pbProfiles.Profiles { @@ -430,7 +430,7 @@ func ProfileNameCompleter(con *console.SliverClient) carapace.Action { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage(fmt.Sprintf("No profiles, err: %s", err.Error())) + return carapace.ActionMessage(fmt.Sprintf("No profiles, err: %s", con.UnwrapServerErr(err))) } if len(pbProfiles.Profiles) == 0 { diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 4cf1105a3e..fe8c8d069b 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -43,7 +43,7 @@ func RegenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ImplantName: name, }) if err != nil { - con.PrintErrorf("Failed to regenerate implant %s\n", err) + con.PrintErrorf("Failed to regenerate implant %s\n", con.UnwrapServerErr(err)) return } if regenerate.File == nil { diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index c1ec8530d0..ca3efe5a06 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -47,7 +47,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []st defer cancel() encoderMap, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } DisplayTrafficEncoders(encoderMap, con) @@ -116,7 +116,7 @@ func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args [ <-completed close(completed) if err != nil { - con.PrintErrorf("Failed to add traffic encoder %s", err) + con.PrintErrorf("Failed to add traffic encoder %s", con.UnwrapServerErr(err)) con.Println() return } @@ -264,7 +264,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, arg }, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } con.Println() @@ -277,7 +277,7 @@ func SelectTrafficEncoder(con *console.SliverClient) string { defer cancel() encoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return "" } var encoderNames []string diff --git a/client/command/history/history.go b/client/command/history/history.go index a88254c28b..b67102f925 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -62,7 +62,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { history, err := con.Rpc.GetImplantHistory(context.Background(), req) if err != nil { - return err + return con.UnwrapServerErr(err) } commands := history.GetCommands() diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index f009e3ee92..6624e635a6 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -39,7 +39,7 @@ func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } _, err = con.Rpc.HostIOCRm(context.Background(), ioc) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Removed host from database\n") diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index 77a052f93c..24e3272c36 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -34,7 +34,7 @@ func HostsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } _, err = con.Rpc.HostRm(context.Background(), host) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Removed host from database\n") diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index c694bc1d61..d222d7b40a 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -48,7 +48,7 @@ var ( func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } if 0 < len(allHosts.Hosts) { @@ -143,7 +143,7 @@ func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Ses func SelectHost(con *console.SliverClient) (*clientpb.Host, error) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } // Sort the keys because maps have a randomized order, these keys must be ordered for the selection // to work properly since we rely on the index of the user's selection to find the session in the map diff --git a/client/command/info/info.go b/client/command/info/info.go index 6910370fd4..0b1b128415 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -174,7 +174,7 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/info/ping.go b/client/command/info/ping.go index 3dd75e1652..c98c7ca75d 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -23,7 +23,7 @@ func PingCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Pong %d\n", pong.Nonce) } diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index 4cbf4e8479..bdb8c4b439 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -54,7 +54,7 @@ func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string }) con.Println() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", dns.JobID) } diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index 10ea0bb6bb..1c8e013faf 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -62,7 +62,7 @@ func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []strin LongPollJitter: int64(longPollJitter), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", http.JobID) } diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index cbba4450a4..327eb6966b 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -79,7 +79,7 @@ func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri }) con.Println() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", https.JobID) } diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index 09c008b7f2..079a64bb9c 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -43,7 +43,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } else { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } // Convert to a map @@ -97,7 +97,7 @@ func JobsIDCompleter(con *console.SliverClient) carapace.Action { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("No active jobs") + return carapace.ActionMessage("Failed to get server jobs: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) @@ -120,7 +120,7 @@ func jobKill(jobID uint32, con *console.SliverClient) { ID: jobID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully killed job #%d\n", jobKill.ID) } @@ -129,7 +129,7 @@ func jobKill(jobID uint32, con *console.SliverClient) { func killAllJobs(con *console.SliverClient) { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } for _, job := range jobs.Active { diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 4c918e2914..86d9e08b2f 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -40,7 +40,7 @@ func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []strin }) con.Println() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", mtls.JobID) } diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index bd779139cd..53d2a97170 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -155,7 +155,7 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error starting HTTP staging listener: %s\n", err) + con.PrintErrorf("Error starting HTTP staging listener: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Job %d (http) started\n", stageListener.GetJobID()) @@ -184,7 +184,7 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error starting HTTPS staging listener: %v\n", err) + con.PrintErrorf("Error starting HTTPS staging listener: %v\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Job %d (https) started\n", stageListener.GetJobID()) @@ -202,7 +202,7 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error starting TCP staging listener: %v\n", err) + con.PrintErrorf("Error starting TCP staging listener: %v\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Job %d (tcp) started\n", stageListener.GetJobID()) diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index 1f7ae6d8cd..c743738092 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -41,7 +41,7 @@ func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Persistent: persistent, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", wg.JobID) } diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go index 2128351edc..b27d909dc3 100644 --- a/client/command/kill/commands.go +++ b/client/command/kill/commands.go @@ -1,13 +1,12 @@ package kill import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/kill/kill.go b/client/command/kill/kill.go index 250a104e95..69eb4f7016 100644 --- a/client/command/kill/kill.go +++ b/client/command/kill/kill.go @@ -23,15 +23,14 @@ import ( "errors" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// KillCmd - Kill the active session (not to be confused with TerminateCmd) +// KillCmd - Kill the active session (not to be confused with TerminateCmd). func KillCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() // Confirm with the user, just in case they confused kill with terminate @@ -81,7 +80,7 @@ func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.Sli }, Force: force, }) - return err + return con.UnwrapServerErr(err) } func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.SliverClient) error { @@ -99,5 +98,5 @@ func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.Sliver }, Force: force, }) - return err + return con.UnwrapServerErr(err) } diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index a3583b355b..7340f92748 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -34,7 +34,7 @@ func LootFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } loot, err = con.Rpc.LootContent(context.Background(), loot) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintLootFile(loot, con) diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 3e693062ae..2f389262be 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -72,7 +72,7 @@ func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverClient, args []strin ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } con.PrintInfof("Successfully added loot to server (%s)\n", loot.ID) diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 686e3c5847..4ac8eb519b 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -40,7 +40,7 @@ import ( func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allLoot, err := con.Rpc.LootAll(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to fetch loot %s\n", err) + con.PrintErrorf("Failed to fetch loot %s\n", con.UnwrapServerErr(err)) return } PrintAllFileLootTable(allLoot, con) diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index da4ee056ab..764e8249fd 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -64,7 +64,7 @@ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con ctrl <- true <-ctrl if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if download.Response != nil && download.Response.Async { con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { @@ -114,7 +114,7 @@ func SendLootMessage(loot *clientpb.Loot, con *console.SliverClient) { control <- true <-control if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } if loot.Name != loot.File.Name { diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index f664d9811e..ff2d4e45a4 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -31,7 +31,7 @@ import ( func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } oldName := loot.Name @@ -44,7 +44,7 @@ func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: newName, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Renamed %s -> %s\n", oldName, loot.Name) diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index 2e89c4df90..78997a6e7d 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -28,13 +28,13 @@ import ( func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } _, err = con.Rpc.LootRm(context.Background(), loot) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.Println() diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index da7c962e0c..0f8480ab90 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -1,10 +1,9 @@ package monitor import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/monitor/start.go b/client/command/monitor/start.go index bafb59b16e..e18e3050b8 100644 --- a/client/command/monitor/start.go +++ b/client/command/monitor/start.go @@ -21,17 +21,16 @@ package monitor import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// MonitorStartCmd - Start monitoring threat intel for implants +// MonitorStartCmd - Start monitoring threat intel for implants. func MonitorStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { resp, err := con.Rpc.MonitorStart(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if resp != nil && resp.Err != "" { diff --git a/client/command/monitor/stop.go b/client/command/monitor/stop.go index 5857750e60..fe6d8fa4fe 100644 --- a/client/command/monitor/stop.go +++ b/client/command/monitor/stop.go @@ -21,17 +21,16 @@ package monitor import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// MonitorStopCmd - Stop monitoring threat intel for implants +// MonitorStopCmd - Stop monitoring threat intel for implants. func MonitorStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, err := con.Rpc.MonitorStop(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Stopped monitoring threat intel platforms for implants hashes\n") diff --git a/client/command/network/commands.go b/client/command/network/commands.go index 137e5f68c5..ad31bb2042 100644 --- a/client/command/network/commands.go +++ b/client/command/network/commands.go @@ -1,13 +1,12 @@ package network import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index d72969cc5a..bc714888d1 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -25,17 +25,16 @@ import ( "strconv" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// IfconfigCmd - Display network interfaces on the remote system +// IfconfigCmd - Display network interfaces on the remote system. func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -45,7 +44,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } all, _ := cmd.Flags().GetBool("all") @@ -64,7 +63,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintIfconfig - Print the ifconfig response +// PrintIfconfig - Print the ifconfig response. func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverClient) { var err error interfaces := ifconfig.NetInterfaces diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index 452c6d672f..5c32f69cbe 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -23,17 +23,16 @@ import ( "fmt" "net" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// NetstatCmd - Display active network connections on the remote system +// NetstatCmd - Display active network connections on the remote system. func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -59,7 +58,7 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { IP6: ip6, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if netstat.Response != nil && netstat.Response.Async { diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 0070221c49..3d6868297a 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -39,7 +39,7 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pivotListeners.Response != nil && pivotListeners.Response.Err != "" { diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 8872cd631a..4431694079 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -32,7 +32,7 @@ import ( func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { graph, err := con.Rpc.PivotGraph(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index 8288a43680..dad68bf2b3 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -78,7 +78,7 @@ func PivotIDCompleter(con *console.SliverClient) carapace.Action { Request: con.ActiveTarget.Request(con.App.ActiveMenu().Root()), }) if err != nil { - return carapace.ActionMessage("failed to get remote pivots: %s", err.Error()) + return carapace.ActionMessage("failed to get remote pivots: %s", con.UnwrapServerErr(err)) } for _, listener := range pivotListeners.Listeners { diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index 60de8dec39..954d8cc5a7 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -38,7 +38,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pivotListeners.Response != nil && pivotListeners.Response.Err != "" { diff --git a/client/command/pivots/start.go b/client/command/pivots/start.go index 67e00e9041..1b92e497fb 100644 --- a/client/command/pivots/start.go +++ b/client/command/pivots/start.go @@ -41,7 +41,7 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []s Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if listener.Response != nil && listener.Response.Err != "" { @@ -69,7 +69,7 @@ func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, ar Options: options, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if listener.Response != nil && listener.Response.Err != "" { diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 9f8d0cd419..93c76ec1d7 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -39,7 +39,7 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(pivotListeners.Listeners) == 0 { @@ -58,7 +58,7 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Stopped pivot listener\n") diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go index f152788fdf..2fc82eb546 100644 --- a/client/command/prelude-operator/commands.go +++ b/client/command/prelude-operator/commands.go @@ -1,14 +1,13 @@ package operator import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index be07ff9aba..a75d844db7 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -21,12 +21,11 @@ package operator import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { @@ -48,7 +47,7 @@ func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if !skipExisting { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Could not get session list: %s", err) + con.PrintErrorf("Could not get session list: %s", con.UnwrapServerErr(err)) return } if len(sessions.Sessions) > 0 { @@ -65,7 +64,7 @@ func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Could not get beacon list: %s", err) + con.PrintErrorf("Could not get beacon list: %s", con.UnwrapServerErr(err)) return } if len(beacons.Beacons) > 0 { diff --git a/client/command/prelude-operator/operator.go b/client/command/prelude-operator/operator.go index f36a692150..fbd8a7305c 100644 --- a/client/command/prelude-operator/operator.go +++ b/client/command/prelude-operator/operator.go @@ -19,10 +19,9 @@ package operator */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" + "github.com/spf13/cobra" ) func OperatorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go index 32095e4a7d..5a2e2cf8cb 100644 --- a/client/command/privilege/commands.go +++ b/client/command/privilege/commands.go @@ -1,15 +1,14 @@ package privilege import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 6dcc14307e..4b6c40efac 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -23,15 +23,14 @@ import ( "strconv" "strings" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// GetPrivsCmd - Get the current process privileges (Windows only) +// GetPrivsCmd - Get the current process privileges (Windows only). func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -47,7 +46,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } pid := getPID(session, beacon) @@ -66,7 +65,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintGetPrivs - Print the results of the get privs command +// PrintGetPrivs - Print the results of the get privs command. func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverClient) { // Response is the Envelope (see RPC API), Err is part of it. if privs.Response != nil && privs.Response.Err != "" { diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index 20b862760b..e921dc5d06 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system +// GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system. func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -55,7 +53,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -74,7 +72,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintGetSystem - Print the results of get system +// PrintGetSystem - Print the results of get system. func PrintGetSystem(getsystemResp *sliverpb.GetSystem, con *console.SliverClient) { if getsystemResp.Response != nil && getsystemResp.Response.GetErr() != "" { con.PrintErrorf("%s\n", getsystemResp.GetResponse().GetErr()) diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index 95d764e81f..2e3d7fbf2d 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ImpersonateCmd - Windows only, impersonate a user token +// ImpersonateCmd - Windows only, impersonate a user token. func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -43,7 +41,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string Username: username, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } @@ -62,7 +60,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// PrintImpersonate - Print the results of the attempted impersonation +// PrintImpersonate - Print the results of the attempted impersonation. func PrintImpersonate(impersonate *sliverpb.Impersonate, username string, con *console.SliverClient) { if impersonate.Response != nil && impersonate.Response.GetErr() != "" { con.PrintErrorf("%s\n", impersonate.Response.GetErr()) diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index f3b02aad01..18dc287307 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -21,13 +21,11 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) var logonTypes = map[string]uint32{ @@ -40,7 +38,7 @@ var logonTypes = map[string]uint32{ "LOGON_NEW_CREDENTIALS": 9, } -// MakeTokenCmd - Windows only, create a token using "valid" credentails +// MakeTokenCmd - Windows only, create a token using "valid" credentials. func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -75,7 +73,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -94,7 +92,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintMakeToken - Print the results of attempting to make a token +// PrintMakeToken - Print the results of attempting to make a token. func PrintMakeToken(makeToken *sliverpb.MakeToken, domain string, username string, con *console.SliverClient) { if makeToken.Response != nil && makeToken.Response.GetErr() != "" { con.PrintErrorf("%s\n", makeToken.Response.GetErr()) diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index 069b8b329a..f214010ca1 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RevToSelfCmd - Drop any impersonated tokens +// RevToSelfCmd - Drop any impersonated tokens. func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -41,7 +39,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -60,7 +58,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintRev2Self - Print the result of revert to self +// PrintRev2Self - Print the result of revert to self. func PrintRev2Self(revert *sliverpb.RevToSelf, con *console.SliverClient) { if revert.Response != nil && revert.Response.GetErr() != "" { con.PrintErrorf("%s\n", revert.Response.GetErr()) diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index ade8aa8768..a07f3cfebc 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RunAsCmd - Run a command as another user on the remote system +// RunAsCmd - Run a command as another user on the remote system. func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -66,7 +64,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { NetOnly: netonly, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } @@ -86,7 +84,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRunAs - Print the result of run as +// PrintRunAs - Print the result of run as. func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con *console.SliverClient) { if runAs.Response != nil && runAs.Response.GetErr() != "" { con.PrintErrorf("%s\n", runAs.Response.GetErr()) diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index b473d89648..7d05ba780a 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -1,14 +1,13 @@ package processes import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index bd3f59d75e..d39b2d3103 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -26,16 +26,15 @@ import ( "path/filepath" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ProcdumpCmd - Dump the memory of a remote process +// ProcdumpCmd - Dump the memory of a remote process. func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -74,7 +73,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -106,7 +105,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintProcessDump - Handle the results of a process dump +// PrintProcessDump - Handle the results of a process dump. func PrintProcessDump(dump *sliverpb.ProcessDump, saveTo string, hostname string, pid int, con *console.SliverClient) { var err error var saveToFile *os.File diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index dbea16aa30..76cad08198 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -24,19 +24,18 @@ import ( "sort" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) -// Stylizes known processes in the `ps` command +// Stylizes known processes in the `ps` command. var knownSecurityTools = map[string][]string{ // Process Name -> [Color, Stylized Name] "ccSvcHst.exe": {console.Red, "Symantec Endpoint Protection"}, // Symantec Endpoint Protection (SEP) @@ -88,7 +87,7 @@ var knownSecurityTools = map[string][]string{ "efwd.exe": {console.Red, "ESET Security"}, // ESET Internet Security } -// PsCmd - List processes on the remote system +// PsCmd - List processes on the remote system. func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -98,7 +97,7 @@ func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } os := getOS(session, beacon) @@ -136,7 +135,7 @@ func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { return "" } -// PrintPS - Prints the process list +// PrintPS - Prints the process list. func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, con *console.SliverClient) { pidFilter, _ := flags.GetInt("pid") exeFilter, _ := flags.GetString("exe") @@ -211,7 +210,7 @@ func findKnownSecurityProducts(ps *sliverpb.Ps) []string { return products } -// procRow - Stylizes the process information +// procRow - Stylizes the process information. func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console.SliverClient) table.Row { session, beacon := con.ActiveTarget.GetInteractive() @@ -286,7 +285,7 @@ func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console return row } -// GetPIDByName - Get a PID by name from the active session +// GetPIDByName - Get a PID by name from the active session. func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverClient) int { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), @@ -302,7 +301,7 @@ func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverClient) in return -1 } -// SortProcessesByPID - Sorts a list of processes by PID +// SortProcessesByPID - Sorts a list of processes by PID. func SortProcessesByPID(ps []*commonpb.Process) []*commonpb.Process { sort.Slice(ps, func(i, j int) bool { return ps[i].Pid < ps[j].Pid diff --git a/client/command/processes/pstree.go b/client/command/processes/pstree.go index 044f65436b..c8bb398ea9 100644 --- a/client/command/processes/pstree.go +++ b/client/command/processes/pstree.go @@ -4,13 +4,12 @@ import ( "fmt" "sort" - "github.com/xlab/treeprint" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/xlab/treeprint" ) -// A PsTree is a tree of *commonpb.Process +// A PsTree is a tree of *commonpb.Process. type PsTree struct { printableTree treeprint.Tree // only used for rendering implantPID int32 @@ -23,7 +22,7 @@ type node struct { Parent *node // The parent of this node } -// NewPsTree creates a new PsTree +// NewPsTree creates a new PsTree. func NewPsTree(pid int32) *PsTree { return &PsTree{ printableTree: treeprint.New(), diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index f7b91d9983..293beb722f 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -22,15 +22,14 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// TerminateCmd - Terminate a process on the remote system +// TerminateCmd - Terminate a process on the remote system. func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -52,7 +51,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Force: force, }) if err != nil { - con.PrintErrorf("Terminate failed: %s", err) + con.PrintErrorf("Terminate failed: %s", con.UnwrapServerErr(err)) return } @@ -71,7 +70,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintTerminate - Print the results of the terminate command +// PrintTerminate - Print the results of the terminate command. func PrintTerminate(terminated *sliverpb.Terminate, con *console.SliverClient) { if terminated.Response != nil && terminated.Response.GetErr() != "" { con.PrintErrorf("%s\n", terminated.Response.GetErr()) diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index f0b5343aef..98d5775ee5 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -80,7 +80,7 @@ func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } if reconfig.Response != nil && reconfig.Response.Async { diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index ba4cb518a9..74f7d2ad8e 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -54,7 +54,7 @@ func RenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Name: name, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go index fec21cf040..d93f3b32d1 100644 --- a/client/command/registry/commands.go +++ b/client/command/registry/commands.go @@ -1,14 +1,13 @@ package registry import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index 1791e8c018..bef2cdea17 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -22,16 +22,14 @@ import ( "context" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegCreateKeyCmd - Create a new Windows registry key +// RegCreateKeyCmd - Create a new Windows registry key. func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -78,7 +76,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -97,7 +95,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintCreateKey - Print the results of the create key command +// PrintCreateKey - Print the results of the create key command. func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key string, con *console.SliverClient) { if createKey.Response != nil && createKey.Response.Err != "" { con.PrintErrorf("%s", createKey.Response.Err) diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index 80f80c484c..b4443664ec 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -22,16 +22,14 @@ import ( "context" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegDeleteKeyCmd - Remove a Windows registry key +// RegDeleteKeyCmd - Remove a Windows registry key. func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -78,7 +76,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -97,7 +95,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintDeleteKey - Print the results of the delete key command +// PrintDeleteKey - Print the results of the delete key command. func PrintDeleteKey(deleteKey *sliverpb.RegistryDeleteKey, regPath string, key string, con *console.SliverClient) { if deleteKey.Response != nil && deleteKey.Response.Err != "" { con.PrintErrorf("%s", deleteKey.Response.Err) diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index 3bafb2a571..657086c7ca 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -21,16 +21,14 @@ package registry import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegListSubKeysCmd - List sub registry keys +// RegListSubKeysCmd - List sub registry keys. func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -53,7 +51,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -72,7 +70,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// PrintListSubKeys - Print the list sub keys command result +// PrintListSubKeys - Print the list sub keys command result. func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) @@ -86,7 +84,7 @@ func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath } } -// RegListValuesCmd - List registry values +// RegListValuesCmd - List registry values. func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -104,7 +102,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -123,7 +121,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } } -// PrintListValues - Print the registry list values +// PrintListValues - Print the registry list values. func PrintListValues(regList *sliverpb.RegistryValuesList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index 3109b32e8c..6c5efeda30 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -23,13 +23,11 @@ import ( "fmt" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) var validHives = []string{ @@ -74,7 +72,7 @@ func getType(t string) (uint32, error) { return res, nil } -// RegReadCmd - Read a windows registry key: registry read --hostname aa.bc.local --hive HKCU "software\google\chrome\blbeacon\version" +// RegReadCmd - Read a windows registry key: registry read --hostname aa.bc.local --hive HKCU "software\google\chrome\blbeacon\version". func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( finalPath string @@ -126,7 +124,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -145,7 +143,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRegRead - Print the results of the registry read command +// PrintRegRead - Print the results of the registry read command. func PrintRegRead(regRead *sliverpb.RegistryRead, con *console.SliverClient) { if regRead.Response != nil && regRead.Response.Err != "" { con.PrintErrorf("%s\n", regRead.Response.Err) diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 542f258544..181c0d0a57 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -25,16 +25,14 @@ import ( "strconv" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32 +// RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32. func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -140,7 +138,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ByteValue: binaryValue, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -159,7 +157,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRegWrite - Print the registry write operation +// PrintRegWrite - Print the registry write operation. func PrintRegWrite(regWrite *sliverpb.RegistryWrite, con *console.SliverClient) { if regWrite.Response != nil && regWrite.Response.Err != "" { con.PrintErrorf("%s", regWrite.Response.Err) diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 8dc20f2be9..84c168e4e5 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -59,7 +59,7 @@ func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, arg ForwardAddress: forwardAddress, }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } printStartedRportFwdListener(rportfwdListener, con) diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index a801c1a5ff..db69d3d59b 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -50,7 +50,7 @@ func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args ID: uint32(listenerID), }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 0f4d9b4d62..1daa35d673 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -43,7 +43,7 @@ func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverClient, args [] Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } PrintRportFwdListeners(rportfwdListeners, cmd.Flags(), con) diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 0741237c8c..f958474d4b 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -52,7 +52,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index 3968a1c11f..28e666a9c5 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -40,7 +40,7 @@ func CloseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err.Error()) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index 399fb19822..18c90026d1 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -44,7 +44,7 @@ var ( func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(sessions.Sessions) == 0 { return nil, ErrNoSessions diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index 8b44007757..b84f941c0a 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -165,7 +165,7 @@ func InteractiveCmd(cmd *cobra.Command, con *console.SliverClient, _ []string) { openSession, err = con.Rpc.OpenSession(context.Background(), openSession) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } if openSession.Response != nil && openSession.Response.Async { con.PrintAsyncResponse(openSession.Response) diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index 31d673464a..48704761cc 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -31,7 +31,7 @@ import ( func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(sessions.GetSessions()) == 0 { diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 6f056319f8..108f87bde8 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -44,7 +44,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index 6dcebbbbe3..95c3b7786b 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -76,7 +76,7 @@ func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *conso }) defer cancelTunnel() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } log.Printf("Created new tunnel with id: %d, binding to shell ...", rpcTunnel.TunnelID) @@ -91,7 +91,7 @@ func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *conso TunnelID: tunnel.ID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } // @@ -102,7 +102,7 @@ func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *conso SessionID: session.ID, }) if err != nil { - con.PrintErrorf("RPC Error: %s\n", err) + con.PrintErrorf("RPC Error: %s\n", con.UnwrapServerErr(err)) } return } diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go index 92a1e93ff4..b73a4d25ce 100644 --- a/client/command/shikata-ga-nai/commands.go +++ b/client/command/shikata-ga-nai/commands.go @@ -1,14 +1,13 @@ package sgn import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/shikata-ga-nai/sgn.go b/client/command/shikata-ga-nai/sgn.go index e05af7015c..298d269d25 100644 --- a/client/command/shikata-ga-nai/sgn.go +++ b/client/command/shikata-ga-nai/sgn.go @@ -24,13 +24,12 @@ import ( "io/ioutil" "path/filepath" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder +// ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder. func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { shellcodeFile := args[0] rawShellcode, err := ioutil.ReadFile(shellcodeFile) @@ -59,7 +58,7 @@ func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if shellcodeResp.Response != nil && shellcodeResp.Response.Err != "" { diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 4e01aacc01..4fff9c95c9 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -27,14 +27,13 @@ import ( "strings" "text/tabwriter" - "github.com/spf13/cobra" - "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) func Command(con *console.SliverClient) []*cobra.Command { @@ -80,12 +79,12 @@ func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{taskmanyCmd} } -// TaskmanyCmd - Task many beacons / sessions +// TaskmanyCmd - Task many beacons / sessions. func TaskmanyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("Must specify subcommand. See taskmany --help for supported subcommands.\n") } -// Helper function to wrap grumble commands with taskmany logic +// Helper function to wrap grumble commands with taskmany logic. func WrapCommand(c *cobra.Command, con *console.SliverClient) *cobra.Command { wc := &cobra.Command{ Use: c.Use, @@ -99,7 +98,7 @@ func WrapCommand(c *cobra.Command, con *console.SliverClient) *cobra.Command { return wc } -// Wrap a function to run it for each beacon / session +// Wrap a function to run it for each beacon / session. func wrapFunctionWithTaskmany(con *console.SliverClient, f func(cmd *cobra.Command, args []string)) func(cmd *cobra.Command, args []string) { return func(cmd *cobra.Command, args []string) { defer con.Println() @@ -154,7 +153,7 @@ func SelectMultipleBeaconsAndSessions(con *console.SliverClient) ([]*clientpb.Se // Get and sort sessions sessionsObj, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } sessions := sessionsObj.Sessions sort.Slice(sessions, func(i, j int) bool { @@ -164,7 +163,7 @@ func SelectMultipleBeaconsAndSessions(con *console.SliverClient) ([]*clientpb.Se // Get and sort beacons beaconsObj, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } beacons := beaconsObj.Beacons sort.Slice(beacons, func(i, j int) bool { diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 1c2ba517ad..40be58c2a8 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -54,7 +54,7 @@ func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } tasks := beaconTasks.Tasks @@ -97,7 +97,7 @@ func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } task, err = con.Rpc.GetBeaconTaskContent(context.Background(), &clientpb.BeaconTask{ID: task.ID}) if err != nil { - con.PrintErrorf("Failed to fetch task content: %s\n", err) + con.PrintErrorf("Failed to fetch task content: %s\n", con.UnwrapServerErr(err)) return } PrintTask(task, con) @@ -507,7 +507,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to fetch beacon: %s\n", err) + con.PrintErrorf("Failed to fetch beacon: %s\n", con.UnwrapServerErr(err)) return } network.PrintNetstat(netstat, beacon.PID, beacon.ActiveC2, false, con) @@ -524,7 +524,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to fetch beacon: %s\n", err) + con.PrintErrorf("Failed to fetch beacon: %s\n", con.UnwrapServerErr(err)) return } privilege.PrintGetPrivs(privs, beacon.PID, con) @@ -591,7 +591,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to fetch beacon: %s\n", err) + con.PrintErrorf("Failed to fetch beacon: %s\n", con.UnwrapServerErr(err)) return } privilege.PrintRunAs(runAs, runAsReq.ProcessName, runAsReq.Args, beacon.Name, con) @@ -617,7 +617,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to get beacon: %s\n", err) + con.PrintErrorf("Failed to get beacon: %s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 33ce9f3f76..41fd042cdc 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -62,7 +62,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - return carapace.ActionMessage("Failed to fetch tasks: %s", err.Error()) + return carapace.ActionMessage("Failed to fetch tasks: %s", con.UnwrapServerErr(err)) } completed := make([]string, 0) @@ -131,7 +131,7 @@ func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - return carapace.ActionMessage("Failed to fetch tasks: %s", err.Error()) + return carapace.ActionMessage("Failed to fetch tasks: %s", con.UnwrapServerErr(err)) } pending := make([]string, 0) diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index c184c33b39..c95fee327e 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -24,7 +24,7 @@ func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string if idArg == "" { beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } tasks := []*clientpb.BeaconTask{} @@ -47,7 +47,7 @@ func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string } else { task, err = con.Rpc.GetBeaconTaskContent(context.Background(), &clientpb.BeaconTask{ID: idArg}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } } @@ -55,7 +55,7 @@ func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string if task != nil { task, err := con.Rpc.CancelBeaconTask(context.Background(), task) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Task %s canceled\n", task.ID) diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index bd025867e6..91d9e1973f 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -39,7 +39,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintBeaconTasks(beaconTasks.Tasks, cmd, con) diff --git a/client/command/update/update.go b/client/command/update/update.go index d9d9d36d5a..933d925414 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -130,7 +130,7 @@ func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverClient, args []st clientVer := version.FullVersion() serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to check server version %s\n", err) + con.PrintErrorf("Failed to check server version %s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/use/use.go b/client/command/use/use.go index 90cf0c36f9..e6b8616d73 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -72,7 +72,7 @@ func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } if err == nil { for _, session := range sessions.Sessions { @@ -83,7 +83,7 @@ func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Sessio } beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } for _, beacon := range beacons.Beacons { if strings.HasPrefix(beacon.ID, id) { @@ -98,7 +98,7 @@ func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clien // Get and sort sessions sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } sessionsMap := map[string]*clientpb.Session{} for _, session := range sessions.GetSessions() { @@ -113,7 +113,7 @@ func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clien // Get and sort beacons beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } beaconsMap := map[string]*clientpb.Beacon{} for _, beacon := range beacons.Beacons { diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index a6b6c8c9aa..25b6a0a042 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -138,7 +138,7 @@ func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console. defer cancel() execWasmResp, err := con.Rpc.ExecWasmExtension(grpcCtx, execWasmReq) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if execWasmResp.Response != nil && execWasmResp.Response.Async { @@ -176,7 +176,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR }) defer cancelTunnel() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Wait approximately 10 seconds after exit, and press to continue\n") @@ -190,7 +190,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR // Send the exec request wasmExt, err := con.Rpc.ExecWasmExtension(context.Background(), execWasmReq) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if wasmExt.Response != nil && wasmExt.Response.Err != "" { @@ -200,7 +200,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR SessionID: session.ID, }) if err != nil { - con.PrintErrorf("RPC Error: %s\n", err) + con.PrintErrorf("RPC Error: %s\n", con.UnwrapServerErr(err)) } return } @@ -247,7 +247,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console WasmGz: data, }) if err != nil { - return err + return con.UnwrapServerErr(err) } wasmRegistrationCache[idOf(con)] = append(wasmRegistrationCache[idOf(con)], filepath.Base(wasmFilePath)) return nil @@ -266,7 +266,7 @@ func WasmLsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } if len(loaded.Names) < 1 { diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index dc3e8386d4..9de9620269 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -76,7 +76,7 @@ func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args [ web, err := con.Rpc.WebsiteAddContent(context.Background(), addWeb) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } PrintWebsite(web, con) diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index 95b7d1f621..d36c8638de 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -46,7 +46,7 @@ func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []str Name: name, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } @@ -65,7 +65,7 @@ func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []str } web, err := con.Rpc.WebsiteRemoveContent(context.Background(), rmWebContent) if err != nil { - con.PrintErrorf("Failed to remove content %s", err) + con.PrintErrorf("Failed to remove content %s", con.UnwrapServerErr(err)) return } PrintWebsite(web, con) diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index e81873cc17..d1340b49a9 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -37,7 +37,7 @@ func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: name, }) if err != nil { - con.PrintErrorf("Failed to remove website %s", err) + con.PrintErrorf("Failed to remove website %s", con.UnwrapServerErr(err)) return } } diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index d6d1b51919..7cf52d89c7 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -54,7 +54,7 @@ func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverClient, arg web, err := con.Rpc.WebsiteUpdateContent(context.Background(), updateWeb) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } PrintWebsite(web, con) diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index 012625007f..a8a9335d81 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -51,7 +51,7 @@ func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to list websites %s", err) + con.PrintErrorf("Failed to list websites %s", con.UnwrapServerErr(err)) return } if len(websites.Websites) < 1 { @@ -71,7 +71,7 @@ func ListWebsiteContent(websiteName string, con *console.SliverClient) { Name: websiteName, }) if err != nil { - con.PrintErrorf("Failed to list website content %s", err) + con.PrintErrorf("Failed to list website content %s", con.UnwrapServerErr(err)) return } if 0 < len(website.Contents) { @@ -120,7 +120,7 @@ func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("Failed to list websites %s", err) + return carapace.ActionMessage("Failed to list websites %s", con.UnwrapServerErr(err)) } for _, ws := range websites.Websites { diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index 760306fd73..a7fcd9e172 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -55,7 +55,7 @@ type wgQuickConfig struct { func WGConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } clientPrivKeyBytes, err := hex.DecodeString(wgConfig.ClientPrivateKey) diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index 4ca36a7771..97acc62950 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -56,7 +56,7 @@ func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index f5837a1dcc..98922eea7d 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -51,7 +51,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } @@ -78,7 +78,7 @@ func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { Request: con.ActiveTarget.Request(con.App.ActiveMenu().Root()), }) if err != nil { - return carapace.ActionMessage("failed to get Wireguard port forwarders: %s", err.Error()) + return carapace.ActionMessage("failed to get Wireguard port forwarders: %s", con.UnwrapServerErr(err)) } for _, fwd := range fwdList.Forwarders { diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index 38882eeb7d..d6d8d78a1f 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -43,7 +43,7 @@ func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []stri Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } if fwdList.Response != nil && fwdList.Response.Err != "" { diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index 156aad40a3..bc1a34e1dd 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -44,7 +44,7 @@ func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index c0239bfe74..cd11c31194 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -49,7 +49,7 @@ func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 8a061962bd..eb4aa2e4dc 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -45,7 +45,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } if socksList.Response != nil && socksList.Response.Err != "" { @@ -85,7 +85,7 @@ func SocksIDCompleter(con *console.SliverClient) carapace.Action { Request: con.ActiveTarget.Request(con.App.ActiveMenu().Root()), }) if err != nil { - return carapace.ActionMessage("failed to get Wireguard Socks servers: %s", err.Error()) + return carapace.ActionMessage("failed to get Wireguard Socks servers: %s", con.UnwrapServerErr(err)) } for _, serv := range socksList.Servers { diff --git a/client/console/console.go b/client/console/console.go index 04938679aa..96a527a523 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -20,6 +20,7 @@ package console import ( "context" + "errors" "fmt" "io" "log" @@ -46,6 +47,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" + "google.golang.org/grpc/status" ) const ( @@ -249,6 +251,12 @@ func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { return carapace.ActionValues(), nil } +// UnwrapServerErr unwraps errors returned by gRPC method calls. +// Should be used to return every non-nil resp, err := con.Rpc.Function(). +func (con *SliverClient) UnwrapServerErr(err error) error { + return errors.New(status.Convert(err).Message()) +} + // Disconnect disconnectss the client from its Sliver server, // closing all its event/log streams and files, then closing // the core Sliver RPC client connection. From 8dd319627408966fd0d641236bca7a1fb452f4e4 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 22:15:22 +0200 Subject: [PATCH 046/109] Refactor C2 job control command tree & dispatch - tcp and named-pipe are now "roots" in the sliver context. - Removed --id flags for pivots and use args. --- client/command/info/commands.go | 4 +- client/command/jobs/commands.go | 33 +++++++++++ client/command/jobs/named-pipe.go | 55 +++++++++++++++++++ .../command/{pivots/start.go => jobs/tcp.go} | 30 +--------- client/command/pivots/commands.go | 50 +++-------------- client/command/pivots/details.go | 14 +++-- client/command/pivots/stop.go | 16 ++++-- client/command/sliver.go | 4 +- 8 files changed, 124 insertions(+), 82 deletions(-) create mode 100644 client/command/jobs/named-pipe.go rename client/command/{pivots/start.go => jobs/tcp.go} (63%) diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 98f919dd28..72fa908b3e 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -17,6 +17,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.InfoStr, Short: "Get info about session", Long: help.GetHelpFor([]string{consts.InfoStr}), + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { InfoCmd(cmd, con, args) }, @@ -25,7 +26,8 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("use", false, infoCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) + + carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con).Usage("implant target to show (optional)")) return []*cobra.Command{infoCmd} } diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 5de76356a8..6e3b58f76c 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -171,3 +171,36 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{jobsCmd, mtlsCmd, wgCmd, httpCmd, httpsCmd, stageCmd} } + +// SliverCommands returns all C2 channels control commands available for an implant target. +func SliverCommands(con *console.SliverClient) []*cobra.Command { + namedPipeCmd := &cobra.Command{ + Use: consts.NamedPipeStr, + Short: "Start a named pipe pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + StartNamedPipeListenerCmd(cmd, con, args) + }, + } + flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") + f.BoolP("allow-all", "a", false, "allow all users to connect") + }) + + tcpListenerCmd := &cobra.Command{ + Use: consts.TCPListenerStr, + Short: "Start a TCP pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + StartTCPListenerCmd(cmd, con, args) + }, + } + flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "remote interface to bind pivot listener") + f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") + }) + + return []*cobra.Command{namedPipeCmd, tcpListenerCmd} +} diff --git a/client/command/jobs/named-pipe.go b/client/command/jobs/named-pipe.go new file mode 100644 index 0000000000..ed4815ace4 --- /dev/null +++ b/client/command/jobs/named-pipe.go @@ -0,0 +1,55 @@ +package jobs + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" +) + +// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. +func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { + session := con.ActiveTarget.GetSessionInteractive() + if session == nil { + return + } + allowAll, _ := cmd.Flags().GetBool("allow-all") + bind, _ := cmd.Flags().GetString("bind") + + var options []bool + options = append(options, allowAll) + listener, err := con.Rpc.PivotStartListener(context.Background(), &sliverpb.PivotStartListenerReq{ + Type: sliverpb.PivotType_NamedPipe, + BindAddress: bind, + Request: con.ActiveTarget.Request(cmd), + Options: options, + }) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + return + } + if listener.Response != nil && listener.Response.Err != "" { + con.PrintErrorf("%s\n", listener.Response.Err) + return + } + con.PrintInfof("Started named pipe pivot listener %s with id %d\n", listener.BindAddress, listener.ID) +} diff --git a/client/command/pivots/start.go b/client/command/jobs/tcp.go similarity index 63% rename from client/command/pivots/start.go rename to client/command/jobs/tcp.go index 1b92e497fb..1c520fa020 100644 --- a/client/command/pivots/start.go +++ b/client/command/jobs/tcp.go @@ -1,4 +1,4 @@ -package pivots +package jobs /* Sliver Implant Framework @@ -50,31 +50,3 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []s } con.PrintInfof("Started tcp pivot listener %s with id %d\n", listener.BindAddress, listener.ID) } - -// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. -func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - session := con.ActiveTarget.GetSessionInteractive() - if session == nil { - return - } - allowAll, _ := cmd.Flags().GetBool("allow-all") - bind, _ := cmd.Flags().GetString("bind") - - var options []bool - options = append(options, allowAll) - listener, err := con.Rpc.PivotStartListener(context.Background(), &sliverpb.PivotStartListenerReq{ - Type: sliverpb.PivotType_NamedPipe, - BindAddress: bind, - Request: con.ActiveTarget.Request(cmd), - Options: options, - }) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return - } - if listener.Response != nil && listener.Response.Err != "" { - con.PrintErrorf("%s\n", listener.Response.Err) - return - } - con.PrintInfof("Started named pipe pivot listener %s with id %d\n", listener.BindAddress, listener.ID) -} diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index cd848b4b08..a1cc3a5b98 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -2,11 +2,9 @@ package pivots import ( "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -26,65 +24,33 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - namedPipeCmd := &cobra.Command{ - Use: consts.NamedPipeStr, - Short: "Start a named pipe pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), - Run: func(cmd *cobra.Command, args []string) { - StartNamedPipeListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(namedPipeCmd) - flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") - f.BoolP("allow-all", "a", false, "allow all users to connect") - }) - - tcpListenerCmd := &cobra.Command{ - Use: consts.TCPListenerStr, - Short: "Start a TCP pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - StartTCPListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(tcpListenerCmd) - flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "remote interface to bind pivot listener") - f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") - }) - pivotStopCmd := &cobra.Command{ Use: consts.StopStr, Short: "Stop a pivot listener", + Args: cobra.ExactArgs(1), Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), Run: func(cmd *cobra.Command, args []string) { StopPivotListenerCmd(cmd, con, args) }, } pivotsCmd.AddCommand(pivotStopCmd) - flags.Bind("", false, pivotStopCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of the pivot listener to stop") - }) - flags.BindFlagCompletions(pivotStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PivotIDCompleter(con) - }) + + stopComs := flags.NewCompletions(pivotStopCmd) + stopComs.PositionalCompletion(PivotIDCompleter(con).Usage("id of the pivot listener to stop")) pivotDetailsCmd := &cobra.Command{ Use: consts.DetailsStr, Short: "Get details of a pivot listener", Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { PivotDetailsCmd(cmd, con, args) }, } pivotsCmd.AddCommand(pivotDetailsCmd) - flags.Bind("", false, pivotDetailsCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of the pivot listener to get details for") - }) - flags.BindFlagCompletions(pivotDetailsCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PivotIDCompleter(con) - }) + + detailsComps := flags.NewCompletions(pivotDetailsCmd) + detailsComps.PositionalCompletion(PivotIDCompleter(con).Usage("ID of the pivot listener to get details for")) graphCmd := &cobra.Command{ Use: consts.GraphStr, diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 3d6868297a..7356e257c7 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -21,6 +21,7 @@ package pivots import ( "context" "fmt" + "strconv" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" @@ -47,19 +48,24 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []strin return } - id, _ := cmd.Flags().GetUint32("id") - if id == uint32(0) { + id, err := strconv.ParseUint(args[0], 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse pivot ID: %s\n", err) + return + } + + if id == 0 { selectedListener, err := SelectPivotListener(pivotListeners.Listeners, con) if err != nil { con.PrintErrorf("%s\n", err) return } - id = selectedListener.ID + id = uint64(selectedListener.ID) } found := false for _, listener := range pivotListeners.Listeners { - if listener.ID == id { + if listener.ID == uint32(id) { PrintPivotListenerDetails(listener, con) found = true } diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 93c76ec1d7..116a505986 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -20,6 +20,7 @@ package pivots import ( "context" + "strconv" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" @@ -33,8 +34,13 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] return } - id, _ := cmd.Flags().GetUint32("id") - if id == uint32(0) { + id, err := strconv.ParseUint(args[0], 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse pivot ID: %s\n", err) + return + } + + if id == 0 { pivotListeners, err := con.Rpc.PivotSessionListeners(context.Background(), &sliverpb.PivotListenersReq{ Request: con.ActiveTarget.Request(cmd), }) @@ -51,10 +57,10 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] con.PrintErrorf("%s\n", err) return } - id = selectedListener.ID + id = uint64(selectedListener.ID) } - _, err := con.Rpc.PivotStopListener(context.Background(), &sliverpb.PivotStopListenerReq{ - ID: id, + _, err = con.Rpc.PivotStopListener(context.Background(), &sliverpb.PivotStopListenerReq{ + ID: uint32(id), Request: con.ActiveTarget.Request(cmd), }) if err != nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 65b6310b65..4370ee3480 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -30,6 +30,7 @@ import ( "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/history" "github.com/bishopfox/sliver/client/command/info" + "github.com/bishopfox/sliver/client/command/jobs" "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/network" "github.com/bishopfox/sliver/client/command/pivots" @@ -84,7 +85,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Info ] bind(consts.InfoHelpGroup, - // info.Commands, + info.Commands, info.SliverCommands, screenshot.Commands, environment.Commands, @@ -98,6 +99,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Network tools ] bind(consts.NetworkHelpGroup, + jobs.SliverCommands, network.Commands, rportfwd.Commands, portfwd.Commands, From 1ab9ebb315866c782ca8db01da00df2139b14b1e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 03:30:37 +0200 Subject: [PATCH 047/109] Add a small cache for Metasploit data: - Full completer for all msf related stuff (modules/payloads/encoders/archs, etc) --- client/command/exec/commands.go | 4 + client/command/generate/commands.go | 3 + client/command/generate/helpers.go | 112 + protobuf/clientpb/client.pb.go | 3489 ++++++++++++++------------- protobuf/clientpb/client.proto | 15 + protobuf/rpcpb/services.pb.go | 1375 +++++------ protobuf/rpcpb/services.proto | 1 + protobuf/rpcpb/services_grpc.pb.go | 37 + server/assets/assets.go | 10 +- server/command/assets/unpack.go | 2 + server/msf/msf.go | 182 ++ server/rpc/rpc-generate.go | 7 +- server/rpc/rpc-msf.go | 9 +- 13 files changed, 2902 insertions(+), 2344 deletions(-) diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index a2f913c25c..b1b4e88658 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -195,6 +195,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { + (*comp)["payload"] = generate.MsfPayloadCompleter(con) + (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + }) msfInjectCmd := &cobra.Command{ Use: consts.MsfInjectStr, diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 67ed1ded0d..20ddba6eac 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -69,6 +69,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + (*comp)["arch"] = MsfArchCompleter(con) + (*comp)["format"] = MsfFormatCompleter(con) + (*comp)["payload"] = MsfPayloadCompleter(con) }) generateCmd.AddCommand(generateStagerCmd) diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 9c6e7eacee..0104a33686 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -3,12 +3,15 @@ package generate import ( "context" "fmt" + "strings" "time" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/cache" + "github.com/rsteube/carapace/pkg/style" ) // GetSliverBinary - Get the binary of an implant based on it's profile. @@ -171,3 +174,112 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValuesDescribed(results...).Tag("traffic encoders") }) } + +// MsfFormatCompleter completes MsfVenom stager formats. +func MsfFormatCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, fmt := range info.Formats { + fmt = strings.TrimSpace(fmt) + if fmt == "" { + continue + } + + results = append(results, fmt) + + } + + return carapace.ActionValues(results...).Tag("msfvenom formats") + }).Cache(1 * time.Minute) +} + +// MsfArchCompleter completes MsfVenom stager architectures. +func MsfArchCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, arch := range info.Archs { + arch = strings.TrimSpace(arch) + if arch == "" { + continue + } + + results = append(results, arch) + } + + return carapace.ActionValues(results...).Tag("msfvenom archs") + }).Cache(1 * time.Minute) +} + +// MsfFormatCompleter completes MsfVenom stager encoders. +func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, mod := range info.Encoders { + results = append(results, mod.FullName) + + level := fmt.Sprintf("%-10s", "["+mod.Quality+"]") + desc := fmt.Sprintf("%s %s", level, mod.Description) + + results = append(results, desc) + } + + return carapace.ActionValuesDescribed(results...).Tag("msfvenom encoders") + }).Cache(1 * time.Minute) +} + +// MsfPayloadCompleter completes Metasploit payloads. +func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, mod := range info.Payloads { + if mod.FullName == "" && mod.Name == "" { + continue + } + + results = append(results, mod.FullName) + results = append(results, mod.Description) + } + + return carapace.ActionValuesDescribed(results...) + }).Cache(1*time.Minute, cache.String("payloads")).MultiParts("/").StyleF(style.ForPath) +} diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index f4665ada7f..d182722f8d 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -3276,6 +3276,156 @@ func (x *Compiler) GetUnsupportedTargets() []*CompilerTarget { return nil } +type MetasploitModule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + FullName string `protobuf:"bytes,2,opt,name=FullName,proto3" json:"FullName,omitempty"` + Description string `protobuf:"bytes,3,opt,name=Description,proto3" json:"Description,omitempty"` + Quality string `protobuf:"bytes,4,opt,name=Quality,proto3" json:"Quality,omitempty"` +} + +func (x *MetasploitModule) Reset() { + *x = MetasploitModule{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetasploitModule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetasploitModule) ProtoMessage() {} + +func (x *MetasploitModule) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetasploitModule.ProtoReflect.Descriptor instead. +func (*MetasploitModule) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{22} +} + +func (x *MetasploitModule) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MetasploitModule) GetFullName() string { + if x != nil { + return x.FullName + } + return "" +} + +func (x *MetasploitModule) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *MetasploitModule) GetQuality() string { + if x != nil { + return x.Quality + } + return "" +} + +type MetasploitCompiler struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=Version,proto3" json:"Version,omitempty"` + Formats []string `protobuf:"bytes,2,rep,name=Formats,proto3" json:"Formats,omitempty"` + Archs []string `protobuf:"bytes,3,rep,name=Archs,proto3" json:"Archs,omitempty"` + Encoders []*MetasploitModule `protobuf:"bytes,4,rep,name=Encoders,proto3" json:"Encoders,omitempty"` + Payloads []*MetasploitModule `protobuf:"bytes,5,rep,name=Payloads,proto3" json:"Payloads,omitempty"` +} + +func (x *MetasploitCompiler) Reset() { + *x = MetasploitCompiler{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetasploitCompiler) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetasploitCompiler) ProtoMessage() {} + +func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetasploitCompiler.ProtoReflect.Descriptor instead. +func (*MetasploitCompiler) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{23} +} + +func (x *MetasploitCompiler) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *MetasploitCompiler) GetFormats() []string { + if x != nil { + return x.Formats + } + return nil +} + +func (x *MetasploitCompiler) GetArchs() []string { + if x != nil { + return x.Archs + } + return nil +} + +func (x *MetasploitCompiler) GetEncoders() []*MetasploitModule { + if x != nil { + return x.Encoders + } + return nil +} + +func (x *MetasploitCompiler) GetPayloads() []*MetasploitModule { + if x != nil { + return x.Payloads + } + return nil +} + type DeleteReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3287,7 +3437,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3300,7 +3450,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3313,7 +3463,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} } func (x *DeleteReq) GetName() string { @@ -3340,7 +3490,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3353,7 +3503,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3366,7 +3516,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{25} } func (x *DNSCanary) GetImplantName() string { @@ -3422,7 +3572,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3435,7 +3585,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3448,7 +3598,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3470,7 +3620,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3483,7 +3633,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3496,7 +3646,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } func (x *UniqueWGIP) GetIP() string { @@ -3518,7 +3668,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3531,7 +3681,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3544,7 +3694,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *ImplantProfile) GetName() string { @@ -3572,7 +3722,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3585,7 +3735,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3598,7 +3748,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3619,7 +3769,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3632,7 +3782,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3645,7 +3795,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *RegenerateReq) GetImplantName() string { @@ -3672,7 +3822,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3685,7 +3835,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3698,7 +3848,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *Job) GetID() uint32 { @@ -3761,7 +3911,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3924,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3937,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *Jobs) GetActive() []*Job { @@ -3808,7 +3958,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3821,7 +3971,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3834,7 +3984,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *KillJobReq) GetID() uint32 { @@ -3856,7 +4006,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3869,7 +4019,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3882,7 +4032,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *KillJob) GetID() uint32 { @@ -3912,7 +4062,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3925,7 +4075,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3938,7 +4088,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *MTLSListenerReq) GetHost() string { @@ -3973,7 +4123,7 @@ type MTLSListener struct { func (x *MTLSListener) Reset() { *x = MTLSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3986,7 +4136,7 @@ func (x *MTLSListener) String() string { func (*MTLSListener) ProtoMessage() {} func (x *MTLSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3999,7 +4149,7 @@ func (x *MTLSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListener.ProtoReflect.Descriptor instead. func (*MTLSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *MTLSListener) GetJobID() uint32 { @@ -4025,7 +4175,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4038,7 +4188,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4051,7 +4201,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *WGListenerReq) GetHost() string { @@ -4107,7 +4257,7 @@ type WGListener struct { func (x *WGListener) Reset() { *x = WGListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4120,7 +4270,7 @@ func (x *WGListener) String() string { func (*WGListener) ProtoMessage() {} func (x *WGListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4133,7 +4283,7 @@ func (x *WGListener) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListener.ProtoReflect.Descriptor instead. func (*WGListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *WGListener) GetJobID() uint32 { @@ -4159,7 +4309,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4172,7 +4322,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4185,7 +4335,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *DNSListenerReq) GetDomains() []string { @@ -4241,7 +4391,7 @@ type DNSListener struct { func (x *DNSListener) Reset() { *x = DNSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4254,7 +4404,7 @@ func (x *DNSListener) String() string { func (*DNSListener) ProtoMessage() {} func (x *DNSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4267,7 +4417,7 @@ func (x *DNSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListener.ProtoReflect.Descriptor instead. func (*DNSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *DNSListener) GetJobID() uint32 { @@ -4300,7 +4450,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4313,7 +4463,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4326,7 +4476,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *HTTPListenerReq) GetDomain() string { @@ -4433,7 +4583,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4446,7 +4596,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4459,7 +4609,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *NamedPipesReq) GetPipeName() string { @@ -4489,7 +4639,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4502,7 +4652,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4515,7 +4665,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *NamedPipes) GetSuccess() bool { @@ -4552,7 +4702,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4565,7 +4715,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4578,7 +4728,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *TCPPivotReq) GetAddress() string { @@ -4608,7 +4758,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4621,7 +4771,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4634,7 +4784,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *TCPPivot) GetSuccess() bool { @@ -4669,7 +4819,7 @@ type HTTPListener struct { func (x *HTTPListener) Reset() { *x = HTTPListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4682,7 +4832,7 @@ func (x *HTTPListener) String() string { func (*HTTPListener) ProtoMessage() {} func (x *HTTPListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4695,7 +4845,7 @@ func (x *HTTPListener) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListener.ProtoReflect.Descriptor instead. func (*HTTPListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *HTTPListener) GetJobID() uint32 { @@ -4716,7 +4866,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4729,7 +4879,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4742,7 +4892,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *Sessions) GetSessions() []*Session { @@ -4765,7 +4915,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4778,7 +4928,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4791,7 +4941,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *RenameReq) GetSessionID() string { @@ -4826,7 +4976,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4839,7 +4989,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4852,7 +5002,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -4873,7 +5023,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4886,7 +5036,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4899,7 +5049,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *Generate) GetFile() *commonpb.File { @@ -4925,7 +5075,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4938,7 +5088,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4951,7 +5101,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *MSFReq) GetPayload() string { @@ -5013,7 +5163,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5026,7 +5176,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5039,7 +5189,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *MSFRemoteReq) GetPayload() string { @@ -5109,7 +5259,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5122,7 +5272,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5135,7 +5285,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -5205,7 +5355,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5218,7 +5368,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5231,7 +5381,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *StagerListener) GetJobID() uint32 { @@ -5254,7 +5404,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5267,7 +5417,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5280,7 +5430,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5315,7 +5465,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5328,7 +5478,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5341,7 +5491,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *ShellcodeRDI) GetData() []byte { @@ -5369,7 +5519,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5382,7 +5532,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5395,7 +5545,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *MsfStagerReq) GetArch() string { @@ -5465,7 +5615,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5478,7 +5628,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5491,7 +5641,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5517,7 +5667,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5530,7 +5680,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5543,7 +5693,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5584,7 +5734,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5597,7 +5747,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5610,7 +5760,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *MigrateReq) GetPid() uint32 { @@ -5653,7 +5803,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5666,7 +5816,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5679,7 +5829,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5701,7 +5851,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5714,7 +5864,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5727,7 +5877,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5756,7 +5906,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5769,7 +5919,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5782,7 +5932,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -5814,7 +5964,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5827,7 +5977,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5840,7 +5990,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -5882,7 +6032,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5895,7 +6045,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5908,7 +6058,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -5932,7 +6082,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5945,7 +6095,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5958,7 +6108,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *Client) GetID() uint32 { @@ -5998,7 +6148,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6011,7 +6161,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6024,7 +6174,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *Event) GetEventType() string { @@ -6081,7 +6231,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6094,7 +6244,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6107,7 +6257,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *Operator) GetOnline() bool { @@ -6139,7 +6289,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6152,7 +6302,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6165,7 +6315,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *WebContent) GetPath() string { @@ -6208,7 +6358,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6221,7 +6371,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6234,7 +6384,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *WebsiteAddContent) GetName() string { @@ -6263,7 +6413,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6276,7 +6426,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6289,7 +6439,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *WebsiteRemoveContent) GetName() string { @@ -6318,7 +6468,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6331,7 +6481,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6344,7 +6494,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *Website) GetName() string { @@ -6372,7 +6522,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6385,7 +6535,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6398,7 +6548,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *Websites) GetWebsites() []*Website { @@ -6422,7 +6572,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6435,7 +6585,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6448,7 +6598,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6495,7 +6645,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6508,7 +6658,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6521,7 +6671,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *Loot) GetID() string { @@ -6577,7 +6727,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6590,7 +6740,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6603,7 +6753,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *AllLoot) GetLoot() []*Loot { @@ -6627,7 +6777,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6640,7 +6790,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6653,7 +6803,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *IOC) GetPath() string { @@ -6688,7 +6838,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6701,7 +6851,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6714,7 +6864,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *ExtensionData) GetOutput() string { @@ -6741,7 +6891,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6754,7 +6904,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6767,7 +6917,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *Host) GetHostname() string { @@ -6830,7 +6980,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6843,7 +6993,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6856,7 +7006,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *AllHosts) GetHosts() []*Host { @@ -6883,7 +7033,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6896,7 +7046,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6909,7 +7059,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -6965,7 +7115,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6978,7 +7128,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6991,7 +7141,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -7014,7 +7164,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7027,7 +7177,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7040,7 +7190,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *BackdoorReq) GetFilePath() string { @@ -7075,7 +7225,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7088,7 +7238,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7101,7 +7251,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -7127,7 +7277,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7140,7 +7290,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7153,7 +7303,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7210,7 +7360,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7223,7 +7373,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7236,7 +7386,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *ShellcodeEncode) GetData() []byte { @@ -7264,7 +7414,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7277,7 +7427,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7290,7 +7440,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7312,7 +7462,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7325,7 +7475,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7338,7 +7488,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7366,7 +7516,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7379,7 +7529,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7392,7 +7542,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *Builders) GetBuilders() []*Builder { @@ -7419,7 +7569,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7432,7 +7582,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7445,7 +7595,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *Builder) GetName() string { @@ -7515,7 +7665,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7528,7 +7678,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7541,7 +7691,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *Credential) GetID() string { @@ -7611,7 +7761,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7624,7 +7774,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7637,7 +7787,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *Credentials) GetCredentials() []*Credential { @@ -7659,7 +7809,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7672,7 +7822,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7685,7 +7835,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7711,7 +7861,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7724,7 +7874,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7737,7 +7887,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *CrackstationStatus) GetName() string { @@ -7794,7 +7944,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7807,7 +7957,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7820,7 +7970,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -7850,7 +8000,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7863,7 +8013,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7876,7 +8026,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *CrackBenchmark) GetName() string { @@ -7917,7 +8067,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7930,7 +8080,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7943,7 +8093,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CrackTask) GetID() string { @@ -8016,7 +8166,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8029,7 +8179,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8042,7 +8192,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *Crackstation) GetName() string { @@ -8142,7 +8292,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8155,7 +8305,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8168,7 +8318,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *CUDABackendInfo) GetType() string { @@ -8262,7 +8412,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8275,7 +8425,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8288,7 +8438,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *OpenCLBackendInfo) GetType() string { @@ -8388,7 +8538,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8401,7 +8551,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8414,7 +8564,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *MetalBackendInfo) GetType() string { @@ -8612,7 +8762,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8625,7 +8775,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8638,7 +8788,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9369,7 +9519,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9382,7 +9532,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9395,7 +9545,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *CrackConfig) GetAutoFire() bool { @@ -9439,7 +9589,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9452,7 +9602,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9465,7 +9615,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9510,7 +9660,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9523,7 +9673,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9536,7 +9686,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{103} + return file_clientpb_client_proto_rawDescGZIP(), []int{105} } func (x *CrackFile) GetID() string { @@ -9630,7 +9780,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9643,7 +9793,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9656,7 +9806,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{104} + return file_clientpb_client_proto_rawDescGZIP(), []int{106} } func (x *CrackFileChunk) GetID() string { @@ -10075,633 +10225,614 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, - 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, - 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, - 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, - 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, - 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, + 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, + 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, + 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, + 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, + 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, + 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, + 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, + 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, + 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, + 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, + 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, + 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, + 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, + 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, + 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, + 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, + 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, + 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, + 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, + 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, + 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, + 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, + 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, + 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, - 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, - 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, - 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, - 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, - 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, - 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, - 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, - 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, - 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, - 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, - 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, - 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, - 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, - 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, - 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, - 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, - 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, - 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, - 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, - 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, + 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, + 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, + 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, + 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, - 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, - 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, - 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, - 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, - 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, - 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, - 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, - 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, - 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, - 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, - 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, - 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, - 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, - 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, - 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, - 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, - 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, - 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, - 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, - 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, + 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, + 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, + 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, + 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, + 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, + 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, + 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, + 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, + 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, + 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, + 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, + 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, + 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, + 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, + 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, + 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, - 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, - 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, - 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, + 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, + 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, + 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, + 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, + 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, + 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, + 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, + 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, + 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, - 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, - 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, - 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, - 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, - 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, - 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, - 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, - 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, - 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, - 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, - 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, - 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, - 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, - 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, - 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, - 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, + 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, + 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, + 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, + 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, + 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, @@ -10717,514 +10848,554 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, - 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, - 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, - 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, - 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, - 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, - 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, - 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, - 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, - 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, - 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, - 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, - 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, - 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, - 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, - 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, - 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, - 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, - 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, - 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, - 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, - 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, - 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, - 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, - 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, - 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, - 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, - 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, - 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, - 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, - 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, - 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, - 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, - 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, - 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, - 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, - 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, - 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, - 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, - 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, - 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, - 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, - 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, - 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, - 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, - 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, - 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, - 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, - 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, - 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, - 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, - 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, - 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, - 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, - 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, - 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, - 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, - 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, - 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, - 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, - 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, - 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, - 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, - 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, - 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, - 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, - 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, - 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, - 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, - 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, - 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, - 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, - 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, - 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, - 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, - 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, - 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, - 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, - 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, - 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, - 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, - 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, - 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, - 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, - 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, - 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, - 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, - 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, - 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, - 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, - 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, - 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, - 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, - 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, - 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, - 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, - 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, - 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, - 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, - 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, - 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, - 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, - 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, - 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, - 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, - 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, + 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, + 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, + 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, + 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, + 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, + 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, + 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, + 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, + 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, + 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, + 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, + 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, + 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, + 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, + 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, + 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, + 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, + 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, + 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, + 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, + 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, + 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, + 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, + 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, + 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, + 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, + 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, + 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, + 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, + 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, + 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, + 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, + 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, + 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, + 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, + 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, + 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, + 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, + 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, + 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, + 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, + 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, + 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, + 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, + 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, + 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, + 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, + 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, + 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, + 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, + 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, + 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, + 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, + 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, + 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, + 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, + 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, + 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, + 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, + 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, + 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, + 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, + 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, + 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, + 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, + 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, + 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, + 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, + 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, + 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, + 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, + 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, + 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, + 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, + 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, + 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, + 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, + 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, + 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, + 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, + 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, + 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, + 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, + 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, + 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, + 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, + 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, + 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, + 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, + 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, + 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, + 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, + 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, + 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, + 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, + 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, + 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, + 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, + 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, + 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, + 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, + 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, + 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, + 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, + 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, + 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, + 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, + 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, + 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, + 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, + 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, + 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, - 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, - 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, - 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, - 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, - 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, - 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, - 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, - 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, - 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, - 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, - 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, - 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, - 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, - 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, - 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, - 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, - 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, - 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, - 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, - 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, - 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, - 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, - 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, - 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, - 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, - 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, - 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, - 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, - 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, - 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, - 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, - 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, - 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, - 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, - 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, - 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, - 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, - 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, - 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, - 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, - 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, - 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, - 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, - 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, - 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, - 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, - 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, - 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, - 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, - 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, - 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, - 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, - 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, - 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, - 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, - 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, - 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, - 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, - 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, - 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, - 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, - 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, - 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, - 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, - 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, - 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, - 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, - 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, - 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, - 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, - 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, - 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, - 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, - 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, - 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, - 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, - 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, - 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, - 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, - 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, - 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, - 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, - 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, - 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, + 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, + 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, + 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, + 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, + 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, + 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, + 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, + 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, + 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, + 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, + 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, + 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, + 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, + 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, + 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, + 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, + 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, + 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, + 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, + 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, + 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, + 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, + 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, + 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, + 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, + 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, + 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, + 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, + 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, + 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, + 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, + 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, + 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, + 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, + 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, + 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, + 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, + 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, + 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, + 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, + 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, + 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, + 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, + 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, + 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, + 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, + 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, + 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, + 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, + 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, + 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, + 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, + 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, + 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, + 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, + 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, + 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, + 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, + 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, + 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, + 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, + 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, + 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, + 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, + 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, + 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, + 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, + 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, + 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, + 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, + 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, + 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, + 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, + 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, + 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, + 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, + 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, + 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, + 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11240,7 +11411,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 114) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 116) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -11276,206 +11447,210 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler (*Compiler)(nil), // 33: clientpb.Compiler - (*DeleteReq)(nil), // 34: clientpb.DeleteReq - (*DNSCanary)(nil), // 35: clientpb.DNSCanary - (*Canaries)(nil), // 36: clientpb.Canaries - (*UniqueWGIP)(nil), // 37: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 38: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 39: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 40: clientpb.RegenerateReq - (*Job)(nil), // 41: clientpb.Job - (*Jobs)(nil), // 42: clientpb.Jobs - (*KillJobReq)(nil), // 43: clientpb.KillJobReq - (*KillJob)(nil), // 44: clientpb.KillJob - (*MTLSListenerReq)(nil), // 45: clientpb.MTLSListenerReq - (*MTLSListener)(nil), // 46: clientpb.MTLSListener - (*WGListenerReq)(nil), // 47: clientpb.WGListenerReq - (*WGListener)(nil), // 48: clientpb.WGListener - (*DNSListenerReq)(nil), // 49: clientpb.DNSListenerReq - (*DNSListener)(nil), // 50: clientpb.DNSListener - (*HTTPListenerReq)(nil), // 51: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 52: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 53: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 54: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 55: clientpb.TCPPivot - (*HTTPListener)(nil), // 56: clientpb.HTTPListener - (*Sessions)(nil), // 57: clientpb.Sessions - (*RenameReq)(nil), // 58: clientpb.RenameReq - (*GenerateReq)(nil), // 59: clientpb.GenerateReq - (*Generate)(nil), // 60: clientpb.Generate - (*MSFReq)(nil), // 61: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 62: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 63: clientpb.StagerListenerReq - (*StagerListener)(nil), // 64: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 65: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 66: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 67: clientpb.MsfStagerReq - (*MsfStager)(nil), // 68: clientpb.MsfStager - (*GetSystemReq)(nil), // 69: clientpb.GetSystemReq - (*MigrateReq)(nil), // 70: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 71: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 72: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 73: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 74: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 75: clientpb.PivotGraph - (*Client)(nil), // 76: clientpb.Client - (*Event)(nil), // 77: clientpb.Event - (*Operator)(nil), // 78: clientpb.Operator - (*WebContent)(nil), // 79: clientpb.WebContent - (*WebsiteAddContent)(nil), // 80: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 81: clientpb.WebsiteRemoveContent - (*Website)(nil), // 82: clientpb.Website - (*Websites)(nil), // 83: clientpb.Websites - (*WGClientConfig)(nil), // 84: clientpb.WGClientConfig - (*Loot)(nil), // 85: clientpb.Loot - (*AllLoot)(nil), // 86: clientpb.AllLoot - (*IOC)(nil), // 87: clientpb.IOC - (*ExtensionData)(nil), // 88: clientpb.ExtensionData - (*Host)(nil), // 89: clientpb.Host - (*AllHosts)(nil), // 90: clientpb.AllHosts - (*DllHijackReq)(nil), // 91: clientpb.DllHijackReq - (*DllHijack)(nil), // 92: clientpb.DllHijack - (*BackdoorReq)(nil), // 93: clientpb.BackdoorReq - (*Backdoor)(nil), // 94: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 95: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 96: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 97: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 98: clientpb.ExternalGenerateReq - (*Builders)(nil), // 99: clientpb.Builders - (*Builder)(nil), // 100: clientpb.Builder - (*Credential)(nil), // 101: clientpb.Credential - (*Credentials)(nil), // 102: clientpb.Credentials - (*Crackstations)(nil), // 103: clientpb.Crackstations - (*CrackstationStatus)(nil), // 104: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 105: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 106: clientpb.CrackBenchmark - (*CrackTask)(nil), // 107: clientpb.CrackTask - (*Crackstation)(nil), // 108: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 109: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 110: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 111: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 112: clientpb.CrackCommand - (*CrackConfig)(nil), // 113: clientpb.CrackConfig - (*CrackFiles)(nil), // 114: clientpb.CrackFiles - (*CrackFile)(nil), // 115: clientpb.CrackFile - (*CrackFileChunk)(nil), // 116: clientpb.CrackFileChunk - nil, // 117: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 118: clientpb.ImplantBuilds.ConfigsEntry - nil, // 119: clientpb.WebsiteAddContent.ContentsEntry - nil, // 120: clientpb.Website.ContentsEntry - nil, // 121: clientpb.Host.ExtensionDataEntry - nil, // 122: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 123: clientpb.CrackSyncStatus.ProgressEntry - nil, // 124: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 125: clientpb.Crackstation.BenchmarksEntry - (*commonpb.Request)(nil), // 126: commonpb.Request - (*commonpb.Response)(nil), // 127: commonpb.Response - (*commonpb.File)(nil), // 128: commonpb.File + (*MetasploitModule)(nil), // 34: clientpb.MetasploitModule + (*MetasploitCompiler)(nil), // 35: clientpb.MetasploitCompiler + (*DeleteReq)(nil), // 36: clientpb.DeleteReq + (*DNSCanary)(nil), // 37: clientpb.DNSCanary + (*Canaries)(nil), // 38: clientpb.Canaries + (*UniqueWGIP)(nil), // 39: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 40: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 41: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 42: clientpb.RegenerateReq + (*Job)(nil), // 43: clientpb.Job + (*Jobs)(nil), // 44: clientpb.Jobs + (*KillJobReq)(nil), // 45: clientpb.KillJobReq + (*KillJob)(nil), // 46: clientpb.KillJob + (*MTLSListenerReq)(nil), // 47: clientpb.MTLSListenerReq + (*MTLSListener)(nil), // 48: clientpb.MTLSListener + (*WGListenerReq)(nil), // 49: clientpb.WGListenerReq + (*WGListener)(nil), // 50: clientpb.WGListener + (*DNSListenerReq)(nil), // 51: clientpb.DNSListenerReq + (*DNSListener)(nil), // 52: clientpb.DNSListener + (*HTTPListenerReq)(nil), // 53: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 54: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 55: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 56: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 57: clientpb.TCPPivot + (*HTTPListener)(nil), // 58: clientpb.HTTPListener + (*Sessions)(nil), // 59: clientpb.Sessions + (*RenameReq)(nil), // 60: clientpb.RenameReq + (*GenerateReq)(nil), // 61: clientpb.GenerateReq + (*Generate)(nil), // 62: clientpb.Generate + (*MSFReq)(nil), // 63: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 64: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 65: clientpb.StagerListenerReq + (*StagerListener)(nil), // 66: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 67: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 68: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 69: clientpb.MsfStagerReq + (*MsfStager)(nil), // 70: clientpb.MsfStager + (*GetSystemReq)(nil), // 71: clientpb.GetSystemReq + (*MigrateReq)(nil), // 72: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 73: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 74: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 75: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 76: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 77: clientpb.PivotGraph + (*Client)(nil), // 78: clientpb.Client + (*Event)(nil), // 79: clientpb.Event + (*Operator)(nil), // 80: clientpb.Operator + (*WebContent)(nil), // 81: clientpb.WebContent + (*WebsiteAddContent)(nil), // 82: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 83: clientpb.WebsiteRemoveContent + (*Website)(nil), // 84: clientpb.Website + (*Websites)(nil), // 85: clientpb.Websites + (*WGClientConfig)(nil), // 86: clientpb.WGClientConfig + (*Loot)(nil), // 87: clientpb.Loot + (*AllLoot)(nil), // 88: clientpb.AllLoot + (*IOC)(nil), // 89: clientpb.IOC + (*ExtensionData)(nil), // 90: clientpb.ExtensionData + (*Host)(nil), // 91: clientpb.Host + (*AllHosts)(nil), // 92: clientpb.AllHosts + (*DllHijackReq)(nil), // 93: clientpb.DllHijackReq + (*DllHijack)(nil), // 94: clientpb.DllHijack + (*BackdoorReq)(nil), // 95: clientpb.BackdoorReq + (*Backdoor)(nil), // 96: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 97: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 98: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 99: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 100: clientpb.ExternalGenerateReq + (*Builders)(nil), // 101: clientpb.Builders + (*Builder)(nil), // 102: clientpb.Builder + (*Credential)(nil), // 103: clientpb.Credential + (*Credentials)(nil), // 104: clientpb.Credentials + (*Crackstations)(nil), // 105: clientpb.Crackstations + (*CrackstationStatus)(nil), // 106: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 107: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 108: clientpb.CrackBenchmark + (*CrackTask)(nil), // 109: clientpb.CrackTask + (*Crackstation)(nil), // 110: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 111: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 112: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 113: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 114: clientpb.CrackCommand + (*CrackConfig)(nil), // 115: clientpb.CrackConfig + (*CrackFiles)(nil), // 116: clientpb.CrackFiles + (*CrackFile)(nil), // 117: clientpb.CrackFile + (*CrackFileChunk)(nil), // 118: clientpb.CrackFileChunk + nil, // 119: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 120: clientpb.ImplantBuilds.ConfigsEntry + nil, // 121: clientpb.WebsiteAddContent.ContentsEntry + nil, // 122: clientpb.Website.ContentsEntry + nil, // 123: clientpb.Host.ExtensionDataEntry + nil, // 124: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 125: clientpb.CrackSyncStatus.ProgressEntry + nil, // 126: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 127: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 128: commonpb.Request + (*commonpb.Response)(nil), // 129: commonpb.Response + (*commonpb.File)(nil), // 130: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 126, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request - 126, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 128, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 128, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request 14, // 2: clientpb.History.Commands:type_name -> clientpb.ImplantCommand - 127, // 3: clientpb.History.Response:type_name -> commonpb.Response + 129, // 3: clientpb.History.Response:type_name -> commonpb.Response 18, // 4: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon 20, // 5: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask 22, // 6: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 0, // 7: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 128, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 128, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 117, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 130, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 130, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 119, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry 24, // 11: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder 26, // 12: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest 23, // 13: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 128, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 118, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 130, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 120, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry 0, // 16: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat 31, // 17: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget 32, // 18: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler 31, // 19: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 35, // 20: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 23, // 21: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 38, // 22: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 41, // 23: clientpb.Jobs.Active:type_name -> clientpb.Job - 126, // 24: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 127, // 25: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 126, // 26: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 127, // 27: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 17, // 28: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 23, // 29: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 128, // 30: clientpb.Generate.File:type_name -> commonpb.File - 126, // 31: clientpb.MSFReq.Request:type_name -> commonpb.Request - 126, // 32: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 33: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 34: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 128, // 35: clientpb.MsfStager.File:type_name -> commonpb.File - 23, // 36: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 126, // 37: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 23, // 38: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 39: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 126, // 40: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 126, // 41: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 126, // 42: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 17, // 43: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 74, // 44: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 74, // 45: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 78, // 46: clientpb.Client.Operator:type_name -> clientpb.Operator - 17, // 47: clientpb.Event.Session:type_name -> clientpb.Session - 41, // 48: clientpb.Event.Job:type_name -> clientpb.Job - 76, // 49: clientpb.Event.Client:type_name -> clientpb.Client - 119, // 50: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 120, // 51: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 82, // 52: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 53: clientpb.Loot.FileType:type_name -> clientpb.FileType - 128, // 54: clientpb.Loot.File:type_name -> commonpb.File - 85, // 55: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 87, // 56: clientpb.Host.IOCs:type_name -> clientpb.IOC - 121, // 57: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 89, // 58: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 126, // 59: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 127, // 60: clientpb.DllHijack.Response:type_name -> commonpb.Response - 126, // 61: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 127, // 62: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 63: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 126, // 64: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 127, // 65: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 122, // 66: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 23, // 67: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 100, // 68: clientpb.Builders.Builders:type_name -> clientpb.Builder - 31, // 69: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 32, // 70: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 71: clientpb.Credential.HashType:type_name -> clientpb.HashType - 101, // 72: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 108, // 73: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 74: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 105, // 75: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 123, // 76: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 124, // 77: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 112, // 78: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 125, // 79: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 109, // 80: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 111, // 81: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 110, // 82: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 83: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 84: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 85: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 86: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 87: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 88: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 115, // 89: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 90: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 116, // 91: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 24, // 92: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 23, // 93: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 79, // 94: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 79, // 95: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 88, // 96: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 97: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 98, // [98:98] is the sub-list for method output_type - 98, // [98:98] is the sub-list for method input_type - 98, // [98:98] is the sub-list for extension type_name - 98, // [98:98] is the sub-list for extension extendee - 0, // [0:98] is the sub-list for field type_name + 34, // 20: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule + 34, // 21: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule + 37, // 22: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 23, // 23: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 40, // 24: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 43, // 25: clientpb.Jobs.Active:type_name -> clientpb.Job + 128, // 26: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 129, // 27: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 128, // 28: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 129, // 29: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 17, // 30: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 23, // 31: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 130, // 32: clientpb.Generate.File:type_name -> commonpb.File + 128, // 33: clientpb.MSFReq.Request:type_name -> commonpb.Request + 128, // 34: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 35: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 36: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 130, // 37: clientpb.MsfStager.File:type_name -> commonpb.File + 23, // 38: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 128, // 39: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 23, // 40: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 41: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 128, // 42: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 128, // 43: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 128, // 44: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 17, // 45: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 76, // 46: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 76, // 47: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 80, // 48: clientpb.Client.Operator:type_name -> clientpb.Operator + 17, // 49: clientpb.Event.Session:type_name -> clientpb.Session + 43, // 50: clientpb.Event.Job:type_name -> clientpb.Job + 78, // 51: clientpb.Event.Client:type_name -> clientpb.Client + 121, // 52: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 122, // 53: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 84, // 54: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 55: clientpb.Loot.FileType:type_name -> clientpb.FileType + 130, // 56: clientpb.Loot.File:type_name -> commonpb.File + 87, // 57: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 89, // 58: clientpb.Host.IOCs:type_name -> clientpb.IOC + 123, // 59: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 91, // 60: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 128, // 61: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 129, // 62: clientpb.DllHijack.Response:type_name -> commonpb.Response + 128, // 63: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 129, // 64: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 65: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 128, // 66: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 129, // 67: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 124, // 68: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 23, // 69: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 102, // 70: clientpb.Builders.Builders:type_name -> clientpb.Builder + 31, // 71: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 32, // 72: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 73: clientpb.Credential.HashType:type_name -> clientpb.HashType + 103, // 74: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 110, // 75: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 76: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 107, // 77: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 125, // 78: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 126, // 79: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 114, // 80: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 127, // 81: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 111, // 82: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 113, // 83: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 112, // 84: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 85: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 86: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 87: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 88: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 89: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 90: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 117, // 91: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 92: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 118, // 93: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 24, // 94: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 23, // 95: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 81, // 96: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 81, // 97: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 90, // 98: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 99: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 100, // [100:100] is the sub-list for method output_type + 100, // [100:100] is the sub-list for method input_type + 100, // [100:100] is the sub-list for extension type_name + 100, // [100:100] is the sub-list for extension extendee + 0, // [0:100] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -11749,7 +11924,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteReq); i { + switch v := v.(*MetasploitModule); i { case 0: return &v.state case 1: @@ -11761,7 +11936,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSCanary); i { + switch v := v.(*MetasploitCompiler); i { case 0: return &v.state case 1: @@ -11773,7 +11948,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Canaries); i { + switch v := v.(*DeleteReq); i { case 0: return &v.state case 1: @@ -11785,7 +11960,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueWGIP); i { + switch v := v.(*DNSCanary); i { case 0: return &v.state case 1: @@ -11797,7 +11972,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfile); i { + switch v := v.(*Canaries); i { case 0: return &v.state case 1: @@ -11809,7 +11984,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfiles); i { + switch v := v.(*UniqueWGIP); i { case 0: return &v.state case 1: @@ -11821,7 +11996,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegenerateReq); i { + switch v := v.(*ImplantProfile); i { case 0: return &v.state case 1: @@ -11833,7 +12008,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ImplantProfiles); i { case 0: return &v.state case 1: @@ -11845,7 +12020,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Jobs); i { + switch v := v.(*RegenerateReq); i { case 0: return &v.state case 1: @@ -11857,7 +12032,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJobReq); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -11869,7 +12044,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJob); i { + switch v := v.(*Jobs); i { case 0: return &v.state case 1: @@ -11881,7 +12056,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListenerReq); i { + switch v := v.(*KillJobReq); i { case 0: return &v.state case 1: @@ -11893,7 +12068,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListener); i { + switch v := v.(*KillJob); i { case 0: return &v.state case 1: @@ -11905,7 +12080,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListenerReq); i { + switch v := v.(*MTLSListenerReq); i { case 0: return &v.state case 1: @@ -11917,7 +12092,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListener); i { + switch v := v.(*MTLSListener); i { case 0: return &v.state case 1: @@ -11929,7 +12104,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListenerReq); i { + switch v := v.(*WGListenerReq); i { case 0: return &v.state case 1: @@ -11941,7 +12116,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListener); i { + switch v := v.(*WGListener); i { case 0: return &v.state case 1: @@ -11953,7 +12128,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListenerReq); i { + switch v := v.(*DNSListenerReq); i { case 0: return &v.state case 1: @@ -11965,7 +12140,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipesReq); i { + switch v := v.(*DNSListener); i { case 0: return &v.state case 1: @@ -11977,7 +12152,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipes); i { + switch v := v.(*HTTPListenerReq); i { case 0: return &v.state case 1: @@ -11989,7 +12164,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivotReq); i { + switch v := v.(*NamedPipesReq); i { case 0: return &v.state case 1: @@ -12001,7 +12176,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivot); i { + switch v := v.(*NamedPipes); i { case 0: return &v.state case 1: @@ -12013,7 +12188,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListener); i { + switch v := v.(*TCPPivotReq); i { case 0: return &v.state case 1: @@ -12025,7 +12200,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Sessions); i { + switch v := v.(*TCPPivot); i { case 0: return &v.state case 1: @@ -12037,7 +12212,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenameReq); i { + switch v := v.(*HTTPListener); i { case 0: return &v.state case 1: @@ -12049,7 +12224,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateReq); i { + switch v := v.(*Sessions); i { case 0: return &v.state case 1: @@ -12061,7 +12236,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Generate); i { + switch v := v.(*RenameReq); i { case 0: return &v.state case 1: @@ -12073,7 +12248,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFReq); i { + switch v := v.(*GenerateReq); i { case 0: return &v.state case 1: @@ -12085,7 +12260,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFRemoteReq); i { + switch v := v.(*Generate); i { case 0: return &v.state case 1: @@ -12097,7 +12272,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListenerReq); i { + switch v := v.(*MSFReq); i { case 0: return &v.state case 1: @@ -12109,7 +12284,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListener); i { + switch v := v.(*MSFRemoteReq); i { case 0: return &v.state case 1: @@ -12121,7 +12296,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDIReq); i { + switch v := v.(*StagerListenerReq); i { case 0: return &v.state case 1: @@ -12133,7 +12308,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDI); i { + switch v := v.(*StagerListener); i { case 0: return &v.state case 1: @@ -12145,7 +12320,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStagerReq); i { + switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state case 1: @@ -12157,7 +12332,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStager); i { + switch v := v.(*ShellcodeRDI); i { case 0: return &v.state case 1: @@ -12169,7 +12344,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSystemReq); i { + switch v := v.(*MsfStagerReq); i { case 0: return &v.state case 1: @@ -12181,7 +12356,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MigrateReq); i { + switch v := v.(*MsfStager); i { case 0: return &v.state case 1: @@ -12193,7 +12368,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelReq); i { + switch v := v.(*GetSystemReq); i { case 0: return &v.state case 1: @@ -12205,7 +12380,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnel); i { + switch v := v.(*MigrateReq); i { case 0: return &v.state case 1: @@ -12217,7 +12392,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseTunnelReq); i { + switch v := v.(*CreateTunnelReq); i { case 0: return &v.state case 1: @@ -12229,7 +12404,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraphEntry); i { + switch v := v.(*CreateTunnel); i { case 0: return &v.state case 1: @@ -12241,7 +12416,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraph); i { + switch v := v.(*CloseTunnelReq); i { case 0: return &v.state case 1: @@ -12253,7 +12428,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { + switch v := v.(*PivotGraphEntry); i { case 0: return &v.state case 1: @@ -12265,7 +12440,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*PivotGraph); i { case 0: return &v.state case 1: @@ -12277,7 +12452,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operator); i { + switch v := v.(*Client); i { case 0: return &v.state case 1: @@ -12289,7 +12464,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebContent); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -12301,7 +12476,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteAddContent); i { + switch v := v.(*Operator); i { case 0: return &v.state case 1: @@ -12313,7 +12488,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteRemoveContent); i { + switch v := v.(*WebContent); i { case 0: return &v.state case 1: @@ -12325,7 +12500,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Website); i { + switch v := v.(*WebsiteAddContent); i { case 0: return &v.state case 1: @@ -12337,7 +12512,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Websites); i { + switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state case 1: @@ -12349,7 +12524,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGClientConfig); i { + switch v := v.(*Website); i { case 0: return &v.state case 1: @@ -12361,7 +12536,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Loot); i { + switch v := v.(*Websites); i { case 0: return &v.state case 1: @@ -12373,7 +12548,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllLoot); i { + switch v := v.(*WGClientConfig); i { case 0: return &v.state case 1: @@ -12385,7 +12560,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOC); i { + switch v := v.(*Loot); i { case 0: return &v.state case 1: @@ -12397,7 +12572,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionData); i { + switch v := v.(*AllLoot); i { case 0: return &v.state case 1: @@ -12409,7 +12584,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Host); i { + switch v := v.(*IOC); i { case 0: return &v.state case 1: @@ -12421,7 +12596,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllHosts); i { + switch v := v.(*ExtensionData); i { case 0: return &v.state case 1: @@ -12433,7 +12608,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijackReq); i { + switch v := v.(*Host); i { case 0: return &v.state case 1: @@ -12445,7 +12620,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijack); i { + switch v := v.(*AllHosts); i { case 0: return &v.state case 1: @@ -12457,7 +12632,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BackdoorReq); i { + switch v := v.(*DllHijackReq); i { case 0: return &v.state case 1: @@ -12469,7 +12644,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Backdoor); i { + switch v := v.(*DllHijack); i { case 0: return &v.state case 1: @@ -12481,7 +12656,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncodeReq); i { + switch v := v.(*BackdoorReq); i { case 0: return &v.state case 1: @@ -12493,7 +12668,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncode); i { + switch v := v.(*Backdoor); i { case 0: return &v.state case 1: @@ -12505,7 +12680,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncoderMap); i { + switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state case 1: @@ -12517,7 +12692,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalGenerateReq); i { + switch v := v.(*ShellcodeEncode); i { case 0: return &v.state case 1: @@ -12529,7 +12704,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builders); i { + switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state case 1: @@ -12541,7 +12716,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builder); i { + switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state case 1: @@ -12553,7 +12728,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credential); i { + switch v := v.(*Builders); i { case 0: return &v.state case 1: @@ -12565,7 +12740,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credentials); i { + switch v := v.(*Builder); i { case 0: return &v.state case 1: @@ -12577,7 +12752,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstations); i { + switch v := v.(*Credential); i { case 0: return &v.state case 1: @@ -12589,7 +12764,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackstationStatus); i { + switch v := v.(*Credentials); i { case 0: return &v.state case 1: @@ -12601,7 +12776,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackSyncStatus); i { + switch v := v.(*Crackstations); i { case 0: return &v.state case 1: @@ -12613,7 +12788,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackBenchmark); i { + switch v := v.(*CrackstationStatus); i { case 0: return &v.state case 1: @@ -12625,7 +12800,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackTask); i { + switch v := v.(*CrackSyncStatus); i { case 0: return &v.state case 1: @@ -12637,7 +12812,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstation); i { + switch v := v.(*CrackBenchmark); i { case 0: return &v.state case 1: @@ -12649,7 +12824,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CUDABackendInfo); i { + switch v := v.(*CrackTask); i { case 0: return &v.state case 1: @@ -12661,7 +12836,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenCLBackendInfo); i { + switch v := v.(*Crackstation); i { case 0: return &v.state case 1: @@ -12673,7 +12848,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetalBackendInfo); i { + switch v := v.(*CUDABackendInfo); i { case 0: return &v.state case 1: @@ -12685,7 +12860,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackCommand); i { + switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state case 1: @@ -12697,7 +12872,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackConfig); i { + switch v := v.(*MetalBackendInfo); i { case 0: return &v.state case 1: @@ -12709,7 +12884,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFiles); i { + switch v := v.(*CrackCommand); i { case 0: return &v.state case 1: @@ -12721,7 +12896,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFile); i { + switch v := v.(*CrackConfig); i { case 0: return &v.state case 1: @@ -12733,6 +12908,30 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12751,7 +12950,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 114, + NumMessages: 116, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index 18b3021899..e8b9aac374 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -282,6 +282,21 @@ message Compiler { repeated CompilerTarget UnsupportedTargets = 5; } +message MetasploitModule { + string Name = 1; + string FullName = 2; + string Description = 3; + string Quality = 4; +} + +message MetasploitCompiler { + string Version = 1; + repeated string Formats = 2; + repeated string Archs = 3; + repeated MetasploitModule Encoders = 4; + repeated MetasploitModule Payloads = 5; +} + message DeleteReq { string Name = 1; } // DNSCanary - Single canary and metadata diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index 512be4c7a8..e77304edf2 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -31,7 +31,7 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xe7, 0x4e, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xaf, 0x4f, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, @@ -302,370 +302,374 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, - 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x46, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, + 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, + 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, + 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, - 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, - 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, + 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, + 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, + 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, + 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, - 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, - 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, - 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, - 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, - 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, + 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, + 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, + 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, + 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, + 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, + 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, + 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, + 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, - 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, - 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, - 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, - 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, - 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, - 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, + 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, + 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, + 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, + 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, - 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, - 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, - 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, - 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, - 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, - 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, - 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, + 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, + 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, + 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, + 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, + 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, + 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, + 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, + 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, + 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, - 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, + 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, - 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, - 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, - 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, - 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, - 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, - 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, - 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, + 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, - 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, + 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, + 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, - 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, - 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, - 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, - 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, - 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, - 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, - 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, - 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, - 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, - 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, - 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, - 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, - 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, - 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, + 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, + 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, + 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, + 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, + 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, + 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, + 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -818,73 +822,74 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*clientpb.MsfStager)(nil), // 146: clientpb.MsfStager (*clientpb.ShellcodeRDI)(nil), // 147: clientpb.ShellcodeRDI (*clientpb.Compiler)(nil), // 148: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 149: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 150: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 151: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 152: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 153: clientpb.Websites - (*sliverpb.Ps)(nil), // 154: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 155: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 156: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 157: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 158: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 159: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 160: sliverpb.Mv - (*sliverpb.Cp)(nil), // 161: sliverpb.Cp - (*sliverpb.Rm)(nil), // 162: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 163: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 164: sliverpb.Download - (*sliverpb.Upload)(nil), // 165: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 166: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 167: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 168: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 169: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 170: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 171: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 172: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 173: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 174: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 175: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 176: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 177: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 178: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 179: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 180: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 181: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 182: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 183: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 184: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 185: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 186: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 187: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 188: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 189: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 190: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 191: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 192: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 193: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 194: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 195: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 196: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 197: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 198: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 199: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 200: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 201: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 202: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 203: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 204: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 205: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 206: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 207: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 208: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 209: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 210: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 211: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 212: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 213: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 214: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 215: sliverpb.Portfwd + (*clientpb.MetasploitCompiler)(nil), // 149: clientpb.MetasploitCompiler + (*clientpb.ShellcodeEncode)(nil), // 150: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 151: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 152: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 153: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 154: clientpb.Websites + (*sliverpb.Ps)(nil), // 155: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 156: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 157: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 158: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 159: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 160: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 161: sliverpb.Mv + (*sliverpb.Cp)(nil), // 162: sliverpb.Cp + (*sliverpb.Rm)(nil), // 163: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 164: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 165: sliverpb.Download + (*sliverpb.Upload)(nil), // 166: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 167: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 168: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 169: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 170: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 171: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 172: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 173: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 174: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 175: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 176: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 177: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 178: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 179: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 180: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 181: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 182: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 183: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 184: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 185: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 186: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 187: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 188: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 189: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 190: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 191: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 192: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 193: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 194: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 195: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 196: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 197: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 198: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 199: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 200: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 201: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 202: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 203: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 204: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 205: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 206: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 207: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 208: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 209: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 210: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 211: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 212: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 213: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 214: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 215: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 216: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty @@ -960,269 +965,271 @@ var file_rpcpb_services_proto_depIdxs = []int32{ 34, // 70: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq 35, // 71: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq 0, // 72: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 36, // 73: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 74: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 75: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 37, // 76: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 37, // 77: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 78: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 38, // 79: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 38, // 80: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 39, // 81: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 39, // 82: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 40, // 83: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 41, // 84: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 42, // 85: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 43, // 86: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 44, // 87: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 45, // 88: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 46, // 89: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 47, // 90: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 48, // 91: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 49, // 92: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 50, // 93: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 51, // 94: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 52, // 95: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 53, // 96: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 54, // 97: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 55, // 98: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 56, // 99: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 57, // 100: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 58, // 101: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 59, // 102: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 60, // 103: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 61, // 104: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 62, // 105: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 63, // 106: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 64, // 107: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 65, // 108: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 66, // 109: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 67, // 110: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 68, // 111: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 69, // 112: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 70, // 113: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 71, // 114: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 72, // 115: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 73, // 116: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 74, // 117: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 75, // 118: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 76, // 119: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 77, // 120: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 78, // 121: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 79, // 122: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 123: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 80, // 124: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 81, // 125: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 82, // 126: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 83, // 127: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 84, // 128: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 85, // 129: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 86, // 130: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 87, // 131: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 88, // 132: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 89, // 133: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 90, // 134: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 91, // 135: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 92, // 136: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 93, // 137: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 94, // 138: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 95, // 139: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 96, // 140: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 97, // 141: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 98, // 142: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 99, // 143: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 100, // 144: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 101, // 145: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 102, // 146: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 103, // 147: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 104, // 148: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 105, // 149: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 106, // 150: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 107, // 151: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 108, // 152: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 109, // 153: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 110, // 154: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 111, // 155: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 112, // 156: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 113, // 157: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 114, // 158: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 115, // 159: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 116, // 160: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 116, // 161: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 117, // 162: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 118, // 163: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 118, // 164: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 119, // 165: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 166: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 120, // 167: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 168: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 0, // 169: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 121, // 170: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 171: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 0, // 172: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty - 122, // 173: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History - 123, // 174: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 124, // 175: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 7, // 176: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 177: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 125, // 178: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 8, // 179: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 8, // 180: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 126, // 181: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 182: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 127, // 183: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 128, // 184: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 129, // 185: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 130, // 186: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 131, // 187: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 132, // 188: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 132, // 189: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 133, // 190: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 133, // 191: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 15, // 192: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 193: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 15, // 194: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 15, // 195: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 134, // 196: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 16, // 197: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 198: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 199: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 200: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 17, // 201: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 16, // 202: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 16, // 203: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 17, // 204: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 135, // 205: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 18, // 206: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 207: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 208: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 136, // 209: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 137, // 210: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 211: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 137, // 212: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 25, // 213: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 214: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 138, // 215: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 25, // 216: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 217: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 218: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 139, // 219: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 28, // 220: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 221: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 140, // 222: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 29, // 223: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 224: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 30, // 225: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 226: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 227: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 136, // 228: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 141, // 229: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 230: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 142, // 231: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 143, // 232: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 144, // 233: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 145, // 234: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 235: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 33, // 236: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 146, // 237: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 147, // 238: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 148, // 239: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 149, // 240: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 150, // 241: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 151, // 242: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 152, // 243: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 244: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 153, // 245: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 38, // 246: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 247: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 38, // 248: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 38, // 249: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 38, // 250: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 41, // 251: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 154, // 252: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 155, // 253: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 156, // 254: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 157, // 255: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 158, // 256: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 159, // 257: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 159, // 258: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 160, // 259: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 161, // 260: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 162, // 261: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 163, // 262: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 164, // 263: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 165, // 264: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 166, // 265: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 167, // 266: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 168, // 267: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 158, // 268: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 169, // 269: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 170, // 270: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 171, // 271: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 172, // 272: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 173, // 273: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 174, // 274: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 175, // 275: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 176, // 276: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 176, // 277: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 176, // 278: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 177, // 279: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 178, // 280: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 179, // 281: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 179, // 282: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 180, // 283: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 181, // 284: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 182, // 285: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 183, // 286: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 184, // 287: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 288: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 185, // 289: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 186, // 290: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 187, // 291: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 187, // 292: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 187, // 293: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 188, // 294: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 189, // 295: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 190, // 296: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 191, // 297: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 192, // 298: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 193, // 299: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 194, // 300: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 195, // 301: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 196, // 302: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 197, // 303: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 198, // 304: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 199, // 305: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 200, // 306: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 201, // 307: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 202, // 308: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 203, // 309: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 202, // 310: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 100, // 311: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 312: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 204, // 313: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 205, // 314: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 206, // 315: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 207, // 316: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 208, // 317: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 209, // 318: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 210, // 319: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 210, // 320: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 211, // 321: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 211, // 322: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 212, // 323: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 213, // 324: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 214, // 325: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 215, // 326: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 116, // 327: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 328: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 117, // 329: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 118, // 330: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 331: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 119, // 332: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 25, // 333: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 167, // [167:334] is the sub-list for method output_type - 0, // [0:167] is the sub-list for method input_type + 0, // 73: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty + 36, // 74: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 75: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 76: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 37, // 77: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 37, // 78: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 79: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 38, // 80: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 38, // 81: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 39, // 82: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 39, // 83: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 40, // 84: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 41, // 85: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 42, // 86: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 43, // 87: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 44, // 88: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 45, // 89: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 46, // 90: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 47, // 91: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 48, // 92: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 49, // 93: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 50, // 94: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 51, // 95: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 52, // 96: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 53, // 97: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 54, // 98: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 55, // 99: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 56, // 100: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 57, // 101: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 58, // 102: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 59, // 103: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 60, // 104: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 61, // 105: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 62, // 106: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 63, // 107: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 64, // 108: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 65, // 109: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 66, // 110: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 67, // 111: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 68, // 112: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 69, // 113: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 70, // 114: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 71, // 115: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 72, // 116: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 73, // 117: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 74, // 118: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 75, // 119: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 76, // 120: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 77, // 121: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 78, // 122: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 79, // 123: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 124: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 80, // 125: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 81, // 126: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 82, // 127: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 83, // 128: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 84, // 129: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 85, // 130: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 86, // 131: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 87, // 132: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 88, // 133: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 89, // 134: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 90, // 135: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 91, // 136: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 92, // 137: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 93, // 138: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 94, // 139: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 95, // 140: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 96, // 141: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 97, // 142: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 98, // 143: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 99, // 144: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 100, // 145: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 101, // 146: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 102, // 147: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 103, // 148: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 104, // 149: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 105, // 150: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 106, // 151: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 107, // 152: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 108, // 153: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 109, // 154: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 110, // 155: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 111, // 156: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 112, // 157: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 113, // 158: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 114, // 159: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 115, // 160: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 116, // 161: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 116, // 162: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 117, // 163: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 118, // 164: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 118, // 165: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 119, // 166: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 167: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 120, // 168: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 0, // 169: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 170: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 121, // 171: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 172: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 173: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 122, // 174: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 123, // 175: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 124, // 176: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 7, // 177: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 178: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 125, // 179: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 8, // 180: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 8, // 181: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 126, // 182: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 183: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 127, // 184: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 128, // 185: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 129, // 186: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 130, // 187: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 131, // 188: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 132, // 189: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 132, // 190: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 133, // 191: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 133, // 192: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 15, // 193: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 194: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 15, // 195: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 15, // 196: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 134, // 197: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 16, // 198: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 199: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 200: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 201: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 17, // 202: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 16, // 203: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 16, // 204: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 17, // 205: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 135, // 206: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 18, // 207: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 208: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 209: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 136, // 210: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 137, // 211: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 212: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 137, // 213: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 25, // 214: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 215: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 138, // 216: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 25, // 217: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 218: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 219: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 139, // 220: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 28, // 221: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 222: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 140, // 223: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 29, // 224: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 225: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 30, // 226: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 227: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 228: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 136, // 229: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 141, // 230: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 231: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 142, // 232: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 143, // 233: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 144, // 234: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 145, // 235: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 236: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 33, // 237: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 146, // 238: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 147, // 239: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 148, // 240: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 149, // 241: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler + 150, // 242: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 151, // 243: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 152, // 244: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 153, // 245: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 246: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 154, // 247: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 38, // 248: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 249: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 38, // 250: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 38, // 251: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 38, // 252: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 41, // 253: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 155, // 254: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 156, // 255: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 157, // 256: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 158, // 257: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 159, // 258: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 160, // 259: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 160, // 260: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 161, // 261: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 162, // 262: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 163, // 263: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 164, // 264: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 165, // 265: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 166, // 266: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 167, // 267: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 168, // 268: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 169, // 269: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 159, // 270: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 170, // 271: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 171, // 272: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 172, // 273: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 173, // 274: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 174, // 275: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 175, // 276: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 176, // 277: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 177, // 278: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 177, // 279: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 177, // 280: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 178, // 281: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 179, // 282: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 180, // 283: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 180, // 284: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 181, // 285: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 182, // 286: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 183, // 287: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 184, // 288: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 185, // 289: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 290: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 186, // 291: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 187, // 292: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 188, // 293: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 188, // 294: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 188, // 295: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 189, // 296: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 190, // 297: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 191, // 298: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 192, // 299: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 193, // 300: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 194, // 301: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 195, // 302: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 196, // 303: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 197, // 304: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 198, // 305: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 199, // 306: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 200, // 307: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 201, // 308: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 202, // 309: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 203, // 310: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 204, // 311: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 203, // 312: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 100, // 313: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 314: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 205, // 315: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 206, // 316: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 207, // 317: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 208, // 318: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 209, // 319: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 210, // 320: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 211, // 321: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 211, // 322: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 212, // 323: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 212, // 324: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 213, // 325: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 214, // 326: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 215, // 327: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 216, // 328: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 116, // 329: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 330: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 117, // 331: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 118, // 332: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 333: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 119, // 334: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 25, // 335: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 168, // [168:336] is the sub-list for method output_type + 0, // [0:168] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 2ef6bc2f8c..67baf58d6d 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -125,6 +125,7 @@ service SliverRPC { rpc MsfStage(clientpb.MsfStagerReq) returns (clientpb.MsfStager); rpc ShellcodeRDI(clientpb.ShellcodeRDIReq) returns (clientpb.ShellcodeRDI); rpc GetCompiler(commonpb.Empty) returns (clientpb.Compiler); + rpc GetMetasploitCompiler(commonpb.Empty) returns (clientpb.MetasploitCompiler); rpc ShellcodeEncoder(clientpb.ShellcodeEncodeReq) returns (clientpb.ShellcodeEncode); rpc ShellcodeEncoderMap(commonpb.Empty) diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 247e58c04e..875e4a7ac3 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -95,6 +95,7 @@ const ( SliverRPC_MsfStage_FullMethodName = "/rpcpb.SliverRPC/MsfStage" SliverRPC_ShellcodeRDI_FullMethodName = "/rpcpb.SliverRPC/ShellcodeRDI" SliverRPC_GetCompiler_FullMethodName = "/rpcpb.SliverRPC/GetCompiler" + SliverRPC_GetMetasploitCompiler_FullMethodName = "/rpcpb.SliverRPC/GetMetasploitCompiler" SliverRPC_ShellcodeEncoder_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoder" SliverRPC_ShellcodeEncoderMap_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoderMap" SliverRPC_TrafficEncoderMap_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderMap" @@ -284,6 +285,7 @@ type SliverRPCClient interface { MsfStage(ctx context.Context, in *clientpb.MsfStagerReq, opts ...grpc.CallOption) (*clientpb.MsfStager, error) ShellcodeRDI(ctx context.Context, in *clientpb.ShellcodeRDIReq, opts ...grpc.CallOption) (*clientpb.ShellcodeRDI, error) GetCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Compiler, error) + GetMetasploitCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.MetasploitCompiler, error) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) ShellcodeEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ShellcodeEncoderMap, error) TrafficEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.TrafficEncoderMap, error) @@ -1152,6 +1154,15 @@ func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, o return out, nil } +func (c *sliverRPCClient) GetMetasploitCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.MetasploitCompiler, error) { + out := new(clientpb.MetasploitCompiler) + err := c.cc.Invoke(ctx, SliverRPC_GetMetasploitCompiler_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) { out := new(clientpb.ShellcodeEncode) err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoder_FullMethodName, in, out, opts...) @@ -2158,6 +2169,7 @@ type SliverRPCServer interface { MsfStage(context.Context, *clientpb.MsfStagerReq) (*clientpb.MsfStager, error) ShellcodeRDI(context.Context, *clientpb.ShellcodeRDIReq) (*clientpb.ShellcodeRDI, error) GetCompiler(context.Context, *commonpb.Empty) (*clientpb.Compiler, error) + GetMetasploitCompiler(context.Context, *commonpb.Empty) (*clientpb.MetasploitCompiler, error) ShellcodeEncoder(context.Context, *clientpb.ShellcodeEncodeReq) (*clientpb.ShellcodeEncode, error) ShellcodeEncoderMap(context.Context, *commonpb.Empty) (*clientpb.ShellcodeEncoderMap, error) TrafficEncoderMap(context.Context, *commonpb.Empty) (*clientpb.TrafficEncoderMap, error) @@ -2489,6 +2501,9 @@ func (UnimplementedSliverRPCServer) ShellcodeRDI(context.Context, *clientpb.Shel func (UnimplementedSliverRPCServer) GetCompiler(context.Context, *commonpb.Empty) (*clientpb.Compiler, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCompiler not implemented") } +func (UnimplementedSliverRPCServer) GetMetasploitCompiler(context.Context, *commonpb.Empty) (*clientpb.MetasploitCompiler, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMetasploitCompiler not implemented") +} func (UnimplementedSliverRPCServer) ShellcodeEncoder(context.Context, *clientpb.ShellcodeEncodeReq) (*clientpb.ShellcodeEncode, error) { return nil, status.Errorf(codes.Unimplemented, "method ShellcodeEncoder not implemented") } @@ -4120,6 +4135,24 @@ func _SliverRPC_GetCompiler_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _SliverRPC_GetMetasploitCompiler_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(commonpb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetMetasploitCompiler(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetMetasploitCompiler_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetMetasploitCompiler(ctx, req.(*commonpb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_ShellcodeEncoder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(clientpb.ShellcodeEncodeReq) if err := dec(in); err != nil { @@ -6114,6 +6147,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetCompiler", Handler: _SliverRPC_GetCompiler_Handler, }, + { + MethodName: "GetMetasploitCompiler", + Handler: _SliverRPC_GetMetasploitCompiler_Handler, + }, { MethodName: "ShellcodeEncoder", Handler: _SliverRPC_ShellcodeEncoder_Handler, diff --git a/server/assets/assets.go b/server/assets/assets.go index 68880078b8..cd6a2e61a5 100644 --- a/server/assets/assets.go +++ b/server/assets/assets.go @@ -43,9 +43,7 @@ const ( envVarName = "SLIVER_ROOT_DIR" ) -var ( - setupLog = log.NamedLogger("assets", "setup") -) +var setupLog = log.NamedLogger("assets", "setup") // GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/ func GetRootAppDir() string { @@ -59,7 +57,7 @@ func GetRootAppDir() string { } if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { setupLog.Fatalf("Cannot write to sliver root dir %s", err) } @@ -71,7 +69,7 @@ func GetRootAppDir() string { func GetChunkDataDir() string { chunkDir := filepath.Join(GetRootAppDir(), "crack", "chunks") if _, err := os.Stat(chunkDir); os.IsNotExist(err) { - err = os.MkdirAll(chunkDir, 0700) + err = os.MkdirAll(chunkDir, 0o700) if err != nil { setupLog.Errorf("Failed to create chunk data directory: %s", err) return "" @@ -84,7 +82,7 @@ func GetChunkDataDir() string { func GetTrafficEncoderDir() string { trafficDir := filepath.Join(GetRootAppDir(), "traffic-encoders") if _, err := os.Stat(trafficDir); os.IsNotExist(err) { - os.MkdirAll(trafficDir, 0700) + os.MkdirAll(trafficDir, 0o700) } return trafficDir } diff --git a/server/command/assets/unpack.go b/server/command/assets/unpack.go index f3bbe77b54..6ba65744b9 100644 --- a/server/command/assets/unpack.go +++ b/server/command/assets/unpack.go @@ -22,6 +22,7 @@ import ( "fmt" "github.com/bishopfox/sliver/server/assets" + "github.com/bishopfox/sliver/server/msf" "github.com/spf13/cobra" ) @@ -44,6 +45,7 @@ func Commands() []*cobra.Command { } assets.Setup(force, true) + msf.CacheModules() }, } diff --git a/server/msf/msf.go b/server/msf/msf.go index 18252d7ddf..a6d6e8bd50 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -22,10 +22,15 @@ import ( "bytes" "fmt" "net/url" + "os" "os/exec" + "path/filepath" "strconv" "strings" + "sync" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/log" ) @@ -102,6 +107,8 @@ var ( } ) +var msfCache = sync.Map{} + // VenomConfig - type VenomConfig struct { Os string @@ -117,6 +124,65 @@ type VenomConfig struct { AdvOptions string } +// CacheModules parses the text output of some our relevant +// Metasploit generation helpers, to be used for completions. +func CacheModules() { + if _, err := exec.LookPath(venomBin); err != nil { + return + } + + msfLog.Infof("Caching msfvenom data (this may take a few seconds)") + + all := sync.WaitGroup{} + + targets := []string{"formats", "archs", "payloads", "encoders"} + + for i := range targets { + all.Add(1) + target := targets[i] + + go func() { + defer all.Done() + + result, err := venomCmd([]string{"--list", target}) + if err != nil { + msfLog.Error(err) + return + } + + fileName := filepath.Join(assets.GetRootAppDir(), "msf-"+target+".cache") + if err := os.WriteFile(fileName, result, 0o600); err != nil { + msfLog.Error(err) + } + }() + } + + all.Wait() + msfLog.Infof("Done caching msfvenom data") +} + +// GetMsfCache returns the cache of Metasploit modules and other info. +func GetMsfCache() *clientpb.MetasploitCompiler { + formats, ok := msfCache.Load("formats") + if !ok { + loadCache() + } + + formats, ok = msfCache.Load("formats") + archs, _ := msfCache.Load("archs") + payloads, _ := msfCache.Load("payloads") + encoders, _ := msfCache.Load("encoders") + + msf := &clientpb.MetasploitCompiler{ + Formats: formats.([]string), + Archs: archs.([]string), + Payloads: payloads.([]*clientpb.MetasploitModule), + Encoders: encoders.([]*clientpb.MetasploitModule), + } + + return msf +} + // Version - Return the version of MSFVenom func Version() (string, error) { stdout, err := consoleCmd([]string{"--version"}) @@ -259,3 +325,119 @@ func Arch(arch string) string { } return "x86" } + +func loadCache() { + msf := parseCache() + + if len(msf.Formats) == 0 { + return + } + + msfCache.Store("formats", msf.Formats) + msfCache.Store("archs", msf.Archs) + msfCache.Store("payloads", msf.Payloads) + msfCache.Store("encoders", msf.Encoders) +} + +// parseCache returns the MSFvenom information useful to Sliver. +func parseCache() *clientpb.MetasploitCompiler { + msf := &clientpb.MetasploitCompiler{} + + if _, err := exec.LookPath(venomBin); err != nil { + return msf + } + + ver, err := Version() + if err != nil { + return msf + } + + msf.Version = ver + + fileName := filepath.Join(assets.GetRootAppDir(), "msf-formats.cache") + if formats, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(formats), "----") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, fmt := range all { + msf.Formats = append(msf.Formats, strings.TrimSpace(fmt)) + } + } + + archsFile := filepath.Join(assets.GetRootAppDir(), "msf-archs.cache") + if archs, err := os.ReadFile(archsFile); err == nil { + raw := strings.Split(string(archs), "----") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, arch := range all { + msf.Archs = append(msf.Archs, strings.TrimSpace(arch)) + } + } + + payloadsFile := filepath.Join(assets.GetRootAppDir(), "msf-payloads.cache") + if payloads, err := os.ReadFile(payloadsFile); err == nil { + raw := strings.Split(string(payloads), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, info := range all { + payload := &clientpb.MetasploitModule{} + + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + payload.FullName = fullname + payload.Name = filepath.Base(fullname) + } + if len(items) > 1 { + payload.Description = strings.Join(items[1:], " ") + } + + msf.Payloads = append(msf.Payloads, payload) + } + } + + encodersFile := filepath.Join(assets.GetRootAppDir(), "msf-encoders.cache") + if encoders, err := os.ReadFile(encodersFile); err == nil { + raw := strings.Split(string(encoders), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, info := range all { + encoder := &clientpb.MetasploitModule{} + + // First split the name from everything else following. + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + if len(items) == 0 { + continue + } + + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + encoder.FullName = fullname + encoder.Name = filepath.Base(fullname) + } + + // Then try to find a level, and a description. + if len(items) > 1 { + encoder.Quality = strings.TrimSpace(items[1]) + encoder.Description = strings.Join(items[2:], " ") + } + + msf.Encoders = append(msf.Encoders, encoder) + } + } + + return msf +} + +func filterEmpty(list []string) []string { + var full []string + for _, item := range list { + trim := strings.TrimSpace(item) + if trim != "" { + full = append(full, trim) + } + } + + return full +} diff --git a/server/rpc/rpc-generate.go b/server/rpc/rpc-generate.go index 94e17faa53..ce8677423c 100644 --- a/server/rpc/rpc-generate.go +++ b/server/rpc/rpc-generate.go @@ -47,9 +47,7 @@ import ( "google.golang.org/protobuf/proto" ) -var ( - rcpGenLog = log.NamedLogger("rpc", "generate") -) +var rcpGenLog = log.NamedLogger("rpc", "generate") // Generate - Generate a new implant func (rpc *Server) Generate(ctx context.Context, req *clientpb.GenerateReq) (*clientpb.Generate, error) { @@ -111,7 +109,6 @@ func (rpc *Server) Generate(ctx context.Context, req *clientpb.GenerateReq) (*cl // Regenerate - Regenerate a previously generated implant func (rpc *Server) Regenerate(ctx context.Context, req *clientpb.RegenerateReq) (*clientpb.Generate, error) { - build, err := db.ImplantBuildByName(req.ImplantName) if err != nil { rpcLog.Errorf("Failed to find implant %s: %s", req.ImplantName, err) @@ -167,7 +164,6 @@ func (rpc *Server) Canaries(ctx context.Context, _ *commonpb.Empty) (*clientpb.C // GenerateUniqueIP - Wrapper around generate.GenerateUniqueIP func (rpc *Server) GenerateUniqueIP(ctx context.Context, _ *commonpb.Empty) (*clientpb.UniqueWGIP, error) { uniqueIP, err := generate.GenerateUniqueIP() - if err != nil { rpcLog.Infof("Failed to generate unique wg peer ip: %s\n", err) return nil, err @@ -430,7 +426,6 @@ func (rpc *Server) Builders(ctx context.Context, _ *commonpb.Empty) (*clientpb.B // BuilderTrigger - Trigger a builder event func (rpc *Server) BuilderTrigger(ctx context.Context, req *clientpb.Event) (*commonpb.Empty, error) { - switch req.EventType { // Only allow certain event types to be triggered diff --git a/server/rpc/rpc-msf.go b/server/rpc/rpc-msf.go index 368c726ab8..c86037f3a2 100644 --- a/server/rpc/rpc-msf.go +++ b/server/rpc/rpc-msf.go @@ -37,9 +37,7 @@ import ( "github.com/bishopfox/sliver/server/msf" ) -var ( - msfLog = log.NamedLogger("rpc", "msf") -) +var msfLog = log.NamedLogger("rpc", "msf") // Msf - Helper function to execute MSF payloads on the remote system func (rpc *Server) Msf(ctx context.Context, req *clientpb.MSFReq) (*sliverpb.Task, error) { @@ -207,6 +205,11 @@ func (rpc *Server) MsfStage(ctx context.Context, req *clientpb.MsfStagerReq) (*c return MSFStage, nil } +// GetMetasploitCompiler - Get information about any Metasploit installation server-side. +func (rpc *Server) GetMetasploitCompiler(ctx context.Context, _ *commonpb.Empty) (*clientpb.MetasploitCompiler, error) { + return msf.GetMsfCache(), nil +} + // Utility functions func generateCallbackURI() string { currentHTTPC2Config := configs.GetHTTPC2Config() From 41fbd483e591fed5efad4d343bbdbb1bda636de7 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 03:41:40 +0200 Subject: [PATCH 048/109] And deactivate it since we can't really choose payloads --- client/command/exec/commands.go | 4 +++- client/command/generate/commands.go | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index b1b4e88658..4807e57d59 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -196,7 +196,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { - (*comp)["payload"] = generate.MsfPayloadCompleter(con) (*comp)["encoder"] = generate.MsfEncoderCompleter(con) }) @@ -219,6 +218,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(msfInjectCmd, func(comp *carapace.ActionMap) { + (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + }) psExecCmd := &cobra.Command{ Use: consts.PsExecStr, diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 20ddba6eac..1a51db6330 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -69,9 +69,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - (*comp)["arch"] = MsfArchCompleter(con) + (*comp)["arch"] = carapace.ActionValues("amd64", "x86") (*comp)["format"] = MsfFormatCompleter(con) - (*comp)["payload"] = MsfPayloadCompleter(con) + (*comp)["protocol"] = carapace.ActionValues("http", "https", "tcp").Tag("msf stager protocols") }) generateCmd.AddCommand(generateStagerCmd) From a279ee1521d89ea4fc3467c7965a667fc9513411 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 04:02:45 +0200 Subject: [PATCH 049/109] Clean --- client/command/generate/commands.go | 5 +- client/command/sliver.go | 7 +- server/msf/msf.go | 138 ++++++++++++++++------------ 3 files changed, 82 insertions(+), 68 deletions(-) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 1a51db6330..7781df4f8b 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -68,8 +68,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") }) flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - (*comp)["arch"] = carapace.ActionValues("amd64", "x86") + (*comp)["save"] = carapace.ActionDirectories() + (*comp)["os"] = carapace.ActionValues("windows", "linux", "darwin").Tag("msf stager OS") + (*comp)["arch"] = carapace.ActionValues("amd64", "x86").Tag("msf stager archs") (*comp)["format"] = MsfFormatCompleter(con) (*comp)["protocol"] = carapace.ActionValues("http", "https", "tcp").Tag("msf stager protocols") }) diff --git a/client/command/sliver.go b/client/command/sliver.go index 4370ee3480..c9dc292d2f 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -74,13 +74,12 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Core ] bind(consts.SliverCoreHelpGroup, reconfig.Commands, - // sessions.Commands, sessions.SliverCommands, kill.Commands, - // use.Commands, tasks.Commands, pivots.Commands, history.Commands, + extensions.Commands, ) // [ Info ] @@ -131,9 +130,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { bind(consts.AliasHelpGroup) // [ Extensions ] - bind(consts.ExtensionHelpGroup, - extensions.Commands, - ) + bind(consts.ExtensionHelpGroup) // [ Post-command declaration setup ]---------------------------------------- diff --git a/server/msf/msf.go b/server/msf/msf.go index a6d6e8bd50..360ff99c01 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -38,6 +38,7 @@ const ( consoleBin = "msfconsole" venomBin = "msfvenom" sep = "/" + msfDir = "msf" ) var ( @@ -105,6 +106,13 @@ var ( "vbapplication": true, "vbscript": true, } + + msfModuleTypes = []string{ + "encoders", + "payloads", + "formats", + "archs", + } ) var msfCache = sync.Map{} @@ -135,11 +143,9 @@ func CacheModules() { all := sync.WaitGroup{} - targets := []string{"formats", "archs", "payloads", "encoders"} - - for i := range targets { + for i := range msfModuleTypes { all.Add(1) - target := targets[i] + target := msfModuleTypes[i] go func() { defer all.Done() @@ -150,7 +156,9 @@ func CacheModules() { return } - fileName := filepath.Join(assets.GetRootAppDir(), "msf-"+target+".cache") + msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) + + fileName := filepath.Join(msfDir, "msf-"+target+".cache") if err := os.WriteFile(fileName, result, 0o600); err != nil { msfLog.Error(err) } @@ -354,76 +362,84 @@ func parseCache() *clientpb.MetasploitCompiler { msf.Version = ver - fileName := filepath.Join(assets.GetRootAppDir(), "msf-formats.cache") - if formats, err := os.ReadFile(fileName); err == nil { - raw := strings.Split(string(formats), "----") - all := strings.Split(raw[len(raw)-1], "\n") - - for _, fmt := range all { - msf.Formats = append(msf.Formats, strings.TrimSpace(fmt)) - } - } - - archsFile := filepath.Join(assets.GetRootAppDir(), "msf-archs.cache") - if archs, err := os.ReadFile(archsFile); err == nil { - raw := strings.Split(string(archs), "----") - all := strings.Split(raw[len(raw)-1], "\n") + msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) - for _, arch := range all { - msf.Archs = append(msf.Archs, strings.TrimSpace(arch)) - } - } + for _, file := range msfModuleTypes { + fileName := filepath.Join(msfDir, fmt.Sprintf("msf-%s.cache", file)) - payloadsFile := filepath.Join(assets.GetRootAppDir(), "msf-payloads.cache") - if payloads, err := os.ReadFile(payloadsFile); err == nil { - raw := strings.Split(string(payloads), "-----------") - all := strings.Split(raw[len(raw)-1], "\n") + switch file { + case "formats": + if formats, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(formats), "----") + all := strings.Split(raw[len(raw)-1], "\n") - for _, info := range all { - payload := &clientpb.MetasploitModule{} + for _, fmt := range all { + msf.Formats = append(msf.Formats, strings.TrimSpace(fmt)) + } + } - items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + case "archs": + if archs, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(archs), "----") + all := strings.Split(raw[len(raw)-1], "\n") - if len(items) > 0 { - fullname := strings.TrimSpace(items[0]) - payload.FullName = fullname - payload.Name = filepath.Base(fullname) - } - if len(items) > 1 { - payload.Description = strings.Join(items[1:], " ") + for _, arch := range all { + msf.Archs = append(msf.Archs, strings.TrimSpace(arch)) + } } - msf.Payloads = append(msf.Payloads, payload) - } - } + case "payloads": + if payloads, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(payloads), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") - encodersFile := filepath.Join(assets.GetRootAppDir(), "msf-encoders.cache") - if encoders, err := os.ReadFile(encodersFile); err == nil { - raw := strings.Split(string(encoders), "-----------") - all := strings.Split(raw[len(raw)-1], "\n") + for _, info := range all { + payload := &clientpb.MetasploitModule{} - for _, info := range all { - encoder := &clientpb.MetasploitModule{} + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) - // First split the name from everything else following. - items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) - if len(items) == 0 { - continue - } + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + payload.FullName = fullname + payload.Name = filepath.Base(fullname) + } + if len(items) > 1 { + payload.Description = strings.Join(items[1:], " ") + } - if len(items) > 0 { - fullname := strings.TrimSpace(items[0]) - encoder.FullName = fullname - encoder.Name = filepath.Base(fullname) + msf.Payloads = append(msf.Payloads, payload) + } } - // Then try to find a level, and a description. - if len(items) > 1 { - encoder.Quality = strings.TrimSpace(items[1]) - encoder.Description = strings.Join(items[2:], " ") + case "encoders": + if encoders, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(encoders), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, info := range all { + encoder := &clientpb.MetasploitModule{} + + // First split the name from everything else following. + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + if len(items) == 0 { + continue + } + + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + encoder.FullName = fullname + encoder.Name = filepath.Base(fullname) + } + + // Then try to find a level, and a description. + if len(items) > 1 { + encoder.Quality = strings.TrimSpace(items[1]) + encoder.Description = strings.Join(items[2:], " ") + } + + msf.Encoders = append(msf.Encoders, encoder) + } } - - msf.Encoders = append(msf.Encoders, encoder) } } From c535491d3aabeaf2ea12ca687c7c630507a799e4 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 04:50:22 +0200 Subject: [PATCH 050/109] Use comp cache duraction groups --- client/command/completers/completers.go | 11 +++++++++++ client/command/generate/helpers.go | 16 ++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/client/command/completers/completers.go b/client/command/completers/completers.go index 762b14b62f..89cc9f8558 100644 --- a/client/command/completers/completers.go +++ b/client/command/completers/completers.go @@ -20,10 +20,21 @@ package completers import ( "net" + "time" "github.com/rsteube/carapace" ) +const ( + days = 24 * time.Hour + + CacheSessions = 1 * time.Minute // CacheSessions caches session/beacon IDs for a minute on-disk. + CacheEncodersInfo = 1 * time.Minute // CacheCompilerInfo caches encoders info for a minute on disk. + + CacheMsf = 7 * days // CacheMsf caches server Metasploit info for a week on disk + CacheCompilerInfo = 1 * time.Hour // CacheCompilerInfo caches server compiler info for an hour on disk. +) + // ClientInterfacesCompleter completes interface addresses on the client host. func ClientInterfacesCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 0104a33686..992bd5b051 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "strings" - "time" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -96,7 +96,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("architectures") - }) + }).Cache(completers.CacheCompilerInfo) } // FormatCompleter completes build operating systems. @@ -134,7 +134,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("operating systems") - }).Cache(10 * time.Second) + }).Cache(completers.CacheCompilerInfo) } // FormatCompleter completes build formats. @@ -172,7 +172,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("traffic encoders") - }) + }).Cache(completers.CacheCompilerInfo) } // MsfFormatCompleter completes MsfVenom stager formats. @@ -200,7 +200,7 @@ func MsfFormatCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("msfvenom formats") - }).Cache(1 * time.Minute) + }).Cache(completers.CacheMsf) } // MsfArchCompleter completes MsfVenom stager architectures. @@ -227,7 +227,7 @@ func MsfArchCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("msfvenom archs") - }).Cache(1 * time.Minute) + }).Cache(completers.CacheMsf) } // MsfFormatCompleter completes MsfVenom stager encoders. @@ -254,7 +254,7 @@ func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("msfvenom encoders") - }).Cache(1 * time.Minute) + }).Cache(completers.CacheMsf) } // MsfPayloadCompleter completes Metasploit payloads. @@ -281,5 +281,5 @@ func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...) - }).Cache(1*time.Minute, cache.String("payloads")).MultiParts("/").StyleF(style.ForPath) + }).Cache(completers.CacheMsf, cache.String("payloads")).MultiParts("/").StyleF(style.ForPath) } From 63a9edf04b95b7d645fbf193f4ce5d2752486234 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 05:10:34 +0200 Subject: [PATCH 051/109] Cleanup completion pre-run setup --- client/cli/cli.go | 17 ++++++++++++----- client/console/console.go | 14 +++++++------- client/console/log.go | 9 ++++++++- server/cli/cli.go | 17 ++++++++++++----- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index f2e109ccb5..dbebfdf141 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -117,11 +117,8 @@ func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) e return func(cmd *cobra.Command, _ []string) error { // Don't stream console asciicast/logs when using the completion subcommand. // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - con.IsCompleting = true - break - } + if compCommandCalled(cmd) { + con.CompleteDisableLog() } return con.Teamclient.Connect() @@ -134,3 +131,13 @@ func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) return con.Disconnect() } } + +func compCommandCalled(cmd *cobra.Command) bool { + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + return true + } + } + + return false +} diff --git a/client/console/console.go b/client/console/console.go index 96a527a523..d669e1892d 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -91,12 +91,12 @@ type ( type SliverClient struct { // Core client - Teamclient *client.Client - App *console.Console - Settings *assets.ClientSettings - IsServer bool - IsCLI bool - IsCompleting bool + Teamclient *client.Client + App *console.Console + Settings *assets.ClientSettings + IsServer bool + IsCLI bool + completing bool // Logging jsonHandler slog.Handler @@ -241,7 +241,7 @@ func (con *SliverClient) StartConsole() error { // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { - con.IsCompleting = true + con.completing = true err := con.Teamclient.Connect() if err != nil { diff --git a/client/console/log.go b/client/console/log.go index 5a459a16b2..a6fe68eb2a 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,6 +51,13 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } +// CompleteDisableLog forbids the server from streaming its asciicast +// and some logs output to the server, as asciicast and completions both +// tinker with very low-level IO and very often don't work nice together. +func (con *SliverClient) CompleteDisableLog() { + con.completing = true +} + // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { @@ -62,7 +69,7 @@ func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, err } func (con *SliverClient) startClientLog() error { - if con.IsCompleting { + if con.completing { return nil } diff --git a/server/cli/cli.go b/server/cli/cli.go index bea28110b7..4f5a378dfc 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -204,11 +204,8 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c // Don't stream console asciicast/logs when using the completion subcommand. // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - con.IsCompleting = true - break - } + if compCommandCalled(cmd) { + con.CompleteDisableLog() } // Let our in-memory teamclient be served. @@ -216,6 +213,16 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c } } +func compCommandCalled(cmd *cobra.Command) bool { + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + return true + } + } + + return false +} + // preRun := func(cmd *cobra.Command, _ []string) error { // // Ensure the server has what it needs // assets.Setup(false, true) From e795203ff99aa2a35b20fd1aceab5ce063ab2db7 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 20:53:37 +0200 Subject: [PATCH 052/109] Cleanup/rewrite comments for modified transport stack --- client/transport/client.go | 35 ++++++++++--------------- client/transport/middleware.go | 8 +++--- server/core/clients.go | 5 +++- server/transport/middleware.go | 16 ++++++------ server/transport/rpc.go | 9 +++---- server/transport/server.go | 47 +++++++++++++++++----------------- server/transport/tailscale.go | 27 +++++++++---------- 7 files changed, 71 insertions(+), 76 deletions(-) diff --git a/client/transport/client.go b/client/transport/client.go index 0440409d51..e12b9233f6 100644 --- a/client/transport/client.go +++ b/client/transport/client.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,27 +45,19 @@ const ( var ( // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client // connection is available. The error is raised when the handler hasn't connected. - ErrNoRPC = errors.New("no working grpc.Teamclient available") + ErrNoRPC = errors.New("no working core Teamclient available") // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try // connecting with, TLS credentials. If such an error is raised, make sure your team // client has correctly fetched -using client.Config()- a remote teamserver config. - ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") + ErrNoTLSCredentials = errors.New("the Teamclient has no TLS credentials to use") ) -// Teamclient is a simple example gRPC teamclient and dialer backend. -// It comes correctly configured with Mutual TLS authentication and -// RPC connection/registration/use when created with NewTeamClient(). +// Teamclient is a vanilla gRPC client set up and configured +// to interact with remotes/in-memory Sliver teamservers. // // This teamclient embeds a team/client.Client core driver and uses // it for fetching/setting up the transport credentials, dialers, etc... -// It also has a few internal types (clientConns, options) for working. -// -// Note that this teamclient is not able to be used as an in-memory dialer. -// See the counterpart `team/transports/grpc/server` package for creating one. -// Also note that this example transport has been made for a single use-case, -// and that your program might require more elaborated behavior. -// In this case, please use this simple code as a reference for what/not to do. type Teamclient struct { *client.Client conn *grpc.ClientConn @@ -89,16 +81,16 @@ func NewTeamClient(opts ...grpc.DialOption) *Teamclient { } // Init implements team/client.Dialer.Init(c). -// This implementation asks the teamclient core for its remote server -// configuration, and uses it to load a set of Mutual TLS dialing options. +// It uses teamclient core driver for a remote server configuration, +// and uses it to load a set of Mutual TLS dialing options. func (h *Teamclient) Init(cli *client.Client) error { h.Client = cli config := cli.Config() - options := LogMiddlewareOptions(cli) + options := logMiddlewareOptions(cli) - // If the configuration has no credentials, we are most probably - // an in-memory dialer, don't authenticate and encrypt the conn. + // If the configuration has no credentials, we are an + // in-memory dialer, don't authenticate/encrypt the conn. if config.PrivateKey != "" { tlsOpts, err := tlsAuthMiddleware(cli) if err != nil { @@ -133,7 +125,8 @@ func (h *Teamclient) Dial() (rpcClient any, err error) { return h.conn, nil } -// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. +// Close implements team/client.Dialer.Close(). +// It closes the gRPC client connection if any. func (h *Teamclient) Close() error { if h.conn == nil { return nil @@ -168,8 +161,6 @@ func (h *Teamclient) Users() (users []team.User, err error) { // ServerVersion returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. func (h *Teamclient) Version() (version team.Version, err error) { if h.rpc == nil { return version, ErrNoRPC diff --git a/client/transport/middleware.go b/client/transport/middleware.go index 3cfbcc9883..480fe71150 100644 --- a/client/transport/middleware.go +++ b/client/transport/middleware.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,10 +33,10 @@ import ( // specifically the "Authorization": "Bearer" key:value pair. type TokenAuth string -// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// logMiddlewareOptions is an example list of gRPC options with logging middleware set up. // This function uses the core teamclient loggers to log the gRPC stack/requests events. // The Teamclient of this package uses them by default. -func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { +func logMiddlewareOptions(cli *client.Client) []grpc.DialOption { logrusEntry := cli.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ grpc_logrus.WithLevels(common.CodeToLevel), diff --git a/server/core/clients.go b/server/core/clients.go index aa2d49d091..96c90755e8 100644 --- a/server/core/clients.go +++ b/server/core/clients.go @@ -23,6 +23,7 @@ import ( consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" + "golang.org/x/exp/slices" ) var ( @@ -72,7 +73,9 @@ func (cc *clients) ActiveOperators() []string { defer cc.mutex.Unlock() operators := []string{} for _, client := range cc.active { - operators = append(operators, client.Operator.Name) + if !slices.Contains(operators, client.Operator.Name) { + operators = append(operators, client.Operator.Name) + } } return operators } diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 97035684c2..6a2d106d84 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,9 +35,9 @@ import ( "github.com/reeflective/team/transports/grpc/common" ) -// BufferingOptions returns a list of server options with max send/receive +// bufferingOptions returns a list of server options with max send/receive // message size, which value is that of the ServerMaxMessageSize variable (2GB). -func BufferingOptions() (options []grpc.ServerOption) { +func bufferingOptions() (options []grpc.ServerOption) { options = append(options, grpc.MaxRecvMsgSize(ServerMaxMessageSize), grpc.MaxSendMsgSize(ServerMaxMessageSize), @@ -46,11 +46,11 @@ func BufferingOptions() (options []grpc.ServerOption) { return } -// LogMiddlewareOptions is a set of logging middleware options +// logMiddlewareOptions is a set of logging middleware options // preconfigured to perform the following tasks: // - Log all connections/disconnections to/from the teamserver listener. // - Log all raw client requests into a teamserver audit file (see server.AuditLog()). -func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { +func logMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { var requestOpts []grpc.UnaryServerInterceptor var streamOpts []grpc.StreamServerInterceptor @@ -101,11 +101,11 @@ func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { }, nil } -// TLSAuthMiddlewareOptions is a set of transport security options which will use +// tlsAuthMiddlewareOptions is a set of transport security options which will use // the preconfigured teamserver TLS (credentials) configuration to authenticate // incoming client connections. The authentication is Mutual TLS, used because // all teamclients will connect with a known TLS credentials set. -func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { +func tlsAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { var options []grpc.ServerOption tlsConfig, err := s.UsersTLSConfig() diff --git a/server/transport/rpc.go b/server/transport/rpc.go index c04fe457fd..1178595aef 100644 --- a/server/transport/rpc.go +++ b/server/transport/rpc.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -63,9 +63,8 @@ func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, erro userspb := make([]*proto.User, len(users)) for i, user := range users { userspb[i] = &proto.User{ - Name: user.Name, - Online: isOperatorOnline(user.Name), - // Online: user.Online, + Name: user.Name, + Online: isOperatorOnline(user.Name), LastSeen: user.LastSeen.Unix(), Clients: int32(user.Clients), } diff --git a/server/transport/server.go b/server/transport/server.go index fed5174b63..0622515b51 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -45,11 +45,8 @@ const ( ServerMaxMessageSize = 2*gb - 1 ) -// Teamserver is a simple example gRPC teamserver listener and server backend. -// This server can handle both remote and local (in-memory) connections, provided -// that it is being created with the correct grpc.Server options. -// -// This teamserver embeds a team/server.Server core driver and uses it for fetching +// Teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. +// This listener backend embeds a team/server.Server core driver and uses it for fetching // server-side TLS configurations, use its loggers and access its database/users/list. type Teamserver struct { *teamserver.Server @@ -59,11 +56,13 @@ type Teamserver struct { mutex *sync.RWMutex } -// NewListener is a simple constructor returning a teamserver loaded with the -// provided list of server options. By default the server does not come with any. +// NewListener returns a vanilla tcp+mtls gRPC teamserver listener backend. +// Developers: note that the teamserver type is already set with logging/ +// auth/middleware/buffering gRPC options. You can still override them. func NewListener(opts ...grpc.ServerOption) *Teamserver { listener := &Teamserver{ - mutex: &sync.RWMutex{}, + mutex: &sync.RWMutex{}, + options: bufferingOptions(), } listener.options = append(listener.options, opts...) @@ -94,7 +93,7 @@ func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport } // Name immplements team/server.Handler.Name(). -// It indicates the transport/rpc stack, in this case "gRPC". +// It indicates the transport/rpc stack. func (h *Teamserver) Name() string { return "gRPC/mTLS" } @@ -105,26 +104,27 @@ func (h *Teamserver) Name() string { func (h *Teamserver) Init(serv *teamserver.Server) (err error) { h.Server = serv - h.options, err = LogMiddlewareOptions(h.Server) + // Logging + logOptions, err := logMiddlewareOptions(h.Server) if err != nil { return err } - // Logging/authentication/audit - serverOptions, err := h.initAuthMiddleware() + h.options = append(h.options, logOptions...) + + // Authentication/audit + authOptions, err := h.initAuthMiddleware() if err != nil { return err } - h.options = append(h.options, serverOptions...) + h.options = append(h.options, authOptions...) return nil } // Listen implements team/server.Handler.Listen(). -// It starts listening on a network address for incoming gRPC clients. -// If the teamserver has previously been given an in-memory connection, -// it returns it as the listener without errors. +// this teamserver uses a tcp+TLS (mutual) listener to serve remote clients. func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { // In-memory connection are not authenticated. if h.conn == nil { @@ -134,7 +134,7 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { } // Encryption. - tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) + tlsOptions, err := tlsAuthMiddlewareOptions(h.Server) if err != nil { return nil, err } @@ -153,16 +153,17 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { } // Close implements team/server.Handler.Close(). -// In this implementation, the function does nothing. Thus the underlying -// *grpc.Server.Shutdown() method is not called, and only the listener -// will be closed by the server automatically when using CloseListener(). -// -// This is probably not optimal from a resource usage standpoint, but currently it -// fits most use cases. Feel free to reimplement or propose changes to this lib. +// Original sliver never closes the gRPC HTTP server itself +// with server.Shutdown(), so here we don't close anything. +// Note that the listener itself is controled/closed by +// our core teamserver driver. func (h *Teamserver) Close() error { return nil } +// serve is the transport-agnostic routine to serve the gRPC server +// (and its implemented Sliver services) onto a generic listener. +// Both mTLS and Tailscale teamserver backends use this. func (h *Teamserver) serve(ln net.Listener) { grpcServer := grpc.NewServer(h.options...) diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 6b86c6902d..78dd991d8c 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -24,7 +24,6 @@ import ( "net/url" "os" "path/filepath" - "sync" "github.com/reeflective/team/server" "google.golang.org/grpc" @@ -33,21 +32,28 @@ import ( "github.com/bishopfox/sliver/server/assets" ) -type TailScaleTeamserver struct { +// tailscaleTeamserver is unexported since we only need it as +// a reeflective/team/server.Listener interface implementation. +type tailscaleTeamserver struct { *Teamserver } +// NewTailScaleListener returns a Sliver teamserver backend using Tailscale. func NewTailScaleListener(opts ...grpc.ServerOption) server.Listener { - core := &Teamserver{ - mutex: &sync.RWMutex{}, - } + core := NewListener(opts...) - core.options = append(core.options, opts...) + return &tailscaleTeamserver{core} +} - return &TailScaleTeamserver{core} +// Name indicates the transport/rpc stack. +func (ts *tailscaleTeamserver) Name() string { + return "gRPC/TSNet" } -func (ts *TailScaleTeamserver) Listen(addr string) (ln net.Listener, err error) { +// Close implements team/server.Handler.Close(). +// Instead of serving a classic TCP+TLS listener, +// we start a tailscale stack and create the listener out of it. +func (ts *tailscaleTeamserver) Listen(addr string) (ln net.Listener, err error) { tsNetLog := ts.NamedLogger("transport", "tailscale") url, err := url.Parse(fmt.Sprintf("ts://%s", addr)) @@ -95,8 +101,3 @@ func (ts *TailScaleTeamserver) Listen(addr string) (ln net.Listener, err error) return ln, nil } - -// It indicates the transport/rpc stack, in this case "gRPC". -func (ts *TailScaleTeamserver) Name() string { - return "gRPC/TSNet" -} From ecdbf6e5dd6b37a87735ce11a1182b377ca18ca2 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 21:08:15 +0200 Subject: [PATCH 053/109] Further cleanup in teamserver transport --- server/transport/middleware-old.go.old | 292 ------------------------- server/transport/middleware.go | 138 +++++++++++- server/transport/rpc.go | 1 + 3 files changed, 130 insertions(+), 301 deletions(-) delete mode 100644 server/transport/middleware-old.go.old diff --git a/server/transport/middleware-old.go.old b/server/transport/middleware-old.go.old deleted file mode 100644 index 32aea05a18..0000000000 --- a/server/transport/middleware-old.go.old +++ /dev/null @@ -1,292 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "sync" - - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/log" - grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/status" -) - -var ( - serverConfig = configs.GetServerConfig() - middlewareLog = log.NamedLogger("transport", "middleware") -) - -type contextKey int - -const ( - Transport contextKey = iota - Operator -) - -// initMiddleware - Initialize middleware logger -func initMiddleware(remoteAuth bool) []grpc.ServerOption { - logrusEntry := log.NamedLogger("transport", "grpc") - logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(codeToLevel), - } - grpc_logrus.ReplaceGrpcLogger(logrusEntry) - if remoteAuth { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(tokenAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(tokenAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } - } else { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(serverAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(serverAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } - } -} - -var tokenCache = sync.Map{} - -// ClearTokenCache - Clear the auth token cache -func ClearTokenCache() { - tokenCache = sync.Map{} -} - -func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, Transport, "local") - newCtx = context.WithValue(newCtx, Operator, "server") - return newCtx, nil -} - -func tokenAuthFunc(ctx context.Context) (context.Context, error) { - mtlsLog.Debugf("Auth interceptor checking operator token ...") - rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") - if err != nil { - mtlsLog.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - - // Check auth cache - digest := sha256.Sum256([]byte(rawToken)) - token := hex.EncodeToString(digest[:]) - newCtx := context.WithValue(ctx, Transport, "mtls") - if name, ok := tokenCache.Load(token); ok { - mtlsLog.Debugf("Token in cache!") - newCtx = context.WithValue(newCtx, Operator, name.(string)) - return newCtx, nil - } - operator, err := db.OperatorByToken(token) - if err != nil || operator == nil { - mtlsLog.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - mtlsLog.Debugf("Valid user token for %s", operator.Name) - tokenCache.Store(token, operator.Name) - - newCtx = context.WithValue(newCtx, Operator, operator.Name) - return newCtx, nil -} - -func deciderUnary(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCUnaryPayloads -} - -func deciderStream(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCStreamPayloads -} - -// Maps a grpc response code to a logging level -func codeToLevel(code codes.Code) logrus.Level { - switch code { - case codes.OK: - return logrus.InfoLevel - case codes.Canceled: - return logrus.InfoLevel - case codes.Unknown: - return logrus.ErrorLevel - case codes.InvalidArgument: - return logrus.InfoLevel - case codes.DeadlineExceeded: - return logrus.WarnLevel - case codes.NotFound: - return logrus.InfoLevel - case codes.AlreadyExists: - return logrus.InfoLevel - case codes.PermissionDenied: - return logrus.WarnLevel - case codes.Unauthenticated: - return logrus.InfoLevel - case codes.ResourceExhausted: - return logrus.WarnLevel - case codes.FailedPrecondition: - return logrus.WarnLevel - case codes.Aborted: - return logrus.WarnLevel - case codes.OutOfRange: - return logrus.WarnLevel - case codes.Unimplemented: - return logrus.ErrorLevel - case codes.Internal: - return logrus.ErrorLevel - case codes.Unavailable: - return logrus.WarnLevel - case codes.DataLoss: - return logrus.ErrorLevel - default: - return logrus.ErrorLevel - } -} - -type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` - Session string `json:"session,omitempty"` - Beacon string `json:"beacon,omitempty"` - RemoteIP string `json:"remote_ip"` - User string `json:"user"` -} - -func auditLogUnaryServerInterceptor() grpc.UnaryServerInterceptor { - return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { - rawRequest, err := json.Marshal(req) - if err != nil { - middlewareLog.Errorf("Failed to serialize %s", err) - return - } - middlewareLog.Debugf("Raw request: %s", string(rawRequest)) - session, beacon, err := getActiveTarget(rawRequest) - if err != nil { - middlewareLog.Errorf("Middleware failed to insert details: %s", err) - } - - p, _ := peer.FromContext(ctx) - - // Construct Log Message - msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, - User: getUser(p), - RemoteIP: p.Addr.String(), - } - if session != nil { - sessionJSON, _ := json.Marshal(session) - msg.Session = string(sessionJSON) - } - if beacon != nil { - beaconJSON, _ := json.Marshal(beacon) - msg.Beacon = string(beaconJSON) - } - - msgData, _ := json.Marshal(msg) - log.AuditLogger.Info(string(msgData)) - - resp, err := handler(ctx, req) - return resp, err - } -} - -func getUser(client *peer.Peer) string { - tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) - if !ok { - return "" - } - if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { - return "" - } - if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { - return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName - } - return "" -} - -func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { - var activeBeacon *clientpb.Beacon - var activeSession *clientpb.Session - - var request map[string]interface{} - err := json.Unmarshal(rawRequest, &request) - if err != nil { - return nil, nil, err - } - - // RPC is not a session/beacon request - if _, ok := request["Request"]; !ok { - return nil, nil, nil - } - - rpcRequest := request["Request"].(map[string]interface{}) - - middlewareLog.Debugf("RPC Request: %v", rpcRequest) - - if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { - beaconID := rawBeaconID.(string) - middlewareLog.Debugf("Found Beacon ID: %s", beaconID) - beacon, err := db.BeaconByID(beaconID) - if err != nil { - middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) - } else if beacon != nil { - activeBeacon = beacon.ToProtobuf() - } - } - - if rawSessionID, ok := rpcRequest["SessionID"]; ok { - sessionID := rawSessionID.(string) - middlewareLog.Debugf("Found Session ID: %s", sessionID) - session := core.Sessions.Get(sessionID) - if session != nil { - activeSession = session.ToProtobuf() - } - } - - return activeSession, activeBeacon, nil -} diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 6a2d106d84..abc243192e 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -22,6 +22,11 @@ import ( "context" "encoding/json" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/core" + "github.com/bishopfox/sliver/server/db" + "github.com/reeflective/team/server" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" @@ -29,10 +34,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" "google.golang.org/grpc/status" - - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/common" ) // bufferingOptions returns a list of server options with max send/receive @@ -76,7 +79,7 @@ func logMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { // Logging interceptors logrusEntry := s.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), + grpc_logrus.WithLevels(codeToLevel), } grpc_logrus.ReplaceGrpcLogger(logrusEntry) @@ -165,6 +168,7 @@ func serverAuthFunc(ctx context.Context) (context.Context, error) { return newCtx, nil } +// tokenAuthFunc uses the core reeflective/team/server to authenticate user requests. func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { log := ts.NamedLogger("transport", "grpc") log.Debugf("Auth interceptor checking user token ...") @@ -175,6 +179,8 @@ func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error return nil, status.Error(codes.Unauthenticated, "Authentication failure") } + // Let our core teamserver driver authenticate the user. + // The teamserver has its credentials, tokens and everything in database. user, authorized, err := ts.UserAuthenticate(rawToken) if err != nil || !authorized || user == "" { log.Errorf("Authentication failure: %s", err) @@ -188,8 +194,12 @@ func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error } type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` + Request string `json:"request"` + Method string `json:"method"` + Session string `json:"session,omitempty"` + Beacon string `json:"beacon,omitempty"` + RemoteIP string `json:"remote_ip"` + User string `json:"user"` } func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { @@ -203,15 +213,27 @@ func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) } log.Debugf("Raw request: %s", string(rawRequest)) - + session, beacon, err := getActiveTarget(log, rawRequest) if err != nil { log.Errorf("Middleware failed to insert details: %s", err) } + p, _ := peer.FromContext(ctx) + // Construct Log Message msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, + Request: string(rawRequest), + Method: info.FullMethod, + User: getUser(p), + RemoteIP: p.Addr.String(), + } + if session != nil { + sessionJSON, _ := json.Marshal(session) + msg.Session = string(sessionJSON) + } + if beacon != nil { + beaconJSON, _ := json.Marshal(beacon) + msg.Beacon = string(beaconJSON) } msgData, _ := json.Marshal(msg) @@ -222,3 +244,101 @@ func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) return resp, err } } + +func getUser(client *peer.Peer) string { + tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) + if !ok { + return "" + } + if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { + return "" + } + if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { + return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName + } + return "" +} + +func getActiveTarget(middlewareLog *logrus.Entry, rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { + var activeBeacon *clientpb.Beacon + var activeSession *clientpb.Session + + var request map[string]interface{} + err := json.Unmarshal(rawRequest, &request) + if err != nil { + return nil, nil, err + } + + // RPC is not a session/beacon request + if _, ok := request["Request"]; !ok { + return nil, nil, nil + } + + rpcRequest := request["Request"].(map[string]interface{}) + + middlewareLog.Debugf("RPC Request: %v", rpcRequest) + + if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { + beaconID := rawBeaconID.(string) + middlewareLog.Debugf("Found Beacon ID: %s", beaconID) + beacon, err := db.BeaconByID(beaconID) + if err != nil { + middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) + } else if beacon != nil { + activeBeacon = beacon.ToProtobuf() + } + } + + if rawSessionID, ok := rpcRequest["SessionID"]; ok { + sessionID := rawSessionID.(string) + middlewareLog.Debugf("Found Session ID: %s", sessionID) + session := core.Sessions.Get(sessionID) + if session != nil { + activeSession = session.ToProtobuf() + } + } + + return activeSession, activeBeacon, nil +} + +// Maps a grpc response code to a logging level +func codeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.InfoLevel + case codes.Canceled: + return logrus.InfoLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.InfoLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.InfoLevel + case codes.AlreadyExists: + return logrus.InfoLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.InfoLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} diff --git a/server/transport/rpc.go b/server/transport/rpc.go index 1178595aef..e3a7ce3aef 100644 --- a/server/transport/rpc.go +++ b/server/transport/rpc.go @@ -58,6 +58,7 @@ func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, // GetUsers returns the list of teamserver users and their status. func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { + // Fetch users from the teamserver user database. users, err := ts.server.Users() userspb := make([]*proto.User, len(users)) From 1686af1c01e7d0389994ce0041996e25e3e7c6c6 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 02:07:37 +0200 Subject: [PATCH 054/109] Fix some log errors --- server/log/audit.go | 8 +++---- server/log/log.go | 45 +++++++++++++++++------------------ server/rpc/rpc-client-logs.go | 9 ++++++- server/rpc/rpc-history.go | 9 ++++++- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/server/log/audit.go b/server/log/audit.go index ac45ceded0..16e7969816 100644 --- a/server/log/audit.go +++ b/server/log/audit.go @@ -26,16 +26,14 @@ import ( "github.com/sirupsen/logrus" ) -var ( - // AuditLogger - Single audit log - AuditLogger = newAuditLogger() -) +// AuditLogger - Single audit log. +var AuditLogger = newAuditLogger() func newAuditLogger() *logrus.Logger { auditLogger := logrus.New() auditLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := filepath.Join(GetLogDir(), "audit.json") - jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) + jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600) if err != nil { panic(fmt.Sprintf("Failed to open log file %v", err)) } diff --git a/server/log/log.go b/server/log/log.go index 417627b85f..4a322403f0 100644 --- a/server/log/log.go +++ b/server/log/log.go @@ -35,13 +35,13 @@ const ( ) var ( - // RootLoggerName - Root logger name, contains all log data + // RootLoggerName - Root logger name, contains all log data. RootLoggerName = "root" - // RootLogger - Root Logger + // RootLogger - Root Logger. RootLogger = rootLogger() ) -// NamedLogger - Returns a logger wrapped with pkg/stream fields +// NamedLogger - Returns a logger wrapped with pkg/stream fields. func NamedLogger(pkg, stream string) *logrus.Entry { return RootLogger.WithFields(logrus.Fields{ "pkg": pkg, @@ -49,9 +49,8 @@ func NamedLogger(pkg, stream string) *logrus.Entry { }) } -// GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/ +// GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/. func GetRootAppDir() string { - value := os.Getenv(envVarName) var dir string @@ -63,7 +62,7 @@ func GetRootAppDir() string { } if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { panic("Cannot write to sliver root dir") } @@ -71,18 +70,18 @@ func GetRootAppDir() string { return dir } -// GetLogDir - Return the log dir +// GetLogDir - Return the log dir. func GetLogDir() string { rootDir := GetRootAppDir() if _, err := os.Stat(rootDir); os.IsNotExist(err) { - err = os.MkdirAll(rootDir, 0700) + err = os.MkdirAll(rootDir, 0o700) if err != nil { panic(err) } } logDir := path.Join(rootDir, "logs") if _, err := os.Stat(logDir); os.IsNotExist(err) { - err = os.MkdirAll(logDir, 0700) + err = os.MkdirAll(logDir, 0o700) if err != nil { panic(err) } @@ -90,12 +89,12 @@ func GetLogDir() string { return logDir } -// RootLogger - Returns the root logger +// RootLogger - Returns the root logger. func rootLogger() *logrus.Logger { rootLogger := logrus.New() rootLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := filepath.Join(GetLogDir(), "sliver.json") - jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { panic(fmt.Sprintf("Failed to open log file %v", err)) } @@ -106,7 +105,7 @@ func rootLogger() *logrus.Logger { return rootLogger } -// RootLogger - Returns the root logger +// RootLogger - Returns the root logger. func txtLogger() *logrus.Logger { txtLogger := logrus.New() txtLogger.Formatter = &logrus.TextFormatter{ @@ -114,7 +113,7 @@ func txtLogger() *logrus.Logger { FullTimestamp: true, } txtFilePath := filepath.Join(GetLogDir(), "sliver.log") - txtFile, err := os.OpenFile(txtFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + txtFile, err := os.OpenFile(txtFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { panic(fmt.Sprintf("Failed to open log file %v", err)) } @@ -123,13 +122,13 @@ func txtLogger() *logrus.Logger { return txtLogger } -// TxtHook - Hook in a textual version of the logs +// TxtHook - Hook in a textual version of the logs. type TxtHook struct { Name string logger *logrus.Logger } -// NewTxtHook - returns a new txt hook +// NewTxtHook - returns a new txt hook. func NewTxtHook(name string) *TxtHook { hook := &TxtHook{ Name: name, @@ -138,7 +137,7 @@ func NewTxtHook(name string) *TxtHook { return hook } -// Fire - Implements the fire method of the Logrus hook +// Fire - Implements the fire method of the Logrus hook. func (hook *TxtHook) Fire(entry *logrus.Entry) error { if hook.logger == nil { return errors.New("no txt logger") @@ -172,12 +171,12 @@ func (hook *TxtHook) Fire(entry *logrus.Entry) error { return nil } -// Levels - Hook all levels +// Levels - Hook all levels. func (hook *TxtHook) Levels() []logrus.Level { return logrus.AllLevels } -// RootLogger - Returns the root logger +// RootLogger - Returns the root logger. func stdoutLogger() *logrus.Logger { txtLogger := logrus.New() txtLogger.Formatter = &logrus.TextFormatter{ @@ -189,13 +188,13 @@ func stdoutLogger() *logrus.Logger { return txtLogger } -// TxtHook - Hook in a textual version of the logs +// TxtHook - Hook in a textual version of the logs. type StdoutHook struct { Name string logger *logrus.Logger } -// NewTxtHook - returns a new txt hook +// NewTxtHook - returns a new txt hook. func NewStdoutHook(name string) *StdoutHook { hook := &StdoutHook{ Name: name, @@ -204,7 +203,7 @@ func NewStdoutHook(name string) *StdoutHook { return hook } -// Fire - Implements the fire method of the Logrus hook +// Fire - Implements the fire method of the Logrus hook. func (hook *StdoutHook) Fire(entry *logrus.Entry) error { if hook.logger == nil { return errors.New("no txt logger") @@ -238,12 +237,12 @@ func (hook *StdoutHook) Fire(entry *logrus.Entry) error { return nil } -// Levels - Hook all levels +// Levels - Hook all levels. func (hook *StdoutHook) Levels() []logrus.Level { return logrus.AllLevels } -// LevelFrom - returns level from int +// LevelFrom - returns level from int. func LevelFrom(level int) logrus.Level { switch level { case 0: diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index e99a2a09c3..c5117358cd 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -20,6 +20,8 @@ package rpc import ( "compress/gzip" + "context" + "errors" "fmt" "io" insecureRand "math/rand" @@ -102,10 +104,15 @@ func (rpc *Server) ClientLog(stream rpcpb.SliverRPC_ClientLogServer) error { if err == io.EOF { break } + if err != nil { - rpcClientLogs.Errorf("Failed to receive client console log data: %s", err) + err = errors.New(status.Convert(err).Message()) // Unwrap the gRPC error + if !errors.Is(err, context.Canceled) { + rpcClientLogs.Errorf("Failed to receive client console log data: %s", err) + } return err } + streamName := fromClient.GetStream() if _, ok := streams[streamName]; !ok { streams[streamName], err = openNewLogStream(logsDir, streamName) diff --git a/server/rpc/rpc-history.go b/server/rpc/rpc-history.go index 7c72e9b986..aba3aea1b5 100644 --- a/server/rpc/rpc-history.go +++ b/server/rpc/rpc-history.go @@ -3,6 +3,7 @@ package rpc import ( "context" "encoding/json" + "errors" "fmt" "io" "os" @@ -13,6 +14,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/log" + "google.golang.org/grpc/status" ) /* @@ -117,7 +119,12 @@ func (rpc *Server) ImplantHistory(stream rpcpb.SliverRPC_ImplantHistoryServer) e break } if err != nil { - rpcClientLogs.Errorf("Failed to receive implant history data: %s", err) + // gRPC errors are a pain to work with... + canceled := errors.New(context.Canceled.Error()) + + if !errors.As(errors.New(status.Convert(err).Message()), &canceled) { + rpcClientLogs.Errorf("Failed to receive implant history data: %s", err) + } return err } From 9565314b0eae21ff8e5d772360cb535ee3eeee06 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:31:24 +0200 Subject: [PATCH 055/109] Cleanup and tidy server transport package. --- server/transport/middleware.go | 4 +- server/transport/mtls.go | 122 +++++++++++++++++++++++++++++ server/transport/rpc.go | 84 -------------------- server/transport/server.go | 136 +++++++++------------------------ server/transport/tailscale.go | 8 +- 5 files changed, 163 insertions(+), 191 deletions(-) create mode 100644 server/transport/mtls.go delete mode 100644 server/transport/rpc.go diff --git a/server/transport/middleware.go b/server/transport/middleware.go index abc243192e..0ead39c38b 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -123,7 +123,7 @@ func tlsAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { } // initAuthMiddleware - Initialize middleware logger. -func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { +func (ts *teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { var requestOpts []grpc.UnaryServerInterceptor var streamOpts []grpc.StreamServerInterceptor @@ -169,7 +169,7 @@ func serverAuthFunc(ctx context.Context) (context.Context, error) { } // tokenAuthFunc uses the core reeflective/team/server to authenticate user requests. -func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { +func (ts *teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { log := ts.NamedLogger("transport", "grpc") log.Debugf("Auth interceptor checking user token ...") diff --git a/server/transport/mtls.go b/server/transport/mtls.go new file mode 100644 index 0000000000..b74ee97c03 --- /dev/null +++ b/server/transport/mtls.go @@ -0,0 +1,122 @@ +package transport + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "net" + "sync" + + "github.com/reeflective/team/server" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" +) + +// teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. +// This listener backend embeds a team/server.Server core driver and uses it for fetching +// server-side TLS configurations, use its loggers and access its database/users/list. +type teamserver struct { + *server.Server + + options []grpc.ServerOption + conn *bufconn.Listener + mutex *sync.RWMutex +} + +// newTeamserverTLS returns a vanilla tcp+mtls gRPC teamserver listener backend. +// Developers: note that the teamserver type is already set with logging/ +// auth/middleware/buffering gRPC options. You can still override them. +func newTeamserverTLS(opts ...grpc.ServerOption) *teamserver { + listener := &teamserver{ + mutex: &sync.RWMutex{}, + options: bufferingOptions(), + } + + listener.options = append(listener.options, opts...) + + return listener +} + +// Name immplements team/server.Handler.Name(). +// It indicates the transport/rpc stack. +func (h *teamserver) Name() string { + return "gRPC/mTLS" +} + +// Init implements team/server.Handler.Init(). +// It is used to initialize the listener with the correct TLS credentials +// middleware (or absence of if about to serve an in-memory connection). +func (h *teamserver) Init(team *server.Server) (err error) { + h.Server = team + + // Logging + logOptions, err := logMiddlewareOptions(h.Server) + if err != nil { + return err + } + + h.options = append(h.options, logOptions...) + + // Authentication/audit + authOptions, err := h.initAuthMiddleware() + if err != nil { + return err + } + + h.options = append(h.options, authOptions...) + + return nil +} + +// Listen implements team/server.Handler.Listen(). +// this teamserver uses a tcp+TLS (mutual) listener to serve remote clients. +func (h *teamserver) Listen(addr string) (ln net.Listener, err error) { + // In-memory connection are not authenticated. + if h.conn == nil { + ln, err = net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + // Encryption. + tlsOptions, err := tlsAuthMiddlewareOptions(h.Server) + if err != nil { + return nil, err + } + + h.options = append(h.options, tlsOptions...) + } else { + h.mutex.Lock() + ln = h.conn + h.conn = nil + h.mutex.Unlock() + } + + h.serve(ln) + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// Original sliver never closes the gRPC HTTP server itself +// with server.Shutdown(), so here we don't close anything. +// Note that the listener itself is controled/closed by +// our core teamserver driver. +func (h *teamserver) Close() error { + return nil +} diff --git a/server/transport/rpc.go b/server/transport/rpc.go deleted file mode 100644 index e3a7ce3aef..0000000000 --- a/server/transport/rpc.go +++ /dev/null @@ -1,84 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/bishopfox/sliver/server/core" - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/proto" -) - -// rpcServer is the gRPC server implementation. -// It makes uses of the teamserver core to query users and version information. -type rpcServer struct { - server *server.Server - *proto.UnimplementedTeamServer -} - -func newServer(server *server.Server) *rpcServer { - return &rpcServer{ - server: server, - UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, - } -} - -// GetVersion returns the teamserver version. -func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { - ver, err := ts.server.Version() - - return &proto.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, err -} - -// GetUsers returns the list of teamserver users and their status. -func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { - // Fetch users from the teamserver user database. - users, err := ts.server.Users() - - userspb := make([]*proto.User, len(users)) - for i, user := range users { - userspb[i] = &proto.User{ - Name: user.Name, - Online: isOperatorOnline(user.Name), - LastSeen: user.LastSeen.Unix(), - Clients: int32(user.Clients), - } - } - - return &proto.Users{Users: userspb}, err -} - -func isOperatorOnline(commonName string) bool { - for _, operator := range core.Clients.ActiveOperators() { - if commonName == operator { - return true - } - } - return false -} diff --git a/server/transport/server.go b/server/transport/server.go index 0622515b51..0b7684553c 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -22,14 +22,11 @@ import ( "context" "net" "runtime/debug" - "sync" - teamserver "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/proto" + "github.com/reeflective/team/server" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" - clientTransport "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/rpc" ) @@ -45,35 +42,41 @@ const ( ServerMaxMessageSize = 2*gb - 1 ) -// Teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. -// This listener backend embeds a team/server.Server core driver and uses it for fetching -// server-side TLS configurations, use its loggers and access its database/users/list. -type Teamserver struct { - *teamserver.Server - - options []grpc.ServerOption - conn *bufconn.Listener - mutex *sync.RWMutex -} - -// NewListener returns a vanilla tcp+mtls gRPC teamserver listener backend. -// Developers: note that the teamserver type is already set with logging/ -// auth/middleware/buffering gRPC options. You can still override them. -func NewListener(opts ...grpc.ServerOption) *Teamserver { - listener := &Teamserver{ - mutex: &sync.RWMutex{}, - options: bufferingOptions(), +// NewTeamserver returns a Sliver teamserver ready to run and serve +// itself over either TCP+MTLS/gRPC, or Tailscale+MTLS/gRPC channels. +// The client options returned should be passed to an in-memory teamclient. +// All errors returned by this function are critical: the server can't work. +func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err error) { + tlsListener := newTeamserverTLS() + tailscaleListener := newTeamserverTailScale() + + // Here is an import step, where we are given a change to setup + // the reeflective/teamserver with everything we want: our own + // database, the application daemon default port, loggers or files, + // directories, and much more. + var serverOpts []server.Options + serverOpts = append(serverOpts, + server.WithDefaultPort(31337), + server.WithListener(tlsListener), + server.WithListener(tailscaleListener), + ) + + // Create the application teamserver. + // Any error is critical, and means we can't work correctly. + teamserver, err := server.New("sliver", serverOpts...) + if err != nil { + return nil, nil, err } - listener.options = append(listener.options, opts...) - - return listener + // The gRPC teamserver backend is hooked to produce a single + // in-memory teamclient RPC/dialer backend. Not encrypted. + return teamserver, clientOptionsFor(tlsListener), nil } -// NewClientFrom requires an existing grpc Teamserver to create an in-memory -// connection bound to both the teamserver and the teamclient backends. +// clientOptionsFor requires an existing grpc Teamserver to create an in-memory connection. +// Those options are passed to the SliverClient constructor for setting up its own dialer. // It returns a teamclient meant to be ran in memory, with TLS credentials disabled. -func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport.Teamclient { +func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOption { conn := bufconn.Listen(bufSize) ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { @@ -89,89 +92,20 @@ func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport // The reference is dropped after server start. server.conn = conn - return clientTransport.NewTeamClient(opts...) -} - -// Name immplements team/server.Handler.Name(). -// It indicates the transport/rpc stack. -func (h *Teamserver) Name() string { - return "gRPC/mTLS" -} - -// Init implements team/server.Handler.Init(). -// It is used to initialize the listener with the correct TLS credentials -// middleware (or absence of if about to serve an in-memory connection). -func (h *Teamserver) Init(serv *teamserver.Server) (err error) { - h.Server = serv - - // Logging - logOptions, err := logMiddlewareOptions(h.Server) - if err != nil { - return err - } - - h.options = append(h.options, logOptions...) - - // Authentication/audit - authOptions, err := h.initAuthMiddleware() - if err != nil { - return err - } - - h.options = append(h.options, authOptions...) - - return nil -} - -// Listen implements team/server.Handler.Listen(). -// this teamserver uses a tcp+TLS (mutual) listener to serve remote clients. -func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { - // In-memory connection are not authenticated. - if h.conn == nil { - ln, err = net.Listen("tcp", addr) - if err != nil { - return nil, err - } - - // Encryption. - tlsOptions, err := tlsAuthMiddlewareOptions(h.Server) - if err != nil { - return nil, err - } - - h.options = append(h.options, tlsOptions...) - } else { - h.mutex.Lock() - ln = h.conn - h.conn = nil - h.mutex.Unlock() - } - - h.serve(ln) - - return ln, nil -} - -// Close implements team/server.Handler.Close(). -// Original sliver never closes the gRPC HTTP server itself -// with server.Shutdown(), so here we don't close anything. -// Note that the listener itself is controled/closed by -// our core teamserver driver. -func (h *Teamserver) Close() error { - return nil + return opts } // serve is the transport-agnostic routine to serve the gRPC server // (and its implemented Sliver services) onto a generic listener. // Both mTLS and Tailscale teamserver backends use this. -func (h *Teamserver) serve(ln net.Listener) { +func (h *teamserver) serve(ln net.Listener) { grpcServer := grpc.NewServer(h.options...) rpcLog := h.NamedLogger("transport", "gRPC") // Teamserver/Sliver services - proto.RegisterTeamServer(grpcServer, newServer(h.Server)) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) + sliverServer := rpc.NewServer(h.Server) + rpcpb.RegisterSliverRPCServer(grpcServer, sliverServer) rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 78dd991d8c..36e47d8d01 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -35,12 +35,12 @@ import ( // tailscaleTeamserver is unexported since we only need it as // a reeflective/team/server.Listener interface implementation. type tailscaleTeamserver struct { - *Teamserver + *teamserver } -// NewTailScaleListener returns a Sliver teamserver backend using Tailscale. -func NewTailScaleListener(opts ...grpc.ServerOption) server.Listener { - core := NewListener(opts...) +// newTeamserverTailScale returns a Sliver teamserver backend using Tailscale. +func newTeamserverTailScale(opts ...grpc.ServerOption) server.Listener { + core := newTeamserverTLS(opts...) return &tailscaleTeamserver{core} } From 50d530174de57e803538b524efcdd9bb7b6f7e5c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:32:31 +0200 Subject: [PATCH 056/109] Commit dependencies (useless) --- go.mod | 2 +- .../reeflective/team/client/client.go | 30 +- .../reeflective/team/client/options.go | 6 +- .../reeflective/team/server/core.go | 2 +- .../team/transports/grpc/proto/buf.gen.yaml | 13 - .../team/transports/grpc/proto/buf.work.yaml | 3 - .../team/transports/grpc/proto/buf.yaml | 12 - .../team/transports/grpc/proto/client.pb.go | 505 ------------------ .../team/transports/grpc/proto/client.proto | 40 -- .../team/transports/grpc/proto/service.pb.go | 85 --- .../team/transports/grpc/proto/service.proto | 13 - .../transports/grpc/proto/service_grpc.pb.go | 146 ----- vendor/modules.txt | 1 - 13 files changed, 11 insertions(+), 847 deletions(-) delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.proto delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.proto delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go diff --git a/go.mod b/go.mod index 6419ae08d0..c7a073827d 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/cheggaaa/pb/v3 v3.1.2 github.com/chromedp/cdproto v0.0.0-20230220211738-2b1ec77315c9 github.com/chromedp/chromedp v0.9.1 + github.com/fatih/color v1.15.0 github.com/glebarez/sqlite v1.8.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/google/uuid v1.3.0 @@ -99,7 +100,6 @@ require ( github.com/demisto/goxforce v0.0.0-20160322194047-db8357535b1d // indirect github.com/dlclark/regexp2 v1.4.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fatih/color v1.15.0 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5 // indirect github.com/glebarez/go-sqlite v1.21.1 // indirect diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index 30097e7fdc..75940500f0 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -58,8 +58,8 @@ type Client struct { mutex *sync.RWMutex // Sync access. initOpts sync.Once // Some options can only be set once when creating the server. - dialer Dialer[any] // Connection backend for the teamclient. - connect *sync.Once // A client can only connect once per run. + dialer Dialer // Connection backend for the teamclient. + connect *sync.Once // A client can only connect once per run. // Client is the implementation of the core teamclient functionality, // which is to query a server version and its current users. @@ -80,19 +80,16 @@ type Client struct { // - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). // - A simple net.Conn over which anything can be done further. // - Nothing: a dialer might not need to use or even create a client connection. -type Dialer[clientConn any] interface { +type Dialer interface { // Init is used by any dialer to query the teamclient driving it about: // - The remote teamserver address and transport credentials // - The user registered in this remote teamserver configuration. // - To make use of client-side loggers, filesystem and other utilities. Init(c *Client) error - // Dial should connect to the endpoint available in the client configuration. - // Note that the configuration is not required as a function parameter, since - // the dialer has already been provided access to the entire teamclient in Init() - // The c`clientConn` type is then passed to all hook functions registered - // with the dialer when using the client.WithDialer(dialer, hooks...) option. - Dial() (conn clientConn, err error) + // Dial should connect to the endpoint available in any + // of the client remote teamserver configurations. + Dial() error // Close should close the connection or any related component. Close() error @@ -176,24 +173,11 @@ func (tc *Client) Connect(options ...Options) (err error) { return } - // Connect to the teamserver. - var client any - - client, err = tc.dialer.Dial() + err = tc.dialer.Dial() if err != nil { err = tc.errorf("%w: %w", ErrClient, err) return } - - // Post-run hooks are used by consumers to further setup/consume - // the connection after the latter was established. In the case - // of RPCs, this client is generally used to register them. - for _, hook := range tc.opts.hooks { - if err = hook(client); err != nil { - err = tc.errorf("%w: %w", ErrClient, err) - return - } - } }) return err diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index da12a3deb4..a43c03b74d 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -47,8 +47,7 @@ type opts struct { stdout io.Writer config *Config logger *logrus.Logger - dialer Dialer[any] - hooks []func(s any) error + dialer Dialer } func defaultOpts() *opts { @@ -167,10 +166,9 @@ func WithLogger(logger *logrus.Logger) Options { // // This option can be used multiple times, either when using // team/client.New() or when using the teamclient.Connect() method. -func WithDialer(dialer Dialer[any], hooks ...func(clientConn any) error) Options { +func WithDialer(dialer Dialer, hooks ...func(clientConn any) error) Options { return func(opts *opts) { opts.dialer = dialer - opts.hooks = append(opts.hooks, hooks...) } } diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 9025720512..458c078634 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -154,7 +154,7 @@ func (ts *Server) Name() string { // of the application using this teamserver. // See the server.Listener and client.Dialer types documentation for more. func (ts *Server) Self(opts ...client.Options) *client.Client { - opts = append(opts, client.WithLocalDialer()) + // opts = append(opts, client.WithLocalDialer()) teamclient, _ := client.New(ts.Name(), ts, opts...) diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml deleted file mode 100644 index 3db65777d2..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml +++ /dev/null @@ -1,13 +0,0 @@ -version: v1 -managed: - enabled: true - go_package_prefix: - default: github.com/reeflective/team/transports/grpc/proto - -plugins: - - name: go - out: . - opt: paths=source_relative - - name: go-grpc - out: . - opt: paths=source_relative diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml deleted file mode 100644 index f5a48a2395..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml +++ /dev/null @@ -1,3 +0,0 @@ -version: v1 -directories: - - . diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml deleted file mode 100644 index 65d1ddbac4..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: v1 -name: buf.build/reeflective/team -lint: - use: - - BASIC - except: - - FIELD_LOWER_SNAKE_CASE - - ENUM_VALUE_UPPER_SNAKE_CASE -breaking: - use: - - FILE - diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go deleted file mode 100644 index 50e85c77dd..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go +++ /dev/null @@ -1,505 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v3.18.1 -// source: client.proto - -package proto - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// [ Client & User ] -type Client struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ID uint32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` - Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` - User *User `protobuf:"bytes,3,opt,name=User,proto3" json:"User,omitempty"` -} - -func (x *Client) Reset() { - *x = Client{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Client) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Client) ProtoMessage() {} - -func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Client.ProtoReflect.Descriptor instead. -func (*Client) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{0} -} - -func (x *Client) GetID() uint32 { - if x != nil { - return x.ID - } - return 0 -} - -func (x *Client) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Client) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -type Users struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` -} - -func (x *Users) Reset() { - *x = Users{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Users) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Users) ProtoMessage() {} - -func (x *Users) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Users.ProtoReflect.Descriptor instead. -func (*Users) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{1} -} - -func (x *Users) GetUsers() []*User { - if x != nil { - return x.Users - } - return nil -} - -type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` - Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` - LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` - Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` -} - -func (x *User) Reset() { - *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *User) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*User) ProtoMessage() {} - -func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use User.ProtoReflect.Descriptor instead. -func (*User) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{2} -} - -func (x *User) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *User) GetOnline() bool { - if x != nil { - return x.Online - } - return false -} - -func (x *User) GetLastSeen() int64 { - if x != nil { - return x.LastSeen - } - return 0 -} - -func (x *User) GetClients() int32 { - if x != nil { - return x.Clients - } - return 0 -} - -type Version struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Major int32 `protobuf:"varint,1,opt,name=Major,proto3" json:"Major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=Minor,proto3" json:"Minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=Patch,proto3" json:"Patch,omitempty"` - Commit string `protobuf:"bytes,4,opt,name=Commit,proto3" json:"Commit,omitempty"` - Dirty bool `protobuf:"varint,5,opt,name=Dirty,proto3" json:"Dirty,omitempty"` - CompiledAt int64 `protobuf:"varint,6,opt,name=CompiledAt,proto3" json:"CompiledAt,omitempty"` - OS string `protobuf:"bytes,7,opt,name=OS,proto3" json:"OS,omitempty"` - Arch string `protobuf:"bytes,8,opt,name=Arch,proto3" json:"Arch,omitempty"` -} - -func (x *Version) Reset() { - *x = Version{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Version) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Version) ProtoMessage() {} - -func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Version.ProtoReflect.Descriptor instead. -func (*Version) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{3} -} - -func (x *Version) GetMajor() int32 { - if x != nil { - return x.Major - } - return 0 -} - -func (x *Version) GetMinor() int32 { - if x != nil { - return x.Minor - } - return 0 -} - -func (x *Version) GetPatch() int32 { - if x != nil { - return x.Patch - } - return 0 -} - -func (x *Version) GetCommit() string { - if x != nil { - return x.Commit - } - return "" -} - -func (x *Version) GetDirty() bool { - if x != nil { - return x.Dirty - } - return false -} - -func (x *Version) GetCompiledAt() int64 { - if x != nil { - return x.CompiledAt - } - return 0 -} - -func (x *Version) GetOS() string { - if x != nil { - return x.OS - } - return "" -} - -func (x *Version) GetArch() string { - if x != nil { - return x.Arch - } - return "" -} - -// [ Others ] -type Empty struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Empty) Reset() { - *x = Empty{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Empty) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Empty) ProtoMessage() {} - -func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Empty.ProtoReflect.Descriptor instead. -func (*Empty) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{4} -} - -var File_client_proto protoreflect.FileDescriptor - -var file_client_proto_rawDesc = []byte{ - 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x22, 0x2b, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, - 0x22, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbd, 0x01, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x4d, 0x61, 0x6a, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, - 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x84, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, - 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, - 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, - 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_client_proto_rawDescOnce sync.Once - file_client_proto_rawDescData = file_client_proto_rawDesc -) - -func file_client_proto_rawDescGZIP() []byte { - file_client_proto_rawDescOnce.Do(func() { - file_client_proto_rawDescData = protoimpl.X.CompressGZIP(file_client_proto_rawDescData) - }) - return file_client_proto_rawDescData -} - -var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_client_proto_goTypes = []interface{}{ - (*Client)(nil), // 0: client.Client - (*Users)(nil), // 1: client.Users - (*User)(nil), // 2: client.User - (*Version)(nil), // 3: client.Version - (*Empty)(nil), // 4: client.Empty -} -var file_client_proto_depIdxs = []int32{ - 2, // 0: client.Client.User:type_name -> client.User - 2, // 1: client.Users.Users:type_name -> client.User - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_client_proto_init() } -func file_client_proto_init() { - if File_client_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_client_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Users); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Version); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_client_proto_rawDesc, - NumEnums: 0, - NumMessages: 5, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_client_proto_goTypes, - DependencyIndexes: file_client_proto_depIdxs, - MessageInfos: file_client_proto_msgTypes, - }.Build() - File_client_proto = out.File - file_client_proto_rawDesc = nil - file_client_proto_goTypes = nil - file_client_proto_depIdxs = nil -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto deleted file mode 100644 index 21a855b2f3..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; - -package client; - -// [ Client & User ] -message Client { - uint32 ID = 1; - string Name = 2; - - User User = 3; -} - -message Users { repeated User Users = 1; } - -message User { - string Name = 1; - bool Online = 2; - int64 LastSeen = 3; - int32 Clients = 4; -} - - -// [ Version ] - -message Version { - int32 Major = 1; - int32 Minor = 2; - int32 Patch = 3; - - string Commit = 4; - bool Dirty = 5; - int64 CompiledAt = 6; - - string OS = 7; - string Arch = 8; -} - -// [ Others ] -message Empty {} - diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go deleted file mode 100644 index 7ba84d01ec..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go +++ /dev/null @@ -1,85 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v3.18.1 -// source: service.proto - -package proto - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -var File_service_proto protoreflect.FileDescriptor - -var file_service_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x5e, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x0a, - 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x42, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, - 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, - 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, - 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_service_proto_goTypes = []interface{}{ - (*Empty)(nil), // 0: client.Empty - (*Version)(nil), // 1: client.Version - (*Users)(nil), // 2: client.Users -} -var file_service_proto_depIdxs = []int32{ - 0, // 0: client.Team.GetVersion:input_type -> client.Empty - 0, // 1: client.Team.GetUsers:input_type -> client.Empty - 1, // 2: client.Team.GetVersion:output_type -> client.Version - 2, // 3: client.Team.GetUsers:output_type -> client.Users - 2, // [2:4] is the sub-list for method output_type - 0, // [0:2] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_service_proto_init() } -func file_service_proto_init() { - if File_service_proto != nil { - return - } - file_client_proto_init() - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_service_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_service_proto_goTypes, - DependencyIndexes: file_service_proto_depIdxs, - }.Build() - File_service_proto = out.File - file_service_proto_rawDesc = nil - file_service_proto_goTypes = nil - file_service_proto_depIdxs = nil -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto deleted file mode 100644 index 13223cd11e..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -package client; - -import "client.proto"; - -// Team offers basic methods used by team client/servers to communicate -// their related informations, such as connected users, compilation info, -// and streaming their output/console logs. -service Team { - rpc GetVersion(Empty) returns (Version); - rpc GetUsers(Empty) returns (Users); -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go deleted file mode 100644 index e7dde5e622..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go +++ /dev/null @@ -1,146 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v3.18.1 -// source: service.proto - -package proto - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -const ( - Team_GetVersion_FullMethodName = "/client.Team/GetVersion" - Team_GetUsers_FullMethodName = "/client.Team/GetUsers" -) - -// TeamClient is the client API for Team service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type TeamClient interface { - GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) - GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) -} - -type teamClient struct { - cc grpc.ClientConnInterface -} - -func NewTeamClient(cc grpc.ClientConnInterface) TeamClient { - return &teamClient{cc} -} - -func (c *teamClient) GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) { - out := new(Version) - err := c.cc.Invoke(ctx, Team_GetVersion_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *teamClient) GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) { - out := new(Users) - err := c.cc.Invoke(ctx, Team_GetUsers_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// TeamServer is the server API for Team service. -// All implementations must embed UnimplementedTeamServer -// for forward compatibility -type TeamServer interface { - GetVersion(context.Context, *Empty) (*Version, error) - GetUsers(context.Context, *Empty) (*Users, error) - mustEmbedUnimplementedTeamServer() -} - -// UnimplementedTeamServer must be embedded to have forward compatible implementations. -type UnimplementedTeamServer struct { -} - -func (UnimplementedTeamServer) GetVersion(context.Context, *Empty) (*Version, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") -} -func (UnimplementedTeamServer) GetUsers(context.Context, *Empty) (*Users, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") -} -func (UnimplementedTeamServer) mustEmbedUnimplementedTeamServer() {} - -// UnsafeTeamServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to TeamServer will -// result in compilation errors. -type UnsafeTeamServer interface { - mustEmbedUnimplementedTeamServer() -} - -func RegisterTeamServer(s grpc.ServiceRegistrar, srv TeamServer) { - s.RegisterService(&Team_ServiceDesc, srv) -} - -func _Team_GetVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TeamServer).GetVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Team_GetVersion_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TeamServer).GetVersion(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Team_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TeamServer).GetUsers(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Team_GetUsers_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TeamServer).GetUsers(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -// Team_ServiceDesc is the grpc.ServiceDesc for Team service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Team_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "client.Team", - HandlerType: (*TeamServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetVersion", - Handler: _Team_GetVersion_Handler, - }, - { - MethodName: "GetUsers", - Handler: _Team_GetUsers_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "service.proto", -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 4a534c0b54..db8dd69a0f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -550,7 +550,6 @@ github.com/reeflective/team/internal/version github.com/reeflective/team/server github.com/reeflective/team/server/commands github.com/reeflective/team/transports/grpc/common -github.com/reeflective/team/transports/grpc/proto # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft From eb127eaf09432ef0d3d0ebcc3ddd5e26045d27d2 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:34:24 +0200 Subject: [PATCH 057/109] Cleanup and tidy client console/transport code --- client/console/console.go | 168 +++++++++++++++++++++---------- client/console/log.go | 31 ++---- client/console/teamclient.go | 77 ++++++++++++++ client/transport/client.go | 156 ++++++++-------------------- client/transport/middleware.go | 24 ++++- client/version/sliver-version.go | 16 +-- client/version/updates.go | 12 +-- 7 files changed, 277 insertions(+), 207 deletions(-) create mode 100644 client/console/teamclient.go diff --git a/client/console/console.go b/client/console/console.go index d669e1892d..f00b5f0fb6 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -89,14 +89,28 @@ type ( BeaconTaskCallback func(*clientpb.BeaconTask) ) +// SliverClient is a general-purpose, interface-agnostic client. +// +// It allows to use the Sliver toolset with an arbitrary number of remote/local +// Sliver servers, either through its API (RPC client), CLI (the command tree), +// or through an arbitrary mix of those. +// +// The Sliver client will by default be used with remote, mutual TLS authenticated +// connections to Sliver teamservers, which configurations are found in the teamclient +// directory. +// However, the teamclient API/CLI offers ways to manage and use those configurations, +// which means that users of this Sliver client may build arbitrarily complex server +// selection/connection strategies. type SliverClient struct { // Core client + App *console.Console + Settings *assets.ClientSettings + IsServer bool + IsCLI bool + + // Teamclient & remotes Teamclient *client.Client - App *console.Console - Settings *assets.ClientSettings - IsServer bool - IsCLI bool - completing bool + dialer *transport.TeamClient // Logging jsonHandler slog.Handler @@ -112,37 +126,46 @@ type SliverClient struct { } // NewSliverClient is the general-purpose Sliver Client constructor. -func NewSliverClient(teamclient *transport.Teamclient) (*SliverClient, []client.Options) { - // Generate the console client, setting up menus, etc. - con := newConsole() - - // The teamclient requires hooks to bind RPC clients around its connection. - // NOTE: this might not be needed either if Sliver uses its own teamclient backend. - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return client.ErrNoTeamclient - } - - // Register our core Sliver RPC client, and start monitoring - // events, tunnels, logs, and all. - con.connect(grpcClient) +// +// The returned client includes and is ready to use the following: +// - A reeflective/team.Client to manage, use and interact with an arbitrary +// number of Sliver teamservers. This includes connecting, registering RPC +// client interfaces, logging, authenticating and disconnecting. +// - A console application, which can either be used closed-loop, or in a classic +// exec-once CLI style. Users of this client are free to use either at will. +// - Cobra-command runner methods to be included in new commands and completers. +// - Methods to set and interact with a Sliver implant target. +// - Various logging/streaming utilities. +// +// Any error returned from this call is critical, meaning that given the current +// options (teamclient, gRPC, etc), the SliverClient is not able to work properly. +func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { + // Create the client core, everything interface-related. + con = newClient() - return nil - } + // Our reeflective/team.Client needs our gRPC stack. + con.dialer = transport.NewClient(opts...) var clientOpts []client.Options clientOpts = append(clientOpts, - client.WithDialer(teamclient, bindClient), + client.WithDialer(con.dialer), ) - return con, clientOpts + // Create a new reeflective/team.Client, which is in charge of selecting, + // and connecting with, remote Sliver teamserver configurations, etc. + // Includes client backend logging, authentication, core teamclient methods... + con.Teamclient, err = client.New("sliver", con, clientOpts...) + if err != nil { + return nil, err + } + + return con, nil } -// newConsole creates the sliver client (and console), creating menus and prompts. +// newClient creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func newConsole() *SliverClient { +func newClient() *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() @@ -192,6 +215,56 @@ func newConsole() *SliverClient { return con } +// ConnectRun is a spf13/cobra-compliant runner function to be included +// in/as any of the runners that such cobra.Commands offer to use. +// +// The function will connect the Sliver teamclient to a remote server, +// register its client RPC interfaces, and start handling events/log streams. +// +// Note that this function will always check if it used as part of a completion +// command execution call, in which case asciicast/logs streaming is disabled. +func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { + // Let our teamclient connect the transport/RPC stack. + // Note that this uses a sync.Once to ensure we don't + // connect more than once. + err := con.Teamclient.Connect() + if err != nil { + return err + } + + // Register our Sliver client services, and monitor events. + // Also set ourselves up to save our client commands in history. + con.connect(con.dialer.Conn) + + // Never enable asciicasts/logs streaming when this + // client is used to perform completions. Both of these will tinker + // with very low-level IO and very often don't work nice together. + if compCommandCalled(cmd) { + return nil + } + + // Else, initialize our logging/asciicasts streams. + return con.startClientLog() +} + +// ConnectComplete is a special connection mode which should be +// called in completer functions that need to use the client RPC. +// It is almost equivalent to client.ConnectRun(), but for completions. +// +// If the connection failed, an error is returned along with a completion +// action include the error as a status message, to be returned by completers. +// +// This function is safe to call regardless of the client being used +// as a closed-loop console mode or in an exec-once CLI mode. +func (con *SliverClient) ConnectComplete() (carapace.Action, error) { + err := con.Teamclient.Connect() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), nil + } + + return carapace.ActionValues(), nil +} + // connect requires a working gRPC connection to the sliver server. // It starts monitoring events, implant tunnels and client logs streams. func (con *SliverClient) connect(conn *grpc.ClientConn) { @@ -201,11 +274,8 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { go con.startEventLoop() go core.TunnelLoop(con.Rpc) - // Stream logs/asciicasts - con.startClientLog() - // History sources - sliver := con.App.NewMenu(consts.ImplantMenu) + sliver := con.App.Menu(consts.ImplantMenu) histuser, err := con.newImplantHistory(true) if err == nil { @@ -235,28 +305,6 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// ConnectCompletion is a special connection mode which should be -// called in completer functions that need to use the client RPC. -// -// This function is safe to call regardless of the client being used -// as a closed-loop console mode or in an exec-once CLI mode. -func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { - con.completing = true - - err := con.Teamclient.Connect() - if err != nil { - return carapace.ActionMessage("connection error: %s", err), nil - } - - return carapace.ActionValues(), nil -} - -// UnwrapServerErr unwraps errors returned by gRPC method calls. -// Should be used to return every non-nil resp, err := con.Rpc.Function(). -func (con *SliverClient) UnwrapServerErr(err error) error { - return errors.New(status.Convert(err).Message()) -} - // Disconnect disconnectss the client from its Sliver server, // closing all its event/log streams and files, then closing // the core Sliver RPC client connection. @@ -398,6 +446,12 @@ func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, conte return context.WithTimeout(context.Background(), timeout) } +// UnwrapServerErr unwraps errors returned by gRPC method calls. +// Should be used to return every non-nil resp, err := con.Rpc.Function(). +func (con *SliverClient) UnwrapServerErr(err error) error { + return errors.New(status.Convert(err).Message()) +} + func (con *SliverClient) CheckLastUpdate() { now := time.Now() lastUpdate := getLastUpdateCheck() @@ -431,3 +485,13 @@ func getLastUpdateCheck() *time.Time { lastUpdate := time.Unix(int64(unixTime), 0) return &lastUpdate } + +func compCommandCalled(cmd *cobra.Command) bool { + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + return true + } + } + + return false +} diff --git a/client/console/log.go b/client/console/log.go index a6fe68eb2a..8a607153af 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,13 +51,6 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } -// CompleteDisableLog forbids the server from streaming its asciicast -// and some logs output to the server, as asciicast and completions both -// tinker with very low-level IO and very often don't work nice together. -func (con *SliverClient) CompleteDisableLog() { - con.completing = true -} - // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { @@ -69,10 +62,6 @@ func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, err } func (con *SliverClient) startClientLog() error { - if con.completing { - return nil - } - if !con.Settings.ConsoleLogs { return nil } @@ -88,23 +77,23 @@ func (con *SliverClient) startClientLog() error { con.setupLogger(clientLogFile, clientLogs) // Asciicast sessions. - asciicastFile := getConsoleAsciicastFile() - - asciicastStream, err := con.ClientLogStream("asciicast") - if err != nil { - return fmt.Errorf("Could not get client log stream: %w", err) - } - - err = con.setupAsciicastRecord(asciicastFile, asciicastStream) + // asciicastFile := getConsoleAsciicastFile() + // + // asciicastStream, err := con.ClientLogStream("asciicast") + // if err != nil { + // return fmt.Errorf("Could not get client log stream: %w", err) + // } + // + // err = con.setupAsciicastRecord(asciicastFile, asciicastStream) con.closeLogs = append(con.closeLogs, func() { // Local files clientLogFile.Close() - asciicastFile.Close() + // asciicastFile.Close() // Server streams. clientLogs.Stream.CloseAndRecv() - asciicastStream.Stream.CloseAndRecv() + // asciicastStream.Stream.CloseAndRecv() }) return nil diff --git a/client/console/teamclient.go b/client/console/teamclient.go new file mode 100644 index 0000000000..1aaae8af9d --- /dev/null +++ b/client/console/teamclient.go @@ -0,0 +1,77 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "time" + + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/reeflective/team" + "google.golang.org/grpc/status" +) + +// Users returns a list of all users registered with the app teamserver. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *SliverClient) Users() (users []team.User, err error) { + if h.Rpc == nil { + return nil, errors.New("No Sliver client RPC") + } + + res, err := h.Rpc.GetUsers(context.Background(), &commonpb.Empty{}) + if err != nil { + return nil, h.UnwrapServerErr(err) + } + + for _, user := range res.GetUsers() { + users = append(users, team.User{ + Name: user.Name, + Online: user.Online, + LastSeen: time.Unix(user.LastSeen, 0), + }) + } + + return +} + +// ServerVersion returns the version information of the server to which +// the client is connected, or nil and an error if it could not retrieve it. +func (h *SliverClient) Version() (version team.Version, err error) { + if h.Rpc == nil { + return version, errors.New("No Sliver client RPC") + } + + ver, err := h.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + if err != nil { + return version, errors.New(status.Convert(err).Message()) + } + + return team.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, nil +} diff --git a/client/transport/client.go b/client/transport/client.go index e12b9233f6..456ef65ad8 100644 --- a/client/transport/client.go +++ b/client/transport/client.go @@ -20,79 +20,54 @@ package transport import ( "context" - "errors" "fmt" - "time" - "github.com/reeflective/team" "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/proto" "google.golang.org/grpc" - "google.golang.org/grpc/status" ) -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. - ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte - - defaultTimeout = 10 * time.Second -) - -var ( - // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client - // connection is available. The error is raised when the handler hasn't connected. - ErrNoRPC = errors.New("no working core Teamclient available") - - // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try - // connecting with, TLS credentials. If such an error is raised, make sure your team - // client has correctly fetched -using client.Config()- a remote teamserver config. - ErrNoTLSCredentials = errors.New("the Teamclient has no TLS credentials to use") -) - -// Teamclient is a vanilla gRPC client set up and configured -// to interact with remotes/in-memory Sliver teamservers. -// -// This teamclient embeds a team/client.Client core driver and uses -// it for fetching/setting up the transport credentials, dialers, etc... -type Teamclient struct { - *client.Client - conn *grpc.ClientConn - rpc proto.TeamClient +// TeamClient is a type implementing the reeflective/team/client.Dialer +// interface, and can thus be used to communicate with any remote or +// in-memory Sliver teamserver. +// When used to connect remotely, this type can safely +// be instantiated with `new(transport.Teamclient)`. +type TeamClient struct { + team *client.Client options []grpc.DialOption + Conn *grpc.ClientConn } -// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. -// This client has by default only a few options, like max message buffer size. -// All options passed to this call are stored as is and will be used later. -func NewTeamClient(opts ...grpc.DialOption) *Teamclient { - client := &Teamclient{ - options: opts, - } +// NewClient creates a teamclient transport with specific gRPC options. +// It can also be used for in-memory clients, which specify their dialer. +func NewClient(opts ...grpc.DialOption) *TeamClient { + tc := new(TeamClient) + tc.options = append(tc.options, opts...) - client.options = append(client.options, - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), - ) - - return client + return tc } // Init implements team/client.Dialer.Init(c). -// It uses teamclient core driver for a remote server configuration, -// and uses it to load a set of Mutual TLS dialing options. -func (h *Teamclient) Init(cli *client.Client) error { - h.Client = cli +// It uses teamclient core driver for a remote server configuration. +// It also includes all pre-existing Sliver-specific log/middleware. +func (h *TeamClient) Init(cli *client.Client) error { + h.team = cli config := cli.Config() - options := logMiddlewareOptions(cli) + // Buffering + h.options = append(h.options, + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize), + ), + ) + + // Logging/audit + options := LogMiddlewareOptions(cli) + h.options = append(h.options, options...) // If the configuration has no credentials, we are an // in-memory dialer, don't authenticate/encrypt the conn. if config.PrivateKey != "" { - tlsOpts, err := tlsAuthMiddleware(cli) + tlsOpts, err := TLSAuthMiddleware(cli) if err != nil { return err } @@ -100,85 +75,34 @@ func (h *Teamclient) Init(cli *client.Client) error { h.options = append(h.options, tlsOpts...) } - h.options = append(h.options, options...) - return nil } // Dial implements team/client.Dialer.Dial(). // It uses the teamclient remote server configuration as a target of a dial call. -// If the connection is successful, the teamclient registers a proto.Teamclient -// RPC around its client connection, to provide the core teamclient functionality. -func (h *Teamclient) Dial() (rpcClient any, err error) { +// If the connection is successful, the teamclient registers a Sliver RPC client. +func (h *TeamClient) Dial() (err error) { ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) defer cancel() - host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) + cfg := h.team.Config() - h.conn, err = grpc.DialContext(ctx, host, h.options...) + host := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port) + + h.Conn, err = grpc.DialContext(ctx, host, h.options...) if err != nil { - return nil, err + return err } - h.rpc = proto.NewTeamClient(h.conn) - - return h.conn, nil + return nil } // Close implements team/client.Dialer.Close(). // It closes the gRPC client connection if any. -func (h *Teamclient) Close() error { - if h.conn == nil { +func (h *TeamClient) Close() error { + if h.Conn == nil { return nil } - return h.conn.Close() -} - -// Users returns a list of all users registered with the app teamserver. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. -func (h *Teamclient) Users() (users []team.User, err error) { - if h.rpc == nil { - return nil, ErrNoRPC - } - - res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) - if err != nil { - return nil, err - } - - for _, user := range res.GetUsers() { - users = append(users, team.User{ - Name: user.Name, - Online: user.Online, - LastSeen: time.Unix(user.LastSeen, 0), - }) - } - - return -} - -// ServerVersion returns the version information of the server to which -// the client is connected, or nil and an error if it could not retrieve it. -func (h *Teamclient) Version() (version team.Version, err error) { - if h.rpc == nil { - return version, ErrNoRPC - } - - ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) - if err != nil { - return version, errors.New(status.Convert(err).Message()) - } - - return team.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, nil + return h.Conn.Close() } diff --git a/client/transport/middleware.go b/client/transport/middleware.go index 480fe71150..6ff8d3ab8a 100644 --- a/client/transport/middleware.go +++ b/client/transport/middleware.go @@ -21,6 +21,8 @@ package transport import ( "context" "encoding/json" + "errors" + "time" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" "github.com/reeflective/team/client" @@ -29,14 +31,30 @@ import ( "google.golang.org/grpc/credentials" ) +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. + ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte + + defaultTimeout = 10 * time.Second +) + +// ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try +// connecting with, TLS credentials. If such an error is raised, make sure your team +// client has correctly fetched -using client.Config()- a remote teamserver config. +var ErrNoTLSCredentials = errors.New("the Teamclient has no TLS credentials to use") + // TokenAuth extracts authentication metadata from contexts, // specifically the "Authorization": "Bearer" key:value pair. type TokenAuth string -// logMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. // This function uses the core teamclient loggers to log the gRPC stack/requests events. // The Teamclient of this package uses them by default. -func logMiddlewareOptions(cli *client.Client) []grpc.DialOption { +func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { logrusEntry := cli.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ grpc_logrus.WithLevels(common.CodeToLevel), @@ -66,7 +84,7 @@ func logMiddlewareOptions(cli *client.Client) []grpc.DialOption { return options } -func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { +func TLSAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { config := cli.Config() if config.PrivateKey == "" { return nil, ErrNoTLSCredentials diff --git a/client/version/sliver-version.go b/client/version/sliver-version.go index fae3a87c4d..7d0c4e2d5a 100644 --- a/client/version/sliver-version.go +++ b/client/version/sliver-version.go @@ -31,23 +31,23 @@ const ( ) var ( - // Version - The semantic version in string form + // Version - The semantic version in string form. Version string - // GoVersion - Go compiler version + // GoVersion - Go compiler version. GoVersion string - // GitCommit - The commit id at compile time + // GitCommit - The commit id at compile time. GitCommit string - // GitDirty - Was the commit dirty at compile time + // GitDirty - Was the commit dirty at compile time. GitDirty string - // CompiledAt - When was this binary compiled + // CompiledAt - When was this binary compiled. CompiledAt string ) -// SemanticVersion - Get the structured sematic version +// SemanticVersion - Get the structured sematic version. func SemanticVersion() []int { semVer := []int{} version := Version @@ -61,7 +61,7 @@ func SemanticVersion() []int { return semVer } -// Compiled - Get time this binary was compiled +// Compiled - Get time this binary was compiled. func Compiled() (time.Time, error) { compiled, err := strconv.ParseInt(CompiledAt, 10, 64) if err != nil { @@ -70,7 +70,7 @@ func Compiled() (time.Time, error) { return time.Unix(compiled, 0), nil } -// FullVersion - Full version string +// FullVersion - Full version string. func FullVersion() string { ver := fmt.Sprintf("%s", Version) compiled, err := Compiled() diff --git a/client/version/updates.go b/client/version/updates.go index 963d7040ef..e4b50b3de6 100644 --- a/client/version/updates.go +++ b/client/version/updates.go @@ -16,10 +16,8 @@ const ( dateLayout = "2006-01-02T15:04:05Z" ) -var ( - // GithubReleasesURL - Check this Github releases API for updates - GithubReleasesURL string -) +// GithubReleasesURL - Check this Github releases API for updates. +var GithubReleasesURL string // Release - A single Github release object // https://developer.github.com/v3/repos/releases/ @@ -49,12 +47,12 @@ type Asset struct { BrowserDownloadURL string `json:"browser_download_url"` } -// Created - Get the time the release was created +// Created - Get the time the release was created. func (r *Release) Created() (time.Time, error) { return time.Parse(dateLayout, r.CreatedAt) } -// Published - Get the time the release was published +// Published - Get the time the release was published. func (r *Release) Published() (time.Time, error) { return time.Parse(dateLayout, r.PublishedAt) } @@ -113,7 +111,7 @@ func CheckForUpdates(client *http.Client, prereleases bool) (*Release, error) { return nil, nil } -// parseGitTag - Get the structured sematic version +// parseGitTag - Get the structured sematic version. func parseGitTag(tag string) []int { semVer := []int{} version := tag From d5d24e60c182c96e52f0e1c4fcd0f2f023e15a14 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:34:49 +0200 Subject: [PATCH 058/109] Rename a completion pre-runner --- client/command/beacons/beacons.go | 1 + client/command/beacons/commands.go | 2 +- client/command/crack/helpers.go | 6 +++--- client/command/creds/creds.go | 4 ++-- client/command/generate/helpers.go | 14 +++++++------- client/command/generate/implants.go | 2 +- client/command/generate/profiles.go | 2 +- client/command/jobs/jobs.go | 2 +- client/command/pivots/helpers.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/tasks/helpers.go | 4 ++-- client/command/use/use.go | 2 +- client/command/websites/websites.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 2 +- client/command/wireguard/wg-socks.go | 2 +- 15 files changed, 25 insertions(+), 24 deletions(-) diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index a92f992e55..02f0928381 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -89,6 +89,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } + PrintBeacons(beacons.Beacons, filter, filterRegex, con) } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 791a2f9fc6..5e3349c868 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -80,7 +80,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index d2eed38a45..89c1446a6e 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -12,7 +12,7 @@ import ( func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -39,7 +39,7 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -67,7 +67,7 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 2bc5072a89..910122bd5d 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -112,7 +112,7 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { // CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -139,7 +139,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { // CredsCredentialIDCompleter completes credential IDs. func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 992bd5b051..32c7c1306d 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -64,7 +64,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // FormatCompleter completes builds' architectures. func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -102,7 +102,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { // FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -149,7 +149,7 @@ func FormatCompleter() carapace.Action { // TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -178,7 +178,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager formats. func MsfFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -206,7 +206,7 @@ func MsfFormatCompleter(con *console.SliverClient) carapace.Action { // MsfArchCompleter completes MsfVenom stager architectures. func MsfArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -233,7 +233,7 @@ func MsfArchCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager encoders. func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -260,7 +260,7 @@ func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { // MsfPayloadCompleter completes Metasploit payloads. func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index c6c7f4cd0a..12b6e65f3e 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -125,7 +125,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl // ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 161c623ed5..72b1403402 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -422,7 +422,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { // ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index 079a64bb9c..b54567d6eb 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -91,7 +91,7 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { // JobsIDCompleter completes jobs IDs with descriptions. func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index dad68bf2b3..506bf9a4fd 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -68,7 +68,7 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive // PivotIDCompleter completes pivot listeners' IDs. func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 1daa35d673..5adeea6120 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -80,7 +80,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 41fd042cdc..04d8b88e61 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -51,7 +51,7 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -120,7 +120,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { // BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/use/use.go b/client/command/use/use.go index e6b8616d73..19ef853fd8 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -198,7 +198,7 @@ func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { // SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index a8a9335d81..fc7ee3e7d5 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -112,7 +112,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { // WebsiteNameCompleter completes the names of available websites. func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index 98922eea7d..ca57e19b51 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -68,7 +68,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index eb4aa2e4dc..aae46850c6 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -75,7 +75,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string // SocksIDCompleter IDs of WireGuard socks servers. func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } From 15a01fc145294821c1fb44ef683b5a2d394cc13d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 22:21:07 +0200 Subject: [PATCH 059/109] Ultimate refactoring/tidying of sliver entrypoints --- client/cli/cli.go | 113 +++++++------------- client/cli/implant.go | 2 +- client/command/console/console.go | 5 +- server/cli/cli.go | 172 ++++++++++-------------------- 4 files changed, 94 insertions(+), 198 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index dbebfdf141..7e4469cc70 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -23,11 +23,9 @@ import ( "os" "github.com/bishopfox/sliver/client/command" - consoleCmd "github.com/bishopfox/sliver/client/command/console" + sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/transport" "github.com/reeflective/console" - teamclient "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -39,39 +37,22 @@ func Execute() { // Sliver Client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. - con := newSliverClient() - - // Prepare the entire Sliver Command-line Interface as yielder functions. - serverCmds, sliverCmds := getSliverCommands(con) - - // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with - // a pre-runner ensuring the server and its teamclient are set up and connected. - rootCmd := serverCmds() - rootCmd.Use = "sliver-client" // Needed by completion scripts. + con, err := client.NewSliverClient() + if err != nil { + panic(err) + } - // Version - rootCmd.AddCommand(cmdVersion) + // Generate our complete Sliver Framework command-line interface. + rootCmd, server := SliverCLI(con) - // Bind the closed-loop console: + // Bind the closed-loop console. // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) - - // Implant. - // The implant command allows users to run commands on slivers from their - // system shell. It makes use of pre-runners for connecting to the server - // and binding sliver commands. These same pre-runners are also used for - // command completion/filtering purposes. - rootCmd.AddCommand(implantCmd(con, sliverCmds)) - - // Pre/post runners and completions. - command.BindRunners(rootCmd, true, preRunClient(con)) - command.BindRunners(rootCmd, false, postRunClient(con)) + rootCmd.AddCommand(sliverConsole.Command(con, server)) - // Generate the root completion command. - carapace.Gen(rootCmd) + // Version + rootCmd.AddCommand(cmdVersion) // Run the sliver client binary. if err := rootCmd.Execute(); err != nil { @@ -80,64 +61,42 @@ func Execute() { } } -// newSliverClient creates a new application teamclient. -// From this teamclient, configured to work with TLS connections -// to remote teamservers, generate a new Sliver Client. -func newSliverClient() *client.SliverClient { - gTeamclient := transport.NewTeamClient() - - con, opts := client.NewSliverClient(gTeamclient) - - teamclient, err := teamclient.New("sliver", gTeamclient, opts...) - if err != nil { - panic(err) - } - - con.Teamclient = teamclient - - return con -} - -// getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. -func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { +// SliverCLI returns the entire command tree of the Sliver Framework as yielder functions. +// The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped +// with all prerunners needed to connect to remote Sliver teamservers. +// It will also register the appropriate teamclient management commands. +func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Commands) { teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } } - serverCmds := command.ServerCommands(con, teamclientCmds) - sliverCmds := command.SliverCommands(con) + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + server = command.ServerCommands(con, teamclientCmds) - return serverCmds, sliverCmds -} + root = server() + root.Use = "sliver-client" // Needed by completion scripts. -// Before running any CLI entry command, require the Sliver client to connect to a teamserver. -func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(cmd *cobra.Command, _ []string) error { - // Don't stream console asciicast/logs when using the completion subcommand. - // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - if compCommandCalled(cmd) { - con.CompleteDisableLog() - } + // Implant. + // The implant command allows users to run commands on slivers from their + // system shell. It makes use of pre-runners for connecting to the server + // and binding sliver commands. These same pre-runners are also used for + // command completion/filtering purposes. + sliver := command.SliverCommands(con) - return con.Teamclient.Connect() - } -} + root.AddCommand(implantCmd(con, sliver)) -// After running any CLI entry command, correctly disconnect from the server. -func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(_ *cobra.Command, _ []string) error { + // Pre/post runners and completions. + command.BindRunners(root, true, con.ConnectRun) + command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() - } -} + }) -func compCommandCalled(cmd *cobra.Command) bool { - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - return true - } - } + // Generate the root completion command. + carapace.Gen(root) - return false + return root, server } diff --git a/client/cli/implant.go b/client/cli/implant.go index 85eaff1379..d0dfc14948 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -59,7 +59,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - if err := preRunClient(con)(cmd, args); err != nil { + if err := con.ConnectRun(cmd, args); err != nil { return err } diff --git a/client/command/console/console.go b/client/command/console/console.go index 0bff089286..a53e2ae533 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,13 +19,14 @@ package console */ import ( + "github.com/bishopfox/sliver/client/command" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" "github.com/spf13/cobra" ) -func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) *cobra.Command { +func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", Short: "Start the sliver client console", @@ -37,7 +38,7 @@ func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) server.SetCommands(serverCmds) sliver := con.App.Menu(consts.ImplantMenu) - sliver.SetCommands(sliverCmds) + sliver.SetCommands(command.SliverCommands(con)) // Start the console, blocking until player exit. return con.StartConsole() diff --git a/server/cli/cli.go b/server/cli/cli.go index 4f5a378dfc..2bef0643f9 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -20,7 +20,6 @@ package cli import ( "fmt" - "log" "os" // CLI dependencies @@ -30,7 +29,6 @@ import ( // Teamserver/teamclient dependencies "github.com/reeflective/team/server" - teamserver "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" // Sliver Client core, and generic/server-only commands @@ -46,48 +44,37 @@ import ( // Server-only imports "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" ) // Execute the sliver server binary. func Execute() { - // Create a self-serving teamserver: - // This teamserver creates an in-memory -gRPC-transported- teamclient - // (which is not yet connected). The server is also able to serve remote - // clients, although no persistent/network listeners are started by default. - // - // The server-only teamclient is used to create a Sliver Client, which functioning - // is agnostic to its execution mode (one-exec CLI, or closed-loop console). - // The client has no commands available yet. - teamserver, con := newSliverServer() + // Create a new Sliver Teamserver: the latter is able to serve all remote + // clients for its users, over any of the available transport stacks (MTLS/TS. + // Persistent teamserver client listeners are not started by default. + teamserver, opts, err := transport.NewTeamserver() + if err != nil { + panic(err) + } - // Prepare the entire Sliver Command-line Interface as yielder functions: - // - Server commands are all commands which don't need an active Sliver implant. - // These commands include a server-binary-specific set of "teamserver" commands. - // - Sliver commands are all commands requiring an active target. - serverCmds, sliverCmds := getSliverCommands(teamserver, con) + // Use the specific set of dialing options passed by the teamserver, + // and use them to create an in-memory sliver teamclient, identical + // in behavior to remote ones. + // The client has no commands available yet. + con, err := client.NewSliverClient(opts...) + if err != nil { + panic(err) + } - // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with - // a pre-runner ensuring the server and its teamclient are set up and connected. - rootCmd := serverCmds() - rootCmd.Use = "sliver-server" // Needed by completion scripts. + // Generate our complete Sliver Framework command-line interface. + rootCmd, server := sliverServerCLI(teamserver, con) // Bind the closed-loop console: // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) - - // Completion setup: - carapace.Gen(rootCmd) - command.BindRunners(rootCmd, true, preRunServer(teamserver, con)) - // command.BindRunners(rootCmd, false, func(_ *cobra.Command, _ []string) error { - // return con.Teamclient.Disconnect() - // }) + rootCmd.AddCommand(consoleCmd.Command(con, server)) // Run the target Sliver command: // Three different examples here, to illustrate. @@ -110,86 +97,57 @@ func Execute() { } } -// newSliverServer creates a new application teamserver. -// The gRPC listener is hooked with an in-memory teamclient, and the latter -// is passed to our client console package to create a new SliverClient. -func newSliverServer() (*teamserver.Server, *client.SliverClient) { - // - // 1) Teamserver --------- - // - - // We can use several teamserver listener/stack backends. - tlsListener := transport.NewListener() - tailscaleListener := transport.NewTailScaleListener() - - // Here is an import step, where we are given a change to setup - // the reeflective/teamserver with everything we want: our own - // database, the application daemon default port, loggers or files, - // directories, and much more. - var serverOpts []teamserver.Options - serverOpts = append(serverOpts, - teamserver.WithDefaultPort(31337), - teamserver.WithListener(tlsListener), - teamserver.WithListener(tailscaleListener), - ) - - // Create the application teamserver. - // Any error is critical, and means we can't work correctly. - teamserver, err := teamserver.New("sliver", serverOpts...) - if err != nil { - log.Fatal(err) - } +// sliverServerCLI returns the entire command tree of the Sliver Framework as yielder functions. +// The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped with +// all prerunners needed to connect to remote Sliver teamservers. +// It will also register the appropriate teamclient management commands. +// +// Counterpart of sliver/client/cli.SliverCLI() (not identical: no implant command here). +func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command, server console.Commands) { + teamserverCmds := teamserverCmds(team, con) - // - // 2) Teamclient --------- - // + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + server = command.ServerCommands(con, teamserverCmds) - // The gRPC teamserver backend is hooked to produce a single - // in-memory teamclient RPC/dialer backend. Not encrypted. - gTeamclient := transport.NewClientFrom(tlsListener) + root = server() + root.Use = "sliver-server" // Needed by completion scripts. - // Pass the gRPC teamclient backend to our console package, - // with registers a hook to bind its RPC client and start - // monitoring events/logs/etc when asked to connect. - // - // The options returned are used to dictate to the server - // how it should configure and run its self-teamclient. - sliver, opts := client.NewSliverClient(gTeamclient) + // Pre/post runners and completions. + command.BindRunners(root, true, preRunServer(team, con)) + command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + return con.Disconnect() + }) - // And let the server create its own teamclient, - // pass to the Sliver client for normal usage. - sliver.Teamclient = teamserver.Self(opts...) + // Generate the root completion command. + carapace.Gen(root) - return teamserver, sliver + return root, server } -// getSliverCommands wraps the `teamserver` specific commands in a command yielder function, passes those -// server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode -// agnostic Command-Line-Interface for the Sliver Framework. -func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func(con *client.SliverClient) (cmds []*cobra.Command) { +// Yielder function for server-binary only functions. +func teamserverCmds(teamserver *server.Server, con *client.SliverClient) func(con *client.SliverClient) (cmds []*cobra.Command) { + return func(con *client.SliverClient) (cmds []*cobra.Command) { // Teamserver management cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) // Sliver-specific cmds = append(cmds, version.Commands(con)...) cmds = append(cmds, assetsCmds.Commands()...) - cmds = append(cmds, builderCmds.Commands(con)...) cmds = append(cmds, certsCmds.Commands(con)...) + // Commands requiring the server to be a remote teamclient. + cmds = append(cmds, builderCmds.Commands(con, teamserver)...) + return cmds } - - serverCmds := command.ServerCommands(con, teamserverCmds) - sliverCmds := command.SliverCommands(con) - - return serverCmds, sliverCmds } // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(cmd *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, args []string) error { // Ensure the server has what it needs. assets.Setup(false, true) encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? @@ -199,42 +157,20 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c cryptography.MinisignServerPrivateKey() // TODO: Move this out of here. - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - // Don't stream console asciicast/logs when using the completion subcommand. - // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - if compCommandCalled(cmd) { - con.CompleteDisableLog() - } + // serverConfig := configs.GetServerConfig() + // c2.StartPersistentJobs(serverConfig) // Let our in-memory teamclient be served. - return teamserver.Serve(con.Teamclient) - } -} - -func compCommandCalled(cmd *cobra.Command) bool { - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - return true + err := teamserver.Serve(con.Teamclient) + if err != nil { + return err } - } - return false + return con.ConnectRun(cmd, args) + } } // preRun := func(cmd *cobra.Command, _ []string) error { -// // Ensure the server has what it needs -// assets.Setup(false, true) -// certs.SetupCAs() -// certs.SetupWGKeys() -// cryptography.AgeServerKeyPair() -// cryptography.MinisignServerPrivateKey() -// -// // Let our runtime teamclient be served. -// if err := teamserver.Serve(teamclient); err != nil { -// return err -// } // // // Start persistent implant/c2 jobs (not teamservers) // // serverConfig := configs.GetServerConfig() From 96585c13dba08e7a1ce04b78dd44e77373c11131 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 22:25:35 +0200 Subject: [PATCH 060/109] Comment console command yielder --- client/cli/cli.go | 2 +- client/command/console/console.go | 6 ++++++ server/cli/cli.go | 2 -- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 7e4469cc70..7aa4bd9bab 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -31,7 +31,7 @@ import ( "github.com/spf13/cobra" ) -// Execute - Run the sliver-client binary. +// Execute - Run the sliver client binary. func Execute() { // Create a client-only (remote TLS-transported connections) // Sliver Client, prepared with a working reeflective/teamclient. diff --git a/client/command/console/console.go b/client/command/console/console.go index a53e2ae533..8570ffb9f3 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -26,6 +26,12 @@ import ( "github.com/spf13/cobra" ) +// Command returns the closed-loop Sliver console command. +// +// The latter requires only the set of "server" commands, that is, all commands that +// do not require an active target to run on. This is only because sliver-client/server +// binaries are distinct, and the implant command tree does not care about this, so it +// is always the same in the console. func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", diff --git a/server/cli/cli.go b/server/cli/cli.go index 2bef0643f9..2273866bd2 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -183,7 +183,5 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c // // teamserver.ListenerStartPersistents() // Automatically logged errors. // // // console.StartPersistentJobs(serverConfig) // Old alternative // // } -// -// console.StartClient(con, nil, nil) // return nil // } From 9d769759e1324b922573eb3b5f22fcceb24f5322 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 22:40:04 +0200 Subject: [PATCH 061/109] Move console connection funcs --- client/console/console.go | 94 ---------------------------- client/console/teamclient.go | 116 ++++++++++++++++++++++++++++++++--- 2 files changed, 109 insertions(+), 101 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index f00b5f0fb6..3ab821814a 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -33,7 +33,6 @@ import ( "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" @@ -43,7 +42,6 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" - "github.com/rsteube/carapace" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" @@ -215,86 +213,6 @@ func newClient() *SliverClient { return con } -// ConnectRun is a spf13/cobra-compliant runner function to be included -// in/as any of the runners that such cobra.Commands offer to use. -// -// The function will connect the Sliver teamclient to a remote server, -// register its client RPC interfaces, and start handling events/log streams. -// -// Note that this function will always check if it used as part of a completion -// command execution call, in which case asciicast/logs streaming is disabled. -func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { - // Let our teamclient connect the transport/RPC stack. - // Note that this uses a sync.Once to ensure we don't - // connect more than once. - err := con.Teamclient.Connect() - if err != nil { - return err - } - - // Register our Sliver client services, and monitor events. - // Also set ourselves up to save our client commands in history. - con.connect(con.dialer.Conn) - - // Never enable asciicasts/logs streaming when this - // client is used to perform completions. Both of these will tinker - // with very low-level IO and very often don't work nice together. - if compCommandCalled(cmd) { - return nil - } - - // Else, initialize our logging/asciicasts streams. - return con.startClientLog() -} - -// ConnectComplete is a special connection mode which should be -// called in completer functions that need to use the client RPC. -// It is almost equivalent to client.ConnectRun(), but for completions. -// -// If the connection failed, an error is returned along with a completion -// action include the error as a status message, to be returned by completers. -// -// This function is safe to call regardless of the client being used -// as a closed-loop console mode or in an exec-once CLI mode. -func (con *SliverClient) ConnectComplete() (carapace.Action, error) { - err := con.Teamclient.Connect() - if err != nil { - return carapace.ActionMessage("connection error: %s", err), nil - } - - return carapace.ActionValues(), nil -} - -// connect requires a working gRPC connection to the sliver server. -// It starts monitoring events, implant tunnels and client logs streams. -func (con *SliverClient) connect(conn *grpc.ClientConn) { - con.Rpc = rpcpb.NewSliverRPCClient(conn) - - // Events - go con.startEventLoop() - go core.TunnelLoop(con.Rpc) - - // History sources - sliver := con.App.Menu(consts.ImplantMenu) - - histuser, err := con.newImplantHistory(true) - if err == nil { - sliver.AddHistorySource("implant history (user)", histuser) - } - - histAll, err := con.newImplantHistory(false) - if err == nil { - sliver.AddHistorySource("implant history (all users)", histAll) - } - - con.ActiveTarget.hist = histAll - - con.closeLogs = append(con.closeLogs, func() { - histuser.Close() - histAll.Close() - }) -} - // StartConsole is a blocking call that starts the Sliver closed console. // The command/events/log outputs use the specific-console fmt.Printer, // because the console needs to query the terminal for cursor positions @@ -305,18 +223,6 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// Disconnect disconnectss the client from its Sliver server, -// closing all its event/log streams and files, then closing -// the core Sliver RPC client connection. -// After this call, the client can reconnect should it want to. -func (con *SliverClient) Disconnect() error { - // Close all RPC streams and local files. - con.closeClientStreams() - - // Close the RPC client connection. - return con.Teamclient.Disconnect() -} - // Expose or hide commands if the active target does support them (or not). // Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. func (con *SliverClient) ExposeCommands() { diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 1aaae8af9d..07eff8dc98 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -23,22 +23,94 @@ import ( "errors" "time" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "google.golang.org/grpc" "google.golang.org/grpc/status" ) +// ConnectRun is a spf13/cobra-compliant runner function to be included +// in/as any of the runners that such cobra.Commands offer to use. +// +// The function will connect the Sliver teamclient to a remote server, +// register its client RPC interfaces, and start handling events/log streams. +// +// Note that this function will always check if it used as part of a completion +// command execution call, in which case asciicast/logs streaming is disabled. +func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { + // Let our teamclient connect the transport/RPC stack. + // Note that this uses a sync.Once to ensure we don't + // connect more than once. + err := con.Teamclient.Connect() + if err != nil { + return err + } + + // Register our Sliver client services, and monitor events. + // Also set ourselves up to save our client commands in history. + con.connect(con.dialer.Conn) + + // Never enable asciicasts/logs streaming when this + // client is used to perform completions. Both of these will tinker + // with very low-level IO and very often don't work nice together. + if compCommandCalled(cmd) { + return nil + } + + // Else, initialize our logging/asciicasts streams. + return con.startClientLog() +} + +// ConnectComplete is a special connection mode which should be +// called in completer functions that need to use the client RPC. +// It is almost equivalent to client.ConnectRun(), but for completions. +// +// If the connection failed, an error is returned along with a completion +// action include the error as a status message, to be returned by completers. +// +// This function is safe to call regardless of the client being used +// as a closed-loop console mode or in an exec-once CLI mode. +func (con *SliverClient) ConnectComplete() (carapace.Action, error) { + err := con.Teamclient.Connect() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), nil + } + + // Register our Sliver client services, and monitor events. + // Also set ourselves up to save our client commands in history. + con.connect(con.dialer.Conn) + + return carapace.ActionValues(), nil +} + +// Disconnect disconnects the client from its Sliver server, +// closing all its event/log streams and files, then closing +// the core Sliver RPC client connection. +// After this call, the client can reconnect should it want to. +func (con *SliverClient) Disconnect() error { + // Close all RPC streams and local files. + con.closeClientStreams() + + // Close the RPC client connection. + return con.Teamclient.Disconnect() +} + // Users returns a list of all users registered with the app teamserver. // If the gRPC teamclient is not connected or does not have an RPC client, // an ErrNoRPC is returned. -func (h *SliverClient) Users() (users []team.User, err error) { - if h.Rpc == nil { +func (con *SliverClient) Users() (users []team.User, err error) { + if con.Rpc == nil { return nil, errors.New("No Sliver client RPC") } - res, err := h.Rpc.GetUsers(context.Background(), &commonpb.Empty{}) + res, err := con.Rpc.GetUsers(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, h.UnwrapServerErr(err) + return nil, con.UnwrapServerErr(err) } for _, user := range res.GetUsers() { @@ -54,12 +126,12 @@ func (h *SliverClient) Users() (users []team.User, err error) { // ServerVersion returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. -func (h *SliverClient) Version() (version team.Version, err error) { - if h.Rpc == nil { +func (con *SliverClient) Version() (version team.Version, err error) { + if con.Rpc == nil { return version, errors.New("No Sliver client RPC") } - ver, err := h.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + ver, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { return version, errors.New(status.Convert(err).Message()) } @@ -75,3 +147,33 @@ func (h *SliverClient) Version() (version team.Version, err error) { Arch: ver.Arch, }, nil } + +// connect requires a working gRPC connection to the sliver server. +// It starts monitoring events, implant tunnels and client logs streams. +func (con *SliverClient) connect(conn *grpc.ClientConn) { + con.Rpc = rpcpb.NewSliverRPCClient(conn) + + // Events + go con.startEventLoop() + go core.TunnelLoop(con.Rpc) + + // History sources + sliver := con.App.Menu(consts.ImplantMenu) + + histuser, err := con.newImplantHistory(true) + if err == nil { + sliver.AddHistorySource("implant history (user)", histuser) + } + + histAll, err := con.newImplantHistory(false) + if err == nil { + sliver.AddHistorySource("implant history (all users)", histAll) + } + + con.ActiveTarget.hist = histAll + + con.closeLogs = append(con.closeLogs, func() { + histuser.Close() + histAll.Close() + }) +} From 6debdb8fea147af5a2477a75ae00f36347853be5 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 02:09:07 +0200 Subject: [PATCH 062/109] Fixes/tweaks to final command output printing --- client/cli/cli.go | 2 -- client/command/server.go | 1 + client/console/teamclient.go | 23 +++++++++++++++++++++++ server/cli/cli.go | 2 -- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 7aa4bd9bab..206d01ae5f 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -19,7 +19,6 @@ package cli */ import ( - "fmt" "os" "github.com/bishopfox/sliver/client/command" @@ -56,7 +55,6 @@ func Execute() { // Run the sliver client binary. if err := rootCmd.Execute(); err != nil { - fmt.Println(err) os.Exit(1) } } diff --git a/client/command/server.go b/client/command/server.go index abcdd7f2be..73225d9844 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -60,6 +60,7 @@ func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console. server := &cobra.Command{ Short: "Server commands", TraverseChildren: true, + SilenceUsage: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 07eff8dc98..207f665c7d 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -43,6 +43,11 @@ import ( // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { + // Some commands don't need a remote teamserver connection. + if con.isOffline(cmd) { + return nil + } + // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. @@ -177,3 +182,21 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { histAll.Close() }) } + +// WARN: this is the premise of a big burden. Please bear this in mind. +// If I haven't speaked to you about it, or if you're not sure of what +// that means, ping me up and ask. +func (con *SliverClient) isOffline(cmd *cobra.Command) bool { + // Teamclient configuration import does not need network. + ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) + if err == nil && ts != nil && ts == cmd { + return true + } + + tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) + if err == nil && ts != nil && tc == cmd { + return true + } + + return false +} diff --git a/server/cli/cli.go b/server/cli/cli.go index 2273866bd2..e2fed0376e 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -19,7 +19,6 @@ package cli */ import ( - "fmt" "os" // CLI dependencies @@ -92,7 +91,6 @@ func Execute() { // set above in the code has been given a single hook to register its RPC backend. // The call blocks like your old daemon command, and works _just the same_. if err := rootCmd.Execute(); err != nil { - fmt.Println(err) os.Exit(1) } } From 2af630e46016638f2379449904ac754c4e898374 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 02:53:41 +0200 Subject: [PATCH 063/109] Keep tidying --- client/command/server.go | 4 +-- client/console/console.go | 6 +++-- client/console/teamclient.go | 39 +++++++++++++++++++++++++--- server/cli/cli.go | 47 ++++++++-------------------------- server/command/server.go | 49 ++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 43 deletions(-) create mode 100644 server/command/server.go diff --git a/client/command/server.go b/client/command/server.go index 73225d9844..0af107fe39 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -51,11 +51,11 @@ import ( "github.com/spf13/cobra" ) -type CommandBinder func(con *client.SliverClient) []*cobra.Command +type SliverBinder func(con *client.SliverClient) []*cobra.Command // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", diff --git a/client/console/console.go b/client/console/console.go index 3ab821814a..cabc315640 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -107,8 +107,9 @@ type SliverClient struct { IsCLI bool // Teamclient & remotes - Teamclient *client.Client - dialer *transport.TeamClient + Teamclient *client.Client + dialer *transport.TeamClient + connectHooks []func() error // Logging jsonHandler slog.Handler @@ -146,6 +147,7 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { var clientOpts []client.Options clientOpts = append(clientOpts, + client.WithHomeDirectory(assets.GetRootAppDir()), client.WithDialer(con.dialer), ) diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 207f665c7d..bed430783a 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -48,10 +48,15 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { return nil } + err := con.runPreConnectHooks() + if err != nil { + return err + } + // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. - err := con.Teamclient.Connect() + err = con.Teamclient.Connect() if err != nil { return err } @@ -81,9 +86,15 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. func (con *SliverClient) ConnectComplete() (carapace.Action, error) { - err := con.Teamclient.Connect() + // This almost only ever runs teamserver-side pre-runs. + err := con.runPreConnectHooks() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), err + } + + err = con.Teamclient.Connect() if err != nil { - return carapace.ActionMessage("connection error: %s", err), nil + return carapace.ActionMessage("connection error: %s", err), err } // Register our Sliver client services, and monitor events. @@ -105,6 +116,14 @@ func (con *SliverClient) Disconnect() error { return con.Teamclient.Disconnect() } +// AddConnectHooks should be considered part of the temporary API. +// It is used to all the Sliver client to run hooks before running +// its own pre-connect handlers, and can thus be used to register +// server-only pre-run routines. +func (con *SliverClient) AddConnectHooks(hooks ...func() error) { + con.connectHooks = append(con.connectHooks, hooks...) +} + // Users returns a list of all users registered with the app teamserver. // If the gRPC teamclient is not connected or does not have an RPC client, // an ErrNoRPC is returned. @@ -183,6 +202,20 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { }) } +func (con *SliverClient) runPreConnectHooks() error { + for _, hook := range con.connectHooks { + if hook == nil { + continue + } + + if err := hook(); err != nil { + return err + } + } + + return nil +} + // WARN: this is the premise of a big burden. Please bear this in mind. // If I haven't speaked to you about it, or if you're not sure of what // that means, ping me up and ask. diff --git a/server/cli/cli.go b/server/cli/cli.go index e2fed0376e..b1840899e7 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -28,16 +28,12 @@ import ( // Teamserver/teamclient dependencies "github.com/reeflective/team/server" - "github.com/reeflective/team/server/commands" // Sliver Client core, and generic/server-only commands - "github.com/bishopfox/sliver/client/command" + clientCommand "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - assetsCmds "github.com/bishopfox/sliver/server/command/assets" - builderCmds "github.com/bishopfox/sliver/server/command/builder" - certsCmds "github.com/bishopfox/sliver/server/command/certs" - "github.com/bishopfox/sliver/server/command/version" + "github.com/bishopfox/sliver/server/command" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -66,6 +62,8 @@ func Execute() { panic(err) } + con.AddConnectHooks(preRunServer(teamserver, con)) + // Generate our complete Sliver Framework command-line interface. rootCmd, server := sliverServerCLI(teamserver, con) @@ -102,19 +100,19 @@ func Execute() { // // Counterpart of sliver/client/cli.SliverCLI() (not identical: no implant command here). func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command, server console.Commands) { - teamserverCmds := teamserverCmds(team, con) + teamserverCmds := command.TeamserverCommands(team, con) // Generate a single tree instance of server commands: // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. - server = command.ServerCommands(con, teamserverCmds) + server = clientCommand.ServerCommands(con, teamserverCmds) root = server() root.Use = "sliver-server" // Needed by completion scripts. // Pre/post runners and completions. - command.BindRunners(root, true, preRunServer(team, con)) - command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + clientCommand.BindRunners(root, true, con.ConnectRun) + clientCommand.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) @@ -124,28 +122,10 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra return root, server } -// Yielder function for server-binary only functions. -func teamserverCmds(teamserver *server.Server, con *client.SliverClient) func(con *client.SliverClient) (cmds []*cobra.Command) { - return func(con *client.SliverClient) (cmds []*cobra.Command) { - // Teamserver management - cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) - - // Sliver-specific - cmds = append(cmds, version.Commands(con)...) - cmds = append(cmds, assetsCmds.Commands()...) - cmds = append(cmds, certsCmds.Commands(con)...) - - // Commands requiring the server to be a remote teamclient. - cmds = append(cmds, builderCmds.Commands(con, teamserver)...) - - return cmds - } -} - // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. -func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(cmd *cobra.Command, args []string) error { +func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { + return func() error { // Ensure the server has what it needs. assets.Setup(false, true) encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? @@ -159,12 +139,7 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c // c2.StartPersistentJobs(serverConfig) // Let our in-memory teamclient be served. - err := teamserver.Serve(con.Teamclient) - if err != nil { - return err - } - - return con.ConnectRun(cmd, args) + return teamserver.Serve(con.Teamclient) } } diff --git a/server/command/server.go b/server/command/server.go new file mode 100644 index 0000000000..f8a328946f --- /dev/null +++ b/server/command/server.go @@ -0,0 +1,49 @@ +package command + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/server/command/assets" + "github.com/bishopfox/sliver/server/command/builder" + "github.com/bishopfox/sliver/server/command/certs" + "github.com/bishopfox/sliver/server/command/version" + "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" + "github.com/spf13/cobra" +) + +// TeamserverCommands is the equivalent of client/command.ServerCommands(), but for server-binary only ones. +func TeamserverCommands(team *server.Server, con *console.SliverClient) command.SliverBinder { + return func(con *console.SliverClient) (cmds []*cobra.Command) { + // Teamserver management + cmds = append(cmds, commands.Generate(team, con.Teamclient)) + + // Sliver-specific + cmds = append(cmds, version.Commands(con)...) + cmds = append(cmds, assets.Commands()...) + cmds = append(cmds, certs.Commands(con)...) + + // Commands requiring the server to be a remote teamclient. + cmds = append(cmds, builder.Commands(con, team)...) + + return cmds + } +} From da42eab2b3b8060da7dba5edc15896cf10fe6a39 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 02:58:32 +0200 Subject: [PATCH 064/109] Cleanup --- client/cli/cli.go | 4 ++-- client/command/server.go | 6 +++--- server/cli/cli.go | 6 ++++-- server/transport/server.go | 15 ++++++++++++--- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 206d01ae5f..5c0f684d4d 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -88,8 +88,8 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Co root.AddCommand(implantCmd(con, sliver)) // Pre/post runners and completions. - command.BindRunners(root, true, con.ConnectRun) - command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + command.BindPrePost(root, true, con.ConnectRun) + command.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) diff --git a/client/command/server.go b/client/command/server.go index 0af107fe39..7f271c6140 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -151,13 +151,13 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C return serverCommands } -// BindRunners is used to register specific pre/post-runs for a given command/tree. +// BindPrePost is used to register specific pre/post-runs for a given command/tree. // // This function is special in that it will only bind the pre/post-runners to commands // in the tree if they have a non-nil Run/RunE function, or if they are leaf commands. // // This allows us to optimize client-to-server connections for things like completions. -func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { +func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { for _, cmd := range root.Commands() { ePreE := cmd.PersistentPreRunE ePostE := cmd.PersistentPostRunE @@ -173,7 +173,7 @@ func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ // Always go to find the leaf commands, irrespective // of what we do with this parent command. if cmd.HasSubCommands() { - BindRunners(cmd, pre, runs...) + BindPrePost(cmd, pre, runs...) } // If the command has no runners, there's nothing to bind: diff --git a/server/cli/cli.go b/server/cli/cli.go index b1840899e7..f3925e637e 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -62,6 +62,8 @@ func Execute() { panic(err) } + // The server is also a client of itself, so add our sliver-server + // binary specific pre-run hooks: assets, encoders, toolchains, etc. con.AddConnectHooks(preRunServer(teamserver, con)) // Generate our complete Sliver Framework command-line interface. @@ -111,8 +113,8 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra root.Use = "sliver-server" // Needed by completion scripts. // Pre/post runners and completions. - clientCommand.BindRunners(root, true, con.ConnectRun) - clientCommand.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + clientCommand.BindPrePost(root, true, con.ConnectRun) + clientCommand.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) diff --git a/server/transport/server.go b/server/transport/server.go index 0b7684553c..7ef8f19403 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -28,6 +28,9 @@ import ( "google.golang.org/grpc/test/bufconn" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/assets" + "github.com/bishopfox/sliver/server/db" + "github.com/bishopfox/sliver/server/log" "github.com/bishopfox/sliver/server/rpc" ) @@ -56,9 +59,15 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // directories, and much more. var serverOpts []server.Options serverOpts = append(serverOpts, - server.WithDefaultPort(31337), - server.WithListener(tlsListener), - server.WithListener(tailscaleListener), + // Core directories/loggers. + server.WithHomeDirectory(assets.GetRootAppDir()), // ~/.sliver/ + server.WithLogger(log.RootLogger), // Logs to ~/.sliver/logs/sliver.{log,json} and audit.json + server.WithDatabase(db.Session()), // Uses our traditional ~/.sliver/sliver.db for storing users. + + // Network options/stacks + server.WithDefaultPort(31337), // Our now famous port. + server.WithListener(tlsListener), // Our legacy TCP+MTLS gRPC stack. + server.WithListener(tailscaleListener), // And our new Tailscale variant. ) // Create the application teamserver. From 27af8827185a9628724b906a9d4b3d931f7b05f3 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 03:14:24 +0200 Subject: [PATCH 065/109] Most of the transition to team/server & team/client is done. --- protobuf/clientpb/client.pb.go | 4503 ++++++++++++++-------------- protobuf/clientpb/client.proto | 14 +- protobuf/rpcpb/services.pb.go | 2102 ++++++------- protobuf/rpcpb/services.proto | 3 +- protobuf/rpcpb/services_grpc.pb.go | 41 +- server/command/builder/builder.go | 43 +- server/rpc/rpc-teamclient.go | 73 + server/rpc/rpc.go | 33 +- 8 files changed, 3529 insertions(+), 3283 deletions(-) create mode 100644 server/rpc/rpc-teamclient.go diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index d182722f8d..1649d20030 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1115,7 +1115,125 @@ func (x *Version) GetArch() string { return "" } -// [ Client Logs ] ---------------------------------------- +type Users struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` +} + +func (x *Users) Reset() { + *x = Users{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Users) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Users) ProtoMessage() {} + +func (x *Users) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Users.ProtoReflect.Descriptor instead. +func (*Users) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{1} +} + +func (x *Users) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` + LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` + Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetOnline() bool { + if x != nil { + return x.Online + } + return false +} + +func (x *User) GetLastSeen() int64 { + if x != nil { + return x.LastSeen + } + return 0 +} + +func (x *User) GetClients() int32 { + if x != nil { + return x.Clients + } + return 0 +} + +// [ Client Logs ] ------------------------------------------ type ClientLogData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1128,7 +1246,7 @@ type ClientLogData struct { func (x *ClientLogData) Reset() { *x = ClientLogData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[1] + mi := &file_clientpb_client_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1141,7 +1259,7 @@ func (x *ClientLogData) String() string { func (*ClientLogData) ProtoMessage() {} func (x *ClientLogData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[1] + mi := &file_clientpb_client_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1154,7 +1272,7 @@ func (x *ClientLogData) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientLogData.ProtoReflect.Descriptor instead. func (*ClientLogData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{1} + return file_clientpb_client_proto_rawDescGZIP(), []int{3} } func (x *ClientLogData) GetStream() string { @@ -1188,7 +1306,7 @@ type ImplantCommand struct { func (x *ImplantCommand) Reset() { *x = ImplantCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1201,7 +1319,7 @@ func (x *ImplantCommand) String() string { func (*ImplantCommand) ProtoMessage() {} func (x *ImplantCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1214,7 +1332,7 @@ func (x *ImplantCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantCommand.ProtoReflect.Descriptor instead. func (*ImplantCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{2} + return file_clientpb_client_proto_rawDescGZIP(), []int{4} } func (x *ImplantCommand) GetStream() string { @@ -1281,7 +1399,7 @@ type HistoryRequest struct { func (x *HistoryRequest) Reset() { *x = HistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1294,7 +1412,7 @@ func (x *HistoryRequest) String() string { func (*HistoryRequest) ProtoMessage() {} func (x *HistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1307,7 +1425,7 @@ func (x *HistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. func (*HistoryRequest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{3} + return file_clientpb_client_proto_rawDescGZIP(), []int{5} } func (x *HistoryRequest) GetUserOnly() bool { @@ -1360,7 +1478,7 @@ type History struct { func (x *History) Reset() { *x = History{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1373,7 +1491,7 @@ func (x *History) String() string { func (*History) ProtoMessage() {} func (x *History) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1386,7 +1504,7 @@ func (x *History) ProtoReflect() protoreflect.Message { // Deprecated: Use History.ProtoReflect.Descriptor instead. func (*History) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{4} + return file_clientpb_client_proto_rawDescGZIP(), []int{6} } func (x *History) GetHistoryLen() int32 { @@ -1453,7 +1571,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1466,7 +1584,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1479,7 +1597,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{5} + return file_clientpb_client_proto_rawDescGZIP(), []int{7} } func (x *Session) GetID() string { @@ -1695,7 +1813,7 @@ type Beacon struct { func (x *Beacon) Reset() { *x = Beacon{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1708,7 +1826,7 @@ func (x *Beacon) String() string { func (*Beacon) ProtoMessage() {} func (x *Beacon) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1721,7 +1839,7 @@ func (x *Beacon) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacon.ProtoReflect.Descriptor instead. func (*Beacon) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{6} + return file_clientpb_client_proto_rawDescGZIP(), []int{8} } func (x *Beacon) GetID() string { @@ -1931,7 +2049,7 @@ type Beacons struct { func (x *Beacons) Reset() { *x = Beacons{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1944,7 +2062,7 @@ func (x *Beacons) String() string { func (*Beacons) ProtoMessage() {} func (x *Beacons) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1957,7 +2075,7 @@ func (x *Beacons) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacons.ProtoReflect.Descriptor instead. func (*Beacons) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{7} + return file_clientpb_client_proto_rawDescGZIP(), []int{9} } func (x *Beacons) GetBeacons() []*Beacon { @@ -1986,7 +2104,7 @@ type BeaconTask struct { func (x *BeaconTask) Reset() { *x = BeaconTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1999,7 +2117,7 @@ func (x *BeaconTask) String() string { func (*BeaconTask) ProtoMessage() {} func (x *BeaconTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2012,7 +2130,7 @@ func (x *BeaconTask) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTask.ProtoReflect.Descriptor instead. func (*BeaconTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{8} + return file_clientpb_client_proto_rawDescGZIP(), []int{10} } func (x *BeaconTask) GetID() string { @@ -2090,7 +2208,7 @@ type BeaconTasks struct { func (x *BeaconTasks) Reset() { *x = BeaconTasks{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2103,7 +2221,7 @@ func (x *BeaconTasks) String() string { func (*BeaconTasks) ProtoMessage() {} func (x *BeaconTasks) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2116,7 +2234,7 @@ func (x *BeaconTasks) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTasks.ProtoReflect.Descriptor instead. func (*BeaconTasks) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{9} + return file_clientpb_client_proto_rawDescGZIP(), []int{11} } func (x *BeaconTasks) GetBeaconID() string { @@ -2146,7 +2264,7 @@ type ImplantC2 struct { func (x *ImplantC2) Reset() { *x = ImplantC2{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2159,7 +2277,7 @@ func (x *ImplantC2) String() string { func (*ImplantC2) ProtoMessage() {} func (x *ImplantC2) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2172,7 +2290,7 @@ func (x *ImplantC2) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantC2.ProtoReflect.Descriptor instead. func (*ImplantC2) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{10} + return file_clientpb_client_proto_rawDescGZIP(), []int{12} } func (x *ImplantC2) GetPriority() uint32 { @@ -2255,7 +2373,7 @@ type ImplantConfig struct { func (x *ImplantConfig) Reset() { *x = ImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2268,7 +2386,7 @@ func (x *ImplantConfig) String() string { func (*ImplantConfig) ProtoMessage() {} func (x *ImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2281,7 +2399,7 @@ func (x *ImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantConfig.ProtoReflect.Descriptor instead. func (*ImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{11} + return file_clientpb_client_proto_rawDescGZIP(), []int{13} } func (x *ImplantConfig) GetID() string { @@ -2634,7 +2752,7 @@ type TrafficEncoder struct { func (x *TrafficEncoder) Reset() { *x = TrafficEncoder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2647,7 +2765,7 @@ func (x *TrafficEncoder) String() string { func (*TrafficEncoder) ProtoMessage() {} func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2660,7 +2778,7 @@ func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoder.ProtoReflect.Descriptor instead. func (*TrafficEncoder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{12} + return file_clientpb_client_proto_rawDescGZIP(), []int{14} } func (x *TrafficEncoder) GetID() uint64 { @@ -2703,7 +2821,7 @@ type TrafficEncoderMap struct { func (x *TrafficEncoderMap) Reset() { *x = TrafficEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2716,7 +2834,7 @@ func (x *TrafficEncoderMap) String() string { func (*TrafficEncoderMap) ProtoMessage() {} func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2729,7 +2847,7 @@ func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderMap.ProtoReflect.Descriptor instead. func (*TrafficEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{13} + return file_clientpb_client_proto_rawDescGZIP(), []int{15} } func (x *TrafficEncoderMap) GetEncoders() map[string]*TrafficEncoder { @@ -2755,7 +2873,7 @@ type TrafficEncoderTest struct { func (x *TrafficEncoderTest) Reset() { *x = TrafficEncoderTest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2768,7 +2886,7 @@ func (x *TrafficEncoderTest) String() string { func (*TrafficEncoderTest) ProtoMessage() {} func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,7 +2899,7 @@ func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTest.ProtoReflect.Descriptor instead. func (*TrafficEncoderTest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{14} + return file_clientpb_client_proto_rawDescGZIP(), []int{16} } func (x *TrafficEncoderTest) GetName() string { @@ -2840,7 +2958,7 @@ type TrafficEncoderTests struct { func (x *TrafficEncoderTests) Reset() { *x = TrafficEncoderTests{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2971,7 @@ func (x *TrafficEncoderTests) String() string { func (*TrafficEncoderTests) ProtoMessage() {} func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2984,7 @@ func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTests.ProtoReflect.Descriptor instead. func (*TrafficEncoderTests) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{15} + return file_clientpb_client_proto_rawDescGZIP(), []int{17} } func (x *TrafficEncoderTests) GetEncoder() *TrafficEncoder { @@ -2909,7 +3027,7 @@ type ExternalImplantConfig struct { func (x *ExternalImplantConfig) Reset() { *x = ExternalImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2922,7 +3040,7 @@ func (x *ExternalImplantConfig) String() string { func (*ExternalImplantConfig) ProtoMessage() {} func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2935,7 +3053,7 @@ func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantConfig.ProtoReflect.Descriptor instead. func (*ExternalImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{16} + return file_clientpb_client_proto_rawDescGZIP(), []int{18} } func (x *ExternalImplantConfig) GetConfig() *ImplantConfig { @@ -2965,7 +3083,7 @@ type ExternalImplantBinary struct { func (x *ExternalImplantBinary) Reset() { *x = ExternalImplantBinary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2978,7 +3096,7 @@ func (x *ExternalImplantBinary) String() string { func (*ExternalImplantBinary) ProtoMessage() {} func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2991,7 +3109,7 @@ func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantBinary.ProtoReflect.Descriptor instead. func (*ExternalImplantBinary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{17} + return file_clientpb_client_proto_rawDescGZIP(), []int{19} } func (x *ExternalImplantBinary) GetName() string { @@ -3027,7 +3145,7 @@ type ImplantBuilds struct { func (x *ImplantBuilds) Reset() { *x = ImplantBuilds{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3040,7 +3158,7 @@ func (x *ImplantBuilds) String() string { func (*ImplantBuilds) ProtoMessage() {} func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3053,7 +3171,7 @@ func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantBuilds.ProtoReflect.Descriptor instead. func (*ImplantBuilds) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{18} + return file_clientpb_client_proto_rawDescGZIP(), []int{20} } func (x *ImplantBuilds) GetConfigs() map[string]*ImplantConfig { @@ -3076,7 +3194,7 @@ type CompilerTarget struct { func (x *CompilerTarget) Reset() { *x = CompilerTarget{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3089,7 +3207,7 @@ func (x *CompilerTarget) String() string { func (*CompilerTarget) ProtoMessage() {} func (x *CompilerTarget) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3102,7 +3220,7 @@ func (x *CompilerTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use CompilerTarget.ProtoReflect.Descriptor instead. func (*CompilerTarget) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{19} + return file_clientpb_client_proto_rawDescGZIP(), []int{21} } func (x *CompilerTarget) GetGOOS() string { @@ -3140,7 +3258,7 @@ type CrossCompiler struct { func (x *CrossCompiler) Reset() { *x = CrossCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3153,7 +3271,7 @@ func (x *CrossCompiler) String() string { func (*CrossCompiler) ProtoMessage() {} func (x *CrossCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3166,7 +3284,7 @@ func (x *CrossCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use CrossCompiler.ProtoReflect.Descriptor instead. func (*CrossCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{20} + return file_clientpb_client_proto_rawDescGZIP(), []int{22} } func (x *CrossCompiler) GetTargetGOOS() string { @@ -3212,7 +3330,7 @@ type Compiler struct { func (x *Compiler) Reset() { *x = Compiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3225,7 +3343,7 @@ func (x *Compiler) String() string { func (*Compiler) ProtoMessage() {} func (x *Compiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3238,7 +3356,7 @@ func (x *Compiler) ProtoReflect() protoreflect.Message { // Deprecated: Use Compiler.ProtoReflect.Descriptor instead. func (*Compiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{21} + return file_clientpb_client_proto_rawDescGZIP(), []int{23} } func (x *Compiler) GetGOOS() string { @@ -3290,7 +3408,7 @@ type MetasploitModule struct { func (x *MetasploitModule) Reset() { *x = MetasploitModule{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3303,7 +3421,7 @@ func (x *MetasploitModule) String() string { func (*MetasploitModule) ProtoMessage() {} func (x *MetasploitModule) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3316,7 +3434,7 @@ func (x *MetasploitModule) ProtoReflect() protoreflect.Message { // Deprecated: Use MetasploitModule.ProtoReflect.Descriptor instead. func (*MetasploitModule) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} } func (x *MetasploitModule) GetName() string { @@ -3362,7 +3480,7 @@ type MetasploitCompiler struct { func (x *MetasploitCompiler) Reset() { *x = MetasploitCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3375,7 +3493,7 @@ func (x *MetasploitCompiler) String() string { func (*MetasploitCompiler) ProtoMessage() {} func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3388,7 +3506,7 @@ func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use MetasploitCompiler.ProtoReflect.Descriptor instead. func (*MetasploitCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{25} } func (x *MetasploitCompiler) GetVersion() string { @@ -3437,7 +3555,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3450,7 +3568,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3463,7 +3581,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } func (x *DeleteReq) GetName() string { @@ -3490,7 +3608,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3503,7 +3621,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3516,7 +3634,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } func (x *DNSCanary) GetImplantName() string { @@ -3572,7 +3690,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3585,7 +3703,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3598,7 +3716,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3620,7 +3738,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3633,7 +3751,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3646,7 +3764,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *UniqueWGIP) GetIP() string { @@ -3668,7 +3786,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3681,7 +3799,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3694,7 +3812,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *ImplantProfile) GetName() string { @@ -3722,7 +3840,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3735,7 +3853,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3748,7 +3866,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3769,7 +3887,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3782,7 +3900,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3795,7 +3913,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *RegenerateReq) GetImplantName() string { @@ -3822,7 +3940,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3835,7 +3953,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3848,7 +3966,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *Job) GetID() uint32 { @@ -3911,7 +4029,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3924,7 +4042,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3937,7 +4055,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *Jobs) GetActive() []*Job { @@ -3958,7 +4076,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3971,7 +4089,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3984,7 +4102,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *KillJobReq) GetID() uint32 { @@ -4006,7 +4124,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4019,7 +4137,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4032,7 +4150,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *KillJob) GetID() uint32 { @@ -4062,7 +4180,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4075,7 +4193,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4088,7 +4206,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *MTLSListenerReq) GetHost() string { @@ -4123,7 +4241,7 @@ type MTLSListener struct { func (x *MTLSListener) Reset() { *x = MTLSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4136,7 +4254,7 @@ func (x *MTLSListener) String() string { func (*MTLSListener) ProtoMessage() {} func (x *MTLSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4149,7 +4267,7 @@ func (x *MTLSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListener.ProtoReflect.Descriptor instead. func (*MTLSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *MTLSListener) GetJobID() uint32 { @@ -4175,7 +4293,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4188,7 +4306,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4201,7 +4319,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *WGListenerReq) GetHost() string { @@ -4257,7 +4375,7 @@ type WGListener struct { func (x *WGListener) Reset() { *x = WGListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4270,7 +4388,7 @@ func (x *WGListener) String() string { func (*WGListener) ProtoMessage() {} func (x *WGListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4283,7 +4401,7 @@ func (x *WGListener) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListener.ProtoReflect.Descriptor instead. func (*WGListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *WGListener) GetJobID() uint32 { @@ -4309,7 +4427,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4322,7 +4440,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4335,7 +4453,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *DNSListenerReq) GetDomains() []string { @@ -4391,7 +4509,7 @@ type DNSListener struct { func (x *DNSListener) Reset() { *x = DNSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4404,7 +4522,7 @@ func (x *DNSListener) String() string { func (*DNSListener) ProtoMessage() {} func (x *DNSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4417,7 +4535,7 @@ func (x *DNSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListener.ProtoReflect.Descriptor instead. func (*DNSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *DNSListener) GetJobID() uint32 { @@ -4450,7 +4568,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +4581,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4476,7 +4594,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *HTTPListenerReq) GetDomain() string { @@ -4583,7 +4701,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4596,7 +4714,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4609,7 +4727,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *NamedPipesReq) GetPipeName() string { @@ -4639,7 +4757,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4652,7 +4770,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4665,7 +4783,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *NamedPipes) GetSuccess() bool { @@ -4702,7 +4820,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4715,7 +4833,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4728,7 +4846,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *TCPPivotReq) GetAddress() string { @@ -4758,7 +4876,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4771,7 +4889,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4784,7 +4902,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *TCPPivot) GetSuccess() bool { @@ -4819,7 +4937,7 @@ type HTTPListener struct { func (x *HTTPListener) Reset() { *x = HTTPListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4832,7 +4950,7 @@ func (x *HTTPListener) String() string { func (*HTTPListener) ProtoMessage() {} func (x *HTTPListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4845,7 +4963,7 @@ func (x *HTTPListener) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListener.ProtoReflect.Descriptor instead. func (*HTTPListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *HTTPListener) GetJobID() uint32 { @@ -4866,7 +4984,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4879,7 +4997,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4892,7 +5010,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *Sessions) GetSessions() []*Session { @@ -4915,7 +5033,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4928,7 +5046,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4941,7 +5059,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *RenameReq) GetSessionID() string { @@ -4976,7 +5094,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4989,7 +5107,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5002,7 +5120,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -5023,7 +5141,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5036,7 +5154,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5049,7 +5167,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *Generate) GetFile() *commonpb.File { @@ -5075,7 +5193,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5088,7 +5206,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5101,7 +5219,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *MSFReq) GetPayload() string { @@ -5163,7 +5281,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5176,7 +5294,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5189,7 +5307,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *MSFRemoteReq) GetPayload() string { @@ -5259,7 +5377,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5272,7 +5390,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5285,7 +5403,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -5355,7 +5473,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5368,7 +5486,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5381,7 +5499,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *StagerListener) GetJobID() uint32 { @@ -5404,7 +5522,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5417,7 +5535,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5430,7 +5548,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5465,7 +5583,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5478,7 +5596,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5491,7 +5609,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *ShellcodeRDI) GetData() []byte { @@ -5519,7 +5637,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5532,7 +5650,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5545,7 +5663,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *MsfStagerReq) GetArch() string { @@ -5615,7 +5733,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5628,7 +5746,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5641,7 +5759,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5667,7 +5785,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5680,7 +5798,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5693,7 +5811,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5734,7 +5852,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5747,7 +5865,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5760,7 +5878,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *MigrateReq) GetPid() uint32 { @@ -5803,7 +5921,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5816,7 +5934,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5829,7 +5947,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5851,7 +5969,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5864,7 +5982,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5877,7 +5995,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5906,7 +6024,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5919,7 +6037,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5932,7 +6050,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -5964,7 +6082,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5977,7 +6095,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5990,7 +6108,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -6032,7 +6150,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6045,7 +6163,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6058,7 +6176,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -6082,7 +6200,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6095,7 +6213,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6108,7 +6226,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *Client) GetID() uint32 { @@ -6148,7 +6266,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6161,7 +6279,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6174,7 +6292,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *Event) GetEventType() string { @@ -6231,7 +6349,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6244,7 +6362,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6257,7 +6375,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Operator) GetOnline() bool { @@ -6289,7 +6407,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6302,7 +6420,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6315,7 +6433,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *WebContent) GetPath() string { @@ -6358,7 +6476,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6371,7 +6489,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6384,7 +6502,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *WebsiteAddContent) GetName() string { @@ -6413,7 +6531,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6426,7 +6544,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6439,7 +6557,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *WebsiteRemoveContent) GetName() string { @@ -6468,7 +6586,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6481,7 +6599,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6494,7 +6612,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *Website) GetName() string { @@ -6522,7 +6640,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6535,7 +6653,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6548,7 +6666,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *Websites) GetWebsites() []*Website { @@ -6572,7 +6690,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6585,7 +6703,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6598,7 +6716,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6645,7 +6763,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6658,7 +6776,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6671,7 +6789,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *Loot) GetID() string { @@ -6727,7 +6845,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6740,7 +6858,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6753,7 +6871,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *AllLoot) GetLoot() []*Loot { @@ -6777,7 +6895,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6790,7 +6908,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6803,7 +6921,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *IOC) GetPath() string { @@ -6838,7 +6956,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6851,7 +6969,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6864,7 +6982,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *ExtensionData) GetOutput() string { @@ -6891,7 +7009,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6904,7 +7022,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6917,7 +7035,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *Host) GetHostname() string { @@ -6980,7 +7098,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6993,7 +7111,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7006,7 +7124,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *AllHosts) GetHosts() []*Host { @@ -7033,7 +7151,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7046,7 +7164,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7059,7 +7177,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -7115,7 +7233,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7128,7 +7246,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7141,7 +7259,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -7164,7 +7282,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7177,7 +7295,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7190,7 +7308,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *BackdoorReq) GetFilePath() string { @@ -7225,7 +7343,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7238,7 +7356,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7251,7 +7369,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -7277,7 +7395,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7290,7 +7408,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7303,7 +7421,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7360,7 +7478,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7373,7 +7491,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7386,7 +7504,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *ShellcodeEncode) GetData() []byte { @@ -7414,7 +7532,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7427,7 +7545,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7440,7 +7558,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7462,7 +7580,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7475,7 +7593,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7488,7 +7606,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7516,7 +7634,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7529,7 +7647,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7542,7 +7660,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *Builders) GetBuilders() []*Builder { @@ -7569,7 +7687,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7582,7 +7700,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7595,7 +7713,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *Builder) GetName() string { @@ -7665,7 +7783,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7678,7 +7796,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7691,7 +7809,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Credential) GetID() string { @@ -7761,7 +7879,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7774,7 +7892,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7787,7 +7905,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *Credentials) GetCredentials() []*Credential { @@ -7809,7 +7927,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7822,7 +7940,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7835,7 +7953,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7861,7 +7979,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7874,7 +7992,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7887,7 +8005,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *CrackstationStatus) GetName() string { @@ -7944,7 +8062,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7957,7 +8075,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7970,7 +8088,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -8000,7 +8118,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8013,7 +8131,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8026,7 +8144,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *CrackBenchmark) GetName() string { @@ -8067,7 +8185,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8080,7 +8198,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8093,7 +8211,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *CrackTask) GetID() string { @@ -8166,7 +8284,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8179,7 +8297,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8192,7 +8310,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *Crackstation) GetName() string { @@ -8292,7 +8410,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8305,7 +8423,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8318,7 +8436,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *CUDABackendInfo) GetType() string { @@ -8412,7 +8530,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8425,7 +8543,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8438,7 +8556,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *OpenCLBackendInfo) GetType() string { @@ -8538,7 +8656,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8551,7 +8669,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8564,7 +8682,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *MetalBackendInfo) GetType() string { @@ -8762,7 +8880,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8775,7 +8893,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8788,7 +8906,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9519,7 +9637,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9532,7 +9650,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9545,7 +9663,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{103} + return file_clientpb_client_proto_rawDescGZIP(), []int{105} } func (x *CrackConfig) GetAutoFire() bool { @@ -9589,7 +9707,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9602,7 +9720,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9615,7 +9733,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{104} + return file_clientpb_client_proto_rawDescGZIP(), []int{106} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9660,7 +9778,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[105] + mi := &file_clientpb_client_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9673,7 +9791,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[105] + mi := &file_clientpb_client_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9686,7 +9804,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{105} + return file_clientpb_client_proto_rawDescGZIP(), []int{107} } func (x *CrackFile) GetID() string { @@ -9780,7 +9898,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[106] + mi := &file_clientpb_client_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9793,7 +9911,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[106] + mi := &file_clientpb_client_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9806,7 +9924,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{106} + return file_clientpb_client_proto_rawDescGZIP(), []int{108} } func (x *CrackFileChunk) GetID() string { @@ -9855,1547 +9973,1557 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x3b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, - 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, - 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, - 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, - 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, - 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, - 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, - 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, - 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, - 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, - 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, - 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, - 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, - 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x2d, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x12, 0x24, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, + 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, + 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, + 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, + 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, + 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, + 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, + 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, + 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, + 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, + 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, - 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, - 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, - 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, - 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, - 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, - 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, - 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, - 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, - 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, - 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, - 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, - 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, - 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, - 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, - 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, - 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, - 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, - 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, - 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, - 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, - 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, - 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, + 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, + 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, + 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, + 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, + 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, + 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, + 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, + 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, + 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, - 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, - 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, - 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, - 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, - 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, - 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, - 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, - 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, + 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, + 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, + 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, + 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, + 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, + 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, + 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, + 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, + 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, + 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, + 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, + 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, + 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, - 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, - 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, - 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, - 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, - 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, - 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, - 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, - 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, - 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, - 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, - 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, - 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, - 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, - 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, - 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, - 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, - 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, - 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, - 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, - 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, - 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, - 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, - 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, - 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, - 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, + 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, + 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, + 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, + 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, + 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, + 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, + 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, + 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, + 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, + 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, + 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, + 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, + 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, + 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, + 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, + 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, + 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, + 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, + 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, + 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, + 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, + 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, + 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, + 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, + 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, + 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, + 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, + 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, + 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, + 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, + 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, + 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, + 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, - 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, - 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, - 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, - 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, - 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, - 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, - 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, - 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, - 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, - 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, - 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, - 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, - 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, - 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, - 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, + 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, + 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, + 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, + 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, + 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, + 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, + 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, + 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, + 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, + 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, + 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, + 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, + 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, + 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, + 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, + 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, + 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, + 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, + 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, + 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, + 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, + 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, + 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, - 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, - 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, - 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, - 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, - 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, - 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, - 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, - 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, - 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, - 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, - 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, - 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, - 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, - 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, - 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, - 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, + 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, + 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, - 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, - 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, - 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, - 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, - 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, - 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, + 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, + 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, + 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, + 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, - 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, - 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, - 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, - 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, - 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, + 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, - 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, - 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, - 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, - 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, - 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, - 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, - 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, - 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, - 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, - 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, - 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, - 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, - 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, - 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, - 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, - 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, - 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, - 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, - 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, - 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, - 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, - 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, - 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, - 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, - 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, - 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, - 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, - 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, - 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, - 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, - 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, - 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, - 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, - 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, - 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, - 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, - 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, - 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, - 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, - 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, - 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, - 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, - 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, - 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, - 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, - 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, - 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, - 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, - 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, - 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, - 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, - 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, - 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, - 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, - 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, - 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, - 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, - 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, - 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, - 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, + 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, + 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, + 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, + 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, + 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, + 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, - 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, - 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, - 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, - 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, - 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, - 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, - 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, - 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, - 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, - 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, - 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, - 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, - 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, - 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, - 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, - 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, - 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, - 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, - 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, - 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, - 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, - 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, - 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, - 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, - 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, - 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, - 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, - 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, - 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, - 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, - 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, - 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, - 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, - 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, - 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, - 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, - 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, - 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, - 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, - 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, - 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, - 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, - 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, - 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, - 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, - 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, - 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, - 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, - 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, - 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, - 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, - 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, - 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, - 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, - 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, - 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, - 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, - 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, - 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, - 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, - 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, - 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, - 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, - 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, - 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, - 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, - 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, - 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, - 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, - 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, - 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, - 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, - 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, - 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, - 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, - 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, - 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, - 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, - 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, - 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, - 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, - 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, - 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, - 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, - 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, - 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, - 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, - 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, - 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, - 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, - 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, - 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, - 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, - 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, - 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, - 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, - 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, - 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, - 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, - 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, - 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, - 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, - 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, - 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, - 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, - 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, - 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, - 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, - 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, - 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, - 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, - 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, - 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, - 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, - 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, - 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, - 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, - 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, - 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, - 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, - 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, - 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, - 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, - 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, - 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, - 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, - 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, - 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, - 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, - 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, - 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, - 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, - 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, - 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, - 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, - 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, - 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, - 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, - 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, - 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, - 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, - 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, - 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, - 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, - 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, - 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, - 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, - 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, - 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, + 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, + 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, + 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, + 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, + 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, + 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, + 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, + 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, + 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, + 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, + 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, + 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, + 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, + 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, + 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, + 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, + 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, + 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, + 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, + 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, + 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, + 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, + 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, + 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, + 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, + 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, + 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, + 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, + 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, + 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, + 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, + 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, + 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, + 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, + 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, + 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, + 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, + 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, + 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, + 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, + 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, + 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, + 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, + 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, + 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, + 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, + 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, + 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, + 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, + 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, + 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, + 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, + 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, + 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, + 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, + 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, + 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, + 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, + 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, + 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, + 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, + 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, + 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, + 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, + 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, + 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, + 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, + 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, + 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, + 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, + 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, + 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, + 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, + 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, + 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, + 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, + 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, + 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, + 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, + 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, + 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, + 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, + 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, + 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, + 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, + 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, + 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, + 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, + 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, + 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, + 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, + 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, + 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, + 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, + 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, + 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, + 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, + 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, + 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, + 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, + 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, + 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, + 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, + 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, + 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, + 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, + 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, + 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, + 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, + 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, + 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, + 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, + 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, + 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, + 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, + 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, + 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, + 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, + 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, + 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, + 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, + 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, + 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, + 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, + 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, + 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, + 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, + 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, + 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, + 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, + 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, + 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, + 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, + 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, + 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, + 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, + 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, + 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, + 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, + 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, + 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, + 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, + 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, + 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, + 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, + 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, + 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, + 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, + 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, + 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, + 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, + 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, + 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, + 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, + 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, + 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, + 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, + 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, + 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, + 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, + 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, + 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, + 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, + 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, + 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, + 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, + 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, + 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, + 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, + 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, + 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, + 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, + 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, + 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, + 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, + 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, + 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, + 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, + 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, + 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, + 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, + 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, + 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, + 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, + 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, + 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, + 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, + 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, + 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, + 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, + 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, + 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, + 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, + 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, + 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, + 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, + 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, + 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, + 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, + 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, + 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, + 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, + 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, + 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, + 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, + 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, + 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, + 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, + 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, + 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, + 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11411,7 +11539,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 116) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 118) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -11426,231 +11554,234 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (CrackWorkloadProfile)(0), // 10: clientpb.CrackWorkloadProfile (CrackFileType)(0), // 11: clientpb.CrackFileType (*Version)(nil), // 12: clientpb.Version - (*ClientLogData)(nil), // 13: clientpb.ClientLogData - (*ImplantCommand)(nil), // 14: clientpb.ImplantCommand - (*HistoryRequest)(nil), // 15: clientpb.HistoryRequest - (*History)(nil), // 16: clientpb.History - (*Session)(nil), // 17: clientpb.Session - (*Beacon)(nil), // 18: clientpb.Beacon - (*Beacons)(nil), // 19: clientpb.Beacons - (*BeaconTask)(nil), // 20: clientpb.BeaconTask - (*BeaconTasks)(nil), // 21: clientpb.BeaconTasks - (*ImplantC2)(nil), // 22: clientpb.ImplantC2 - (*ImplantConfig)(nil), // 23: clientpb.ImplantConfig - (*TrafficEncoder)(nil), // 24: clientpb.TrafficEncoder - (*TrafficEncoderMap)(nil), // 25: clientpb.TrafficEncoderMap - (*TrafficEncoderTest)(nil), // 26: clientpb.TrafficEncoderTest - (*TrafficEncoderTests)(nil), // 27: clientpb.TrafficEncoderTests - (*ExternalImplantConfig)(nil), // 28: clientpb.ExternalImplantConfig - (*ExternalImplantBinary)(nil), // 29: clientpb.ExternalImplantBinary - (*ImplantBuilds)(nil), // 30: clientpb.ImplantBuilds - (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget - (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler - (*Compiler)(nil), // 33: clientpb.Compiler - (*MetasploitModule)(nil), // 34: clientpb.MetasploitModule - (*MetasploitCompiler)(nil), // 35: clientpb.MetasploitCompiler - (*DeleteReq)(nil), // 36: clientpb.DeleteReq - (*DNSCanary)(nil), // 37: clientpb.DNSCanary - (*Canaries)(nil), // 38: clientpb.Canaries - (*UniqueWGIP)(nil), // 39: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 40: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 41: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 42: clientpb.RegenerateReq - (*Job)(nil), // 43: clientpb.Job - (*Jobs)(nil), // 44: clientpb.Jobs - (*KillJobReq)(nil), // 45: clientpb.KillJobReq - (*KillJob)(nil), // 46: clientpb.KillJob - (*MTLSListenerReq)(nil), // 47: clientpb.MTLSListenerReq - (*MTLSListener)(nil), // 48: clientpb.MTLSListener - (*WGListenerReq)(nil), // 49: clientpb.WGListenerReq - (*WGListener)(nil), // 50: clientpb.WGListener - (*DNSListenerReq)(nil), // 51: clientpb.DNSListenerReq - (*DNSListener)(nil), // 52: clientpb.DNSListener - (*HTTPListenerReq)(nil), // 53: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 54: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 55: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 56: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 57: clientpb.TCPPivot - (*HTTPListener)(nil), // 58: clientpb.HTTPListener - (*Sessions)(nil), // 59: clientpb.Sessions - (*RenameReq)(nil), // 60: clientpb.RenameReq - (*GenerateReq)(nil), // 61: clientpb.GenerateReq - (*Generate)(nil), // 62: clientpb.Generate - (*MSFReq)(nil), // 63: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 64: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 65: clientpb.StagerListenerReq - (*StagerListener)(nil), // 66: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 67: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 68: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 69: clientpb.MsfStagerReq - (*MsfStager)(nil), // 70: clientpb.MsfStager - (*GetSystemReq)(nil), // 71: clientpb.GetSystemReq - (*MigrateReq)(nil), // 72: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 73: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 74: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 75: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 76: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 77: clientpb.PivotGraph - (*Client)(nil), // 78: clientpb.Client - (*Event)(nil), // 79: clientpb.Event - (*Operator)(nil), // 80: clientpb.Operator - (*WebContent)(nil), // 81: clientpb.WebContent - (*WebsiteAddContent)(nil), // 82: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 83: clientpb.WebsiteRemoveContent - (*Website)(nil), // 84: clientpb.Website - (*Websites)(nil), // 85: clientpb.Websites - (*WGClientConfig)(nil), // 86: clientpb.WGClientConfig - (*Loot)(nil), // 87: clientpb.Loot - (*AllLoot)(nil), // 88: clientpb.AllLoot - (*IOC)(nil), // 89: clientpb.IOC - (*ExtensionData)(nil), // 90: clientpb.ExtensionData - (*Host)(nil), // 91: clientpb.Host - (*AllHosts)(nil), // 92: clientpb.AllHosts - (*DllHijackReq)(nil), // 93: clientpb.DllHijackReq - (*DllHijack)(nil), // 94: clientpb.DllHijack - (*BackdoorReq)(nil), // 95: clientpb.BackdoorReq - (*Backdoor)(nil), // 96: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 97: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 98: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 99: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 100: clientpb.ExternalGenerateReq - (*Builders)(nil), // 101: clientpb.Builders - (*Builder)(nil), // 102: clientpb.Builder - (*Credential)(nil), // 103: clientpb.Credential - (*Credentials)(nil), // 104: clientpb.Credentials - (*Crackstations)(nil), // 105: clientpb.Crackstations - (*CrackstationStatus)(nil), // 106: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 107: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 108: clientpb.CrackBenchmark - (*CrackTask)(nil), // 109: clientpb.CrackTask - (*Crackstation)(nil), // 110: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 111: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 112: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 113: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 114: clientpb.CrackCommand - (*CrackConfig)(nil), // 115: clientpb.CrackConfig - (*CrackFiles)(nil), // 116: clientpb.CrackFiles - (*CrackFile)(nil), // 117: clientpb.CrackFile - (*CrackFileChunk)(nil), // 118: clientpb.CrackFileChunk - nil, // 119: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 120: clientpb.ImplantBuilds.ConfigsEntry - nil, // 121: clientpb.WebsiteAddContent.ContentsEntry - nil, // 122: clientpb.Website.ContentsEntry - nil, // 123: clientpb.Host.ExtensionDataEntry - nil, // 124: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 125: clientpb.CrackSyncStatus.ProgressEntry - nil, // 126: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 127: clientpb.Crackstation.BenchmarksEntry - (*commonpb.Request)(nil), // 128: commonpb.Request - (*commonpb.Response)(nil), // 129: commonpb.Response - (*commonpb.File)(nil), // 130: commonpb.File + (*Users)(nil), // 13: clientpb.Users + (*User)(nil), // 14: clientpb.User + (*ClientLogData)(nil), // 15: clientpb.ClientLogData + (*ImplantCommand)(nil), // 16: clientpb.ImplantCommand + (*HistoryRequest)(nil), // 17: clientpb.HistoryRequest + (*History)(nil), // 18: clientpb.History + (*Session)(nil), // 19: clientpb.Session + (*Beacon)(nil), // 20: clientpb.Beacon + (*Beacons)(nil), // 21: clientpb.Beacons + (*BeaconTask)(nil), // 22: clientpb.BeaconTask + (*BeaconTasks)(nil), // 23: clientpb.BeaconTasks + (*ImplantC2)(nil), // 24: clientpb.ImplantC2 + (*ImplantConfig)(nil), // 25: clientpb.ImplantConfig + (*TrafficEncoder)(nil), // 26: clientpb.TrafficEncoder + (*TrafficEncoderMap)(nil), // 27: clientpb.TrafficEncoderMap + (*TrafficEncoderTest)(nil), // 28: clientpb.TrafficEncoderTest + (*TrafficEncoderTests)(nil), // 29: clientpb.TrafficEncoderTests + (*ExternalImplantConfig)(nil), // 30: clientpb.ExternalImplantConfig + (*ExternalImplantBinary)(nil), // 31: clientpb.ExternalImplantBinary + (*ImplantBuilds)(nil), // 32: clientpb.ImplantBuilds + (*CompilerTarget)(nil), // 33: clientpb.CompilerTarget + (*CrossCompiler)(nil), // 34: clientpb.CrossCompiler + (*Compiler)(nil), // 35: clientpb.Compiler + (*MetasploitModule)(nil), // 36: clientpb.MetasploitModule + (*MetasploitCompiler)(nil), // 37: clientpb.MetasploitCompiler + (*DeleteReq)(nil), // 38: clientpb.DeleteReq + (*DNSCanary)(nil), // 39: clientpb.DNSCanary + (*Canaries)(nil), // 40: clientpb.Canaries + (*UniqueWGIP)(nil), // 41: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 42: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 43: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 44: clientpb.RegenerateReq + (*Job)(nil), // 45: clientpb.Job + (*Jobs)(nil), // 46: clientpb.Jobs + (*KillJobReq)(nil), // 47: clientpb.KillJobReq + (*KillJob)(nil), // 48: clientpb.KillJob + (*MTLSListenerReq)(nil), // 49: clientpb.MTLSListenerReq + (*MTLSListener)(nil), // 50: clientpb.MTLSListener + (*WGListenerReq)(nil), // 51: clientpb.WGListenerReq + (*WGListener)(nil), // 52: clientpb.WGListener + (*DNSListenerReq)(nil), // 53: clientpb.DNSListenerReq + (*DNSListener)(nil), // 54: clientpb.DNSListener + (*HTTPListenerReq)(nil), // 55: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 56: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 57: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 58: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 59: clientpb.TCPPivot + (*HTTPListener)(nil), // 60: clientpb.HTTPListener + (*Sessions)(nil), // 61: clientpb.Sessions + (*RenameReq)(nil), // 62: clientpb.RenameReq + (*GenerateReq)(nil), // 63: clientpb.GenerateReq + (*Generate)(nil), // 64: clientpb.Generate + (*MSFReq)(nil), // 65: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 66: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 67: clientpb.StagerListenerReq + (*StagerListener)(nil), // 68: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 69: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 70: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 71: clientpb.MsfStagerReq + (*MsfStager)(nil), // 72: clientpb.MsfStager + (*GetSystemReq)(nil), // 73: clientpb.GetSystemReq + (*MigrateReq)(nil), // 74: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 75: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 76: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 77: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 78: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 79: clientpb.PivotGraph + (*Client)(nil), // 80: clientpb.Client + (*Event)(nil), // 81: clientpb.Event + (*Operator)(nil), // 82: clientpb.Operator + (*WebContent)(nil), // 83: clientpb.WebContent + (*WebsiteAddContent)(nil), // 84: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 85: clientpb.WebsiteRemoveContent + (*Website)(nil), // 86: clientpb.Website + (*Websites)(nil), // 87: clientpb.Websites + (*WGClientConfig)(nil), // 88: clientpb.WGClientConfig + (*Loot)(nil), // 89: clientpb.Loot + (*AllLoot)(nil), // 90: clientpb.AllLoot + (*IOC)(nil), // 91: clientpb.IOC + (*ExtensionData)(nil), // 92: clientpb.ExtensionData + (*Host)(nil), // 93: clientpb.Host + (*AllHosts)(nil), // 94: clientpb.AllHosts + (*DllHijackReq)(nil), // 95: clientpb.DllHijackReq + (*DllHijack)(nil), // 96: clientpb.DllHijack + (*BackdoorReq)(nil), // 97: clientpb.BackdoorReq + (*Backdoor)(nil), // 98: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 99: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 100: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 101: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 102: clientpb.ExternalGenerateReq + (*Builders)(nil), // 103: clientpb.Builders + (*Builder)(nil), // 104: clientpb.Builder + (*Credential)(nil), // 105: clientpb.Credential + (*Credentials)(nil), // 106: clientpb.Credentials + (*Crackstations)(nil), // 107: clientpb.Crackstations + (*CrackstationStatus)(nil), // 108: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 109: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 110: clientpb.CrackBenchmark + (*CrackTask)(nil), // 111: clientpb.CrackTask + (*Crackstation)(nil), // 112: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 113: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 114: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 115: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 116: clientpb.CrackCommand + (*CrackConfig)(nil), // 117: clientpb.CrackConfig + (*CrackFiles)(nil), // 118: clientpb.CrackFiles + (*CrackFile)(nil), // 119: clientpb.CrackFile + (*CrackFileChunk)(nil), // 120: clientpb.CrackFileChunk + nil, // 121: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 122: clientpb.ImplantBuilds.ConfigsEntry + nil, // 123: clientpb.WebsiteAddContent.ContentsEntry + nil, // 124: clientpb.Website.ContentsEntry + nil, // 125: clientpb.Host.ExtensionDataEntry + nil, // 126: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 127: clientpb.CrackSyncStatus.ProgressEntry + nil, // 128: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 129: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 130: commonpb.Request + (*commonpb.Response)(nil), // 131: commonpb.Response + (*commonpb.File)(nil), // 132: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 128, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request - 128, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request - 14, // 2: clientpb.History.Commands:type_name -> clientpb.ImplantCommand - 129, // 3: clientpb.History.Response:type_name -> commonpb.Response - 18, // 4: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon - 20, // 5: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask - 22, // 6: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 - 0, // 7: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 130, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 130, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 119, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry - 24, // 11: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder - 26, // 12: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest - 23, // 13: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 130, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 120, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry - 0, // 16: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat - 31, // 17: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget - 32, // 18: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler - 31, // 19: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 34, // 20: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule - 34, // 21: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule - 37, // 22: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 23, // 23: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 40, // 24: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 43, // 25: clientpb.Jobs.Active:type_name -> clientpb.Job - 128, // 26: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 129, // 27: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 128, // 28: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 129, // 29: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 17, // 30: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 23, // 31: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 130, // 32: clientpb.Generate.File:type_name -> commonpb.File - 128, // 33: clientpb.MSFReq.Request:type_name -> commonpb.Request - 128, // 34: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 35: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 36: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 130, // 37: clientpb.MsfStager.File:type_name -> commonpb.File - 23, // 38: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 128, // 39: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 23, // 40: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 41: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 128, // 42: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 128, // 43: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 128, // 44: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 17, // 45: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 76, // 46: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 76, // 47: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 80, // 48: clientpb.Client.Operator:type_name -> clientpb.Operator - 17, // 49: clientpb.Event.Session:type_name -> clientpb.Session - 43, // 50: clientpb.Event.Job:type_name -> clientpb.Job - 78, // 51: clientpb.Event.Client:type_name -> clientpb.Client - 121, // 52: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 122, // 53: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 84, // 54: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 55: clientpb.Loot.FileType:type_name -> clientpb.FileType - 130, // 56: clientpb.Loot.File:type_name -> commonpb.File - 87, // 57: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 89, // 58: clientpb.Host.IOCs:type_name -> clientpb.IOC - 123, // 59: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 91, // 60: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 128, // 61: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 129, // 62: clientpb.DllHijack.Response:type_name -> commonpb.Response - 128, // 63: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 129, // 64: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 65: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 128, // 66: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 129, // 67: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 124, // 68: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 23, // 69: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 102, // 70: clientpb.Builders.Builders:type_name -> clientpb.Builder - 31, // 71: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 32, // 72: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 73: clientpb.Credential.HashType:type_name -> clientpb.HashType - 103, // 74: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 110, // 75: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 76: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 107, // 77: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 125, // 78: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 126, // 79: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 114, // 80: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 127, // 81: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 111, // 82: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 113, // 83: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 112, // 84: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 85: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 86: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 87: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 88: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 89: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 90: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 117, // 91: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 92: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 118, // 93: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 24, // 94: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 23, // 95: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 81, // 96: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 81, // 97: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 90, // 98: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 99: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 100, // [100:100] is the sub-list for method output_type - 100, // [100:100] is the sub-list for method input_type - 100, // [100:100] is the sub-list for extension type_name - 100, // [100:100] is the sub-list for extension extendee - 0, // [0:100] is the sub-list for field type_name + 14, // 0: clientpb.Users.Users:type_name -> clientpb.User + 130, // 1: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 130, // 2: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 16, // 3: clientpb.History.Commands:type_name -> clientpb.ImplantCommand + 131, // 4: clientpb.History.Response:type_name -> commonpb.Response + 20, // 5: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon + 22, // 6: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask + 24, // 7: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 + 0, // 8: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat + 132, // 9: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 132, // 10: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 121, // 11: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 26, // 12: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder + 28, // 13: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest + 25, // 14: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig + 132, // 15: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 122, // 16: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 0, // 17: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat + 33, // 18: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget + 34, // 19: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler + 33, // 20: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget + 36, // 21: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule + 36, // 22: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule + 39, // 23: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 25, // 24: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 42, // 25: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 45, // 26: clientpb.Jobs.Active:type_name -> clientpb.Job + 130, // 27: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 131, // 28: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 130, // 29: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 131, // 30: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 19, // 31: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 25, // 32: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 132, // 33: clientpb.Generate.File:type_name -> commonpb.File + 130, // 34: clientpb.MSFReq.Request:type_name -> commonpb.Request + 130, // 35: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 36: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 37: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 132, // 38: clientpb.MsfStager.File:type_name -> commonpb.File + 25, // 39: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 130, // 40: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 25, // 41: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 42: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 130, // 43: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 130, // 44: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 130, // 45: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 19, // 46: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 78, // 47: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 78, // 48: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 82, // 49: clientpb.Client.Operator:type_name -> clientpb.Operator + 19, // 50: clientpb.Event.Session:type_name -> clientpb.Session + 45, // 51: clientpb.Event.Job:type_name -> clientpb.Job + 80, // 52: clientpb.Event.Client:type_name -> clientpb.Client + 123, // 53: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 124, // 54: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 86, // 55: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 56: clientpb.Loot.FileType:type_name -> clientpb.FileType + 132, // 57: clientpb.Loot.File:type_name -> commonpb.File + 89, // 58: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 91, // 59: clientpb.Host.IOCs:type_name -> clientpb.IOC + 125, // 60: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 93, // 61: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 130, // 62: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 131, // 63: clientpb.DllHijack.Response:type_name -> commonpb.Response + 130, // 64: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 131, // 65: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 66: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 130, // 67: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 131, // 68: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 126, // 69: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 25, // 70: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 104, // 71: clientpb.Builders.Builders:type_name -> clientpb.Builder + 33, // 72: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 34, // 73: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 74: clientpb.Credential.HashType:type_name -> clientpb.HashType + 105, // 75: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 112, // 76: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 77: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 109, // 78: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 127, // 79: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 128, // 80: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 116, // 81: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 129, // 82: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 113, // 83: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 115, // 84: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 114, // 85: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 86: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 87: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 88: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 89: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 90: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 91: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 119, // 92: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 93: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 120, // 94: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 26, // 95: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 25, // 96: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 83, // 97: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 83, // 98: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 92, // 99: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 100: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 101, // [101:101] is the sub-list for method output_type + 101, // [101:101] is the sub-list for method input_type + 101, // [101:101] is the sub-list for extension type_name + 101, // [101:101] is the sub-list for extension extendee + 0, // [0:101] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -11672,7 +11803,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientLogData); i { + switch v := v.(*Users); i { case 0: return &v.state case 1: @@ -11684,7 +11815,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantCommand); i { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -11696,7 +11827,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryRequest); i { + switch v := v.(*ClientLogData); i { case 0: return &v.state case 1: @@ -11708,7 +11839,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*History); i { + switch v := v.(*ImplantCommand); i { case 0: return &v.state case 1: @@ -11720,7 +11851,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*HistoryRequest); i { case 0: return &v.state case 1: @@ -11732,7 +11863,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacon); i { + switch v := v.(*History); i { case 0: return &v.state case 1: @@ -11744,7 +11875,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacons); i { + switch v := v.(*Session); i { case 0: return &v.state case 1: @@ -11756,7 +11887,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTask); i { + switch v := v.(*Beacon); i { case 0: return &v.state case 1: @@ -11768,7 +11899,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTasks); i { + switch v := v.(*Beacons); i { case 0: return &v.state case 1: @@ -11780,7 +11911,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantC2); i { + switch v := v.(*BeaconTask); i { case 0: return &v.state case 1: @@ -11792,7 +11923,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantConfig); i { + switch v := v.(*BeaconTasks); i { case 0: return &v.state case 1: @@ -11804,7 +11935,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoder); i { + switch v := v.(*ImplantC2); i { case 0: return &v.state case 1: @@ -11816,7 +11947,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderMap); i { + switch v := v.(*ImplantConfig); i { case 0: return &v.state case 1: @@ -11828,7 +11959,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTest); i { + switch v := v.(*TrafficEncoder); i { case 0: return &v.state case 1: @@ -11840,7 +11971,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTests); i { + switch v := v.(*TrafficEncoderMap); i { case 0: return &v.state case 1: @@ -11852,7 +11983,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantConfig); i { + switch v := v.(*TrafficEncoderTest); i { case 0: return &v.state case 1: @@ -11864,7 +11995,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantBinary); i { + switch v := v.(*TrafficEncoderTests); i { case 0: return &v.state case 1: @@ -11876,7 +12007,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantBuilds); i { + switch v := v.(*ExternalImplantConfig); i { case 0: return &v.state case 1: @@ -11888,7 +12019,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompilerTarget); i { + switch v := v.(*ExternalImplantBinary); i { case 0: return &v.state case 1: @@ -11900,7 +12031,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrossCompiler); i { + switch v := v.(*ImplantBuilds); i { case 0: return &v.state case 1: @@ -11912,7 +12043,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Compiler); i { + switch v := v.(*CompilerTarget); i { case 0: return &v.state case 1: @@ -11924,7 +12055,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetasploitModule); i { + switch v := v.(*CrossCompiler); i { case 0: return &v.state case 1: @@ -11936,7 +12067,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetasploitCompiler); i { + switch v := v.(*Compiler); i { case 0: return &v.state case 1: @@ -11948,7 +12079,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteReq); i { + switch v := v.(*MetasploitModule); i { case 0: return &v.state case 1: @@ -11960,7 +12091,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSCanary); i { + switch v := v.(*MetasploitCompiler); i { case 0: return &v.state case 1: @@ -11972,7 +12103,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Canaries); i { + switch v := v.(*DeleteReq); i { case 0: return &v.state case 1: @@ -11984,7 +12115,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueWGIP); i { + switch v := v.(*DNSCanary); i { case 0: return &v.state case 1: @@ -11996,7 +12127,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfile); i { + switch v := v.(*Canaries); i { case 0: return &v.state case 1: @@ -12008,7 +12139,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfiles); i { + switch v := v.(*UniqueWGIP); i { case 0: return &v.state case 1: @@ -12020,7 +12151,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegenerateReq); i { + switch v := v.(*ImplantProfile); i { case 0: return &v.state case 1: @@ -12032,7 +12163,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ImplantProfiles); i { case 0: return &v.state case 1: @@ -12044,7 +12175,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Jobs); i { + switch v := v.(*RegenerateReq); i { case 0: return &v.state case 1: @@ -12056,7 +12187,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJobReq); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -12068,7 +12199,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJob); i { + switch v := v.(*Jobs); i { case 0: return &v.state case 1: @@ -12080,7 +12211,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListenerReq); i { + switch v := v.(*KillJobReq); i { case 0: return &v.state case 1: @@ -12092,7 +12223,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListener); i { + switch v := v.(*KillJob); i { case 0: return &v.state case 1: @@ -12104,7 +12235,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListenerReq); i { + switch v := v.(*MTLSListenerReq); i { case 0: return &v.state case 1: @@ -12116,7 +12247,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListener); i { + switch v := v.(*MTLSListener); i { case 0: return &v.state case 1: @@ -12128,7 +12259,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListenerReq); i { + switch v := v.(*WGListenerReq); i { case 0: return &v.state case 1: @@ -12140,7 +12271,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListener); i { + switch v := v.(*WGListener); i { case 0: return &v.state case 1: @@ -12152,7 +12283,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListenerReq); i { + switch v := v.(*DNSListenerReq); i { case 0: return &v.state case 1: @@ -12164,7 +12295,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipesReq); i { + switch v := v.(*DNSListener); i { case 0: return &v.state case 1: @@ -12176,7 +12307,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipes); i { + switch v := v.(*HTTPListenerReq); i { case 0: return &v.state case 1: @@ -12188,7 +12319,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivotReq); i { + switch v := v.(*NamedPipesReq); i { case 0: return &v.state case 1: @@ -12200,7 +12331,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivot); i { + switch v := v.(*NamedPipes); i { case 0: return &v.state case 1: @@ -12212,7 +12343,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListener); i { + switch v := v.(*TCPPivotReq); i { case 0: return &v.state case 1: @@ -12224,7 +12355,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Sessions); i { + switch v := v.(*TCPPivot); i { case 0: return &v.state case 1: @@ -12236,7 +12367,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenameReq); i { + switch v := v.(*HTTPListener); i { case 0: return &v.state case 1: @@ -12248,7 +12379,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateReq); i { + switch v := v.(*Sessions); i { case 0: return &v.state case 1: @@ -12260,7 +12391,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Generate); i { + switch v := v.(*RenameReq); i { case 0: return &v.state case 1: @@ -12272,7 +12403,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFReq); i { + switch v := v.(*GenerateReq); i { case 0: return &v.state case 1: @@ -12284,7 +12415,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFRemoteReq); i { + switch v := v.(*Generate); i { case 0: return &v.state case 1: @@ -12296,7 +12427,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListenerReq); i { + switch v := v.(*MSFReq); i { case 0: return &v.state case 1: @@ -12308,7 +12439,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListener); i { + switch v := v.(*MSFRemoteReq); i { case 0: return &v.state case 1: @@ -12320,7 +12451,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDIReq); i { + switch v := v.(*StagerListenerReq); i { case 0: return &v.state case 1: @@ -12332,7 +12463,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDI); i { + switch v := v.(*StagerListener); i { case 0: return &v.state case 1: @@ -12344,7 +12475,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStagerReq); i { + switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state case 1: @@ -12356,7 +12487,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStager); i { + switch v := v.(*ShellcodeRDI); i { case 0: return &v.state case 1: @@ -12368,7 +12499,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSystemReq); i { + switch v := v.(*MsfStagerReq); i { case 0: return &v.state case 1: @@ -12380,7 +12511,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MigrateReq); i { + switch v := v.(*MsfStager); i { case 0: return &v.state case 1: @@ -12392,7 +12523,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelReq); i { + switch v := v.(*GetSystemReq); i { case 0: return &v.state case 1: @@ -12404,7 +12535,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnel); i { + switch v := v.(*MigrateReq); i { case 0: return &v.state case 1: @@ -12416,7 +12547,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseTunnelReq); i { + switch v := v.(*CreateTunnelReq); i { case 0: return &v.state case 1: @@ -12428,7 +12559,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraphEntry); i { + switch v := v.(*CreateTunnel); i { case 0: return &v.state case 1: @@ -12440,7 +12571,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraph); i { + switch v := v.(*CloseTunnelReq); i { case 0: return &v.state case 1: @@ -12452,7 +12583,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { + switch v := v.(*PivotGraphEntry); i { case 0: return &v.state case 1: @@ -12464,7 +12595,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*PivotGraph); i { case 0: return &v.state case 1: @@ -12476,7 +12607,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operator); i { + switch v := v.(*Client); i { case 0: return &v.state case 1: @@ -12488,7 +12619,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebContent); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -12500,7 +12631,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteAddContent); i { + switch v := v.(*Operator); i { case 0: return &v.state case 1: @@ -12512,7 +12643,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteRemoveContent); i { + switch v := v.(*WebContent); i { case 0: return &v.state case 1: @@ -12524,7 +12655,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Website); i { + switch v := v.(*WebsiteAddContent); i { case 0: return &v.state case 1: @@ -12536,7 +12667,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Websites); i { + switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state case 1: @@ -12548,7 +12679,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGClientConfig); i { + switch v := v.(*Website); i { case 0: return &v.state case 1: @@ -12560,7 +12691,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Loot); i { + switch v := v.(*Websites); i { case 0: return &v.state case 1: @@ -12572,7 +12703,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllLoot); i { + switch v := v.(*WGClientConfig); i { case 0: return &v.state case 1: @@ -12584,7 +12715,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOC); i { + switch v := v.(*Loot); i { case 0: return &v.state case 1: @@ -12596,7 +12727,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionData); i { + switch v := v.(*AllLoot); i { case 0: return &v.state case 1: @@ -12608,7 +12739,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Host); i { + switch v := v.(*IOC); i { case 0: return &v.state case 1: @@ -12620,7 +12751,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllHosts); i { + switch v := v.(*ExtensionData); i { case 0: return &v.state case 1: @@ -12632,7 +12763,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijackReq); i { + switch v := v.(*Host); i { case 0: return &v.state case 1: @@ -12644,7 +12775,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijack); i { + switch v := v.(*AllHosts); i { case 0: return &v.state case 1: @@ -12656,7 +12787,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BackdoorReq); i { + switch v := v.(*DllHijackReq); i { case 0: return &v.state case 1: @@ -12668,7 +12799,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Backdoor); i { + switch v := v.(*DllHijack); i { case 0: return &v.state case 1: @@ -12680,7 +12811,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncodeReq); i { + switch v := v.(*BackdoorReq); i { case 0: return &v.state case 1: @@ -12692,7 +12823,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncode); i { + switch v := v.(*Backdoor); i { case 0: return &v.state case 1: @@ -12704,7 +12835,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncoderMap); i { + switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state case 1: @@ -12716,7 +12847,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalGenerateReq); i { + switch v := v.(*ShellcodeEncode); i { case 0: return &v.state case 1: @@ -12728,7 +12859,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builders); i { + switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state case 1: @@ -12740,7 +12871,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builder); i { + switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state case 1: @@ -12752,7 +12883,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credential); i { + switch v := v.(*Builders); i { case 0: return &v.state case 1: @@ -12764,7 +12895,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credentials); i { + switch v := v.(*Builder); i { case 0: return &v.state case 1: @@ -12776,7 +12907,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstations); i { + switch v := v.(*Credential); i { case 0: return &v.state case 1: @@ -12788,7 +12919,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackstationStatus); i { + switch v := v.(*Credentials); i { case 0: return &v.state case 1: @@ -12800,7 +12931,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackSyncStatus); i { + switch v := v.(*Crackstations); i { case 0: return &v.state case 1: @@ -12812,7 +12943,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackBenchmark); i { + switch v := v.(*CrackstationStatus); i { case 0: return &v.state case 1: @@ -12824,7 +12955,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackTask); i { + switch v := v.(*CrackSyncStatus); i { case 0: return &v.state case 1: @@ -12836,7 +12967,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstation); i { + switch v := v.(*CrackBenchmark); i { case 0: return &v.state case 1: @@ -12848,7 +12979,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CUDABackendInfo); i { + switch v := v.(*CrackTask); i { case 0: return &v.state case 1: @@ -12860,7 +12991,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenCLBackendInfo); i { + switch v := v.(*Crackstation); i { case 0: return &v.state case 1: @@ -12872,7 +13003,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetalBackendInfo); i { + switch v := v.(*CUDABackendInfo); i { case 0: return &v.state case 1: @@ -12884,7 +13015,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackCommand); i { + switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state case 1: @@ -12896,7 +13027,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackConfig); i { + switch v := v.(*MetalBackendInfo); i { case 0: return &v.state case 1: @@ -12908,7 +13039,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFiles); i { + switch v := v.(*CrackCommand); i { case 0: return &v.state case 1: @@ -12920,7 +13051,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFile); i { + switch v := v.(*CrackConfig); i { case 0: return &v.state case 1: @@ -12932,6 +13063,30 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12950,7 +13105,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 116, + NumMessages: 118, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index e8b9aac374..ade611358c 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -4,7 +4,7 @@ option go_package = "github.com/bishopfox/sliver/protobuf/clientpb"; import "commonpb/common.proto"; -// [ Version ] ---------------------------------------- +// [ Teamclient ] ------------------------------------------- message Version { int32 Major = 1; @@ -19,7 +19,17 @@ message Version { string Arch = 8; } -// [ Client Logs ] ---------------------------------------- +message Users { repeated User Users = 1; } + +message User { + string Name = 1; + bool Online = 2; + int64 LastSeen = 3; + int32 Clients = 4; +} + + +// [ Client Logs ] ------------------------------------------ message ClientLogData { string Stream = 1; bytes Data = 2; diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index e77304edf2..dafd208cd1 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -31,645 +31,648 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xaf, 0x4f, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xdd, 0x4f, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, - 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, - 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, - 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, - 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, - 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, + 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, - 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, - 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, - 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, + 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, 0x69, 0x6c, + 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, + 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, 0x0a, + 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, + 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, + 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, - 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, - 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, - 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, - 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, - 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, - 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, - 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, - 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, - 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, + 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, 0x6f, + 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, + 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, + 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, - 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, - 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, + 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, 0x73, + 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x43, + 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, + 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, - 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, + 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, + 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, 0x12, + 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, - 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x61, + 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, + 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, - 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, - 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, 0x49, + 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, + 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, + 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, + 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, + 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, - 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, - 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x39, + 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, - 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x46, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x61, + 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, + 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, + 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x46, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, - 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, - 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, - 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, - 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, - 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, - 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, - 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, - 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, - 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, - 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, - 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, - 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, - 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, - 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, - 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, - 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, - 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, - 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, - 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, - 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, - 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, + 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, + 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, + 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, + 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, + 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, + 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, + 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, + 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, + 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, + 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, + 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, + 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, + 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, + 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, + 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, - 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, - 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, - 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, - 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, - 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, + 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, + 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, - 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, - 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, + 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, + 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, + 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, + 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, + 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, + 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, + 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, + 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, - 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, - 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, - 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, - 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, + 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, + 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, + 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, + 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, + 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, + 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, + 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, + 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, + 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, + 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, - 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, - 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, - 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, + 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, + 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, + 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, - 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, - 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, - 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, + 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, + 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, + 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -794,442 +797,445 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.Tunnel)(nil), // 118: sliverpb.Tunnel (*sliverpb.TunnelData)(nil), // 119: sliverpb.TunnelData (*clientpb.Version)(nil), // 120: clientpb.Version - (*sliverpb.Reconfigure)(nil), // 121: sliverpb.Reconfigure - (*clientpb.History)(nil), // 122: clientpb.History - (*clientpb.Sessions)(nil), // 123: clientpb.Sessions - (*clientpb.Beacons)(nil), // 124: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 125: clientpb.BeaconTasks - (*commonpb.Response)(nil), // 126: commonpb.Response - (*clientpb.Jobs)(nil), // 127: clientpb.Jobs - (*clientpb.KillJob)(nil), // 128: clientpb.KillJob - (*clientpb.MTLSListener)(nil), // 129: clientpb.MTLSListener - (*clientpb.WGListener)(nil), // 130: clientpb.WGListener - (*clientpb.DNSListener)(nil), // 131: clientpb.DNSListener - (*clientpb.HTTPListener)(nil), // 132: clientpb.HTTPListener - (*clientpb.StagerListener)(nil), // 133: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 134: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 135: clientpb.AllHosts - (*clientpb.Generate)(nil), // 136: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 137: clientpb.ExternalImplantConfig - (*clientpb.Builders)(nil), // 138: clientpb.Builders - (*clientpb.Crackstations)(nil), // 139: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 140: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 141: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 142: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 143: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 144: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 145: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 146: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 147: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 148: clientpb.Compiler - (*clientpb.MetasploitCompiler)(nil), // 149: clientpb.MetasploitCompiler - (*clientpb.ShellcodeEncode)(nil), // 150: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 151: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 152: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 153: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 154: clientpb.Websites - (*sliverpb.Ps)(nil), // 155: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 156: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 157: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 158: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 159: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 160: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 161: sliverpb.Mv - (*sliverpb.Cp)(nil), // 162: sliverpb.Cp - (*sliverpb.Rm)(nil), // 163: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 164: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 165: sliverpb.Download - (*sliverpb.Upload)(nil), // 166: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 167: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 168: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 169: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 170: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 171: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 172: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 173: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 174: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 175: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 176: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 177: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 178: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 179: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 180: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 181: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 182: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 183: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 184: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 185: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 186: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 187: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 188: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 189: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 190: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 191: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 192: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 193: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 194: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 195: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 196: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 197: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 198: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 199: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 200: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 201: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 202: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 203: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 204: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 205: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 206: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 207: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 208: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 209: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 210: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 211: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 212: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 213: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 214: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 215: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 216: sliverpb.Portfwd + (*clientpb.Users)(nil), // 121: clientpb.Users + (*sliverpb.Reconfigure)(nil), // 122: sliverpb.Reconfigure + (*clientpb.History)(nil), // 123: clientpb.History + (*clientpb.Sessions)(nil), // 124: clientpb.Sessions + (*clientpb.Beacons)(nil), // 125: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 126: clientpb.BeaconTasks + (*commonpb.Response)(nil), // 127: commonpb.Response + (*clientpb.Jobs)(nil), // 128: clientpb.Jobs + (*clientpb.KillJob)(nil), // 129: clientpb.KillJob + (*clientpb.MTLSListener)(nil), // 130: clientpb.MTLSListener + (*clientpb.WGListener)(nil), // 131: clientpb.WGListener + (*clientpb.DNSListener)(nil), // 132: clientpb.DNSListener + (*clientpb.HTTPListener)(nil), // 133: clientpb.HTTPListener + (*clientpb.StagerListener)(nil), // 134: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 135: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 136: clientpb.AllHosts + (*clientpb.Generate)(nil), // 137: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 138: clientpb.ExternalImplantConfig + (*clientpb.Builders)(nil), // 139: clientpb.Builders + (*clientpb.Crackstations)(nil), // 140: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 141: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 142: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 143: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 144: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 145: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 146: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 147: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 148: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 149: clientpb.Compiler + (*clientpb.MetasploitCompiler)(nil), // 150: clientpb.MetasploitCompiler + (*clientpb.ShellcodeEncode)(nil), // 151: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 152: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 153: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 154: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 155: clientpb.Websites + (*sliverpb.Ps)(nil), // 156: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 157: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 158: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 159: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 160: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 161: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 162: sliverpb.Mv + (*sliverpb.Cp)(nil), // 163: sliverpb.Cp + (*sliverpb.Rm)(nil), // 164: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 165: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 166: sliverpb.Download + (*sliverpb.Upload)(nil), // 167: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 168: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 169: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 170: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 171: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 172: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 173: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 174: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 175: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 176: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 177: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 178: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 179: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 180: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 181: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 182: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 183: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 184: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 185: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 186: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 187: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 188: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 189: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 190: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 191: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 192: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 193: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 194: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 195: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 196: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 197: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 198: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 199: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 200: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 201: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 202: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 203: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 204: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 205: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 206: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 207: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 208: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 209: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 210: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 211: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 212: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 213: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 214: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 215: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 216: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 217: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty - 1, // 1: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData - 2, // 2: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq - 3, // 3: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq - 4, // 4: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 5, // 5: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand - 6, // 6: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest - 0, // 7: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 8: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 7, // 9: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 7, // 10: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 7, // 11: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 8, // 12: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 8, // 13: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 14: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 15: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 16: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 9, // 17: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 10, // 18: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 11, // 19: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 12, // 20: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 13, // 21: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 13, // 22: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 14, // 23: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 14, // 24: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq - 15, // 25: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 15, // 26: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 15, // 27: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 15, // 28: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 29: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 30: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 16, // 31: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 16, // 32: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 16, // 33: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 17, // 34: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 17, // 35: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 17, // 36: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 17, // 37: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 38: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 18, // 39: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 18, // 40: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 19, // 41: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 20, // 42: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 21, // 43: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 22, // 44: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 23, // 45: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig - 24, // 46: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 25, // 47: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 48: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 26, // 49: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 25, // 50: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 27, // 51: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 52: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 28, // 53: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 28, // 54: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 29, // 55: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 29, // 56: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 30, // 57: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 30, // 58: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 29, // 59: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 29, // 60: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 31, // 61: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 62: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 32, // 63: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 64: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 65: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 66: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 67: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 32, // 68: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 33, // 69: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 34, // 70: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 35, // 71: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 72: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 0, // 73: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty - 36, // 74: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 75: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 76: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 37, // 77: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 37, // 78: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 79: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 38, // 80: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 38, // 81: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 39, // 82: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 39, // 83: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 40, // 84: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 41, // 85: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 42, // 86: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 43, // 87: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 44, // 88: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 45, // 89: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 46, // 90: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 47, // 91: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 48, // 92: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 49, // 93: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 50, // 94: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 51, // 95: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 52, // 96: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 53, // 97: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 54, // 98: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 55, // 99: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 56, // 100: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 57, // 101: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 58, // 102: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 59, // 103: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 60, // 104: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 61, // 105: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 62, // 106: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 63, // 107: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 64, // 108: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 65, // 109: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 66, // 110: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 67, // 111: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 68, // 112: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 69, // 113: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 70, // 114: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 71, // 115: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 72, // 116: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 73, // 117: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 74, // 118: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 75, // 119: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 76, // 120: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 77, // 121: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 78, // 122: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 79, // 123: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 124: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 80, // 125: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 81, // 126: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 82, // 127: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 83, // 128: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 84, // 129: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 85, // 130: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 86, // 131: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 87, // 132: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 88, // 133: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 89, // 134: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 90, // 135: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 91, // 136: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 92, // 137: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 93, // 138: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 94, // 139: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 95, // 140: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 96, // 141: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 97, // 142: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 98, // 143: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 99, // 144: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 100, // 145: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 101, // 146: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 102, // 147: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 103, // 148: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 104, // 149: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 105, // 150: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 106, // 151: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 107, // 152: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 108, // 153: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 109, // 154: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 110, // 155: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 111, // 156: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 112, // 157: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 113, // 158: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 114, // 159: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 115, // 160: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 116, // 161: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 116, // 162: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 117, // 163: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 118, // 164: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 118, // 165: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 119, // 166: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 167: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 120, // 168: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 169: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 0, // 170: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 121, // 171: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 172: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 0, // 173: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty - 122, // 174: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History - 123, // 175: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 124, // 176: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 7, // 177: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 178: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 125, // 179: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 8, // 180: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 8, // 181: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 126, // 182: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 183: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 127, // 184: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 128, // 185: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 129, // 186: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 130, // 187: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 131, // 188: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 132, // 189: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 132, // 190: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 133, // 191: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 133, // 192: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 15, // 193: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 194: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 15, // 195: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 15, // 196: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 134, // 197: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 16, // 198: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 199: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 200: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 201: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 17, // 202: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 16, // 203: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 16, // 204: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 17, // 205: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 135, // 206: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 18, // 207: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 208: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 209: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 136, // 210: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 137, // 211: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 212: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 137, // 213: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 25, // 214: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 215: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 138, // 216: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 25, // 217: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 218: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 219: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 139, // 220: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 28, // 221: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 222: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 140, // 223: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 29, // 224: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 225: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 30, // 226: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 227: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 228: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 136, // 229: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 141, // 230: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 231: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 142, // 232: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 143, // 233: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 144, // 234: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 145, // 235: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 236: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 33, // 237: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 146, // 238: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 147, // 239: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 148, // 240: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 149, // 241: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler - 150, // 242: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 151, // 243: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 152, // 244: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 153, // 245: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 246: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 154, // 247: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 38, // 248: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 249: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 38, // 250: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 38, // 251: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 38, // 252: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 41, // 253: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 155, // 254: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 156, // 255: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 157, // 256: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 158, // 257: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 159, // 258: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 160, // 259: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 160, // 260: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 161, // 261: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 162, // 262: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 163, // 263: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 164, // 264: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 165, // 265: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 166, // 266: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 167, // 267: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 168, // 268: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 169, // 269: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 159, // 270: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 170, // 271: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 171, // 272: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 172, // 273: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 173, // 274: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 174, // 275: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 175, // 276: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 176, // 277: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 177, // 278: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 177, // 279: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 177, // 280: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 178, // 281: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 179, // 282: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 180, // 283: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 180, // 284: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 181, // 285: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 182, // 286: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 183, // 287: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 184, // 288: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 185, // 289: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 290: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 186, // 291: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 187, // 292: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 188, // 293: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 188, // 294: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 188, // 295: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 189, // 296: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 190, // 297: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 191, // 298: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 192, // 299: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 193, // 300: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 194, // 301: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 195, // 302: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 196, // 303: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 197, // 304: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 198, // 305: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 199, // 306: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 200, // 307: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 201, // 308: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 202, // 309: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 203, // 310: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 204, // 311: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 203, // 312: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 100, // 313: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 314: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 205, // 315: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 206, // 316: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 207, // 317: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 208, // 318: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 209, // 319: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 210, // 320: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 211, // 321: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 211, // 322: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 212, // 323: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 212, // 324: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 213, // 325: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 214, // 326: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 215, // 327: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 216, // 328: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 116, // 329: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 330: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 117, // 331: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 118, // 332: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 333: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 119, // 334: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 25, // 335: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 168, // [168:336] is the sub-list for method output_type - 0, // [0:168] is the sub-list for method input_type + 0, // 1: rpcpb.SliverRPC.GetUsers:input_type -> commonpb.Empty + 1, // 2: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData + 2, // 3: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq + 3, // 4: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq + 4, // 5: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq + 5, // 6: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand + 6, // 7: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest + 0, // 8: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 9: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 7, // 10: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 7, // 11: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 7, // 12: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 8, // 13: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 8, // 14: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 15: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 16: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 17: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 9, // 18: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 10, // 19: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 11, // 20: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 12, // 21: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 13, // 22: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 13, // 23: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 14, // 24: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 14, // 25: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq + 15, // 26: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 15, // 27: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 15, // 28: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 15, // 29: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 30: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 31: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 16, // 32: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 16, // 33: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 16, // 34: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 17, // 35: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 17, // 36: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 17, // 37: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 17, // 38: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 39: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 18, // 40: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 18, // 41: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 19, // 42: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 20, // 43: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 21, // 44: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 22, // 45: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 23, // 46: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig + 24, // 47: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 25, // 48: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 49: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 26, // 50: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 25, // 51: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 27, // 52: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 53: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 28, // 54: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 28, // 55: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 29, // 56: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 29, // 57: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 30, // 58: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 30, // 59: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 29, // 60: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 29, // 61: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 31, // 62: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 63: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 32, // 64: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 65: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 66: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 67: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 68: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 32, // 69: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 33, // 70: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 34, // 71: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 35, // 72: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 73: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 0, // 74: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty + 36, // 75: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 76: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 77: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 37, // 78: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 37, // 79: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 80: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 38, // 81: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 38, // 82: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 39, // 83: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 39, // 84: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 40, // 85: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 41, // 86: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 42, // 87: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 43, // 88: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 44, // 89: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 45, // 90: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 46, // 91: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 47, // 92: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 48, // 93: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 49, // 94: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 50, // 95: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 51, // 96: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 52, // 97: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 53, // 98: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 54, // 99: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 55, // 100: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 56, // 101: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 57, // 102: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 58, // 103: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 59, // 104: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 60, // 105: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 61, // 106: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 62, // 107: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 63, // 108: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 64, // 109: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 65, // 110: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 66, // 111: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 67, // 112: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 68, // 113: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 69, // 114: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 70, // 115: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 71, // 116: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 72, // 117: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 73, // 118: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 74, // 119: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 75, // 120: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 76, // 121: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 77, // 122: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 78, // 123: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 79, // 124: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 125: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 80, // 126: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 81, // 127: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 82, // 128: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 83, // 129: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 84, // 130: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 85, // 131: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 86, // 132: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 87, // 133: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 88, // 134: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 89, // 135: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 90, // 136: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 91, // 137: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 92, // 138: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 93, // 139: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 94, // 140: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 95, // 141: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 96, // 142: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 97, // 143: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 98, // 144: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 99, // 145: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 100, // 146: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 101, // 147: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 102, // 148: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 103, // 149: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 104, // 150: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 105, // 151: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 106, // 152: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 107, // 153: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 108, // 154: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 109, // 155: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 110, // 156: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 111, // 157: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 112, // 158: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 113, // 159: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 114, // 160: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 115, // 161: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 116, // 162: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 116, // 163: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 117, // 164: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 118, // 165: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 118, // 166: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 119, // 167: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 168: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 120, // 169: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 121, // 170: rpcpb.SliverRPC.GetUsers:output_type -> clientpb.Users + 0, // 171: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 172: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 122, // 173: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 174: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 175: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 123, // 176: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 124, // 177: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 125, // 178: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 7, // 179: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 180: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 126, // 181: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 8, // 182: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 8, // 183: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 127, // 184: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 185: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 128, // 186: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 129, // 187: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 130, // 188: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 131, // 189: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 132, // 190: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 133, // 191: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 133, // 192: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 134, // 193: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 134, // 194: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 15, // 195: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 196: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 15, // 197: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 15, // 198: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 135, // 199: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 16, // 200: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 201: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 202: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 203: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 17, // 204: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 16, // 205: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 16, // 206: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 17, // 207: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 136, // 208: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 18, // 209: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 210: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 211: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 137, // 212: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 138, // 213: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 214: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 138, // 215: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 25, // 216: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 217: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 139, // 218: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 25, // 219: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 220: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 221: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 140, // 222: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 28, // 223: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 224: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 141, // 225: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 29, // 226: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 227: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 30, // 228: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 229: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 230: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 137, // 231: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 142, // 232: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 233: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 143, // 234: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 144, // 235: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 145, // 236: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 146, // 237: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 238: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 33, // 239: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 147, // 240: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 148, // 241: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 149, // 242: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 150, // 243: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler + 151, // 244: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 152, // 245: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 153, // 246: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 154, // 247: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 248: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 155, // 249: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 38, // 250: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 251: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 38, // 252: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 38, // 253: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 38, // 254: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 41, // 255: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 156, // 256: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 157, // 257: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 158, // 258: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 159, // 259: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 160, // 260: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 161, // 261: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 161, // 262: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 162, // 263: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 163, // 264: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 164, // 265: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 165, // 266: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 166, // 267: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 167, // 268: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 168, // 269: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 169, // 270: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 170, // 271: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 160, // 272: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 171, // 273: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 172, // 274: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 173, // 275: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 174, // 276: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 175, // 277: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 176, // 278: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 177, // 279: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 178, // 280: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 178, // 281: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 178, // 282: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 179, // 283: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 180, // 284: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 181, // 285: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 181, // 286: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 182, // 287: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 183, // 288: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 184, // 289: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 185, // 290: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 186, // 291: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 292: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 187, // 293: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 188, // 294: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 189, // 295: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 189, // 296: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 189, // 297: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 190, // 298: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 191, // 299: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 192, // 300: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 193, // 301: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 194, // 302: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 195, // 303: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 196, // 304: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 197, // 305: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 198, // 306: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 199, // 307: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 200, // 308: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 201, // 309: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 202, // 310: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 203, // 311: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 204, // 312: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 205, // 313: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 204, // 314: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 100, // 315: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 316: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 206, // 317: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 207, // 318: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 208, // 319: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 209, // 320: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 210, // 321: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 211, // 322: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 212, // 323: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 212, // 324: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 213, // 325: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 213, // 326: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 214, // 327: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 215, // 328: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 216, // 329: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 217, // 330: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 116, // 331: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 332: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 117, // 333: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 118, // 334: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 335: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 119, // 336: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 25, // 337: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 169, // [169:338] is the sub-list for method output_type + 0, // [0:169] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 67baf58d6d..117aedc9b0 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -8,8 +8,9 @@ import "clientpb/client.proto"; service SliverRPC { - // *** Version *** + // *** Teamclient *** rpc GetVersion(commonpb.Empty) returns (clientpb.Version); + rpc GetUsers(commonpb.Empty) returns (clientpb.Users); // *** Client Logs *** rpc ClientLog(stream clientpb.ClientLogData) returns (commonpb.Empty); diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 875e4a7ac3..1291000cb8 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -23,6 +23,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( SliverRPC_GetVersion_FullMethodName = "/rpcpb.SliverRPC/GetVersion" + SliverRPC_GetUsers_FullMethodName = "/rpcpb.SliverRPC/GetUsers" SliverRPC_ClientLog_FullMethodName = "/rpcpb.SliverRPC/ClientLog" SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" @@ -196,8 +197,9 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SliverRPCClient interface { - // *** Version *** + // *** Teamclient *** GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) + GetUsers(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Users, error) // *** Client Logs *** ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) // *** Generic *** @@ -410,6 +412,15 @@ func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, op return out, nil } +func (c *sliverRPCClient) GetUsers(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Users, error) { + out := new(clientpb.Users) + err := c.cc.Invoke(ctx, SliverRPC_GetUsers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) { stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], SliverRPC_ClientLog_FullMethodName, opts...) if err != nil { @@ -2080,8 +2091,9 @@ func (x *sliverRPCEventsClient) Recv() (*clientpb.Event, error) { // All implementations must embed UnimplementedSliverRPCServer // for forward compatibility type SliverRPCServer interface { - // *** Version *** + // *** Teamclient *** GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) + GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) // *** Client Logs *** ClientLog(SliverRPC_ClientLogServer) error // *** Generic *** @@ -2285,6 +2297,9 @@ type UnimplementedSliverRPCServer struct { func (UnimplementedSliverRPCServer) GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") } +func (UnimplementedSliverRPCServer) GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") +} func (UnimplementedSliverRPCServer) ClientLog(SliverRPC_ClientLogServer) error { return status.Errorf(codes.Unimplemented, "method ClientLog not implemented") } @@ -2817,6 +2832,24 @@ func _SliverRPC_GetVersion_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _SliverRPC_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(commonpb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetUsers(ctx, req.(*commonpb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_ClientLog_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(SliverRPCServer).ClientLog(&sliverRPCClientLogServer{stream}) } @@ -5875,6 +5908,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetVersion", Handler: _SliverRPC_GetVersion_Handler, }, + { + MethodName: "GetUsers", + Handler: _SliverRPC_GetUsers_Handler, + }, { MethodName: "Kill", Handler: _SliverRPC_Kill_Handler, diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 6b29a93874..b589d68a99 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -19,7 +19,6 @@ package builder */ import ( - "errors" "fmt" "os" "runtime" @@ -37,9 +36,9 @@ import ( "github.com/bishopfox/sliver/server/log" "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/server" "github.com/rsteube/carapace" "github.com/spf13/cobra" - "google.golang.org/grpc" ) var builderLog = log.NamedLogger("cli", "builder") @@ -56,12 +55,14 @@ const ( ) // Commands returns all commands for using Sliver as a builder backend. -func Commands(con *console.SliverClient) []*cobra.Command { +func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { builderCmd := &cobra.Command{ Use: "builder", Short: "Start the process as an external builder", Long: ``, - Run: runBuilderCmd, + Run: func(cmd *cobra.Command, args []string) { + runBuilderCmd(cmd, args, team) + }, } builderCmd.Flags().StringP(nameFlagStr, "n", "", "Name of the builder (blank = hostname)") @@ -82,7 +83,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{builderCmd} } -func runBuilderCmd(cmd *cobra.Command, args []string) { +func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) @@ -121,7 +122,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string) { externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - startBuilderTeamclient(externalBuilder, configPath) + startBuilderTeamclient(externalBuilder, configPath, team) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -254,32 +255,10 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } -func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string) { - var rpc rpcpb.SliverRPCClient +func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) { + tc := new(transport.TeamClient) - gTeamclient := transport.NewTeamClient() - - // The teamclient requires hooks to bind RPC clients around its connection. - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") - } - - rpc = rpcpb.NewSliverRPCClient(grpcClient) - - return nil - } - - var clientOpts []client.Options - clientOpts = append(clientOpts, - client.WithDialer(gTeamclient, bindClient), - ) - - teamclient, err := client.New("sliver", gTeamclient, clientOpts...) - if err != nil { - panic(err) - } + teamclient := team.Self(client.WithDialer(tc)) // Now use our teamclient to fetch the configuration. config, err := teamclient.ReadConfig(configPath) @@ -304,6 +283,8 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string teamclient.Connect(client.WithConfig(config)) defer teamclient.Disconnect() + rpc := rpcpb.NewSliverRPCClient(tc.Conn) + // Let the builder do its work, blocking. builder.StartBuilder(externalBuilder, rpc) } diff --git a/server/rpc/rpc-teamclient.go b/server/rpc/rpc-teamclient.go new file mode 100644 index 0000000000..9ac023e236 --- /dev/null +++ b/server/rpc/rpc-teamclient.go @@ -0,0 +1,73 @@ +package rpc + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "runtime" + + "github.com/bishopfox/sliver/client/version" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/server/core" +) + +// GetVersion - Get the server version +func (rpc *Server) GetVersion(ctx context.Context, _ *commonpb.Empty) (*clientpb.Version, error) { + dirty := version.GitDirty != "" + semVer := version.SemanticVersion() + compiled, _ := version.Compiled() + return &clientpb.Version{ + Major: int32(semVer[0]), + Minor: int32(semVer[1]), + Patch: int32(semVer[2]), + Commit: version.GitCommit, + Dirty: dirty, + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil +} + +// GetUsers returns the list of teamserver users and their status. +func (ts *Server) GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) { + // Fetch users from the teamserver user database. + users, err := ts.team.Users() + + userspb := make([]*clientpb.User, len(users)) + for i, user := range users { + userspb[i] = &clientpb.User{ + Name: user.Name, + Online: isOperatorOnline(user.Name), + LastSeen: user.LastSeen.Unix(), + Clients: int32(user.Clients), + } + } + + return &clientpb.Users{Users: userspb}, err +} + +func isOperatorOnline(commonName string) bool { + for _, operator := range core.Clients.ActiveOperators() { + if commonName == operator { + return true + } + } + return false +} diff --git a/server/rpc/rpc.go b/server/rpc/rpc.go index f0668a6495..2819e701de 100644 --- a/server/rpc/rpc.go +++ b/server/rpc/rpc.go @@ -21,27 +21,23 @@ package rpc import ( "context" "errors" - "runtime" "strings" "time" - "github.com/bishopfox/sliver/client/version" - "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/server/core" "github.com/bishopfox/sliver/server/db" "github.com/bishopfox/sliver/server/log" + "github.com/reeflective/team/server" "google.golang.org/grpc/credentials" "google.golang.org/grpc/peer" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" ) -var ( - rpcLog = log.NamedLogger("rpc", "server") -) +var rpcLog = log.NamedLogger("rpc", "server") const ( minTimeout = time.Duration(30 * time.Second) @@ -49,6 +45,10 @@ const ( // Server - gRPC server type Server struct { + // Access all teamclient/teamserver base stuff. + // Users, credentials, server configs, loggers, etc. + team *server.Server + // Magical methods to break backwards compatibility // Here be dragons: https://github.com/grpc/grpc-go/issues/3794 rpcpb.UnimplementedSliverRPCServer @@ -75,26 +75,9 @@ type GenericResponse interface { } // NewServer - Create new server instance -func NewServer() *Server { +func NewServer(team *server.Server) *Server { core.StartEventAutomation() - return &Server{} -} - -// GetVersion - Get the server version -func (rpc *Server) GetVersion(ctx context.Context, _ *commonpb.Empty) (*clientpb.Version, error) { - dirty := version.GitDirty != "" - semVer := version.SemanticVersion() - compiled, _ := version.Compiled() - return &clientpb.Version{ - Major: int32(semVer[0]), - Minor: int32(semVer[1]), - Patch: int32(semVer[2]), - Commit: version.GitCommit, - Dirty: dirty, - CompiledAt: compiled.Unix(), - OS: runtime.GOOS, - Arch: runtime.GOARCH, - }, nil + return &Server{team: team} } // GenericHandler - Pass the request to the Sliver/Session From 0a22f66e624266d7bd8257256b67a3593816e10c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 03:44:35 +0200 Subject: [PATCH 066/109] Update teamserver library dependency --- go.mod | 2 +- go.sum | 2 ++ .../reeflective/team/client/config.go | 14 ++++++++----- .../reeflective/team/client/directories.go | 2 ++ .../reeflective/team/client/options.go | 15 +------------ .../reeflective/team/internal/db/sql.go | 14 +++++++++---- .../github.com/reeflective/team/server/db.go | 3 ++- .../reeflective/team/server/directories.go | 2 ++ .../github.com/reeflective/team/server/log.go | 21 ++++++------------- .../reeflective/team/server/server.go | 7 ++++++- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index c7a073827d..c1d502267c 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/ncruces/go-sqlite3 v0.8.1 github.com/reeflective/console v0.1.6 github.com/reeflective/readline v1.0.8 - github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 + github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 github.com/rsteube/carapace v0.37.3 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index df65d357b5..e3e3fe420a 100644 --- a/go.sum +++ b/go.sum @@ -326,6 +326,8 @@ github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/ github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= +github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 h1:FT77nbrQlbSz7yxL23ezc0zHu/xnu+hY5OG2PS+TyPg= +github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187/go.mod h1:6pibborkTGBH30FAz3R+tByK7NPVVkalQU0w90Koq90= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go index f4b4028d35..e4eafee293 100644 --- a/vendor/github.com/reeflective/team/client/config.go +++ b/vendor/github.com/reeflective/team/client/config.go @@ -53,7 +53,7 @@ type Config struct { Certificate string `json:"certificate"` } -func (tc *Client) initConfig() error { +func (tc *Client) initConfig() (err error) { cfg := tc.opts.config // We assume that any configuration passed with WithConfig() @@ -63,17 +63,21 @@ func (tc *Client) initConfig() error { } // Else fetch the unique config or prompt user for which. - if !tc.opts.local { + if tc.dialer != nil { configs := tc.GetConfigs() if len(configs) == 0 { - return tc.errorf("no config files found at %s", tc.ConfigsDir()) + err = fmt.Errorf("no configs found in %s", tc.ConfigsDir()) + } else { + cfg = tc.SelectConfig() } - - cfg = tc.SelectConfig() } // We must have a config. if cfg == nil { + if err != nil { + return fmt.Errorf("%w: %w", ErrNoConfig, err) + } + return ErrNoConfig } diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go index 0c2129c992..448a2c0885 100644 --- a/vendor/github.com/reeflective/team/client/directories.go +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -38,6 +38,8 @@ func (tc *Client) HomeDir() string { if tc.homeDir == "" { user, _ := user.Current() dir = filepath.Join(user.HomeDir, "."+tc.name) + } else { + dir = tc.homeDir } } else { dir = "." + tc.name diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index a43c03b74d..4b0b81d385 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -43,7 +43,6 @@ type opts struct { logFile string inMemory bool console bool - local bool stdout io.Writer config *Config logger *logrus.Logger @@ -166,24 +165,12 @@ func WithLogger(logger *logrus.Logger) Options { // // This option can be used multiple times, either when using // team/client.New() or when using the teamclient.Connect() method. -func WithDialer(dialer Dialer, hooks ...func(clientConn any) error) Options { +func WithDialer(dialer Dialer) Options { return func(opts *opts) { opts.dialer = dialer } } -// WithLocalDialer sets the teamclient to connect with an in-memory dialer -// (provided when creating the teamclient). This in effect only prevents -// the teamclient from looking and loading/prompting remote client configs. -// -// Because this is automatically called by the teamserver.Serve(client) -// function, you should probably not have any reason to use this option. -func WithLocalDialer() Options { - return func(opts *opts) { - opts.local = true - } -} - // WithNoDisconnect is meant to be used when the teamclient commands are used // in a closed-loop (readline-style) application, where the connection is used // more than once in the lifetime of the Go program. diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index 27f589d5a5..ac9c0a43fd 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -83,10 +83,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { return nil, fmt.Errorf("%w: '%s'", ErrUnsupportedDialect, dbConfig.Dialect) } - err = dbClient.AutoMigrate( - &Certificate{}, - &User{}, - ) + err = dbClient.AutoMigrate(Schema()) if err != nil { dbLogger.Error(err) } @@ -111,6 +108,15 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { }), nil } +// Schema returns all objects which should be registered +// to the teamserver database backend. +func Schema() []any { + return []any{ + &Certificate{}, + &User{}, + } +} + func postgresClient(dsn string, log logger.Interface) (*gorm.DB, error) { return gorm.Open(postgres.Open(dsn), &gorm.Config{ PrepareStmt: true, diff --git a/vendor/github.com/reeflective/team/server/db.go b/vendor/github.com/reeflective/team/server/db.go index b8bb61a0ff..31bc97ca6a 100644 --- a/vendor/github.com/reeflective/team/server/db.go +++ b/vendor/github.com/reeflective/team/server/db.go @@ -169,6 +169,7 @@ func (ts *Server) initDatabase() (err error) { dbLogger := ts.NamedLogger("database", "database") if ts.db != nil { + err = ts.db.AutoMigrate(db.Schema()...) return } @@ -183,7 +184,7 @@ func (ts *Server) initDatabase() (err error) { } }) - return nil + return err } func (ts *Server) dbSession() *gorm.DB { diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go index fb04e064f9..188aa7436f 100644 --- a/vendor/github.com/reeflective/team/server/directories.go +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -41,6 +41,8 @@ func (ts *Server) HomeDir() string { if ts.homeDir == "" { user, _ := user.Current() dir = filepath.Join(user.HomeDir, "."+ts.name) + } else { + dir = ts.homeDir } } else { dir = "." + ts.name diff --git a/vendor/github.com/reeflective/team/server/log.go b/vendor/github.com/reeflective/team/server/log.go index 24a81c60c4..7b1729c6d1 100644 --- a/vendor/github.com/reeflective/team/server/log.go +++ b/vendor/github.com/reeflective/team/server/log.go @@ -76,9 +76,12 @@ func (ts *Server) AuditLogger() (*logrus.Logger, error) { // Initialize loggers in files/stdout according to options. func (ts *Server) initLogging() (err error) { - // By default, the stdout logger is never nil. - // We might overwrite it below if using our defaults. - // ts.stdoutLogger = log.NewStdio(logrus.WarnLevel) + // If user supplied a logger, use it in place of the + // file-based logger, since the file logger is optional. + if ts.opts.logger != nil { + ts.fileLog = ts.opts.logger + return nil + } logFile := filepath.Join(ts.LogsDir(), log.FileName(ts.Name(), true)) @@ -87,18 +90,6 @@ func (ts *Server) initLogging() (err error) { logFile = ts.opts.logFile } - // Ensure all teamserver-specific directories are writable. - // if err := ts.checkWritableFiles(); err != nil { - // return fmt.Errorf("%w: %w", ErrDirectory, err) - // } - - // If user supplied a logger, use it in place of the - // file-based logger, since the file logger is optional. - if ts.opts.logger != nil { - ts.fileLog = ts.opts.logger - return nil - } - level := logrus.Level(ts.opts.config.Log.Level) // Create any additional/configured logger and related/missing hooks. diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index 27f04b743d..ad8cb3351a 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -90,7 +90,12 @@ func (ts *Server) Serve(cli *client.Client, opts ...Options) error { return err } - return cli.Connect(client.WithLocalDialer()) + // Use a fake config with a non-empty name. + cliOpts := []client.Options{ + client.WithConfig(&client.Config{User: "server"}), + } + + return cli.Connect(cliOpts...) } // ServeDaemon is a blocking call which starts the teamserver as daemon process, using From a285f404f769aa35cd9a0d6915fa3b78100c7649 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 5 Aug 2023 21:48:09 +0200 Subject: [PATCH 067/109] Switch some commands and completers to multiple args --- client/command/beacons/commands.go | 8 +- client/command/beacons/rm.go | 50 +++++++++--- client/command/creds/creds.go | 3 +- client/command/creds/rm.go | 85 ++++++++++++++------- client/command/generate/commands.go | 4 +- client/command/generate/helpers.go | 3 +- client/command/generate/implants-rm.go | 46 +++++------ client/command/generate/profiles-rm.go | 52 ++++++------- client/command/generate/traffic-encoders.go | 28 +++++-- 9 files changed, 177 insertions(+), 102 deletions(-) diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 5e3349c868..3854737ebb 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -48,7 +48,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { BeaconsRmCmd(cmd, con, args) }, } - carapace.Gen(beaconsRmCmd).PositionalCompletion(BeaconIDCompleter(con)) + carapace.Gen(beaconsRmCmd).PositionalCompletion(BeaconIDCompleter(con).Usage("beacon to delete (optional, prompts if no args given)")) beaconsCmd.AddCommand(beaconsRmCmd) beaconsWatchCmd := &cobra.Command{ @@ -79,7 +79,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -98,7 +98,9 @@ func BeaconIDCompleter(con *console.SliverClient) carapace.Action { results = append(results, desc) } } - return carapace.ActionValuesDescribed(results...).Tag("beacons") + + return carapace.ActionValuesDescribed(results...).Tag("beacons"). + Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index c42fa11ff8..bd626eb193 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -19,23 +19,49 @@ package beacons */ import ( + "context" + "strings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/spf13/cobra" ) // BeaconsRmCmd - Display/interact with beacons. func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - beacon, err := SelectBeacon(con) - if err != nil { - con.PrintErrorf("%s\n", err) - return - } - grpcCtx, cancel := con.GrpcContext(cmd) - defer cancel() - _, err = con.Rpc.RmBeacon(grpcCtx, beacon) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return + if len(args) > 0 { + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintErrorf("Failed to get beacons: %s", err) + return + } + + for _, arg := range args { + for _, beac := range beacons.GetBeacons() { + if strings.HasPrefix(beac.ID, arg) { + grpcCtx, cancel := con.GrpcContext(cmd) + _, err = con.Rpc.RmBeacon(grpcCtx, beac) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + } + + cancel() + } + } + } + } else { + beacon, err := SelectBeacon(con) + if err != nil { + con.PrintErrorf("%s\n", err) + return + } + grpcCtx, cancel := con.GrpcContext(cmd) + defer cancel() + _, err = con.Rpc.RmBeacon(grpcCtx, beacon) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + return + } + con.PrintInfof("Beacon removed (%s)\n", beacon.ID) } - con.PrintInfof("Beacon removed (%s)\n", beacon.ID) } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 910122bd5d..8c8dbdbe3e 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -184,6 +184,7 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { } - return carapace.ActionValuesDescribed(results...).Tag("credentials") + return carapace.ActionValuesDescribed(results...).Tag("credentials"). + Invoke(c).Filter(c.Args).ToA() }) } diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index e10d54c41a..eace7891cb 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -20,6 +20,7 @@ package creds import ( "context" + "strings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -29,37 +30,67 @@ import ( // CredsCmd - Add new credentials. func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - var id string if len(args) > 0 { - id = args[0] - } - if id == "" { - credential, err := SelectCredential(false, clientpb.HashType_INVALID, con) + creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } - id = credential.ID - } - _, err := con.Rpc.CredsRm(context.Background(), &clientpb.Credentials{ - Credentials: []*clientpb.Credential{ - { - ID: id, + + if len(creds.Credentials) == 0 { + con.PrintInfof("No credentials 🙁\n") + return + } + + for _, arg := range args { + for _, cred := range creds.GetCredentials() { + if strings.HasPrefix(cred.ID, arg) { + _, err := con.Rpc.CredsRm(context.Background(), &clientpb.Credentials{ + Credentials: []*clientpb.Credential{ + { + ID: cred.ID, + }, + }, + }) + if err != nil { + con.PrintErrorf("Failed to delete credential: %s\n", con.UnwrapServerErr(err)) + return + } + } + } + } + } else { + var id string + if id == "" { + credential, err := SelectCredential(false, clientpb.HashType_INVALID, con) + if err != nil { + con.PrintErrorf("%s\n", err) + return + } + + id = credential.ID + } + _, err := con.Rpc.CredsRm(context.Background(), &clientpb.Credentials{ + Credentials: []*clientpb.Credential{ + { + ID: id, + }, }, - }, - }) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return - } - creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return - } - if len(creds.Credentials) == 0 { - con.PrintInfof("No credentials 🙁\n") - return + }) + if err != nil { + con.PrintErrorf("Failed to delete credential: %s\n", con.UnwrapServerErr(err)) + return + } + + creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + return + } + if len(creds.Credentials) == 0 { + con.PrintInfof("No credentials 🙁\n") + return + } + PrintCreds(creds.Credentials, con) } - PrintCreds(creds.Credentials, con) } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 7781df4f8b..fb2a574674 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -213,7 +213,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Remove a profile", Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.RmStr}), - Args: cobra.ExactArgs(1), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { ProfilesRmCmd(cmd, con, args) }, @@ -265,7 +265,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Remove implant build", Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.RmStr}), - Args: cobra.ExactArgs(1), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { ImplantsRmCmd(cmd, con, args) }, diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 32c7c1306d..ad35682a83 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -171,7 +171,8 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { results = append(results, desc) } - return carapace.ActionValuesDescribed(results...).Tag("traffic encoders") + return carapace.ActionValuesDescribed(results...).Tag("traffic encoders"). + Invoke(c).Filter(c.Args).ToA() }).Cache(completers.CacheCompilerInfo) } diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index e63620a924..026edd8b31 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -12,28 +12,28 @@ import ( // ImplantsRmCmd - Deletes an archived implant build from the server. func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - name := args[0] - // name := ctx.Args.String("name") - if name == "" { - con.PrintErrorf("No name specified\n") - return - } - build := ImplantBuildByName(name, con) - if build == nil { - con.PrintErrorf("No implant build found with name '%s'\n", name) - return - } - confirm := false - prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' build?", name)} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - _, err := con.Rpc.DeleteImplantBuild(context.Background(), &clientpb.DeleteReq{ - Name: name, - }) - if err != nil { - con.PrintErrorf("Failed to delete implant %s\n", con.UnwrapServerErr(err)) - return + for _, name := range args { + if name == "" { + continue + } + + build := ImplantBuildByName(name, con) + if build == nil { + con.PrintErrorf("No implant build found with name '%s'\n", name) + return + } + confirm := false + prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' build?", name)} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + _, err := con.Rpc.DeleteImplantBuild(context.Background(), &clientpb.DeleteReq{ + Name: name, + }) + if err != nil { + con.PrintErrorf("Failed to delete implant %s\n", con.UnwrapServerErr(err)) + continue + } } } diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index d7351a9cef..da748cc13f 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -30,31 +30,31 @@ import ( // ProfilesRmCmd - Delete an implant profile. func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - var name string - if len(args) > 0 { - name = args[0] - } - // name := ctx.Args.String("name") - if name == "" { - con.PrintErrorf("No profile name specified\n") - return - } - profile := GetImplantProfileByName(name, con) - if profile == nil { - con.PrintErrorf("No profile found with name '%s'\n", name) - return - } - confirm := false - prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' profile?", name)} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - _, err := con.Rpc.DeleteImplantProfile(context.Background(), &clientpb.DeleteReq{ - Name: name, - }) - if err != nil { - con.PrintErrorf("Failed to delete profile %s\n", con.UnwrapServerErr(err)) - return + for _, name := range args { + if name == "" { + continue + } + if name == "" { + con.PrintErrorf("No profile name specified\n") + return + } + profile := GetImplantProfileByName(name, con) + if profile == nil { + con.PrintErrorf("No profile found with name '%s'\n", name) + return + } + confirm := false + prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' profile?", name)} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + _, err := con.Rpc.DeleteImplantProfile(context.Background(), &clientpb.DeleteReq{ + Name: name, + }) + if err != nil { + con.PrintErrorf("Failed to delete profile %s\n", con.UnwrapServerErr(err)) + continue + } } } diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index ca3efe5a06..593bd8cdbc 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -246,14 +246,29 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest // TrafficEncodersRemoveCmd - Remove a traffic encoder. func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - _, cancel := con.GrpcContext(cmd) - defer cancel() - var name string if len(args) > 0 { - name = args[0] - } - if name == "" { + for _, name := range args { + if name == "" { + continue + } + + grpcCtx, cancel := con.GrpcContext(cmd) + _, err := con.Rpc.TrafficEncoderRm(grpcCtx, &clientpb.TrafficEncoder{ + Wasm: &commonpb.File{ + Name: name, + }, + }) + cancel() + + if err != nil { + con.PrintErrorf("%s", con.UnwrapServerErr(err)) + continue + } + + con.PrintInfof("Successfully removed traffic encoder: %s\n", name) + } + } else { name = SelectTrafficEncoder(con) } grpcCtx, cancel := con.GrpcContext(cmd) @@ -267,7 +282,6 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, arg con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } - con.Println() con.PrintInfof("Successfully removed traffic encoder: %s\n", name) } From a995c1490f5fcf69dbbc834b3c19bfb59b46dba6 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 8 Aug 2023 00:41:26 +0200 Subject: [PATCH 068/109] Fixes during presentations --- client/cli/cli.go | 21 ++++++++++----------- client/command/exec/commands.go | 1 + server/cli/cli.go | 29 +++++++++++++++-------------- server/command/server.go | 3 ++- server/msf/msf.go | 21 +++++++++++++++------ server/transport/mtls.go | 3 ++- server/transport/server.go | 3 ++- server/transport/tailscale.go | 3 ++- 8 files changed, 49 insertions(+), 35 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 5c0f684d4d..9beb7eb71a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,7 +24,6 @@ import ( "github.com/bishopfox/sliver/client/command" sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - "github.com/reeflective/console" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -42,13 +41,7 @@ func Execute() { } // Generate our complete Sliver Framework command-line interface. - rootCmd, server := SliverCLI(con) - - // Bind the closed-loop console. - // The console shares the same setup/connection pre-runners as other commands, - // but the command yielders we pass as arguments don't: this is because we only - // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(sliverConsole.Command(con, server)) + rootCmd := SliverCLI(con) // Version rootCmd.AddCommand(cmdVersion) @@ -63,7 +56,7 @@ func Execute() { // The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped // with all prerunners needed to connect to remote Sliver teamservers. // It will also register the appropriate teamclient management commands. -func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Commands) { +func SliverCLI(con *client.SliverClient) (root *cobra.Command) { teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), @@ -73,11 +66,17 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Co // Generate a single tree instance of server commands: // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. - server = command.ServerCommands(con, teamclientCmds) + server := command.ServerCommands(con, teamclientCmds) root = server() root.Use = "sliver-client" // Needed by completion scripts. + // Bind the closed-loop console. + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + root.AddCommand(sliverConsole.Command(con, server)) + // Implant. // The implant command allows users to run commands on slivers from their // system shell. It makes use of pre-runners for connecting to the server @@ -96,5 +95,5 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Co // Generate the root completion command. carapace.Gen(root) - return root, server + return root } diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 4807e57d59..019af886d7 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -197,6 +197,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + (*comp)["payload"] = generate.MsfPayloadCompleter(con) }) msfInjectCmd := &cobra.Command{ diff --git a/server/cli/cli.go b/server/cli/cli.go index f3925e637e..48f9ad540c 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -22,7 +22,6 @@ import ( "os" // CLI dependencies - "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -33,7 +32,9 @@ import ( clientCommand "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/command" + "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -67,13 +68,7 @@ func Execute() { con.AddConnectHooks(preRunServer(teamserver, con)) // Generate our complete Sliver Framework command-line interface. - rootCmd, server := sliverServerCLI(teamserver, con) - - // Bind the closed-loop console: - // The console shares the same setup/connection pre-runners as other commands, - // but the command yielders we pass as arguments don't: this is because we only - // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(consoleCmd.Command(con, server)) + rootCmd := sliverServerCLI(teamserver, con) // Run the target Sliver command: // Three different examples here, to illustrate. @@ -101,17 +96,23 @@ func Execute() { // It will also register the appropriate teamclient management commands. // // Counterpart of sliver/client/cli.SliverCLI() (not identical: no implant command here). -func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command, server console.Commands) { +func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command) { teamserverCmds := command.TeamserverCommands(team, con) // Generate a single tree instance of server commands: // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. - server = clientCommand.ServerCommands(con, teamserverCmds) + server := clientCommand.ServerCommands(con, teamserverCmds) root = server() root.Use = "sliver-server" // Needed by completion scripts. + // Bind the closed-loop console: + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + root.AddCommand(consoleCmd.Command(con, server)) + // Pre/post runners and completions. clientCommand.BindPrePost(root, true, con.ConnectRun) clientCommand.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { @@ -121,7 +122,7 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra // Generate the root completion command. carapace.Gen(root) - return root, server + return root } // preRunServer is the server-binary-specific pre-run; it ensures that the server @@ -130,15 +131,15 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func() er return func() error { // Ensure the server has what it needs. assets.Setup(false, true) - encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? + encoders.Setup() certs.SetupCAs() certs.SetupWGKeys() cryptography.AgeServerKeyPair() cryptography.MinisignServerPrivateKey() // TODO: Move this out of here. - // serverConfig := configs.GetServerConfig() - // c2.StartPersistentJobs(serverConfig) + serverConfig := configs.GetServerConfig() + c2.StartPersistentJobs(serverConfig) // Let our in-memory teamclient be served. return teamserver.Serve(con.Teamclient) diff --git a/server/command/server.go b/server/command/server.go index f8a328946f..bedce7fc3d 100644 --- a/server/command/server.go +++ b/server/command/server.go @@ -19,6 +19,8 @@ package command */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/command/assets" @@ -27,7 +29,6 @@ import ( "github.com/bishopfox/sliver/server/command/version" "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" - "github.com/spf13/cobra" ) // TeamserverCommands is the equivalent of client/command.ServerCommands(), but for server-binary only ones. diff --git a/server/msf/msf.go b/server/msf/msf.go index 360ff99c01..b4f1ec1f70 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -156,9 +156,7 @@ func CacheModules() { return } - msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) - - fileName := filepath.Join(msfDir, "msf-"+target+".cache") + fileName := filepath.Join(MsfDir(), "msf-"+target+".cache") if err := os.WriteFile(fileName, result, 0o600); err != nil { msfLog.Error(err) } @@ -169,6 +167,19 @@ func CacheModules() { msfLog.Infof("Done caching msfvenom data") } +// GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/ +func MsfDir() string { + msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) + + if _, err := os.Stat(msfDir); os.IsNotExist(err) { + err = os.MkdirAll(msfDir, 0o700) + if err != nil { + msfLog.Fatalf("Cannot write to sliver root dir %s", err) + } + } + return msfDir +} + // GetMsfCache returns the cache of Metasploit modules and other info. func GetMsfCache() *clientpb.MetasploitCompiler { formats, ok := msfCache.Load("formats") @@ -362,10 +373,8 @@ func parseCache() *clientpb.MetasploitCompiler { msf.Version = ver - msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) - for _, file := range msfModuleTypes { - fileName := filepath.Join(msfDir, fmt.Sprintf("msf-%s.cache", file)) + fileName := filepath.Join(MsfDir(), fmt.Sprintf("msf-%s.cache", file)) switch file { case "formats": diff --git a/server/transport/mtls.go b/server/transport/mtls.go index b74ee97c03..83a4d9352f 100644 --- a/server/transport/mtls.go +++ b/server/transport/mtls.go @@ -22,9 +22,10 @@ import ( "net" "sync" - "github.com/reeflective/team/server" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" + + "github.com/reeflective/team/server" ) // teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. diff --git a/server/transport/server.go b/server/transport/server.go index 7ef8f19403..b4d9e715df 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -23,10 +23,11 @@ import ( "net" "runtime/debug" - "github.com/reeflective/team/server" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" + "github.com/reeflective/team/server" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/db" diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 36e47d8d01..412aba7873 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -25,10 +25,11 @@ import ( "os" "path/filepath" - "github.com/reeflective/team/server" "google.golang.org/grpc" "tailscale.com/tsnet" + "github.com/reeflective/team/server" + "github.com/bishopfox/sliver/server/assets" ) From 88fc7b6e83050750bc385fa402a6156d3ffda42b Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 8 Aug 2023 05:32:05 +0200 Subject: [PATCH 069/109] Update completion engine version --- go.mod | 11 ++--- go.sum | 4 +- .../github.com/rsteube/carapace/carapace.go | 13 ----- .../github.com/rsteube/carapace/complete.go | 6 +-- .../rsteube/carapace/pkg/style/config.go | 48 +++++++++---------- vendor/github.com/rsteube/carapace/storage.go | 8 ---- .../elves/elvish/pkg/cli/lscolors/feature.go | 1 + vendor/modules.txt | 5 +- 8 files changed, 36 insertions(+), 60 deletions(-) diff --git a/go.mod b/go.mod index c1d502267c..9bc05f9e22 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,12 @@ module github.com/bishopfox/sliver go 1.20 -// replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +// A fork of the completion engine is currently used in order to consume the engine +// as a library. The fork is a very slightly patched mainline tree for that purpose. +replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 -replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace - -replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team - -// replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console +// Team is the teamserver/teamclient library, and this directive should be removed. +replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team require ( filippo.io/age v1.1.1 diff --git a/go.sum b/go.sum index e3e3fe420a..65111898de 100644 --- a/go.sum +++ b/go.sum @@ -322,12 +322,12 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= +github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7u3sKdsKHQRQluOfwv/eXsw+v+r9h50cf1kU8= +github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= -github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 h1:FT77nbrQlbSz7yxL23ezc0zHu/xnu+hY5OG2PS+TyPg= -github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187/go.mod h1:6pibborkTGBH30FAz3R+tByK7NPVVkalQU0w90Koq90= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/vendor/github.com/rsteube/carapace/carapace.go b/vendor/github.com/rsteube/carapace/carapace.go index 7fba2f2cec..6573567f18 100644 --- a/vendor/github.com/rsteube/carapace/carapace.go +++ b/vendor/github.com/rsteube/carapace/carapace.go @@ -38,19 +38,6 @@ func (c Carapace) PreRun(f func(cmd *cobra.Command, args []string)) { } } -func (c Carapace) PostRun(f func(cmd *cobra.Command, args []string)) { - if entry := storage.get(c.cmd); entry.postrun != nil { - _f := entry.postrun - entry.postrun = func(cmd *cobra.Command, args []string) { - // TODO yuck - probably best to append to a slice in storage - _f(cmd, args) - f(cmd, args) - } - } else { - entry.prerun = f - } -} - // PreInvoke sets a function to alter actions before they are invoked. func (c Carapace) PreInvoke(f func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action) { if entry := storage.get(c.cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/complete.go b/vendor/github.com/rsteube/carapace/complete.go index 0cf82b3b03..f23efa8f02 100644 --- a/vendor/github.com/rsteube/carapace/complete.go +++ b/vendor/github.com/rsteube/carapace/complete.go @@ -49,11 +49,7 @@ func complete(cmd *cobra.Command, args []string) (string, error) { action = ActionMessage("failed to load config: " + err.Error()) } - act := action.Invoke(context).value(args[0], args[len(args)-1]) - storage.postRun(cmd, args) - - return act, nil - // return action.Invoke(context).value(args[0], args[len(args)-1]), nil + return action.Invoke(context).value(args[0], args[len(args)-1]), nil } } diff --git a/vendor/github.com/rsteube/carapace/pkg/style/config.go b/vendor/github.com/rsteube/carapace/pkg/style/config.go index 9799b13603..954c19da04 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/config.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/config.go @@ -25,41 +25,41 @@ func Register(name string, i interface{}) { config.RegisterStyle(name, i) } func Set(key, value string) error { return config.SetStyle(key, value) } type carapace struct { - Value string `description:"default style for values" tag:"core styles"` + Value string `description:"default style for values" tag:"core styles"` Description string `description:"default style for descriptions" tag:"core styles"` - Error string `description:"default style for errors" tag:"core styles"` - Usage string `description:"default style for usage" tag:"core styles"` + Error string `description:"default style for errors" tag:"core styles"` + Usage string `description:"default style for usage" tag:"core styles"` KeywordAmbiguous string `description:"keyword describing a ambiguous state" tag:"keyword styles"` - KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` - KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` - KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` + KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` + KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` + KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` - LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` - LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` - LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` - LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` - LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` + LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` + LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` + LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` + LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` + LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` LogLevelCritical string `description:"LogLevel CRITICAL" tag:"loglevel styles"` - LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` + LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` - Highlight1 string `description:"Highlight 1" tag:"highlight styles"` - Highlight2 string `description:"Highlight 2" tag:"highlight styles"` - Highlight3 string `description:"Highlight 3" tag:"highlight styles"` - Highlight4 string `description:"Highlight 4" tag:"highlight styles"` - Highlight5 string `description:"Highlight 5" tag:"highlight styles"` - Highlight6 string `description:"Highlight 6" tag:"highlight styles"` - Highlight7 string `description:"Highlight 7" tag:"highlight styles"` - Highlight8 string `description:"Highlight 8" tag:"highlight styles"` - Highlight9 string `description:"Highlight 9" tag:"highlight styles"` + Highlight1 string `description:"Highlight 1" tag:"highlight styles"` + Highlight2 string `description:"Highlight 2" tag:"highlight styles"` + Highlight3 string `description:"Highlight 3" tag:"highlight styles"` + Highlight4 string `description:"Highlight 4" tag:"highlight styles"` + Highlight5 string `description:"Highlight 5" tag:"highlight styles"` + Highlight6 string `description:"Highlight 6" tag:"highlight styles"` + Highlight7 string `description:"Highlight 7" tag:"highlight styles"` + Highlight8 string `description:"Highlight 8" tag:"highlight styles"` + Highlight9 string `description:"Highlight 9" tag:"highlight styles"` Highlight10 string `description:"Highlight 10" tag:"highlight styles"` Highlight11 string `description:"Highlight 11" tag:"highlight styles"` Highlight12 string `description:"Highlight 12" tag:"highlight styles"` - FlagArg string `description:"flag with argument" tag:"flag styles"` + FlagArg string `description:"flag with argument" tag:"flag styles"` FlagMultiArg string `description:"flag with multiple arguments" tag:"flag styles"` - FlagNoArg string `description:"flag without argument" tag:"flag styles"` - FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` + FlagNoArg string `description:"flag without argument" tag:"flag styles"` + FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` } var Carapace = carapace{ diff --git a/vendor/github.com/rsteube/carapace/storage.go b/vendor/github.com/rsteube/carapace/storage.go index b4470a1d2d..9673ffccd1 100644 --- a/vendor/github.com/rsteube/carapace/storage.go +++ b/vendor/github.com/rsteube/carapace/storage.go @@ -20,7 +20,6 @@ type entry struct { dashAny Action preinvoke func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action prerun func(cmd *cobra.Command, args []string) - postrun func(cmd *cobra.Command, args []string) bridged bool } @@ -68,13 +67,6 @@ func (s _storage) preRun(cmd *cobra.Command, args []string) { } } -func (s _storage) postRun(cmd *cobra.Command, args []string) { - if entry := s.get(cmd); entry.postrun != nil { - LOG.Printf("executing PreRun for %#v with args %#v", cmd.Name(), args) - entry.postrun(cmd, args) - } -} - func (s _storage) preinvoke(cmd *cobra.Command, flag *pflag.Flag, action Action) Action { a := action if entry := s.get(cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go index ff5afcf82f..fdce6d3014 100644 --- a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go +++ b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go @@ -40,6 +40,7 @@ const worldWritable = 0o002 func determineFeature(fname string, mh bool) (feature, error) { stat, err := os.Lstat(fname) + if err != nil { return featureInvalid, err } diff --git a/vendor/modules.txt b/vendor/modules.txt index db8dd69a0f..30ceb0422b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -534,7 +534,7 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team +# github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 => /home/user/code/github.com/reeflective/team ## explicit; go 1.20 github.com/reeflective/team github.com/reeflective/team/client @@ -556,7 +556,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace +# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -1266,3 +1266,4 @@ tailscale.com/wgengine/wgcfg/nmcfg tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet +# github.com/reeflective/team => /home/user/code/github.com/reeflective/team From 678faacd7e2b340df3cd0a4e05fe890db8ed75eb Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 00:10:50 +0200 Subject: [PATCH 070/109] Cleanups and fixes in command display groups --- client/cli/cli.go | 15 ++++++++------- client/cli/implant.go | 2 ++ client/cli/version.go | 11 +++++++---- client/command/console/console.go | 9 +++++---- client/console/console.go | 12 ++++++------ client/console/readline.go | 2 ++ server/command/server.go | 5 ++++- 7 files changed, 34 insertions(+), 22 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 9beb7eb71a..d25b6e3b96 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -21,12 +21,13 @@ package cli import ( "os" - "github.com/bishopfox/sliver/client/command" - sliverConsole "github.com/bishopfox/sliver/client/command/console" - client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command" + consoleCmd "github.com/bishopfox/sliver/client/command/console" + "github.com/bishopfox/sliver/client/console" ) // Execute - Run the sliver client binary. @@ -35,7 +36,7 @@ func Execute() { // Sliver Client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. - con, err := client.NewSliverClient() + con, err := console.NewSliverClient() if err != nil { panic(err) } @@ -56,8 +57,8 @@ func Execute() { // The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped // with all prerunners needed to connect to remote Sliver teamservers. // It will also register the appropriate teamclient management commands. -func SliverCLI(con *client.SliverClient) (root *cobra.Command) { - teamclientCmds := func(con *client.SliverClient) []*cobra.Command { +func SliverCLI(con *console.SliverClient) (root *cobra.Command) { + teamclientCmds := func(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } @@ -75,7 +76,7 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - root.AddCommand(sliverConsole.Command(con, server)) + root.AddCommand(consoleCmd.Command(con, server)) // Implant. // The implant command allows users to run commands on slivers from their diff --git a/client/cli/implant.go b/client/cli/implant.go index d0dfc14948..4dfdff08a3 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -20,6 +20,8 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co // usable in the context of an active target implant. implantCmd := sliverCmds() implantCmd.Use = constants.ImplantMenu + implantCmd.Short = "Implant target command tree (equivalent of the sliver menu)" + implantCmd.GroupID = constants.SliverHelpGroup // But let the user set this implant with a flag. implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) diff --git a/client/cli/version.go b/client/cli/version.go index 89ad72e863..c8b724d89c 100644 --- a/client/cli/version.go +++ b/client/cli/version.go @@ -21,14 +21,17 @@ package cli import ( "fmt" - "github.com/bishopfox/sliver/client/version" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/version" ) var cmdVersion = &cobra.Command{ - Use: "version", - Short: "Print version and exit", - Long: ``, + Use: "version", + Short: "Print version and exit", + Long: ``, + GroupID: constants.GenericHelpGroup, Run: func(cmd *cobra.Command, args []string) { fmt.Printf("%s\n", version.FullVersion()) }, diff --git a/client/command/console/console.go b/client/command/console/console.go index 8570ffb9f3..d057f5f185 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,11 +19,12 @@ package console */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" - "github.com/spf13/cobra" ) // Command returns the closed-loop Sliver console command. @@ -34,10 +35,10 @@ import ( // is always the same in the console. func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ - Use: "console", - Short: "Start the sliver client console", + Use: "console", + Short: "Start the sliver client console", + GroupID: consts.GenericHelpGroup, RunE: func(cmd *cobra.Command, args []string) error { - con.IsCLI = false // Bind commands to the closed-loop console. server := con.App.Menu(consts.ServerMenu) diff --git a/client/console/console.go b/client/console/console.go index cabc315640..f7097dd069 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -31,6 +31,11 @@ import ( "sync" "time" + "github.com/spf13/cobra" + "golang.org/x/exp/slog" + "google.golang.org/grpc" + "google.golang.org/grpc/status" + "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" @@ -42,10 +47,6 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" - "github.com/spf13/cobra" - "golang.org/x/exp/slog" - "google.golang.org/grpc" - "google.golang.org/grpc/status" ) const ( @@ -195,7 +196,6 @@ func newClient() *SliverClient { // Server menu. server := con.App.Menu(consts.ServerMenu) - server.Short = "Server commands" server.Prompt().Primary = con.GetPrompt server.AddInterrupt(readline.ErrInterrupt, con.exitConsole) // Ctrl-C @@ -204,7 +204,6 @@ func newClient() *SliverClient { // Implant menu. sliver := con.App.NewMenu(consts.ImplantMenu) - sliver.Short = "Implant commands" sliver.Prompt().Primary = con.GetPrompt sliver.AddInterrupt(io.EOF, con.exitImplantMenu) // Ctrl-D @@ -220,6 +219,7 @@ func newClient() *SliverClient { // because the console needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). func (con *SliverClient) StartConsole() error { + con.IsCLI = false con.printf = con.App.TransientPrintf return con.App.Start() diff --git a/client/console/readline.go b/client/console/readline.go index 3f1f65e1e7..5ac4b15f7d 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -32,6 +32,7 @@ import ( "github.com/reeflective/console" ) +// GetPrompt returns the prompt string computed for the current context. func (con *SliverClient) GetPrompt() string { prompt := Underline + "sliver" + Normal if con.IsServer { @@ -46,6 +47,7 @@ func (con *SliverClient) GetPrompt() string { return Clearln + prompt } +// PrintLogo prints the Sliver console logo. func (con *SliverClient) PrintLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/server/command/server.go b/server/command/server.go index bedce7fc3d..7164961d97 100644 --- a/server/command/server.go +++ b/server/command/server.go @@ -23,6 +23,7 @@ import ( "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/command/assets" "github.com/bishopfox/sliver/server/command/builder" "github.com/bishopfox/sliver/server/command/certs" @@ -35,7 +36,9 @@ import ( func TeamserverCommands(team *server.Server, con *console.SliverClient) command.SliverBinder { return func(con *console.SliverClient) (cmds []*cobra.Command) { // Teamserver management - cmds = append(cmds, commands.Generate(team, con.Teamclient)) + teamclientCmds := commands.Generate(team, con.Teamclient) + teamclientCmds.GroupID = constants.GenericHelpGroup + cmds = append(cmds, teamclientCmds) // Sliver-specific cmds = append(cmds, version.Commands(con)...) From ed129716ebd2c6802a22f5e1e464398d20869d12 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 04:58:55 +0200 Subject: [PATCH 071/109] Fixes --- client/command/sessions/commands.go | 28 --------------------------- client/command/sessions/helpers.go | 28 +++++++++++++++++++++++++++ client/command/use/commands.go | 3 ++- client/command/use/use.go | 30 ++--------------------------- server/command/server.go | 5 +++-- 5 files changed, 35 insertions(+), 59 deletions(-) diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 3e14771fc1..183c558619 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -1,15 +1,10 @@ package sessions import ( - "context" - "fmt" - "strings" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -60,29 +55,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{sessionsCmd} } -// SessionIDCompleter completes session IDs. -func SessionIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { - results := make([]string, 0) - - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err == nil { - for _, s := range sessions.Sessions { - link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) - id := fmt.Sprintf("%s (%d)", s.Name, s.PID) - userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) - desc := strings.Join([]string{id, userHost, link}, " ") - - results = append(results, s.ID[:8]) - results = append(results, desc) - } - } - return carapace.ActionValuesDescribed(results...).Tag("sessions") - } - - return carapace.ActionCallback(callback) -} - // SliverCommands returns all session control commands for the active target. func SliverCommands(con *console.SliverClient) []*cobra.Command { backgroundCmd := &cobra.Command{ diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index 18c90026d1..f68c9c92af 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -31,6 +31,7 @@ import ( "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" ) var ( @@ -103,3 +104,30 @@ func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session } return nil, ErrNoSelection } + +// SessionIDCompleter completes session IDs. +func SessionIDCompleter(con *console.SliverClient) carapace.Action { + callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectComplete(); err != nil { + return msg + } + + results := make([]string, 0) + + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err == nil { + for _, s := range sessions.Sessions { + link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) + id := fmt.Sprintf("%s (%d)", s.Name, s.PID) + userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) + desc := strings.Join([]string{id, userHost, link}, " ") + + results = append(results, s.ID[:8]) + results = append(results, desc) + } + } + return carapace.ActionValuesDescribed(results...).Tag("sessions") + } + + return carapace.ActionCallback(callback) +} diff --git a/client/command/use/commands.go b/client/command/use/commands.go index c0ba8587e3..bdc2ea3002 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -4,6 +4,7 @@ import ( "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/rsteube/carapace" @@ -35,7 +36,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { UseSessionCmd(cmd, con, args) }, } - carapace.Gen(useSessionCmd).PositionalCompletion(SessionIDCompleter(con)) + carapace.Gen(useSessionCmd).PositionalCompletion(sessions.SessionIDCompleter(con)) useCmd.AddCommand(useSessionCmd) useBeaconCmd := &cobra.Command{ diff --git a/client/command/use/use.go b/client/command/use/use.go index 19ef853fd8..6b11371b5e 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -29,6 +29,7 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/command/beacons" + "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -187,37 +188,10 @@ func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { var action carapace.Action return action.Invoke(ctx).Merge( - SessionIDCompleter(con).Invoke(ctx), + sessions.SessionIDCompleter(con).Invoke(ctx), beacons.BeaconIDCompleter(con).Invoke(ctx), ).ToA() } return carapace.ActionCallback(comps) } - -// SessionIDCompleter completes session IDs. -func SessionIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { - return msg - } - - results := make([]string, 0) - - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err == nil { - for _, s := range sessions.Sessions { - link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) - id := fmt.Sprintf("%s (%d)", s.Name, s.PID) - userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) - desc := strings.Join([]string{id, userHost, link}, " ") - - results = append(results, s.ID[:8]) - results = append(results, desc) - } - } - return carapace.ActionValuesDescribed(results...).Tag("sessions") - } - - return carapace.ActionCallback(callback) -} diff --git a/server/command/server.go b/server/command/server.go index 7164961d97..a8289dd238 100644 --- a/server/command/server.go +++ b/server/command/server.go @@ -21,6 +21,9 @@ package command import ( "github.com/spf13/cobra" + "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" @@ -28,8 +31,6 @@ import ( "github.com/bishopfox/sliver/server/command/builder" "github.com/bishopfox/sliver/server/command/certs" "github.com/bishopfox/sliver/server/command/version" - "github.com/reeflective/team/server" - "github.com/reeflective/team/server/commands" ) // TeamserverCommands is the equivalent of client/command.ServerCommands(), but for server-binary only ones. From 87d26f88465ca49a23017895b63bba617e8fe8d8 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 06:54:52 +0200 Subject: [PATCH 072/109] Handle blocking operations in CLI --- client/command/portfwd/portfwd-add.go | 2 ++ client/command/portfwd/portfwd.go | 8 ++++++- client/command/rportfwd/portfwd-add.go | 2 ++ client/command/socks/socks-start.go | 2 ++ client/console/console.go | 29 ++++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 42c481ea2d..6793cba165 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -88,4 +88,6 @@ func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) }() con.PrintInfof("Port forwarding %s -> %s:%s\n", bindAddr, remoteHost, remotePort) + + con.WaitSignal() } diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 712e975690..8314347b07 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -77,8 +77,14 @@ func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { } for _, fwd := range portfwds { + results = append(results, strconv.Itoa(int(fwd.ID))) - results = append(results, fmt.Sprintf("%s (%s)", fwd.BindAddr, fwd.SessionID)) + results = append(results, fmt.Sprintf("%s (%s) %s -> %s", + fwd.BindAddr, + fwd.SessionID[:8], + fwd.BindAddr, + fwd.RemoteAddr, + )) } if len(results) == 0 { diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 84c168e4e5..94b96dfae3 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -63,6 +63,8 @@ func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, arg return } printStartedRportFwdListener(rportfwdListener, con) + + con.WaitSignal() } func printStartedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 63cf7a9fa7..84f6f07aa0 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -81,6 +81,8 @@ func SocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) }(core.SocksProxies.Add(channelProxy).ChannelProxy) con.PrintInfof("Started SOCKS5 %s %s %s %s\n", host, port, username, password) con.PrintWarnf("In-band SOCKS proxies can be a little unstable depending on protocol\n") + + con.WaitSignal() } func randomPassword() string { diff --git a/client/console/console.go b/client/console/console.go index f7097dd069..c27950646f 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -25,10 +25,12 @@ import ( "io" "log" "os" + "os/signal" "path/filepath" "strconv" "strings" "sync" + "syscall" "time" "github.com/spf13/cobra" @@ -312,6 +314,33 @@ func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } +// WaitSignal listens for os.Signals and returns when receiving one of the following: +// SIGINT, SIGTERM, SIGQUIT. +// +// This can be used for commands which should block if executed in an exec-once CLI run: +// if the command is ran in the closed-loop console, this function will not monitor signals +// and return immediately. +func (con *SliverClient) WaitSignal() error { + if !con.IsCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + sig := <-sigchan + con.PrintInfof("Received signal %s\n", sig) + + return nil +} + // FormatDateDelta - Generate formatted date string of the time delta between then and now. func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) From f49fe4bdc41d93c42468d43d5012d6197d0c5b56 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 07:00:37 +0200 Subject: [PATCH 073/109] Move reactions loading to console entry command --- client/command/console/console.go | 13 ++++++++++++- client/command/server.go | 30 +++++++++++++++++------------- client/console/console.go | 8 ++++---- client/console/implant.go | 6 +++--- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/client/command/console/console.go b/client/command/console/console.go index d057f5f185..35218996cf 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,12 +19,15 @@ package console */ import ( + "os" + + "github.com/reeflective/console" "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/command/reaction" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" ) // Command returns the closed-loop Sliver console command. @@ -47,6 +50,14 @@ func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Comma sliver := con.App.Menu(consts.ImplantMenu) sliver.SetCommands(command.SliverCommands(con)) + // Reactions + n, err := reaction.LoadReactions() + if err != nil && !os.IsNotExist(err) { + con.PrintErrorf("Failed to load reactions: %s\n", err) + } else if n > 0 { + con.PrintInfof("Loaded %d reaction(s) from disk\n", n) + } + // Start the console, blocking until player exit. return con.StartConsole() }, diff --git a/client/command/server.go b/client/command/server.go index 7f271c6140..95baa9bab3 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,8 +19,6 @@ package command */ import ( - "os" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -47,10 +45,14 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + cc "github.com/ivanpirog/coloredcobra" "github.com/reeflective/console" "github.com/spf13/cobra" ) +// SliverBinder is the signature of command yielder functions passed and used by +// the Sliver client. Currently this function type is only used as an alias for +// loading command sets easily, and is not part of any interface. type SliverBinder func(con *client.SliverClient) []*cobra.Command // ServerCommands returns all commands bound to the server menu, optionally @@ -66,6 +68,18 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C }, } + cc.Init(&cc.Config{ + RootCmd: server, + NoExtraNewlines: true, + NoBottomNewline: true, + Headings: cc.HiCyan + cc.Bold + cc.Underline, + ExecName: cc.Bold, + Example: cc.Italic, + Commands: cc.HiYellow + cc.Bold, + Flags: cc.Bold, + FlagsDataType: cc.Italic, + }) + // Utility function to be used for binding new commands to // the sliver menu: call the function with the name of the // group under which this/these commands should be added, @@ -73,7 +87,7 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C bind := MakeBind(server, con) if serverCmds != nil { - bind(consts.TeamserverHelpGroup, + bind(consts.GenericHelpGroup, serverCmds, ) } @@ -132,16 +146,6 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C // (although you can do so without fear). If there are any final modifications // to make to the server menu command tree, it time to do them here. - // Only load reactions when the console is going to be started. - if !con.IsCLI { - n, err := reaction.LoadReactions() - if err != nil && !os.IsNotExist(err) { - con.PrintErrorf("Failed to load reactions: %s\n", err) - } else if n > 0 { - con.PrintInfof("Loaded %d reaction(s) from disk\n", n) - } - } - server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) diff --git a/client/console/console.go b/client/console/console.go index c27950646f..c475749f01 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -107,7 +107,7 @@ type SliverClient struct { App *console.Console Settings *assets.ClientSettings IsServer bool - IsCLI bool + isCLI bool // Teamclient & remotes Teamclient *client.Client @@ -175,7 +175,7 @@ func newClient() *SliverClient { con := &SliverClient{ App: console.New("sliver"), Settings: settings, - IsCLI: true, + isCLI: true, printf: fmt.Printf, ActiveTarget: newActiveTarget(), EventListeners: &sync.Map{}, @@ -221,7 +221,7 @@ func newClient() *SliverClient { // because the console needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). func (con *SliverClient) StartConsole() error { - con.IsCLI = false + con.isCLI = false con.printf = con.App.TransientPrintf return con.App.Start() @@ -321,7 +321,7 @@ func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { // if the command is ran in the closed-loop console, this function will not monitor signals // and return immediately. func (con *SliverClient) WaitSignal() error { - if !con.IsCLI { + if !con.isCLI { return nil } diff --git a/client/console/implant.go b/client/console/implant.go index 0bd05496cc..226219ce45 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -149,7 +149,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { observer(s.session, s.beacon) } - if s.con.IsCLI { + if s.con.isCLI { return } @@ -176,7 +176,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } - if s.con.IsCLI { + if s.con.isCLI { return } @@ -197,7 +197,7 @@ func (s *ActiveTarget) Background() { } // Switch back to server menu. - if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + if !s.con.isCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { s.con.App.SwitchMenu(consts.ServerMenu) } } From 25599424b02a2c1dd9378397a4e1c6d5464fbf0f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 08:02:13 +0200 Subject: [PATCH 074/109] Correctly filter commands even in CLI --- client/cli/implant.go | 15 ++++++--------- client/console/console.go | 3 +++ client/console/teamclient.go | 6 ++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 4dfdff08a3..984f8b5477 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -43,10 +43,6 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co if err != nil { return } - - // And let the console and its active target decide - // what should be available to us, and what should not. - con.ActiveTarget.FilterCommands(implantCmd) }) // This completer will try connect to the server anyway, if not done already. @@ -79,18 +75,19 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd session := con.GetSession(target) if session != nil { con.ActiveTarget.Set(session, nil) - return nil } beacon := con.GetBeacon(target) if beacon != nil { con.ActiveTarget.Set(nil, beacon) - return nil } - // And let the console and its active target decide - // what should be available to us, and what should not. - con.ActiveTarget.FilterCommands(implantCmd) + // If the command is marked filtered (should not be ran in + // the current context/target), don't do anything and return. + // This is identical to the filtering behavior in the console. + if err := con.App.Menu(constants.ImplantMenu).ErrUnavailableCommand(cmd); err != nil { + return err + } return nil } diff --git a/client/console/console.go b/client/console/console.go index c475749f01..5edb4371b0 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -238,6 +238,7 @@ func (con *SliverClient) ExposeCommands() { con.App.HideCommands(filters...) } +// GetSession returns the session matching an ID, either by prefix or strictly. func (con *SliverClient) GetSession(arg string) *clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -252,6 +253,7 @@ func (con *SliverClient) GetSession(arg string) *clientpb.Session { return nil } +// GetBeacon returns the beacon matching an ID, either by prefix or strictly. func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { @@ -310,6 +312,7 @@ func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { return config } +// SpinUntil starts a console display spinner in the background (non-blocking) func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } diff --git a/client/console/teamclient.go b/client/console/teamclient.go index bed430783a..03acd39ee0 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -48,16 +48,14 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { return nil } - err := con.runPreConnectHooks() - if err != nil { + if err := con.runPreConnectHooks(); err != nil { return err } // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. - err = con.Teamclient.Connect() - if err != nil { + if err := con.Teamclient.Connect(); err != nil { return err } From 0b9cea476374efd61f891a8465c09ccc5b6f80cb Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 08:19:08 +0200 Subject: [PATCH 075/109] Cleaner interrupts in all menus --- client/command/exit/exit.go | 33 +---------------- client/console/readline.go | 70 ++++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 45 deletions(-) diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index af74dfc1eb..bbcad99173 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -19,49 +19,18 @@ package exit */ import ( - "context" - "fmt" - "os" - - "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/spf13/cobra" ) -// ExitCmd - Exit the console. -func ExitCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - fmt.Println("Exiting...") - if con.IsServer { - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err != nil { - os.Exit(1) - } - beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) - if err != nil { - os.Exit(1) - } - if 0 < len(sessions.Sessions) || 0 < len(beacons.Beacons) { - con.Printf("There are %d active sessions and %d active beacons.\n", len(sessions.Sessions), len(beacons.Beacons)) - confirm := false - prompt := &survey.Confirm{Message: "Are you sure you want to exit?"} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - } - } - os.Exit(0) -} - // Commands returns the `exit` command. func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{{ Use: "exit", Short: "Exit the program", Run: func(cmd *cobra.Command, args []string) { - ExitCmd(cmd, con, args) + con.ExitConfirm() }, GroupID: constants.GenericHelpGroup, }} diff --git a/client/console/readline.go b/client/console/readline.go index 5ac4b15f7d..578b69f8d4 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -19,14 +19,14 @@ package console */ import ( - "bufio" "context" "fmt" insecureRand "math/rand" "os" "strings" - consts "github.com/bishopfox/sliver/client/constants" + "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/reeflective/console" @@ -73,23 +73,67 @@ func (con *SliverClient) PrintLogo() { con.CheckLastUpdate() } -// exitConsole prompts the user for confirmation to exit the console. -func (c *SliverClient) exitConsole(_ *console.Console) { - reader := bufio.NewReader(os.Stdin) - fmt.Print("Confirm exit (Y/y, Ctrl-C): ") - text, _ := reader.ReadString('\n') - answer := strings.TrimSpace(text) +// ExitConfirm tries to exit the Sliver go program. +// It will prompt on stdin for confirmation if: +// - The program is a Sliver server and has active slivers under management. +// - The program is a client and has active port forwarders or SOCKS proxies. +// In any of those cases and without confirm, the function does nothing. +func (con *SliverClient) ExitConfirm() { + fmt.Println("Exiting...") + + if con.IsServer { + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err != nil { + os.Exit(1) + } + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + os.Exit(1) + } + if 0 < len(sessions.Sessions) || 0 < len(beacons.Beacons) { + con.Printf("There are %d active sessions and %d active beacons.\n", len(sessions.Sessions), len(beacons.Beacons)) + confirm := false + prompt := &survey.Confirm{Message: "Are you sure you want to exit?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + } + } + + // Client might have portfwds/socks + portfwds := core.Portfwds.List() + servers := core.SocksProxies.List() + + if len(portfwds) > 0 { + con.Printf("There are %d active (bind) port forwarders.\n", len(portfwds)) + } - if (answer == "Y") || (answer == "y") { - os.Exit(0) + if len(servers) > 0 { + con.Printf("There are %d active SOCKS servers.\n", len(servers)) } + + if len(portfwds)+len(servers) > 0 { + confirm := false + prompt := &survey.Confirm{Message: "Are you sure you want to exit?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + } + + os.Exit(0) +} + +// exitConsole prompts the user for confirmation to exit the console. +func (c *SliverClient) exitConsole(_ *console.Console) { + c.ExitConfirm() } // exitImplantMenu uses the background command to detach from the implant menu. func (c *SliverClient) exitImplantMenu(_ *console.Console) { - root := c.App.Menu(consts.ImplantMenu).Command - root.SetArgs([]string{"background"}) - root.Execute() + c.ActiveTarget.Background() + c.PrintInfof("Background ...\n") } var abilities = []string{ From 0e6c859473f4147268e70ee05e700bb2e188679f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 08:50:51 +0200 Subject: [PATCH 076/109] Ensure "task sent" is printed before result. --- client/console/console.go | 4 ++++ client/console/events.go | 19 +++++++++++++++++++ client/console/log.go | 3 +++ 3 files changed, 26 insertions(+) diff --git a/client/console/console.go b/client/console/console.go index 5edb4371b0..b51194b962 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -124,7 +124,9 @@ type SliverClient struct { ActiveTarget *ActiveTarget EventListeners *sync.Map BeaconTaskCallbacks map[string]BeaconTaskCallback + beaconSentStatus map[string]*sync.WaitGroup BeaconTaskCallbacksMutex *sync.Mutex + beaconTaskSentMutex *sync.Mutex } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -180,7 +182,9 @@ func newClient() *SliverClient { ActiveTarget: newActiveTarget(), EventListeners: &sync.Map{}, BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, + beaconSentStatus: map[string]*sync.WaitGroup{}, BeaconTaskCallbacksMutex: &sync.Mutex{}, + beaconTaskSentMutex: &sync.Mutex{}, } con.App.SetPrintLogo(func(_ *console.Console) { diff --git a/client/console/events.go b/client/console/events.go index ab2c660141..a37199f2cd 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "strings" + "sync" "time" consts "github.com/bishopfox/sliver/client/constants" @@ -217,6 +218,15 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) return } + + // If needed, wait for the "request sent" status to be printed first. + if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { + waitStatus.Wait() + con.beaconTaskSentMutex.Lock() + delete(con.beaconSentStatus, task.ID) + con.beaconTaskSentMutex.Unlock() + } + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) @@ -246,7 +256,16 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { } func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { + // Store the task ID. con.BeaconTaskCallbacksMutex.Lock() defer con.BeaconTaskCallbacksMutex.Unlock() con.BeaconTaskCallbacks[taskID] = callback + + // And wait for the "request sent" status to be printed before results. + con.beaconTaskSentMutex.Lock() + wait := &sync.WaitGroup{} + wait.Add(1) + con.beaconSentStatus[taskID] = wait + defer con.beaconTaskSentMutex.Unlock() + } diff --git a/client/console/log.go b/client/console/log.go index 8a607153af..4eb32b66f7 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -205,8 +205,11 @@ func getConsoleAsciicastFile() *os.File { // PrintAsyncResponse - Print the generic async response information. func (con *SliverClient) PrintAsyncResponse(resp *commonpb.Response) { + defer con.beaconSentStatus[resp.TaskID].Done() + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() + beacon, err := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: resp.BeaconID}) if err != nil { con.PrintWarnf(err.Error()) From ac04f6d85bff71f43d347387a6a5b74c6fadc179 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 09:24:27 +0200 Subject: [PATCH 077/109] Fix help completion for implant subtree --- client/command/sliver.go | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/client/command/sliver.go b/client/command/sliver.go index c9dc292d2f..4bc27a3ec5 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,6 +19,8 @@ package command */ import ( + "strings" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -50,6 +52,7 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" + "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -165,6 +168,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { sliver.InitDefaultHelpCmd() sliver.SetHelpCommandGroupID(consts.SliverCoreHelpGroup) + initHelpCompletion(sliver) // Compute which commands should be available based on the current session/beacon. con.ExposeCommands() @@ -174,3 +178,41 @@ func SliverCommands(con *client.SliverClient) console.Commands { return sliverCommands } + +func actionSubcommands(cmd *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + batch := carapace.Batch() + for _, subcommand := range cmd.Commands() { + if !subcommand.Hidden && subcommand.Deprecated == "" { + batch = append(batch, carapace.ActionValuesDescribed(subcommand.Name(), subcommand.Short).Tag(subcommand.GroupID)) + for _, alias := range subcommand.Aliases { + batch = append(batch, carapace.ActionValuesDescribed(alias, subcommand.Short).Tag(subcommand.GroupID)) + } + } + } + return batch.ToA() + }) +} + +func initHelpCompletion(cmd *cobra.Command) { + helpCmd, _, err := cmd.Find([]string{"help"}) + if err != nil { + return + } + + if helpCmd.Name() != "help" || + helpCmd.Short != "Help about any command" || + !strings.HasPrefix(helpCmd.Long, `Help provides help for any command in the application.`) { + return + } + + carapace.Gen(helpCmd).PositionalAnyCompletion( + carapace.ActionCallback(func(c carapace.Context) carapace.Action { + lastCmd, _, err := cmd.Find(c.Args) + if err != nil { + return carapace.ActionMessage(err.Error()) + } + return actionSubcommands(lastCmd) + }), + ) +} From 83c35656b98446e5386d83a5f3b3e0a008465ae7 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 09:59:16 +0200 Subject: [PATCH 078/109] Fix teamserver not using the db.Client --- client/command/taskmany/taskmany.go | 3 +++ server/transport/server.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 4fff9c95c9..3424c486ed 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -47,6 +47,9 @@ func Command(con *console.SliverClient) []*cobra.Command { }, } + // Subcommands might have flags of their own. + taskmanyCmd.DisableFlagParsing = true + // Add the relevant beacon commands as a subcommand to taskmany // taskmanyCmds := map[string]bool{ // consts.ExecuteStr: true, diff --git a/server/transport/server.go b/server/transport/server.go index b4d9e715df..4ae54e25ac 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -63,7 +63,7 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // Core directories/loggers. server.WithHomeDirectory(assets.GetRootAppDir()), // ~/.sliver/ server.WithLogger(log.RootLogger), // Logs to ~/.sliver/logs/sliver.{log,json} and audit.json - server.WithDatabase(db.Session()), // Uses our traditional ~/.sliver/sliver.db for storing users. + server.WithDatabase(db.Client), // Uses our traditional ~/.sliver/sliver.db for storing users. // Network options/stacks server.WithDefaultPort(31337), // Our now famous port. From c7f5f48faf51f6294fafb211e1d1ddb4621167fe Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 18:32:33 +0200 Subject: [PATCH 079/109] Port all beacon commands to Cli usage compatibility --- client/command/alias/load.go | 9 +-- client/command/environment/get.go | 3 +- client/command/environment/set.go | 3 +- client/command/environment/unset.go | 3 +- client/command/exec/execute-assembly.go | 3 +- client/command/exec/execute-shellcode.go | 3 +- client/command/exec/execute.go | 3 +- client/command/exec/msf-inject.go | 3 +- client/command/exec/msf.go | 3 +- client/command/exec/sideload.go | 3 +- client/command/exec/spawndll.go | 3 +- client/command/exec/ssh.go | 3 +- client/command/extensions/load.go | 3 +- client/command/filesystem/cat.go | 3 +- client/command/filesystem/cd.go | 3 +- client/command/filesystem/chmod.go | 3 +- client/command/filesystem/chown.go | 3 +- client/command/filesystem/chtimes.go | 3 +- client/command/filesystem/cp.go | 3 +- client/command/filesystem/download.go | 3 +- client/command/filesystem/ls.go | 3 +- client/command/filesystem/memfiles-add.go | 3 +- client/command/filesystem/memfiles-list.go | 3 +- client/command/filesystem/memfiles-rm.go | 3 +- client/command/filesystem/mkdir.go | 3 +- client/command/filesystem/mv.go | 3 +- client/command/filesystem/pwd.go | 3 +- client/command/filesystem/rm.go | 3 +- client/command/filesystem/upload.go | 3 +- client/command/info/info.go | 3 +- client/command/loot/remote.go | 3 +- client/command/network/ifconfig.go | 3 +- client/command/network/netstat.go | 3 +- client/command/prelude-operator/connect.go | 2 +- client/command/privilege/getprivs.go | 3 +- client/command/privilege/getsystem.go | 3 +- client/command/privilege/impersonate.go | 3 +- client/command/privilege/make-token.go | 3 +- client/command/privilege/rev2self.go | 3 +- client/command/privilege/runas.go | 3 +- client/command/processes/procdump.go | 3 +- client/command/processes/ps.go | 3 +- client/command/processes/terminate.go | 3 +- client/command/reconfig/reconfig.go | 3 +- client/command/registry/reg-create.go | 3 +- client/command/registry/reg-delete.go | 3 +- client/command/registry/reg-list.go | 6 +- client/command/registry/reg-read.go | 3 +- client/command/registry/reg-write.go | 3 +- client/command/screenshot/screenshot.go | 3 +- client/command/tasks/commands.go | 37 ++++++++++- client/command/wasm/wasm.go | 2 +- client/console/console.go | 45 +++++++++++-- client/console/events.go | 75 ++++++++++++++++------ client/console/log.go | 7 +- client/console/teamclient.go | 4 ++ client/constants/constants.go | 1 + 57 files changed, 194 insertions(+), 135 deletions(-) diff --git a/client/command/alias/load.go b/client/command/alias/load.go index 7c684f1bab..470fadd946 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -379,7 +379,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } if executeAssemblyResp.Response != nil && executeAssemblyResp.Response.Async { - con.AddBeaconCallback(executeAssemblyResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(executeAssemblyResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, executeAssemblyResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -387,7 +387,6 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintAssemblyOutput(cmd.Name(), executeAssemblyResp, outFilePath, con) }) - con.PrintAsyncResponse(executeAssemblyResp.Response) } else { PrintAssemblyOutput(cmd.Name(), executeAssemblyResp, outFilePath, con) } @@ -418,7 +417,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } if spawnDllResp.Response != nil && spawnDllResp.Response.Async { - con.AddBeaconCallback(spawnDllResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(spawnDllResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, spawnDllResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -426,7 +425,6 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintSpawnDLLOutput(cmd.Name(), spawnDllResp, outFilePath, con) }) - con.PrintAsyncResponse(spawnDllResp.Response) } else { PrintSpawnDLLOutput(cmd.Name(), spawnDllResp, outFilePath, con) } @@ -458,7 +456,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } if sideloadResp.Response != nil && sideloadResp.Response.Async { - con.AddBeaconCallback(sideloadResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(sideloadResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, sideloadResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -466,7 +464,6 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintSideloadOutput(cmd.Name(), sideloadResp, outFilePath, con) }) - con.PrintAsyncResponse(sideloadResp.Response) } else { PrintSideloadOutput(cmd.Name(), sideloadResp, outFilePath, con) } diff --git a/client/command/environment/get.go b/client/command/environment/get.go index 1220a21d8d..70249ce75d 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -49,7 +49,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if envInfo.Response != nil && envInfo.Response.Async { - con.AddBeaconCallback(envInfo.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(envInfo.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, envInfo) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -57,7 +57,6 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintGetEnvInfo(envInfo, con) }) - con.PrintAsyncResponse(envInfo.Response) } else { PrintGetEnvInfo(envInfo, con) } diff --git a/client/command/environment/set.go b/client/command/environment/set.go index db40bed37e..244766f0be 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -55,7 +55,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if envInfo.Response != nil && envInfo.Response.Async { - con.AddBeaconCallback(envInfo.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(envInfo.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, envInfo) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -63,7 +63,6 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintSetEnvInfo(name, value, envInfo, con) }) - con.PrintAsyncResponse(envInfo.Response) } else { PrintSetEnvInfo(name, value, envInfo, con) } diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index 8e21fefd38..e938aa63ce 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -50,7 +50,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if unsetResp.Response != nil && unsetResp.Response.Async { - con.AddBeaconCallback(unsetResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(unsetResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, unsetResp) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -58,7 +58,6 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintUnsetEnvInfo(name, unsetResp, con) }) - con.PrintAsyncResponse(unsetResp.Response) } else { PrintUnsetEnvInfo(name, unsetResp, con) } diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index 15f55d779e..d2418760ff 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -116,7 +116,7 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []st } hostName := getHostname(session, beacon) if execAssembly.Response != nil && execAssembly.Response.Async { - con.AddBeaconCallback(execAssembly.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(execAssembly.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, execAssembly) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -125,7 +125,6 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []st HandleExecuteAssemblyResponse(execAssembly, assemblyPath, hostName, cmd, con) }) - con.PrintAsyncResponse(execAssembly.Response) } else { HandleExecuteAssemblyResponse(execAssembly, assemblyPath, hostName, cmd, con) } diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index e85a2839cb..27d0adae09 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -112,7 +112,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s } if shellcodeTask.Response != nil && shellcodeTask.Response.Async { - con.AddBeaconCallback(shellcodeTask.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(shellcodeTask.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, shellcodeTask) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -120,7 +120,6 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s } PrintExecuteShellcode(shellcodeTask, con) }) - con.PrintAsyncResponse(shellcodeTask.Response) } else { PrintExecuteShellcode(shellcodeTask, con) } diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index e64049af1a..8939d30404 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -97,7 +97,7 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if exec.Response != nil && exec.Response.Async { - con.AddBeaconCallback(exec.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(exec.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, exec) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -105,7 +105,6 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } HandleExecuteResponse(exec, cmdPath, hostName, cmd, con) }) - con.PrintAsyncResponse(exec.Response) } else { HandleExecuteResponse(exec, cmdPath, hostName, cmd, con) } diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index c0cda6d239..c0283c1898 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -83,7 +83,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if msfTask.Response != nil && msfTask.Response.Async { - con.AddBeaconCallback(msfTask.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(msfTask.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, msfTask) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -91,7 +91,6 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintMsfRemote(msfTask, con) }) - con.PrintAsyncResponse(msfTask.Response) } else { PrintMsfRemote(msfTask, con) } diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 02302ab730..27cce40953 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -76,7 +76,7 @@ func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if msfTask.Response != nil && msfTask.Response.Async { - con.AddBeaconCallback(msfTask.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(msfTask.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, msfTask) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -84,7 +84,6 @@ func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintMsfRemote(msfTask, con) }) - con.PrintAsyncResponse(msfTask.Response) } else { PrintMsfRemote(msfTask, con) } diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index 1c036a4b18..5ff2a6ce52 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -79,7 +79,7 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hostName := getHostname(session, beacon) if sideload.Response != nil && sideload.Response.Async { - con.AddBeaconCallback(sideload.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(sideload.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, sideload) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -88,7 +88,6 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { HandleSideloadResponse(sideload, binPath, hostName, cmd, con) }) - con.PrintAsyncResponse(sideload.Response) } else { HandleSideloadResponse(sideload, binPath, hostName, cmd, con) } diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index 83d064c36d..7bbfd7f7a6 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -68,7 +68,7 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hostName := getHostname(session, beacon) if spawndll.Response != nil && spawndll.Response.Async { - con.AddBeaconCallback(spawndll.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(spawndll.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, spawndll) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -77,7 +77,6 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { HandleSpawnDLLResponse(spawndll, binPath, hostName, cmd, con) }) - con.PrintAsyncResponse(spawndll.Response) } else { HandleSpawnDLLResponse(spawndll, binPath, hostName, cmd, con) } diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index 67e8fac562..ae899110ba 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -105,7 +105,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if sshCmd.Response != nil && sshCmd.Response.Async { - con.AddBeaconCallback(sshCmd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(sshCmd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, sshCmd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -113,7 +113,6 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintSSHCmd(sshCmd, con) }) - con.PrintAsyncResponse(sshCmd.Response) } else { PrintSSHCmd(sshCmd, con) } diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index b70d8f76d2..48a666f6d3 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -373,7 +373,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } if callExtResp.Response != nil && callExtResp.Response.Async { - con.AddBeaconCallback(callExtResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(callExtResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, callExtResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -381,7 +381,6 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintExtOutput(extName, ext.CommandName, callExtResp, con) }) - con.PrintAsyncResponse(callExtResp.Response) } else { PrintExtOutput(extName, ext.CommandName, callExtResp, con) } diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 5fa1d54d89..63dc0a1d6d 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -65,7 +65,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -73,7 +73,6 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintCat(download, cmd, con) }) - con.PrintAsyncResponse(download.Response) } else { PrintCat(download, cmd, con) } diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 411a36dfcf..22e763d654 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -49,7 +49,7 @@ func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if pwd.Response != nil && pwd.Response.Async { - con.AddBeaconCallback(pwd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(pwd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, pwd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -57,7 +57,6 @@ func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintPwd(pwd, con) }) - con.PrintAsyncResponse(pwd.Response) } else { PrintPwd(pwd, con) } diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index b25bb983de..4180969f26 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -61,7 +61,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if chmod.Response != nil && chmod.Response.Async { - con.AddBeaconCallback(chmod.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(chmod.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, chmod) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -69,7 +69,6 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintChmod(chmod, con) }) - con.PrintAsyncResponse(chmod.Response) } else { PrintChmod(chmod, con) } diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index 9f980fe5e6..c43b2daa1d 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -69,7 +69,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if chown.Response != nil && chown.Response.Async { - con.AddBeaconCallback(chown.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(chown.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, chown) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -77,7 +77,6 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintChown(chown, con) }) - con.PrintAsyncResponse(chown.Response) } else { PrintChown(chown, con) } diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index fdb2784174..8035496f92 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -82,7 +82,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if chtimes.Response != nil && chtimes.Response.Async { - con.AddBeaconCallback(chtimes.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(chtimes.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, chtimes) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -90,7 +90,6 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintChtimes(chtimes, con) }) - con.PrintAsyncResponse(chtimes.Response) } else { PrintChtimes(chtimes, con) } diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 7e73bf6059..a5b994f791 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -55,14 +55,13 @@ func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er cp.Src, cp.Dst = src, dst if cp.Response != nil && cp.Response.Async { - con.AddBeaconCallback(cp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(cp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, cp) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) return } }) - con.PrintAsyncResponse(cp.Response) } else { PrintCp(cp, con) } diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 01d6d111e6..25f1f8b9a1 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -61,7 +61,7 @@ func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -69,7 +69,6 @@ func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } HandleDownloadResponse(download, cmd, args, con) }) - con.PrintAsyncResponse(download.Response) } else { HandleDownloadResponse(download, cmd, args, con) } diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index 84480548b8..a500c51191 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -59,7 +59,7 @@ func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if ls.Response != nil && ls.Response.Async { - con.AddBeaconCallback(ls.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(ls.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, ls) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -67,7 +67,6 @@ func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintLs(ls, cmd.Flags(), con) }) - con.PrintAsyncResponse(ls.Response) } else { PrintLs(ls, cmd.Flags(), con) } diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 26db52ae24..715166c6de 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -42,7 +42,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string return } if memfilesAdd.Response != nil && memfilesAdd.Response.Async { - con.AddBeaconCallback(memfilesAdd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(memfilesAdd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, memfilesAdd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -50,7 +50,6 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string } PrintAddMemfile(memfilesAdd, con) }) - con.PrintAsyncResponse(memfilesAdd.Response) } else { PrintAddMemfile(memfilesAdd, con) } diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index cc7c87cd54..57ef191c8e 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -48,7 +48,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin return } if memfilesList.Response != nil && memfilesList.Response.Async { - con.AddBeaconCallback(memfilesList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(memfilesList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, memfilesList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -56,7 +56,6 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintMemfiles(memfilesList, con) }) - con.PrintAsyncResponse(memfilesList.Response) } else { PrintMemfiles(memfilesList, con) } diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index ea1b9e6157..4989ae4891 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -52,7 +52,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) return } if memfilesList.Response != nil && memfilesList.Response.Async { - con.AddBeaconCallback(memfilesList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(memfilesList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, memfilesList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -60,7 +60,6 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintRmMemfile(memfilesList, con) }) - con.PrintAsyncResponse(memfilesList.Response) } else { PrintRmMemfile(memfilesList, con) } diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index 4be6d66136..96607fd8de 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -52,7 +52,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if mkdir.Response != nil && mkdir.Response.Async { - con.AddBeaconCallback(mkdir.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(mkdir.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, mkdir) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -60,7 +60,6 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintMkdir(mkdir, con) }) - con.PrintAsyncResponse(mkdir.Response) } else { PrintMkdir(mkdir, con) } diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 7828eae797..baa88c6ccf 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -61,14 +61,13 @@ func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er mv.Src, mv.Dst = src, dst if mv.Response != nil && mv.Response.Async { - con.AddBeaconCallback(mv.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(mv.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, mv) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) return } }) - con.PrintAsyncResponse(mv.Response) } else { PrintMv(mv, con) } diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 576cc32005..4111f67888 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -42,7 +42,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if pwd.Response != nil && pwd.Response.Async { - con.AddBeaconCallback(pwd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(pwd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, pwd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -50,7 +50,6 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintPwd(pwd, con) }) - con.PrintAsyncResponse(pwd.Response) } else { PrintPwd(pwd, con) } diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index d2ba107f78..20e775c2d2 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -57,7 +57,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if rm.Response != nil && rm.Response.Async { - con.AddBeaconCallback(rm.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(rm.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, rm) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -65,7 +65,6 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRm(rm, con) }) - con.PrintAsyncResponse(rm.Response) } else { PrintRm(rm, con) } diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 340b4f24e1..7c39b485ec 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -94,7 +94,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if upload.Response != nil && upload.Response.Async { - con.AddBeaconCallback(upload.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(upload.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, upload) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -102,7 +102,6 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintUpload(upload, con) }) - con.PrintAsyncResponse(upload.Response) } else { PrintUpload(upload, con) } diff --git a/client/command/info/info.go b/client/command/info/info.go index 0b1b128415..5c079578b6 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -179,7 +179,7 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if cto.Response != nil && cto.Response.Async { - con.AddBeaconCallback(cto.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(cto.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, cto) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -187,7 +187,6 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintTokenOwner(cto, con) }) - con.PrintAsyncResponse(cto.Response) } else { PrintTokenOwner(cto, con) } diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 764e8249fd..4e18db3aaa 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -67,13 +67,12 @@ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con return nil, con.UnwrapServerErr(err) } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) } }) - con.PrintAsyncResponse(download.Response) } if download.Response != nil && download.Response.Err != "" { diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index bc714888d1..93a3d23f8f 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -49,7 +49,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } all, _ := cmd.Flags().GetBool("all") if ifconfig.Response != nil && ifconfig.Response.Async { - con.AddBeaconCallback(ifconfig.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(ifconfig.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, ifconfig) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -57,7 +57,6 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintIfconfig(ifconfig, all, con) }) - con.PrintAsyncResponse(ifconfig.Response) } else { PrintIfconfig(ifconfig, all, con) } diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index 5c32f69cbe..700264bf36 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -62,7 +62,7 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if netstat.Response != nil && netstat.Response.Async { - con.AddBeaconCallback(netstat.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(netstat.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, netstat) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -70,7 +70,6 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintNetstat(netstat, implantPID, activeC2, numeric, con) }) - con.PrintAsyncResponse(netstat.Response) } else { PrintNetstat(netstat, implantPID, activeC2, numeric, con) } diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index a75d844db7..3edbfe02bd 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -71,7 +71,7 @@ func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Adding existing beacons ...\n") for _, beacon := range beacons.Beacons { err = implantMapper.AddImplant(beacon, func(taskID string, cb func(task *clientpb.BeaconTask)) { - con.AddBeaconCallback(taskID, cb) + con.AddBeaconCallback(&commonpb.Response{TaskID: taskID}, cb) }) if err != nil { con.PrintErrorf("Could not add beacon %s to implant mapper: %s", beacon.Name, err) diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 4b6c40efac..106ba89633 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -51,7 +51,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } pid := getPID(session, beacon) if privs.Response != nil && privs.Response.Async { - con.AddBeaconCallback(privs.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(privs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, privs) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -59,7 +59,6 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintGetPrivs(privs, pid, con) }) - con.PrintAsyncResponse(privs.Response) } else { PrintGetPrivs(privs, pid, con) } diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index e921dc5d06..3e38e666cb 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -58,7 +58,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if getSystem.Response != nil && getSystem.Response.Async { - con.AddBeaconCallback(getSystem.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(getSystem.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, getSystem) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -66,7 +66,6 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintGetSystem(getSystem, con) }) - con.PrintAsyncResponse(getSystem.Response) } else { PrintGetSystem(getSystem, con) } diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index 2e3d7fbf2d..a58665f4f2 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -46,7 +46,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string } if impersonate.Response != nil && impersonate.Response.Async { - con.AddBeaconCallback(impersonate.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(impersonate.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, impersonate) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -54,7 +54,6 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string } PrintImpersonate(impersonate, username, con) }) - con.PrintAsyncResponse(impersonate.Response) } else { PrintImpersonate(impersonate, username, con) } diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index 18dc287307..1b07338ded 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -78,7 +78,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if makeToken.Response != nil && makeToken.Response.Async { - con.AddBeaconCallback(makeToken.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(makeToken.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, makeToken) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -86,7 +86,6 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintMakeToken(makeToken, domain, username, con) }) - con.PrintAsyncResponse(makeToken.Response) } else { PrintMakeToken(makeToken, domain, username, con) } diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index f214010ca1..3f7a964d0f 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -44,7 +44,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if revert.Response != nil && revert.Response.Async { - con.AddBeaconCallback(revert.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(revert.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, revert) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -52,7 +52,6 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintRev2Self(revert, con) }) - con.PrintAsyncResponse(revert.Response) } else { PrintRev2Self(revert, con) } diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index a07f3cfebc..62b2510457 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -70,7 +70,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := getName(session, beacon) if runAs.Response != nil && runAs.Response.Async { - con.AddBeaconCallback(runAs.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(runAs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, runAs) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -78,7 +78,6 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRunAs(runAs, process, arguments, name, con) }) - con.PrintAsyncResponse(runAs.Response) } else { PrintRunAs(runAs, process, arguments, name, con) } diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index d39b2d3103..9b01ce8954 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -79,7 +79,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hostname := getHostname(session, beacon) if dump.Response != nil && dump.Response.Async { - con.AddBeaconCallback(dump.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(dump.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, dump) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -93,7 +93,6 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintProcessDump(dump, saveTo, hostname, pid, con) } }) - con.PrintAsyncResponse(dump.Response) } else { if saveLoot { LootProcessDump(dump, lootName, hostname, pid, con) diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 76cad08198..2b7b030d4e 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -102,7 +102,7 @@ func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } os := getOS(session, beacon) if ps.Response != nil && ps.Response.Async { - con.AddBeaconCallback(ps.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(ps.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, ps) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -115,7 +115,6 @@ func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintWarnf("Security Product(s): %s\n", strings.Join(products, ", ")) } }) - con.PrintAsyncResponse(ps.Response) } else { PrintPS(os, ps, true, cmd.Flags(), con) products := findKnownSecurityProducts(ps) diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index 293beb722f..f563cfc993 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -56,7 +56,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if terminated.Response != nil && terminated.Response.Async { - con.AddBeaconCallback(terminated.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(terminated.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, terminated) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -64,7 +64,6 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintTerminate(terminated, con) }) - con.PrintAsyncResponse(terminated.Response) } else { PrintTerminate(terminated, con) } diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index 98d5775ee5..d68195dc4b 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -84,7 +84,7 @@ func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if reconfig.Response != nil && reconfig.Response.Async { - con.AddBeaconCallback(reconfig.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(reconfig.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, reconfig) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -92,7 +92,6 @@ func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } con.PrintInfof("Reconfigured beacon\n") }) - con.PrintAsyncResponse(reconfig.Response) } else { con.PrintInfof("Reconfiguration complete\n") } diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index bef2cdea17..d93f344d71 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -81,7 +81,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } if createKey.Response != nil && createKey.Response.Async { - con.AddBeaconCallback(createKey.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(createKey.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, createKey) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -89,7 +89,6 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintCreateKey(createKey, finalPath, key, con) }) - con.PrintAsyncResponse(createKey.Response) } else { PrintCreateKey(createKey, finalPath, key, con) } diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index b4443664ec..e83396781a 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -81,7 +81,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } if deleteKey.Response != nil && deleteKey.Response.Async { - con.AddBeaconCallback(deleteKey.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(deleteKey.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, deleteKey) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -89,7 +89,6 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintDeleteKey(deleteKey, finalPath, key, con) }) - con.PrintAsyncResponse(deleteKey.Response) } else { PrintDeleteKey(deleteKey, finalPath, key, con) } diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index 657086c7ca..f60f56fb17 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -56,7 +56,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str } if regList.Response != nil && regList.Response.Async { - con.AddBeaconCallback(regList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -64,7 +64,6 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str } PrintListSubKeys(regList, hive, regPath, con) }) - con.PrintAsyncResponse(regList.Response) } else { PrintListSubKeys(regList, hive, regPath, con) } @@ -107,7 +106,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } if regList.Response != nil && regList.Response.Async { - con.AddBeaconCallback(regList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -115,7 +114,6 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } PrintListValues(regList, hive, regPath, con) }) - con.PrintAsyncResponse(regList.Response) } else { PrintListValues(regList, hive, regPath, con) } diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index 6c5efeda30..a381937784 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -129,7 +129,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if regRead.Response != nil && regRead.Response.Async { - con.AddBeaconCallback(regRead.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regRead.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regRead) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -137,7 +137,6 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRegRead(regRead, con) }) - con.PrintAsyncResponse(regRead.Response) } else { PrintRegRead(regRead, con) } diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 181c0d0a57..127fe5135c 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -143,7 +143,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if regWrite.Response != nil && regWrite.Response.Async { - con.AddBeaconCallback(regWrite.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regWrite.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regWrite) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -151,7 +151,6 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRegWrite(regWrite, con) }) - con.PrintAsyncResponse(regWrite.Response) } else { PrintRegWrite(regWrite, con) } diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index f958474d4b..4a5430292b 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -62,7 +62,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) hostname := getHostname(session, beacon) if screenshot.Response != nil && screenshot.Response.Async { - con.AddBeaconCallback(screenshot.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(screenshot.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, screenshot) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -80,7 +80,6 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) PrintScreenshot(screenshot, hostname, cmd, con) } }) - con.PrintAsyncResponse(screenshot.Response) } else { if saveLoot { if len(screenshot.Data) > 0 { diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index d92e1b2df0..a68bc7a447 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -1,13 +1,32 @@ package tasks +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -53,5 +72,17 @@ func Commands(con *console.SliverClient) []*cobra.Command { tasksCmd.AddCommand(cancelCmd) carapace.Gen(cancelCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) + waitCmd := &cobra.Command{ + Use: consts.WaitStr, + Short: "Block and wait for a task to complete and return its results", + Long: help.GetHelpFor([]string{consts.TasksStr, consts.WaitStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TaskWaitCmd(cmd, con, args) + }, + } + tasksCmd.AddCommand(waitCmd) + carapace.Gen(waitCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) + return []*cobra.Command{tasksCmd} } diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index 25b6a0a042..ff3ee0ff59 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -142,7 +142,7 @@ func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console. return } if execWasmResp.Response != nil && execWasmResp.Response.Async { - con.AddBeaconCallback(execWasmResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(execWasmResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, execWasmResp) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) diff --git a/client/console/console.go b/client/console/console.go index b51194b962..7e94b5efd9 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -120,13 +120,18 @@ type SliverClient struct { closeLogs []func() // Sliver-specific - Rpc rpcpb.SliverRPCClient - ActiveTarget *ActiveTarget - EventListeners *sync.Map + Rpc rpcpb.SliverRPCClient + ActiveTarget *ActiveTarget + EventListeners *sync.Map + + // Tasks (pending) + beaconSentStatus map[string]*sync.WaitGroup + beaconTaskSentMutex *sync.Mutex + waitingResult chan bool + + // Tasks (completed) BeaconTaskCallbacks map[string]BeaconTaskCallback - beaconSentStatus map[string]*sync.WaitGroup BeaconTaskCallbacksMutex *sync.Mutex - beaconTaskSentMutex *sync.Mutex } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -348,6 +353,36 @@ func (con *SliverClient) WaitSignal() error { return nil } +func (con *SliverClient) waitSignalOrClose() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + if con.waitingResult == nil { + con.waitingResult = make(chan bool) + } + + select { + case sig := <-sigchan: + con.PrintInfof("Received signal %s\n", sig) + case <-con.waitingResult: + con.waitingResult = make(chan bool) + return nil + } + + return nil +} + // FormatDateDelta - Generate formatted date string of the time delta between then and now. func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) diff --git a/client/console/events.go b/client/console/events.go index a37199f2cd..c9699412a8 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -135,7 +135,7 @@ func (con *SliverClient) startEventLoop() { // Prelude Operator if prelude.ImplantMapper != nil { err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) { - con.AddBeaconCallback(taskID, cb) + con.AddBeaconCallback(&commonpb.Response{TaskID: taskID}, cb) }) if err != nil { con.PrintErrorf("Could not add beacon to Operator: %s", err) @@ -219,14 +219,6 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { return } - // If needed, wait for the "request sent" status to be printed first. - if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { - waitStatus.Wait() - con.beaconTaskSentMutex.Lock() - delete(con.beaconSentStatus, task.ID) - con.beaconTaskSentMutex.Unlock() - } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) @@ -237,35 +229,82 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { con.BeaconTaskCallbacksMutex.Lock() defer con.BeaconTaskCallbacksMutex.Unlock() if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { + + // If needed, wait for the "request sent" status to be printed first. + con.beaconTaskSentMutex.Lock() + if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { + waitStatus.Wait() + delete(con.beaconSentStatus, task.ID) + } + con.beaconTaskSentMutex.Unlock() + if con.Settings.BeaconAutoResults { if beacon != nil { - con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) + con.PrintSuccessf("%s completed task %s\n", beacon.Name, strings.Split(task.ID, "-")[0]) } task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ ID: task.ID, }) - con.Printf(Clearln + "\r") + con.Printf(Clearln + "\r\n") if err == nil { callback(task_content) } else { - con.PrintErrorf("Could not get beacon task content: %s", err) + con.PrintErrorf("Could not get beacon task content: %s\n", err) } } delete(con.BeaconTaskCallbacks, task.ID) + con.waitingResult <- true } } -func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { +func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback BeaconTaskCallback) { + if resp == nil || resp.TaskID == "" { + return + } + // Store the task ID. con.BeaconTaskCallbacksMutex.Lock() - defer con.BeaconTaskCallbacksMutex.Unlock() - con.BeaconTaskCallbacks[taskID] = callback + con.BeaconTaskCallbacks[resp.TaskID] = callback + con.BeaconTaskCallbacksMutex.Unlock() - // And wait for the "request sent" status to be printed before results. + // Wait for the "request sent" status to be printed before results. con.beaconTaskSentMutex.Lock() wait := &sync.WaitGroup{} wait.Add(1) - con.beaconSentStatus[taskID] = wait - defer con.beaconTaskSentMutex.Unlock() + con.beaconSentStatus[resp.TaskID] = wait + con.beaconTaskSentMutex.Unlock() + con.PrintAsyncResponse(resp) + con.waitSignalOrClose() } + +// NewTask registers a new task (asynchronous -beacon- or not). If: +// - the provided (task) Response is nil, +// - if the task is not marked Async, +// - or if it's ID is nil, +// the task is considered synchronous, and we will directly call +// the handle function to execute the post-response workflow. +func (con *SliverClient) NewTask(resp *commonpb.Response, message proto.Message, handle func()) { + // We're no beacon here. + if resp == nil || !resp.Async || resp.TaskID == "" { + if handle != nil { + handle() + } + return + } + + // Else, we are a beacon. + con.AddBeaconCallback(resp, func(task *clientpb.BeaconTask) { + err := proto.Unmarshal(task.Response, message) + if err != nil { + con.PrintErrorf("Failed to decode response %s\n", err) + return + } + + if handle != nil { + handle() + } + }) +} + +// con.NewTask(download.Response, download, func() { PrintCat(download, cmd, con) }) diff --git a/client/console/log.go b/client/console/log.go index 4eb32b66f7..8779241b3d 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -28,13 +28,14 @@ import ( "strings" "time" + "github.com/moloch--/asciicast" + "golang.org/x/exp/slog" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/moloch--/asciicast" - "golang.org/x/exp/slog" - "golang.org/x/term" ) // ConsoleClientLogger is an io.Writer that sends data to the server. diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 03acd39ee0..b7ccad2fbc 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -84,6 +84,10 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. func (con *SliverClient) ConnectComplete() (carapace.Action, error) { + if con.Rpc != nil { + return carapace.ActionValues(), nil + } + // This almost only ever runs teamserver-side pre-runs. err := con.runPreConnectHooks() if err != nil { diff --git a/client/constants/constants.go b/client/constants/constants.go index b5a61eb2a4..6cd3e17df9 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -132,6 +132,7 @@ const ( PruneStr = "prune" TasksStr = "tasks" CancelStr = "cancel" + WaitStr = "wait" GenerateStr = "generate" RegenerateStr = "regenerate" CompilerInfoStr = "info" From 82d0c9cefb0a31cd97843ab31159aef6b5f33e10 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 18:43:38 +0200 Subject: [PATCH 080/109] Update console/completion dependencies --- go.mod | 12 +- go.sum | 17 +- .../github.com/reeflective/console/README.md | 12 +- .../github.com/reeflective/console/command.go | 37 -- .../console/commands/readline/bind.go | 499 +++++++----------- .../console/commands/readline/commands.go | 3 +- .../console/commands/readline/completers.go | 115 ++++ .../console/commands/readline/config.go | 54 ++ .../console/commands/readline/export.go | 389 ++++++++++++++ .../console/commands/readline/set.go | 93 +++- .../github.com/reeflective/console/console.go | 9 +- vendor/github.com/reeflective/console/menu.go | 137 ++++- vendor/github.com/reeflective/console/run.go | 89 ++-- .../reeflective/console/tab-completer.go | 25 +- .../readline/internal/core/line.go | 2 +- .../readline/internal/display/engine.go | 20 +- .../readline/internal/term/cursor.go | 8 +- .../readline/internal/ui/prompt.go | 2 +- .../github.com/reeflective/readline/shell.go | 4 +- .../reeflective/team/internal/certs/certs.go | 32 +- .../reeflective/team/internal/certs/users.go | 2 +- .../reeflective/team/internal/db/sql.go | 4 +- vendor/modules.txt | 10 +- 23 files changed, 1121 insertions(+), 454 deletions(-) create mode 100644 vendor/github.com/reeflective/console/commands/readline/completers.go create mode 100644 vendor/github.com/reeflective/console/commands/readline/config.go create mode 100644 vendor/github.com/reeflective/console/commands/readline/export.go diff --git a/go.mod b/go.mod index 9bc05f9e22..b249a97524 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,15 @@ module github.com/bishopfox/sliver go 1.20 // A fork of the completion engine is currently used in order to consume the engine -// as a library. The fork is a very slightly patched mainline tree for that purpose. -replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +// as a library. The fork is a very slightly patched mainline tree for that purpose, +// and is regularly maintained up-to-date with upstream. Should be removed long-term. +replace github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 // Team is the teamserver/teamclient library, and this directive should be removed. replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team +replace github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline + require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -27,6 +30,7 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 + github.com/ivanpirog/coloredcobra v1.0.1 github.com/jedib0t/go-pretty/v6 v6.4.6 github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f github.com/klauspost/compress v1.16.6 @@ -37,10 +41,10 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.1 - github.com/reeflective/console v0.1.6 + github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a github.com/reeflective/readline v1.0.8 github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 - github.com/rsteube/carapace v0.37.3 + github.com/rsteube/carapace v0.42.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index 65111898de..4874c786ba 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -109,6 +110,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= @@ -197,10 +199,13 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/illarion/gonotify v1.0.1 h1:F1d+0Fgbq/sDWjj/r66ekjDG+IDeecQKUFH4wNwsoio= github.com/illarion/gonotify v1.0.1/go.mod h1:zt5pmDofZpU1f8aqlK0+95eQhoEAn/d4G4B/FjVW4jE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16 h1:+aAGyK41KRn8jbF2Q7PLL0Sxwg6dShGcQSeCC7nZQ8E= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16/go.mod h1:IKrnDWs3/Mqq5n0lI+RxA2sB7MvN/vbMBP3ehXg65UI= +github.com/ivanpirog/coloredcobra v1.0.1 h1:aURSdEmlR90/tSiWS0dMjdwOvCVUeYLfltLfbgNxrN4= +github.com/ivanpirog/coloredcobra v1.0.1/go.mod h1:iho4nEKcnwZFiniGSdcgdvRgZNjxm+h20acv8vqmN6Q= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -262,11 +267,13 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -324,10 +331,8 @@ github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9K github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7u3sKdsKHQRQluOfwv/eXsw+v+r9h50cf1kU8= github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= -github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= -github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= -github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= +github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a h1:eH0mArXKs7CljsUX6dhN/+IJlhvQ2I0Mg0ku8Ah0Hao= +github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -340,6 +345,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -466,6 +472,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -476,6 +483,7 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -573,6 +581,7 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/vendor/github.com/reeflective/console/README.md b/vendor/github.com/reeflective/console/README.md index 0d6dc7fb22..e555fd4b49 100644 --- a/vendor/github.com/reeflective/console/README.md +++ b/vendor/github.com/reeflective/console/README.md @@ -90,7 +90,7 @@ is also available in the [wiki](https://github.com/reeflective/console/wiki): ![console](https://github.com/reeflective/console/blob/assets/console.gif) -## Status +## Status The library is in a pre-release candidate status: - Although quite simple and small, it has not been tested heavily. @@ -100,3 +100,13 @@ The library is in a pre-release candidate status: Please open a PR or an issue if you wish to bring enhancements to it. Other contributions, as well as bug fixes and reviews are also welcome. + +## Possible Improvements + +The following is a currently moving list of possible enhancements to be made in order to reach `v1.0`: +- [ ] Ensure to the best extent possible a thread-safe access to the command API. +- [ ] Clearer integration/alignment of the various I/O references between readline and commands. +- [ ] Clearer and sane model for asynchronous control/cancel of commands. +- [ ] Allow users to run the console command trees in one-exec style, with identical behavior. +- [ ] Test suite for most important or risky code paths. +- [ ] Set of helper functions for application-related directories. diff --git a/vendor/github.com/reeflective/console/command.go b/vendor/github.com/reeflective/console/command.go index 2e019480ef..d3858cd3e9 100644 --- a/vendor/github.com/reeflective/console/command.go +++ b/vendor/github.com/reeflective/console/command.go @@ -1,8 +1,6 @@ package console import ( - "strings" - "github.com/spf13/cobra" ) @@ -75,38 +73,3 @@ next: c.filters = updated } - -func (c *Console) isFiltered(cmd *cobra.Command) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range c.filters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } - - return false -} - -// hide commands that are filtered so that they are not -// shown in the help strings or proposed as completions. -func (c *Console) hideFilteredCommands() { - for _, cmd := range c.activeMenu().Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if c.isFiltered(cmd) { - cmd.Hidden = true - } - } -} diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index 2099658aef..2af32deb5f 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -4,13 +4,13 @@ import ( "errors" "fmt" "os" - "sort" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. @@ -20,15 +20,25 @@ func Bind(shell *readline.Shell) *cobra.Command { Short: "Display or modify readline key bindings", Long: `Manipulate readline keymaps and bindings. -Basic binding examples: - bind "\C-x\C-r": re-read-init-file // C-x C-r to reload the inputrc file, in the default keymap. - bind -m vi-insert "\C-l" clear-screen // C-l to clear-screen in vi-insert mode - bind -m menu-complete '\C-n' menu-complete // C-n to cycle through choices in the completion keymap. - +Changing binds: Note that the keymap name is optional, and if omitted, the default keymap is used. The default keymap is 'vi' only if 'set editing-mode vi' is found in inputrc , and unless the -m option is used to set a different keymap. -Also, note that the bind [seq] [command] slightly differs from the original bash 'bind' command.`, +Also, note that the bind [seq] [command] slightly differs from the original bash 'bind' command. + +Exporting binds: +- Since all applications always look up to the same file for a given user, + the export command does not allow to write and modify this file itself. +- Also, since saving the entire list of options and bindings in a different + file for each application would also defeat the purpose of .inputrc.`, + Example: `Changing binds: + bind "\C-x\C-r": re-read-init-file # C-x C-r to reload the inputrc file, in the default keymap. + bind -m vi-insert "\C-l" clear-screen # C-l to clear-screen in vi-insert mode + bind -m menu-complete '\C-n' menu-complete # C-n to cycle through choices in the completion keymap. + +Exporting binds: + bind --binds-rc --lib --changed # Only changed options/binds to stdout applying to all apps using this lib + bind --app OtherApp -c # Changed options, applying to an app other than our current shell one`, } // Flags @@ -44,8 +54,27 @@ Also, note that the bind [seq] [command] slightly differs from the original bash cmd.Flags().StringP("unbind", "u", "", "Unbind all keys which are bound to the named function") cmd.Flags().StringP("remove", "r", "", "Remove the bindings for KEYSEQ") cmd.Flags().StringP("file", "f", "", "Read key bindings from FILENAME") - // cmd.Flags().StringP("execute", "x", "", "Cause SHELL-COMMAND to be executed whenever KEYSEQ is entered") - // cmd.Flags().BoolP("execute-rc", "X", false, "List key sequences bound with -x and associated commands in a form that can be reused as input") + cmd.Flags().StringP("app", "A", "", "Optional application name (if empty/not used, the current app)") + cmd.Flags().BoolP("changed", "c", false, "Only export options modified since app start: maybe not needed, since no use for it") + cmd.Flags().BoolP("lib", "L", false, "Like 'app', but export options/binds for all apps using this specific library") + cmd.Flags().BoolP("self-insert", "I", false, "If exporting bind sequences, also include the sequences mapped to self-insert") + + // Completions + comps := carapace.Gen(cmd) + flagComps := make(carapace.ActionMap) + + flagComps["keymap"] = completeKeymaps(shell, cmd) + flagComps["query"] = completeCommands(shell, cmd) + flagComps["unbind"] = completeCommands(shell, cmd) + flagComps["remove"] = completeBindSequences(shell, cmd) + flagComps["file"] = carapace.ActionFiles() + + comps.FlagCompletion(flagComps) + + comps.PositionalCompletion( + carapace.ActionValues().Usage("key sequence"), + completeCommands(shell, cmd), + ) // Run implementation cmd.RunE = func(cmd *cobra.Command, args []string) error { @@ -55,358 +84,222 @@ Also, note that the bind [seq] [command] slightly differs from the original bash keymap = string(shell.Keymap.Main()) } - // Listing actions - switch { - // Function names - case cmd.Flags().Changed("list"): - for name := range shell.Keymap.Commands() { - fmt.Println(name) - } + var name string + var reeflective = "reeflective" + var buf = &cfgBuilder{buf: &strings.Builder{}} - // Sequences to function names - case cmd.Flags().Changed("binds"): - shell.Keymap.PrintBinds(keymap, false) - return nil + // First prepare the branching strings for any + // needed conditionals (App, Lib, keymap, etc) + changed := cmd.Flags().Changed("changed") + rm := cmd.Flags().Changed("remove") + unbind := cmd.Flags().Changed("unbind") + app := cmd.Flags().Changed("app") + lib := cmd.Flags().Changed("lib") - case cmd.Flags().Changed("binds-rc"): - shell.Keymap.PrintBinds(keymap, true) - return nil + // 1 - SIMPLE QUERIES ------------------------------------------------ - // Macros - case cmd.Flags().Changed("macros"): - binds := shell.Config.Binds[keymap] - if len(binds) == 0 { - return nil - } - var macroBinds []string + // All flags and args that are "exiting the command + // after run" are listed and evaluated first. - for keys, bind := range binds { - if bind.Macro { - macroBinds = append(macroBinds, inputrc.Escape(keys)) - } + // Function names + if cmd.Flags().Changed("list") { + for name := range shell.Keymap.Commands() { + fmt.Println(name) } - sort.Strings(macroBinds) - - for _, key := range macroBinds { - action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) - fmt.Printf("%s outputs %s\n", key, action) - } + return nil + } + // 2 - Query binds for function + if cmd.Flags().Changed("query") { + listBinds(shell, buf, cmd, keymap) + fmt.Fprint(cmd.OutOrStdout(), buf.buf.String()) return nil + } - case cmd.Flags().Changed("macros-rc"): - binds := shell.Config.Binds[keymap] - if len(binds) == 0 { - return nil + // From this point on, some flags don't exit after printing + // their respective listings, since we can combine and output + // various types of stuff at once, for configs or display. + // + // We can even read a file for binds, remove some of them, + // and display all or specific sections of our config in + // a single call, with multiple flags of all sorts. + + // 1 - Apply any changes we want from a file first. + if cmd.Flags().Changed("file") { + if err := readFileConfig(shell, cmd, keymap); err != nil { + return err } - var macroBinds []string + } - for keys, bind := range binds { - if bind.Macro { - macroBinds = append(macroBinds, inputrc.Escape(keys)) - } - } + // Remove anything we might have been asked to. + if unbind { + unbindKeys(shell, cmd, keymap) + } - sort.Strings(macroBinds) + if rm { + removeCommands(shell, cmd, keymap) + } - for _, key := range macroBinds { - action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) - fmt.Printf("\"%s\": \"%s\"\n", key, action) - } + // 2 - COMPLEX QUERIES ------------------------------------------------ - return nil + // Write App/Lib headers for + if app { + fmt.Fprintf(buf, "# %s application (generated)\n", name) + buf.newCond(name) + } else if lib { + fmt.Fprintf(buf, "# %s/readline library-specific (generated)\n", reeflective) + buf.newCond(reeflective) + } - // Global readline options - case cmd.Flags().Changed("vars"): - var variables []string + // Global option variables + if cmd.Flags().Changed("vars") { + listVars(shell, buf, cmd) + } else if cmd.Flags().Changed("vars-rc") { + listVarsRC(shell, buf, cmd) + } - for variable := range shell.Config.Vars { - variables = append(variables, variable) - } + // Sequences to function names + if cmd.Flags().Changed("binds") { + listBinds(shell, buf, cmd, keymap) + } else if cmd.Flags().Changed("binds-rc") { + listBindsRC(shell, buf, cmd, keymap) + } - sort.Strings(variables) + // Macros + if cmd.Flags().Changed("macros") { + listMacros(shell, buf, cmd, keymap) + } else if cmd.Flags().Changed("macros-rc") { + listMacrosRC(shell, buf, cmd, keymap) + } - for _, variable := range variables { - value := shell.Config.Vars[variable] - fmt.Printf("%s is set to `%v'\n", variable, value) - } + // Close any App/Lib conditional + buf.endCond() + // The command has performed an action, so any binding + // with positional arguments is not considered or evaluated. + if buf.buf.Len() > 0 { + fmt.Fprintln(cmd.OutOrStdout(), buf.buf.String()) return nil - - case cmd.Flags().Changed("vars-rc"): - var variables []string - - for variable := range shell.Config.Vars { - variables = append(variables, variable) - } - - sort.Strings(variables) - - for _, variable := range variables { - value := shell.Config.Vars[variable] - fmt.Printf("set %s %v\n", variable, value) - } - + } else if app || lib || changed || rm || unbind { return nil + } - // Query binds for function - case cmd.Flags().Changed("query"): - binds := shell.Config.Binds[keymap] - if binds == nil { - return nil - } - - command, _ := cmd.Flags().GetString("query") - - // Make a list of all sequences bound to each command. - cmdBinds := make([]string, 0) - - for key, bind := range binds { - if bind.Action != command { - continue - } - - cmdBinds = append(cmdBinds, inputrc.Escape(key)) - } - - sort.Strings(cmdBinds) - - switch { - case len(cmdBinds) == 0: - case len(cmdBinds) > 5: - var firstBinds []string - - for i := 0; i < 5; i++ { - firstBinds = append(firstBinds, "\""+cmdBinds[i]+"\"") - } + // 3 - CREATE NEw BINDS ----------------------------------------------- - bindsStr := strings.Join(firstBinds, ", ") - fmt.Printf("%s can be found on %s ...\n", command, bindsStr) + // Bind actions. + // Some keymaps are aliases of others, so use either + // all equivalents or fallback to the relevant keymap. + if len(args) < 2 { + return errors.New("Usage: bind [-m keymap] [keyseq] [command]") + } - default: - var firstBinds []string + // The key sequence is an escaped string, so unescape it. + seq := inputrc.Unescape(args[0]) - for _, bind := range cmdBinds { - firstBinds = append(firstBinds, "\""+bind+"\"") - } + var found bool - bindsStr := strings.Join(firstBinds, ", ") - fmt.Printf("%s can be found on %s\n", command, bindsStr) + for command := range shell.Keymap.Commands() { + if command == args[1] { + found = true + break } - - return nil - - // case cmd.Flags().Changed("execute-rc"): - // return nil } - // Bind actions. - // Some keymaps are aliases of others, so use either all equivalents or fallback to the relevant keymap. - switch { - case cmd.Flags().Changed("unbind"): - command, _ := cmd.Flags().GetString("unbind") - - unbind := func(keymap string) { - binds := shell.Config.Binds[keymap] - if binds == nil { - return - } - - cmdBinds := make([]string, 0) - - for key, bind := range binds { - if bind.Action != command { - continue - } - - cmdBinds = append(cmdBinds, key) - } - - for _, key := range cmdBinds { - delete(binds, key) - } - } - - applyToKeymap(keymap, unbind) - - case cmd.Flags().Changed("remove"): - seq, _ := cmd.Flags().GetString("remove") - - removeBind := func(keymap string) { - binds := shell.Config.Binds[keymap] - if binds == nil { - return - } - - cmdBinds := make([]string, 0) - - for key := range binds { - if key != seq { - continue - } - - cmdBinds = append(cmdBinds, key) - } - - for _, key := range cmdBinds { - delete(binds, key) - } - } + if !found { + return fmt.Errorf("Unknown command: %s", args[1]) + } - applyToKeymap(keymap, removeBind) + // If the keymap doesn't exist, create it. + if shell.Config.Binds[keymap] == nil { + shell.Config.Binds[keymap] = make(map[string]inputrc.Bind) + } - case cmd.Flags().Changed("file"): - fileF, _ := cmd.Flags().GetString("file") + // Adjust some keymaps (aliases of each other). + bindkey := func(keymap string) { + shell.Config.Binds[keymap][seq] = inputrc.Bind{Action: args[1]} + } - file, err := os.Stat(fileF) - if err != nil { - return err - } + // (Bind the key sequence to the command) + applyToKeymap(keymap, bindkey) - if err = inputrc.ParseFile(file.Name(), shell.Config, shell.Opts...); err != nil { - return err - } + return nil + } - fmt.Printf("Read %s\n", file.Name()) - // case cmd.Flags().Changed("execute"): + return cmd +} - // Else if sufficient arguments, bind the key sequence to the command. - default: - if len(args) < 2 { - return errors.New("Usage: bind [-m keymap] [keyseq] [command]") - } +// +// Binding & Unbinding functions --------------------------------- +// - // The key sequence is an escaped string, so unescape it. - seq := inputrc.Unescape(args[0]) +func readFileConfig(sh *readline.Shell, cmd *cobra.Command, _ string) error { + fileF, _ := cmd.Flags().GetString("file") - var found bool + file, err := os.Stat(fileF) + if err != nil { + return err + } - for command := range shell.Keymap.Commands() { - if command == args[1] { - found = true - break - } - } + if err = inputrc.ParseFile(file.Name(), sh.Config, sh.Opts...); err != nil { + return err + } - if !found { - return fmt.Errorf("Unknown command: %s", args[1]) - } + fmt.Printf("Read and parsed %s\n", file.Name()) - // If the keymap doesn't exist, create it. - if shell.Config.Binds[keymap] == nil { - shell.Config.Binds[keymap] = make(map[string]inputrc.Bind) - } + return nil +} - // Adjust some keymaps (aliases of each other). - bindkey := func(keymap string) { - shell.Config.Binds[keymap][seq] = inputrc.Bind{Action: args[1]} - } +func unbindKeys(sh *readline.Shell, cmd *cobra.Command, keymap string) { + command, _ := cmd.Flags().GetString("unbind") - // (Bind the key sequence to the command.) - applyToKeymap(keymap, bindkey) + unbind := func(keymap string) { + binds := sh.Config.Binds[keymap] + if binds == nil { + return } - return nil - } - - // *** Completions *** - comps := carapace.Gen(cmd) - flagComps := make(carapace.ActionMap) + cmdBinds := make([]string, 0) - // Flags - flagComps["keymap"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - results := make([]string, 0) + for key, bind := range binds { + if bind.Action != command { + continue + } - for name := range shell.Config.Binds { - results = append(results, name) + cmdBinds = append(cmdBinds, key) } - return carapace.ActionValues(results...).Tag("keymaps").Usage("keymap") - }) - - functionsComps := carapace.ActionCallback(func(c carapace.Context) carapace.Action { - results := make([]string, 0) - - for name := range shell.Keymap.Commands() { - results = append(results, name) + for _, key := range cmdBinds { + delete(binds, key) } + } - return carapace.ActionValues(results...).Tag("commands").Usage("command") - }) - - bindSequenceComps := carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { - // Get the keymap. - var keymap string - - if cmd.Flags().Changed("keymap") { - keymap, _ = cmd.Flags().GetString("keymap") - } + applyToKeymap(keymap, unbind) +} - if keymap == "" { - keymap = string(shell.Keymap.Main()) - } +func removeCommands(sh *readline.Shell, cmd *cobra.Command, keymap string) { + seq, _ := cmd.Flags().GetString("remove") - // Get the binds. - binds := shell.Config.Binds[keymap] + removeBind := func(keymap string) { + binds := sh.Config.Binds[keymap] if binds == nil { - return carapace.ActionValues().Usage("sequence") + return } - // Make a list of all sequences bound to each command, with descriptions. cmdBinds := make([]string, 0) - insertBinds := make([]string, 0) - for key, bind := range binds { - if bind.Action == "self-insert" { - insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") - } else { - cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") - cmdBinds = append(cmdBinds, bind.Action) + for key := range binds { + if key != seq { + continue } - } - - return carapace.Batch( - carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), - carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), - ).ToA() - }) - - flagComps["query"] = functionsComps - flagComps["unbind"] = functionsComps - flagComps["file"] = carapace.ActionFiles() - flagComps["remove"] = bindSequenceComps - - comps.FlagCompletion(flagComps) - - // Positional arguments - comps.PositionalCompletion( - carapace.ActionValues().Usage("sequence"), - functionsComps, - ) - - return cmd -} -func applyToKeymap(keymap string, bind func(keymap string)) { - switch keymap { - case "emacs", "emacs-standard": - for _, km := range []string{"emacs", "emacs-standard"} { - bind(km) + cmdBinds = append(cmdBinds, key) } - case "emacs-ctlx": - for _, km := range []string{"emacs-ctlx", "emacs-standard", "emacs"} { - bind(km) - } - case "emacs-meta": - for _, km := range []string{"emacs-meta", "emacs-standard", "emacs"} { - bind(km) - } - case "vi", "vi-move", "vi-command": - for _, km := range []string{"vi", "vi-move", "vi-command"} { - bind(km) + + for _, key := range cmdBinds { + delete(binds, key) } - default: - bind(keymap) } + + applyToKeymap(keymap, removeBind) } diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index e3ec1bf03b..cb89c6c650 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,8 +1,9 @@ package readline import ( - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go new file mode 100644 index 0000000000..fa3ee06b69 --- /dev/null +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -0,0 +1,115 @@ +package readline + +/* + console - Closed-loop console application for cobra commands + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" +) + +func completeKeymaps(sh *readline.Shell, _ *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + results := make([]string, 0) + + for name := range sh.Config.Binds { + results = append(results, name) + } + + return carapace.ActionValues(results...).Tag("keymaps").Usage("keymap") + }) +} + +func completeBindSequences(sh *readline.Shell, cmd *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { + // Get the keymap. + var keymap string + + if cmd.Flags().Changed("keymap") { + keymap, _ = cmd.Flags().GetString("keymap") + } + + if keymap == "" { + keymap = string(sh.Keymap.Main()) + } + + // Get the binds. + binds := sh.Config.Binds[keymap] + if binds == nil { + return carapace.ActionValues().Usage("sequence") + } + + // Make a list of all sequences bound to each command, with descriptions. + cmdBinds := make([]string, 0) + insertBinds := make([]string, 0) + + for key, bind := range binds { + if bind.Action == "self-insert" { + insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") + } else { + cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") + cmdBinds = append(cmdBinds, bind.Action) + } + } + + return carapace.Batch( + carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), + carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), + ).ToA() + }) +} + +func completeCommands(sh *readline.Shell, _ *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + results := make([]string, 0) + + for name := range sh.Keymap.Commands() { + results = append(results, name) + } + + return carapace.ActionValues(results...).Tag("commands").Usage("command") + }) +} + +func applyToKeymap(keymap string, bind func(keymap string)) { + switch keymap { + case "emacs", "emacs-standard": + for _, km := range []string{"emacs", "emacs-standard"} { + bind(km) + } + case "emacs-ctlx": + for _, km := range []string{"emacs-ctlx", "emacs-standard", "emacs"} { + bind(km) + } + case "emacs-meta": + for _, km := range []string{"emacs-meta", "emacs-standard", "emacs"} { + bind(km) + } + case "vi", "vi-move", "vi-command": + for _, km := range []string{"vi", "vi-move", "vi-command"} { + bind(km) + } + default: + bind(keymap) + } +} diff --git a/vendor/github.com/reeflective/console/commands/readline/config.go b/vendor/github.com/reeflective/console/commands/readline/config.go new file mode 100644 index 0000000000..b435dc66db --- /dev/null +++ b/vendor/github.com/reeflective/console/commands/readline/config.go @@ -0,0 +1,54 @@ +package readline + +/* + console - Closed-loop console application for cobra commands + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "strings" +) + +// manages display of .inputrc-compliant listings/snippets. +type cfgBuilder struct { + buf *strings.Builder + names []string +} + +// Write writes a single inputrc line with the appropriate contextual indent. +func (cfg *cfgBuilder) Write(data []byte) (int, error) { + indent := strings.Repeat(" ", 4*len(cfg.names)) + + iLen, _ := cfg.buf.Write([]byte(indent)) + bLen, err := cfg.buf.Write(data) + + return iLen + bLen, err +} + +func (cfg *cfgBuilder) newCond(name string) { + cfg.Write([]byte(fmt.Sprintf("$if %s\n", name))) + cfg.names = append(cfg.names, name) +} + +func (cfg *cfgBuilder) endCond() { + if len(cfg.names) == 0 { + return + } + + cfg.names = cfg.names[:len(cfg.names)-1] + cfg.Write([]byte("$endif\n")) +} diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go new file mode 100644 index 0000000000..67f70e9ff2 --- /dev/null +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -0,0 +1,389 @@ +package readline + +/* + console - Closed-loop console application for cobra commands + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "sort" + "strings" + + "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" +) + +const ( + printOn = "on" + printOff = "off" +) + +// listVars prints the readline global option variables in human-readable format. +func listVars(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command) { + var vars map[string]interface{} + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + vars = cfgChanged.Vars + } else { + vars = shell.Config.Vars + } + + if len(vars) == 0 { + return + } + + var variables = make([]string, len(shell.Config.Vars)) + + for variable := range shell.Config.Vars { + variables = append(variables, variable) + } + + sort.Strings(variables) + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "======= Global Variables =========") + fmt.Fprintln(buf) + + for _, variable := range variables { + value := shell.Config.Vars[variable] + if value == nil || variable == "" { + continue + } + + fmt.Fprintf(buf, "%s is set to `%v'\n", variable, value) + } +} + +// listVarsRC returns the readline global options, split according to which are +// supported by which library, and output in .inputrc compliant format. +func listVarsRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command) { + var vars map[string]interface{} + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + vars = cfgChanged.Vars + } else { + vars = shell.Config.Vars + } + + if len(vars) == 0 { + return + } + + // Include print all legacy options. + // Filter them in a separate groups only if NOT being used with --app/--lib + if !cmd.Flags().Changed("app") && !cmd.Flags().Changed("lib") { + var legacy []string + for variable := range filterLegacyVars(vars) { + legacy = append(legacy, variable) + } + + sort.Strings(legacy) + + fmt.Fprintln(buf, "# General/legacy Options (generated from reeflective/readline)") + + for _, variable := range legacy { + value := shell.Config.Vars[variable] + var printVal string + + if on, ok := value.(bool); ok { + if on { + printVal = "on" + } else { + printVal = "off" + } + } else { + printVal = fmt.Sprintf("%v", value) + } + + fmt.Fprintf(buf, "set %s %s\n", variable, printVal) + } + + // Now we print the App/lib specific. + var reef []string + + for variable := range filterAppLibVars(vars) { + reef = append(reef, variable) + } + + sort.Strings(reef) + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "# reeflective/readline specific options (generated)") + fmt.Fprintln(buf, "# The following block is not implemented in GNU C Readline.") + buf.newCond("reeflective") + + for _, variable := range reef { + value := shell.Config.Vars[variable] + var printVal string + + if on, ok := value.(bool); ok { + if on { + printVal = printOn + } else { + printVal = printOff + } + } else { + printVal = fmt.Sprintf("%v", value) + } + + fmt.Fprintf(buf, "set %s %s\n", variable, printVal) + } + + buf.endCond() + + return + } + + fmt.Fprintln(buf, "# General options (legacy and reeflective)") + + var all []string + for variable := range vars { + all = append(all, variable) + } + sort.Strings(all) + + for _, variable := range all { + value := shell.Config.Vars[variable] + var printVal string + + if on, ok := value.(bool); ok { + if on { + printVal = "on" + } else { + printVal = "off" + } + } else { + printVal = fmt.Sprintf("%v", value) + } + + fmt.Fprintf(buf, "set %s %s\n", variable, printVal) + } +} + +// listBinds prints the bind sequences for a given keymap, +// according to command filter flags, in human-readable format. +func listBinds(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + // Get all the commands, used to sort the displays. + var commands = make([]string, len(shell.Keymap.Commands())) + for command := range shell.Keymap.Commands() { + commands = append(commands, command) + } + + sort.Strings(commands) + + query, _ := cmd.Flags().GetString("query") + mustMatchQuery := query != "" && cmd.Flags().Changed("query") + + // Make a list of all sequences bound to each command. + allBinds := make(map[string][]string) + + for _, command := range commands { + for key, bind := range binds { + if bind.Action != command { + continue + } + + // If we are querying a specific command + if bind.Action != query && mustMatchQuery { + continue + } + + commandBinds := allBinds[command] + commandBinds = append(commandBinds, inputrc.Escape(key)) + allBinds[command] = commandBinds + } + } + + if len(commands) == 0 { + return + } + + fmt.Fprintln(buf) + fmt.Fprintf(buf, "===== Command Binds (%s) =======\n", keymap) + fmt.Fprintln(buf) + + for _, command := range commands { + commandBinds := allBinds[command] + sort.Strings(commandBinds) + + switch { + case len(commandBinds) == 0: + case len(commandBinds) > 5: + var firstBinds []string + + for i := 0; i < 5; i++ { + firstBinds = append(firstBinds, "\""+commandBinds[i]+"\"") + } + + bindsStr := strings.Join(firstBinds, ", ") + fmt.Fprintf(buf, "%s can be found on %s ...\n", command, bindsStr) + + default: + var firstBinds []string + + for _, bind := range commandBinds { + firstBinds = append(firstBinds, "\""+bind+"\"") + } + + bindsStr := strings.Join(firstBinds, ", ") + fmt.Fprintf(buf, "%s can be found on %s\n", command, bindsStr) + } + } +} + +// listBindsRC prints the bind sequences for a given keymap, +// according to command filter flags, in .inputrc compliant format. +func listBindsRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + selfInsert, _ := cmd.Flags().GetBool("self-insert") + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + if len(binds) == 0 { + return + } + + // Get all the commands, used to sort the displays. + var commands = make([]string, len(shell.Keymap.Commands())) + for command := range shell.Keymap.Commands() { + commands = append(commands, command) + } + + sort.Strings(commands) + + // Make a list of all sequences bound to each command. + allBinds := make(map[string][]string) + + for _, command := range commands { + for key, bind := range binds { + if bind.Action != command { + continue + } + + commandBinds := allBinds[command] + commandBinds = append(commandBinds, inputrc.Escape(key)) + allBinds[command] = commandBinds + } + } + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "# Command binds (generated from reeflective/readline)") + fmt.Fprintf(buf, "set keymap %s\n\n", keymap) + + for _, command := range commands { + commandBinds := allBinds[command] + sort.Strings(commandBinds) + + if command == "self-insert" && !selfInsert { + continue + } + + if len(commandBinds) > 0 { + for _, bind := range commandBinds { + fmt.Fprintf(buf, "\"%s\": %s\n", bind, command) + } + } + } +} + +// listMacros prints the recorded/existing macros for a given keymap, in human-readable format. +func listMacros(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + var macroBinds []string + + for keys, bind := range binds { + if bind.Macro { + macroBinds = append(macroBinds, inputrc.Escape(keys)) + } + } + + if len(macroBinds) == 0 { + return + } + + sort.Strings(macroBinds) + + fmt.Fprintln(buf) + fmt.Fprintf(buf, "====== Macros (%s) ======\n", keymap) + fmt.Fprintln(buf) + + for _, key := range macroBinds { + action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) + fmt.Printf("%s outputs %s\n", key, action) + } +} + +// listMacros prints the recorded/existing macros for a given keymap, in .inputrc compliant format. +func listMacrosRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + var macroBinds []string + + for keys, bind := range binds { + if bind.Macro { + macroBinds = append(macroBinds, inputrc.Escape(keys)) + } + } + + if len(macroBinds) == 0 { + return + } + + sort.Strings(macroBinds) + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "# Macro binds (generated from reeflective/readline)") + fmt.Fprintf(buf, "set keymap %s\n\n", keymap) + + for _, key := range macroBinds { + action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) + fmt.Fprintf(buf, "\"%s\": \"%s\"\n", key, action) + } +} diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index 92d2739ea2..ee0a2da046 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -3,11 +3,23 @@ package readline import ( "errors" "strconv" + "strings" - "github.com/reeflective/readline" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" +) + +var ( + // We here must assume that all bind changes during the lifetime + // of the binary are all made by a single readline application. + // This config only stores the vars/binds that have been changed. + cfgChanged = inputrc.Config{} ) // Set returns a command named `set`, for manipulating readline global options. @@ -45,7 +57,11 @@ func Set(shell *readline.Shell) *cobra.Command { } // Set the option. - return shell.Config.Set(args[0], value) + if err = shell.Config.Set(args[0], value); err != nil { + return err + } + + return cfgChanged.Set(args[0], value) }, } @@ -61,11 +77,20 @@ func Set(shell *readline.Shell) *cobra.Command { } argComp := func(c carapace.Context) carapace.Action { - val := c.Args[len(c.Args)-1] + val := strings.TrimSpace(c.Args[len(c.Args)-1]) option := shell.Config.Get(val) if option == nil { - return carapace.ActionValues() + return carapace.ActionMessage("No var named %v", option) + } + + switch val { + case "cursor-style": + return carapace.ActionValues("block", "beam", "underline", "blinking-block", "blinking-underline", "blinking-beam", "default") + case "editing-mode": + return carapace.ActionValues("vi", "emacs") + case "keymap": + return completeKeymaps(shell, cmd) } switch option.(type) { @@ -73,8 +98,8 @@ func Set(shell *readline.Shell) *cobra.Command { return carapace.ActionValues("on", "off", "true", "false").StyleF(style.ForKeyword) case int: return carapace.ActionValues().Usage("option value (int)") - default: - carapace.ActionValues().Usage("option value (string)") + case string: + return carapace.ActionValues().Usage("option value (string)") } return carapace.ActionValues().Usage("option value") @@ -87,3 +112,59 @@ func Set(shell *readline.Shell) *cobra.Command { return cmd } + +// Returns the subset of inputrc variables that are specific +// to this library and application/binary. +func filterAppLibVars(cfgVars map[string]interface{}) map[string]interface{} { + appVars := make(map[string]interface{}) + + defCfg := inputrc.DefaultVars() + defVars := maps.Keys(defCfg) + + for name, val := range cfgVars { + if slices.Contains(defVars, name) { + continue + } + + appVars[name] = val + } + + return appVars +} + +// Returns the subset of inputrc variables that are specific +// to this library and application/binary. +func filterLegacyVars(cfgVars map[string]interface{}) map[string]interface{} { + appVars := make(map[string]interface{}) + + defCfg := inputrc.DefaultVars() + defVars := maps.Keys(defCfg) + + for name, val := range cfgVars { + if !slices.Contains(defVars, name) { + continue + } + + appVars[name] = val + } + + return appVars +} + +// Filters out all configuration variables that have not been changed. +func filterChangedVars(allVars map[string]interface{}) map[string]interface{} { + if allVars == nil { + return cfgChanged.Vars + } + + appVars := make(map[string]interface{}) + defVars := maps.Keys(appVars) + + for name, val := range allVars { + if slices.Contains(defVars, name) { + appVars[name] = val + } + } + + return appVars +} diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index ae9898f563..619dd69f41 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -136,11 +136,12 @@ func (c *Console) Menu(name string) *Menu { // that belong to this new menu. If the menu is invalid, i.e that no commands // are bound to this menu name, the current menu is kept. func (c *Console) SwitchMenu(menu string) { - c.mutex.RLock() - defer c.mutex.RUnlock() + c.mutex.Lock() + target, found := c.menus[menu] + c.mutex.Unlock() - // Only switch if the target menu was found. - if target, found := c.menus[menu]; found && target != nil { + if found && target != nil { + // Only switch if the target menu was found. current := c.activeMenu() if current != nil && target == current { return diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 27d8412a18..49967455e5 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -2,9 +2,12 @@ package console import ( "bytes" + "errors" "fmt" + "io" "strings" "sync" + "text/template" "github.com/reeflective/readline" "github.com/spf13/cobra" @@ -35,6 +38,9 @@ type Menu struct { // Command spawner cmds Commands + // An error template to use to produce errors when a command is unavailable. + errFilteredTemplate string + // History sources peculiar to this menu. historyNames []string histories map[string]readline.History @@ -186,21 +192,104 @@ func (m *Menu) Printf(msg string, args ...any) (n int, err error) { return m.console.Printf(buf) } +// ErrUnavailableCommand checks if a target command is marked as filtered as per the console +// application registered/and or active filters (added with console.Hide/ShowCommand()), and +// if yes, returns a template-formatted error message showing the list of incompatible filters. +func (m *Menu) ErrUnavailableCommand(target *cobra.Command) error { + if target == nil { + return nil + } + + filters := m.ActiveFiltersFor(target) + if len(filters) == 0 { + return nil + } + + var bufErr strings.Builder + + err := tmpl(&bufErr, m.errorFilteredCommandTemplate(filters), map[string]interface{}{ + "menu": m, + "cmd": target, + "filters": filters, + }) + + if err != nil { + return err + } + + return errors.New(bufErr.String()) +} + +// ActiveFiltersFor returns all the active menu filters that a given command +// does not declare as compliant with (added with console.Hide/ShowCommand()). +func (m *Menu) ActiveFiltersFor(cmd *cobra.Command) []string { + if cmd.Annotations == nil { + return nil + } + + m.console.mutex.Lock() + defer m.console.mutex.Unlock() + + // Get the filters on the command + filterStr := cmd.Annotations[CommandFilterKey] + var filters []string + + for _, cmdFilter := range strings.Split(filterStr, ",") { + for _, filter := range m.console.filters { + if cmdFilter != "" && cmdFilter == filter { + filters = append(filters, cmdFilter) + } + } + } + + return filters +} + +// SetErrFilteredCommandTemplate sets the error template to be used +// when a called command can't be executed because it's mark filtered. +func (m *Menu) SetErrFilteredCommandTemplate(s string) { + m.errFilteredTemplate = s +} + // resetPreRun is called before each new read line loop and before arbitrary RunCommand() calls. // This function is responsible for resetting the menu state to a clean state, regenerating the // menu commands, and ensuring that the correct prompt is bound to the shell. func (m *Menu) resetPreRun() { - m.console.mutex.RLock() - defer m.console.mutex.RUnlock() + m.mutex.Lock() + defer m.mutex.Unlock() + + // Commands + if m.cmds != nil { + m.Command = m.cmds() + } + + if m.Command == nil { + m.Command = &cobra.Command{ + Annotations: make(map[string]string), + } + } + + // Hide commands that are not available + m.hideFilteredCommands(m.Command) // Menu setup - m.resetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding +} + +// hide commands that are filtered so that they are not +// shown in the help strings or proposed as completions. +func (m *Menu) hideFilteredCommands(root *cobra.Command) { + for _, cmd := range root.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } - // Console-wide setup. - m.console.ensureNoRootRunner() // Avoid printing any help when the command line is empty - m.console.hideFilteredCommands() // Hide commands that are not available + if filters := m.ActiveFiltersFor(cmd); len(filters) > 0 { + cmd.Hidden = true + } + } } func (m *Menu) resetCmdOutput() { @@ -217,20 +306,6 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) resetCommands() { - if m.cmds != nil { - m.Command = m.cmds() - } - - if m.Command == nil { - m.Command = &cobra.Command{ - Annotations: make(map[string]string), - } - } - - m.SilenceUsage = true -} - func (m *Menu) defaultHistoryName() string { var name string @@ -240,3 +315,25 @@ func (m *Menu) defaultHistoryName() string { return fmt.Sprintf("local history%s", name) } + +func (m *Menu) errorFilteredCommandTemplate(filters []string) string { + if m.errFilteredTemplate != "" { + return m.errFilteredTemplate + } + + return `Command {{.cmd.Name}} is only available for: {{range .filters }} + - {{.}} +{{end}}` +} + +// tmpl executes the given template text on data, writing the result to w. +func tmpl(w io.Writer, text string, data interface{}) error { + t := template.New("top") + t.Funcs(templateFuncs) + template.Must(t.Parse(text)) + return t.Execute(w, data) +} + +var templateFuncs = template.FuncMap{ + "trim": strings.TrimSpace, +} diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index eb5b60b9c1..e6dc7bd3b8 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -37,7 +37,7 @@ func (c *Console) Start() error { c.printed = false - if err := c.runPreReadHooks(); err != nil { + if err := c.runAllE(c.PreReadlineHooks); err != nil { fmt.Printf("Pre-read error: %s\n", err.Error()) continue } @@ -83,8 +83,48 @@ func (c *Console) Start() error { // the library user is responsible for setting // the cobra behavior. // If it's an interrupt, we take care of it. - c.execute(menu, args, false) + if err := c.execute(menu, args, false); err != nil { + fmt.Println(err) + } + } +} + +// ExecuteOnce is a wrapper around the classic one-time cobra command execution. +// This call is thus blocking during the entire parsing and execution process +// of a command-line. +// +// This function should be useful if you have trees of commands that can +// be executed both in closed-loop applications or in a one-off exec style. +// Normally, most commands should, if your command behavior/API has no magic. +// +// The command line (os.Args) is matched against the currently active menu. +// Be sure to set and verify this menu before calling this function. +// This function also does not print any application logo. +func (c *Console) ExecuteOnce() error { + // Always ensure we work with the active menu, with freshly + // generated commands, bound prompts and some other things. + menu := c.activeMenu() + menu.resetPreRun() + + c.printed = false + + if c.NewlineBefore { + fmt.Println() } + + // Run user-provided pre-run line hooks, + // which may modify the input line args. + args, err := c.runLineHooks(os.Args) + if err != nil { + return fmt.Errorf("line error: %s\n", err.Error()) + } + + // Run all pre-run hooks and the command itself + // Don't check the error: if its a cobra error, + // the library user is responsible for setting + // the cobra behavior. + // If it's an interrupt, we take care of it. + return c.execute(menu, args, false) } // RunCommand is a convenience function to run a command in a given menu. @@ -105,9 +145,7 @@ func (m *Menu) RunCommand(line string) (err error) { m.resetPreRun() // Run the command and associated helpers. - m.console.execute(m, args, !m.console.isExecuting) - - return + return m.console.execute(m, args, !m.console.isExecuting) } // execute - The user has entered a command input line, the arguments have been processed: @@ -134,14 +172,14 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) - if c.isFiltered(target) { - return + + if err := menu.ErrUnavailableCommand(target); err != nil { + return err } // Console-wide pre-run hooks, cannot. - if err = c.runPreRunHooks(); err != nil { - fmt.Printf("Pre-run error: %s\n", err.Error()) - return + if err = c.runAllE(c.PreCmdRunHooks); err != nil { + return fmt.Errorf("pre-run error: %s", err.Error()) } // Assign those arguments to our parser. @@ -162,7 +200,10 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Wait for the command to finish, or for an OS signal to be caught. select { case <-ctx.Done(): - err = ctx.Err() + if !errors.Is(ctx.Err(), context.Canceled) { + err = ctx.Err() + } + case signal := <-sigchan: cancel(errors.New(signal.String())) menu.handleInterrupt(errors.New(signal.String())) @@ -181,7 +222,7 @@ func (c *Console) executeCommand(cmd *cobra.Command, cancel context.CancelCauseF // And the post-run hooks in the same goroutine, // because they should not be skipped even if // the command is backgrounded by the user. - if err := c.runPostRunHooks(); err != nil { + if err := c.runAllE(c.PostCmdRunHooks); err != nil { cancel(err) return } @@ -210,8 +251,8 @@ func (c *Console) loadActiveHistories() { } } -func (c *Console) runPreReadHooks() error { - for _, hook := range c.PreReadlineHooks { +func (c *Console) runAllE(hooks []func() error) error { + for _, hook := range hooks { if err := hook(); err != nil { return err } @@ -235,26 +276,6 @@ func (c *Console) runLineHooks(args []string) ([]string, error) { return processed, nil } -func (c *Console) runPreRunHooks() error { - for _, hook := range c.PreCmdRunHooks { - if err := hook(); err != nil { - return err - } - } - - return nil -} - -func (c *Console) runPostRunHooks() error { - for _, hook := range c.PostCmdRunHooks { - if err := hook(); err != nil { - return err - } - } - - return nil -} - // monitorSignals - Monitor the signals that can be sent to the process // while a command is running. We want to be able to cancel the command. func (c *Console) monitorSignals() <-chan os.Signal { diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go index 2da490bb65..5418bdfc0b 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/tab-completer.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os" + "regexp" "strings" "unicode/utf8" @@ -27,6 +28,9 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { // (we currently need those two dummies for avoiding a panic). args = append([]string{"examples", "_carapace"}, args...) + // Regenerate a new instance of the commands. + // menu.hideFilteredCommands(cmd) + // Call the completer with our current command context. values, meta := carapace.Complete(menu.Command, args, c.completeCommands(menu)) @@ -64,6 +68,9 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { } func splitArgs(line []rune) (args []string, prefix string) { + // Remove all colors from the string + line = []rune(strip(string(line))) + // Split the line as shellwords, return them if all went fine. args, remain, err := splitCompWords(string(line)) if err == nil { @@ -114,8 +121,13 @@ func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { - menu.resetCommands() - c.hideFilteredCommands() + cmd := menu.Command + if menu.cmds != nil { + cmd = menu.cmds() + } + + menu.resetPreRun() + menu.hideFilteredCommands(cmd) } return commands @@ -299,3 +311,12 @@ double: done: return buf.String(), input, nil } + +const ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))" + +var re = regexp.MustCompile(ansi) + +// strip removes all ANSI escaped color sequences in a string. +func strip(str string) string { + return re.ReplaceAllString(str, "") +} diff --git a/vendor/github.com/reeflective/readline/internal/core/line.go b/vendor/github.com/reeflective/readline/internal/core/line.go index 7f34c9c526..b5a4526e4f 100644 --- a/vendor/github.com/reeflective/readline/internal/core/line.go +++ b/vendor/github.com/reeflective/readline/internal/core/line.go @@ -331,7 +331,7 @@ func DisplayLine(l *Line, indent int) { // Clear everything before each line, except the first. if num > 0 { - term.MoveCursorForwards(indent) + term.MoveCursorForward(indent) line = term.ClearLineBefore + line } diff --git a/vendor/github.com/reeflective/readline/internal/display/engine.go b/vendor/github.com/reeflective/readline/internal/display/engine.go index 5cd907e73c..892e9eeb09 100644 --- a/vendor/github.com/reeflective/readline/internal/display/engine.go +++ b/vendor/github.com/reeflective/readline/internal/display/engine.go @@ -73,7 +73,7 @@ func (e *Engine) Refresh() { // Go back to the first column, and if the primary prompt // was not printed yet, back up to the line's beginning row. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) if !e.primaryPrinted { term.MoveCursorUp(e.cursorRow) @@ -113,7 +113,7 @@ func (e *Engine) ClearHelpers() { term.MoveCursorUp(1) term.MoveCursorUp(e.lineRows) term.MoveCursorDown(e.cursorRow) - term.MoveCursorForwards(e.cursorCol) + term.MoveCursorForward(e.cursorCol) } // ResetHelpers cancels all active hints and completions. @@ -132,16 +132,16 @@ func (e *Engine) AcceptLine() { e.computeCoordinates() // Go back to the end of the non-suggested line. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorDown(e.lineRows) - term.MoveCursorForwards(e.lineCol) + term.MoveCursorForward(e.lineCol) fmt.Print(term.ClearScreenBelow) // Reprint the right-side prompt if it's not a tooltip one. e.prompt.RightPrint(e.lineCol, false) // Go below this non-suggested line and clear everything. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) fmt.Print(term.NewlineReturn) } @@ -166,9 +166,9 @@ func (e *Engine) RefreshTransient() { // This function should only be called when the cursor is on its // "cursor" position on the input line. func (e *Engine) CursorToLineStart() { - term.MoveCursorBackwards(e.cursorCol) + term.MoveCursorBackward(e.cursorCol) term.MoveCursorUp(e.cursorRow) - term.MoveCursorForwards(e.startCols) + term.MoveCursorForward(e.startCols) } // CursorBelowLine moves the cursor to the leftmost @@ -186,8 +186,8 @@ func (e *Engine) CursorBelowLine() { // last character of the prompt. func (e *Engine) lineStartToCursorPos() { term.MoveCursorDown(e.cursorRow) - term.MoveCursorBackwards(term.GetWidth()) - term.MoveCursorForwards(e.cursorCol) + term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorForward(e.cursorCol) } // cursor is on the line below the last line of input. @@ -285,7 +285,7 @@ func (e *Engine) displayHelpers() { e.compRows = completion.Coordinates(e.completer) // Go back to the first line below the input line. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorUp(e.compRows) term.MoveCursorUp(ui.CoordinatesHint(e.hint)) } diff --git a/vendor/github.com/reeflective/readline/internal/term/cursor.go b/vendor/github.com/reeflective/readline/internal/term/cursor.go index ac40f80ceb..98980d166d 100644 --- a/vendor/github.com/reeflective/readline/internal/term/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/term/cursor.go @@ -18,8 +18,8 @@ func MoveCursorDown(i int) { printf("\x1b[%dB", i) } -// MoveCursorForwards moves the cursor forward i columns. -func MoveCursorForwards(i int) { +// MoveCursorForward moves the cursor forward i columns. +func MoveCursorForward(i int) { if i < 1 { return } @@ -27,8 +27,8 @@ func MoveCursorForwards(i int) { printf("\x1b[%dC", i) } -// MoveCursorBackwards moves the cursor backward i columns. -func MoveCursorBackwards(i int) { +// MoveCursorBackward moves the cursor backward i columns. +func MoveCursorBackward(i int) { if i < 1 { return } diff --git a/vendor/github.com/reeflective/readline/internal/ui/prompt.go b/vendor/github.com/reeflective/readline/internal/ui/prompt.go index 44ef0ac0ff..e253278ac4 100644 --- a/vendor/github.com/reeflective/readline/internal/ui/prompt.go +++ b/vendor/github.com/reeflective/readline/internal/ui/prompt.go @@ -212,7 +212,7 @@ func (p *Prompt) TransientPrint() { } // Clean everything below where the prompt will be printed. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorUp(p.primaryRows) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/readline/shell.go b/vendor/github.com/reeflective/readline/shell.go index da50a63876..3a346efec3 100644 --- a/vendor/github.com/reeflective/readline/shell.go +++ b/vendor/github.com/reeflective/readline/shell.go @@ -144,7 +144,7 @@ func (rl *Shell) Printf(msg string, args ...any) (n int, err error) { // First go back to the last line of the input line, // and clear everything below (hints and completions). rl.Display.CursorBelowLine() - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) fmt.Print(term.ClearScreenBelow) // Skip a line, and print the formatted message. @@ -163,7 +163,7 @@ func (rl *Shell) PrintTransientf(msg string, args ...any) (n int, err error) { // First go back to the beginning of the line/prompt, and // clear everything below (prompt/line/hints/completions). rl.Display.CursorToLineStart() - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorUp(rl.Prompt.PrimaryUsed()) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/team/internal/certs/certs.go b/vendor/github.com/reeflective/team/internal/certs/certs.go index 4f7c7d0242..5af5a01fa9 100644 --- a/vendor/github.com/reeflective/team/internal/certs/certs.go +++ b/vendor/github.com/reeflective/team/internal/certs/certs.go @@ -63,11 +63,11 @@ var ErrCertDoesNotExist = errors.New("Certificate does not exist") // Manager is used to manage the certificate infrastructure for a given teamserver. // Has access to a given database for storage, a logger and an abstract filesystem. type Manager struct { - appName string - appDir string - log *logrus.Entry - db *gorm.DB - fs *assets.FS + appName string + appDir string + log *logrus.Entry + database *gorm.DB + fs *assets.FS } // NewManager initializes and returns a certificate manager for a given teamserver. @@ -78,11 +78,11 @@ type Manager struct { // panic and exit. func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appName, appDir string) *Manager { certs := &Manager{ - appName: appName, - appDir: appDir, - log: logger, - db: db, - fs: filesystem, + appName: appName, + appDir: appDir, + log: logger, + database: db, + fs: filesystem, } certs.generateCA(userCA, "teamusers") @@ -90,6 +90,12 @@ func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appNam return certs } +func (m *Manager) db() *gorm.DB { + return m.database.Session(&gorm.Session{ + FullSaveAssociations: true, + }) +} + // GetECCCertificate - Get an ECC certificate. func (c *Manager) GetECCCertificate(caType string, commonName string) ([]byte, []byte, error) { return c.GetCertificate(caType, ECCKey, commonName) @@ -109,7 +115,7 @@ func (c *Manager) GetCertificate(caType string, keyType string, commonName strin c.log.Infof("Getting certificate ca type = %s, cn = '%s'", caType, commonName) certModel := db.Certificate{} - result := c.db.Where(&db.Certificate{ + result := c.db().Where(&db.Certificate{ CAType: caType, KeyType: keyType, CommonName: commonName, @@ -134,7 +140,7 @@ func (c *Manager) RemoveCertificate(caType string, keyType string, commonName st c.log.Infof("Deleting certificate for cn = '%s'", commonName) - err := c.db.Where(&db.Certificate{ + err := c.db().Where(&db.Certificate{ CAType: caType, KeyType: keyType, CommonName: commonName, @@ -301,7 +307,7 @@ func (c *Manager) saveCertificate(caType string, keyType string, commonName stri PrivateKeyPEM: string(key), } - result := c.db.Create(&certModel) + result := c.db().Create(&certModel) return result.Error } diff --git a/vendor/github.com/reeflective/team/internal/certs/users.go b/vendor/github.com/reeflective/team/internal/certs/users.go index c28dac693a..b0fed17776 100644 --- a/vendor/github.com/reeflective/team/internal/certs/users.go +++ b/vendor/github.com/reeflective/team/internal/certs/users.go @@ -70,7 +70,7 @@ func (c *Manager) UserServerGenerateCertificate() ([]byte, []byte, error) { func (c *Manager) UserClientListCertificates() []*x509.Certificate { userCerts := []*db.Certificate{} - result := c.db.Where(&db.Certificate{CAType: userCA}).Find(&userCerts) + result := c.db().Where(&db.Certificate{CAType: userCA}).Find(&userCerts) if result.Error != nil { c.log.Error(result.Error) return []*x509.Certificate{} diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index ac9c0a43fd..713862fb04 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -103,9 +103,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. sqlDB.SetConnMaxLifetime(time.Hour) - return dbClient.Session(&gorm.Session{ - FullSaveAssociations: true, - }), nil + return dbClient, nil } // Schema returns all objects which should be registered diff --git a/vendor/modules.txt b/vendor/modules.txt index 30ceb0422b..7ab05de32a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -365,6 +365,9 @@ github.com/insomniacslk/dhcp/dhcpv4 github.com/insomniacslk/dhcp/iana github.com/insomniacslk/dhcp/interfaces github.com/insomniacslk/dhcp/rfc1035label +# github.com/ivanpirog/coloredcobra v1.0.1 +## explicit; go 1.15 +github.com/ivanpirog/coloredcobra # github.com/jackc/pgpassfile v1.0.0 ## explicit; go 1.12 github.com/jackc/pgpassfile @@ -515,11 +518,11 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.6 +# github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a ## explicit; go 1.20 github.com/reeflective/console github.com/reeflective/console/commands/readline -# github.com/reeflective/readline v1.0.8 +# github.com/reeflective/readline v1.0.8 => /home/user/code/github.com/reeflective/readline ## explicit; go 1.20 github.com/reeflective/readline github.com/reeflective/readline/inputrc @@ -556,7 +559,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +# github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -1267,3 +1270,4 @@ tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet # github.com/reeflective/team => /home/user/code/github.com/reeflective/team +# github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline From 916284cb92f76c87ae0baca5d22cca9abe0203ec Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 21:37:13 +0200 Subject: [PATCH 081/109] Fix correct hiding and erroring of unavailable commands --- client/cli/cli.go | 12 +++++------ client/cli/implant.go | 7 ++++++- client/command/exit/exit.go | 6 ++++-- client/command/reaction/commands.go | 32 +++++++++++++++++++++++------ client/command/server.go | 2 ++ client/command/tasks/commands.go | 12 ----------- client/console/console.go | 30 +++++++++++++++++++++++++++ client/console/implant.go | 6 +++--- client/console/teamclient.go | 8 ++++++++ client/constants/constants.go | 9 ++++---- 10 files changed, 90 insertions(+), 34 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index d25b6e3b96..bb9905186a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -26,8 +26,8 @@ import ( "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" - consoleCmd "github.com/bishopfox/sliver/client/command/console" - "github.com/bishopfox/sliver/client/console" + sliverConsole "github.com/bishopfox/sliver/client/command/console" + client "github.com/bishopfox/sliver/client/console" ) // Execute - Run the sliver client binary. @@ -36,7 +36,7 @@ func Execute() { // Sliver Client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. - con, err := console.NewSliverClient() + con, err := client.NewSliverClient() if err != nil { panic(err) } @@ -57,8 +57,8 @@ func Execute() { // The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped // with all prerunners needed to connect to remote Sliver teamservers. // It will also register the appropriate teamclient management commands. -func SliverCLI(con *console.SliverClient) (root *cobra.Command) { - teamclientCmds := func(con *console.SliverClient) []*cobra.Command { +func SliverCLI(con *client.SliverClient) (root *cobra.Command) { + teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } @@ -76,7 +76,7 @@ func SliverCLI(con *console.SliverClient) (root *cobra.Command) { // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - root.AddCommand(consoleCmd.Command(con, server)) + root.AddCommand(sliverConsole.Command(con, server)) // Implant. // The implant command allows users to run commands on slivers from their diff --git a/client/cli/implant.go b/client/cli/implant.go index 984f8b5477..2d235061d2 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -43,6 +43,10 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co if err != nil { return } + + // And let the console and its active target decide + // what should be available to us, and what should not. + con.ActiveTarget.FilterCommands(implantCmd) }) // This completer will try connect to the server anyway, if not done already. @@ -72,6 +76,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd } // Load either the session or the beacon. + // This also sets the correct console menu. session := con.GetSession(target) if session != nil { con.ActiveTarget.Set(session, nil) @@ -85,7 +90,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd // If the command is marked filtered (should not be ran in // the current context/target), don't do anything and return. // This is identical to the filtering behavior in the console. - if err := con.App.Menu(constants.ImplantMenu).ErrUnavailableCommand(cmd); err != nil { + if err := con.App.ActiveMenu().ErrUnavailableCommand(cmd); err != nil { return err } diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index bbcad99173..08e33cd65b 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -19,6 +19,7 @@ package exit */ import ( + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/spf13/cobra" @@ -27,8 +28,9 @@ import ( // Commands returns the `exit` command. func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{{ - Use: "exit", - Short: "Exit the program", + Use: "exit", + Short: "Exit the program", + Annotations: flags.RestrictTargets(constants.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { con.ExitConfirm() }, diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index 4e4e9c7929..b03e77e0b3 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -1,21 +1,41 @@ package reaction +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { reactionCmd := &cobra.Command{ - Use: consts.ReactionStr, - Short: "Manage automatic reactions to events", - Long: help.GetHelpFor([]string{consts.ReactionStr}), + Use: consts.ReactionStr, + Short: "Manage automatic reactions to events", + Long: help.GetHelpFor([]string{consts.ReactionStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { ReactionCmd(cmd, con, args) }, diff --git a/client/command/server.go b/client/command/server.go index 95baa9bab3..1c93543371 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -149,6 +149,8 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) + con.FilterCommands(server) + return server } diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index a68bc7a447..f6d1d3283d 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -72,17 +72,5 @@ func Commands(con *console.SliverClient) []*cobra.Command { tasksCmd.AddCommand(cancelCmd) carapace.Gen(cancelCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) - waitCmd := &cobra.Command{ - Use: consts.WaitStr, - Short: "Block and wait for a task to complete and return its results", - Long: help.GetHelpFor([]string{consts.TasksStr, consts.WaitStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - TaskWaitCmd(cmd, con, args) - }, - } - tasksCmd.AddCommand(waitCmd) - carapace.Gen(waitCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) - return []*cobra.Command{tasksCmd} } diff --git a/client/console/console.go b/client/console/console.go index 7e94b5efd9..a78bbf9b2a 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -243,10 +243,40 @@ func (con *SliverClient) ExposeCommands() { filters := con.ActiveTarget.Filters() + if !con.isCLI { + filters = append(filters, consts.ConsoleCmdsFilter) + } + // Use all defined filters. con.App.HideCommands(filters...) } +func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { + con.App.ShowCommands() + + if con.isCLI { + filters = append(filters, consts.ConsoleCmdsFilter) + } + + sess, beac := con.ActiveTarget.Get() + if sess != nil || beac != nil { + filters = append(filters, con.ActiveTarget.Filters()...) + } + + con.App.HideCommands(filters...) + + for _, cmd := range cmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, filters) { + cmd.Hidden = true + } + } +} + // GetSession returns the session matching an ID, either by prefix or strictly. func (con *SliverClient) GetSession(arg string) *clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) diff --git a/client/console/implant.go b/client/console/implant.go index 226219ce45..3b2ea595e2 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -176,9 +176,9 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } - if s.con.isCLI { - return - } + // if s.con.isCLI { + // return + // } // Update menus, prompts and commands if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { diff --git a/client/console/teamclient.go b/client/console/teamclient.go index b7ccad2fbc..f703e54359 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -43,6 +43,14 @@ import ( // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { + con.FilterCommands(cmd) + + // If commands are imcompatible with the current requirements. + err := con.App.ActiveMenu().ErrUnavailableCommand(cmd) + if err != nil { + return err + } + // Some commands don't need a remote teamserver connection. if con.isOffline(cmd) { return nil diff --git a/client/constants/constants.go b/client/constants/constants.go index 6cd3e17df9..ca7eee6e06 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -325,10 +325,11 @@ const ( // Command types / filters (per OS/type/C2/etc) // Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( - SessionCmdsFilter = "session" - BeaconCmdsFilter = "beacon" - WindowsCmdsFilter = "windows" - WireguardCmdsFilter = "wireguard" + SessionCmdsFilter = "Sessions" + BeaconCmdsFilter = "Beacons" + WindowsCmdsFilter = "Windows" + WireguardCmdsFilter = "Wireguard" + ConsoleCmdsFilter = "Console" ) // Creds (needed here to avoid recursive imports). From fa61c19a9df0bd44e5c791b49daf7a30f34c5754 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 11 Aug 2023 00:37:45 +0200 Subject: [PATCH 082/109] Update deps + few fixes --- client/command/server.go | 18 ++--------- client/command/sessions/commands.go | 7 +++-- client/command/sliver.go | 47 ++--------------------------- client/console/console.go | 34 ++++++++------------- client/console/implant.go | 6 +--- go.mod | 1 - go.sum | 11 ------- vendor/modules.txt | 3 -- 8 files changed, 23 insertions(+), 104 deletions(-) diff --git a/client/command/server.go b/client/command/server.go index 1c93543371..a31149cce7 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,6 +19,9 @@ package command */ import ( + "github.com/reeflective/console" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -45,9 +48,6 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - cc "github.com/ivanpirog/coloredcobra" - "github.com/reeflective/console" - "github.com/spf13/cobra" ) // SliverBinder is the signature of command yielder functions passed and used by @@ -68,18 +68,6 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C }, } - cc.Init(&cc.Config{ - RootCmd: server, - NoExtraNewlines: true, - NoBottomNewline: true, - Headings: cc.HiCyan + cc.Bold + cc.Underline, - ExecName: cc.Bold, - Example: cc.Italic, - Commands: cc.HiYellow + cc.Bold, - Flags: cc.Bold, - FlagsDataType: cc.Italic, - }) - // Utility function to be used for binding new commands to // the sliver menu: call the function with the name of the // group under which this/these commands should be added, diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 183c558619..b802910564 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -58,9 +58,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { // SliverCommands returns all session control commands for the active target. func SliverCommands(con *console.SliverClient) []*cobra.Command { backgroundCmd := &cobra.Command{ - Use: consts.BackgroundStr, - Short: "Background an active session", - Long: help.GetHelpFor([]string{consts.BackgroundStr}), + Use: consts.BackgroundStr, + Short: "Background an active session", + Long: help.GetHelpFor([]string{consts.BackgroundStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { BackgroundCmd(cmd, con, args) }, diff --git a/client/command/sliver.go b/client/command/sliver.go index 4bc27a3ec5..973947f5fe 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,7 +19,8 @@ package command */ import ( - "strings" + "github.com/reeflective/console" + "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" @@ -51,9 +52,6 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // SliverCommands returns all commands bound to the implant menu. @@ -168,51 +166,12 @@ func SliverCommands(con *client.SliverClient) console.Commands { sliver.InitDefaultHelpCmd() sliver.SetHelpCommandGroupID(consts.SliverCoreHelpGroup) - initHelpCompletion(sliver) // Compute which commands should be available based on the current session/beacon. - con.ExposeCommands() + con.FilterCommands(sliver) return sliver } return sliverCommands } - -func actionSubcommands(cmd *cobra.Command) carapace.Action { - return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - batch := carapace.Batch() - for _, subcommand := range cmd.Commands() { - if !subcommand.Hidden && subcommand.Deprecated == "" { - batch = append(batch, carapace.ActionValuesDescribed(subcommand.Name(), subcommand.Short).Tag(subcommand.GroupID)) - for _, alias := range subcommand.Aliases { - batch = append(batch, carapace.ActionValuesDescribed(alias, subcommand.Short).Tag(subcommand.GroupID)) - } - } - } - return batch.ToA() - }) -} - -func initHelpCompletion(cmd *cobra.Command) { - helpCmd, _, err := cmd.Find([]string{"help"}) - if err != nil { - return - } - - if helpCmd.Name() != "help" || - helpCmd.Short != "Help about any command" || - !strings.HasPrefix(helpCmd.Long, `Help provides help for any command in the application.`) { - return - } - - carapace.Gen(helpCmd).PositionalAnyCompletion( - carapace.ActionCallback(func(c carapace.Context) carapace.Action { - lastCmd, _, err := cmd.Find(c.Args) - if err != nil { - return carapace.ActionMessage(err.Error()) - } - return actionSubcommands(lastCmd) - }), - ) -} diff --git a/client/console/console.go b/client/console/console.go index a78bbf9b2a..b1a6fa1de5 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -236,21 +236,10 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// Expose or hide commands if the active target does support them (or not). -// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -func (con *SliverClient) ExposeCommands() { - con.App.ShowCommands() - - filters := con.ActiveTarget.Filters() - - if !con.isCLI { - filters = append(filters, consts.ConsoleCmdsFilter) - } - - // Use all defined filters. - con.App.HideCommands(filters...) -} - +// FilterCommands shows/hides commands if the active target does support them (or not). +// Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. +// Both the cmd *cobra.Command passed and the filters can be nil, in which case the +// filters are recomputed by the console application for the current context. func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { con.App.ShowCommands() @@ -265,14 +254,15 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { con.App.HideCommands(filters...) - for _, cmd := range cmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } + if cmd != nil { + for _, cmd := range cmd.Commands() { + if cmd.Hidden { + continue + } - if isFiltered(cmd, filters) { - cmd.Hidden = true + if isFiltered(cmd, filters) { + cmd.Hidden = true + } } } } diff --git a/client/console/implant.go b/client/console/implant.go index 3b2ea595e2..7dc4c6c0a1 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -139,7 +139,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { return } - defer s.con.ExposeCommands() + defer s.con.FilterCommands(s.con.App.ActiveMenu().Command) // Backgrounding if session == nil && beacon == nil { @@ -176,10 +176,6 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } - // if s.con.isCLI { - // return - // } - // Update menus, prompts and commands if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { s.con.App.SwitchMenu(consts.ImplantMenu) diff --git a/go.mod b/go.mod index b249a97524..561ab5b9c6 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,6 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 - github.com/ivanpirog/coloredcobra v1.0.1 github.com/jedib0t/go-pretty/v6 v6.4.6 github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f github.com/klauspost/compress v1.16.6 diff --git a/go.sum b/go.sum index 4874c786ba..0e73e19954 100644 --- a/go.sum +++ b/go.sum @@ -91,7 +91,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -110,7 +109,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= @@ -199,13 +197,10 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/illarion/gonotify v1.0.1 h1:F1d+0Fgbq/sDWjj/r66ekjDG+IDeecQKUFH4wNwsoio= github.com/illarion/gonotify v1.0.1/go.mod h1:zt5pmDofZpU1f8aqlK0+95eQhoEAn/d4G4B/FjVW4jE= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16 h1:+aAGyK41KRn8jbF2Q7PLL0Sxwg6dShGcQSeCC7nZQ8E= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16/go.mod h1:IKrnDWs3/Mqq5n0lI+RxA2sB7MvN/vbMBP3ehXg65UI= -github.com/ivanpirog/coloredcobra v1.0.1 h1:aURSdEmlR90/tSiWS0dMjdwOvCVUeYLfltLfbgNxrN4= -github.com/ivanpirog/coloredcobra v1.0.1/go.mod h1:iho4nEKcnwZFiniGSdcgdvRgZNjxm+h20acv8vqmN6Q= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -267,13 +262,11 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -345,7 +338,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -472,7 +464,6 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -483,7 +474,6 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -581,7 +571,6 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/vendor/modules.txt b/vendor/modules.txt index 7ab05de32a..4615c0c69f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -365,9 +365,6 @@ github.com/insomniacslk/dhcp/dhcpv4 github.com/insomniacslk/dhcp/iana github.com/insomniacslk/dhcp/interfaces github.com/insomniacslk/dhcp/rfc1035label -# github.com/ivanpirog/coloredcobra v1.0.1 -## explicit; go 1.15 -github.com/ivanpirog/coloredcobra # github.com/jackc/pgpassfile v1.0.0 ## explicit; go 1.12 github.com/jackc/pgpassfile From f2566210c56115404dc7199242a4df1b55a3b401 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 11 Aug 2023 01:47:59 +0200 Subject: [PATCH 083/109] Rename flag/comp util functions --- client/command/alias/alias.go | 7 +++--- client/command/alias/commands.go | 13 ++++++----- client/command/alias/install.go | 3 ++- client/command/alias/load.go | 9 ++++---- client/command/alias/remove.go | 3 ++- client/command/armory/armory.go | 7 +++--- client/command/armory/commands.go | 13 ++++++----- client/command/armory/completion.go | 3 ++- client/command/armory/install.go | 3 ++- client/command/armory/search.go | 3 ++- client/command/armory/update.go | 3 ++- client/command/backdoor/backdoor.go | 3 ++- client/command/backdoor/commands.go | 10 ++++---- client/command/beacons/beacons.go | 7 +++--- client/command/beacons/commands.go | 10 ++++---- client/command/beacons/helpers.go | 1 + client/command/beacons/prune.go | 3 ++- client/command/beacons/rm.go | 3 ++- client/command/beacons/watch.go | 3 ++- client/command/builders/builders.go | 5 ++-- client/command/builders/commands.go | 5 ++-- client/command/command.go | 3 ++- client/command/completers/completers.go | 23 +++++++++++++++++++ client/command/crack/commands.go | 7 +++--- client/command/crack/crack-files.go | 7 +++--- client/command/crack/crack.go | 5 ++-- client/command/crack/helpers.go | 3 ++- client/command/creds/add.go | 3 ++- client/command/creds/commands.go | 12 ++++++---- client/command/creds/creds.go | 7 +++--- client/command/creds/rm.go | 3 ++- client/command/creds/select.go | 1 + client/command/cursed/commands.go | 14 ++++++----- client/command/cursed/cursed-chrome.go | 3 ++- client/command/cursed/cursed-console.go | 5 ++-- client/command/cursed/cursed-cookies.go | 3 ++- client/command/cursed/cursed-edge.go | 3 ++- client/command/cursed/cursed-electron.go | 3 ++- client/command/cursed/cursed-rm.go | 3 ++- client/command/cursed/cursed-screenshot.go | 3 ++- client/command/cursed/cursed.go | 5 ++-- client/command/dllhijack/commands.go | 10 ++++---- client/command/dllhijack/dllhijack.go | 3 ++- client/command/environment/commands.go | 7 +++--- client/command/environment/get.go | 5 ++-- client/command/environment/set.go | 5 ++-- client/command/environment/unset.go | 5 ++-- client/command/exec/commands.go | 18 ++++++++------- client/command/exec/execute-assembly.go | 5 ++-- client/command/exec/execute-shellcode.go | 7 +++--- client/command/exec/execute.go | 5 ++-- client/command/exec/migrate.go | 3 ++- client/command/exec/msf-inject.go | 5 ++-- client/command/exec/msf.go | 5 ++-- client/command/exec/psexec.go | 3 ++- client/command/exec/sideload.go | 5 ++-- client/command/exec/spawndll.go | 5 ++-- client/command/exec/ssh.go | 5 ++-- client/command/exit/exit.go | 3 ++- client/command/extensions/commands.go | 5 ++-- client/command/extensions/extensions.go | 7 +++--- client/command/extensions/install.go | 3 ++- client/command/extensions/list.go | 3 ++- client/command/extensions/load.go | 11 +++++---- client/command/extensions/remove.go | 3 ++- client/command/filesystem/cat.go | 5 ++-- client/command/filesystem/cd.go | 5 ++-- client/command/filesystem/chmod.go | 5 ++-- client/command/filesystem/chown.go | 5 ++-- client/command/filesystem/chtimes.go | 5 ++-- client/command/filesystem/commands.go | 10 ++++---- client/command/filesystem/cp.go | 5 ++-- client/command/filesystem/download.go | 7 +++--- client/command/filesystem/ls.go | 7 +++--- client/command/filesystem/memfiles-add.go | 5 ++-- client/command/filesystem/memfiles-list.go | 5 ++-- client/command/filesystem/memfiles-rm.go | 5 ++-- client/command/filesystem/mkdir.go | 5 ++-- client/command/filesystem/mv.go | 5 ++-- client/command/filesystem/pwd.go | 5 ++-- client/command/filesystem/rm.go | 5 ++-- client/command/filesystem/upload.go | 5 ++-- client/command/flags/flags.go | 23 ------------------- client/command/generate/canaries.go | 5 ++-- client/command/generate/commands.go | 18 ++++++++------- client/command/generate/generate-beacon.go | 3 ++- client/command/generate/generate-info.go | 3 ++- client/command/generate/generate-stager.go | 3 ++- client/command/generate/generate.go | 3 ++- client/command/generate/helpers.go | 7 +++--- client/command/generate/implants-rm.go | 3 ++- client/command/generate/implants.go | 7 +++--- client/command/generate/profiles-generate.go | 3 ++- client/command/generate/profiles-new.go | 3 ++- client/command/generate/profiles-rm.go | 3 ++- client/command/generate/profiles.go | 7 +++--- client/command/generate/regenerate.go | 3 ++- client/command/generate/traffic-encoders.go | 13 ++++++----- client/command/history/history.go | 7 +++--- client/command/hosts/commands.go | 5 ++-- client/command/hosts/hosts-ioc-rm.go | 3 ++- client/command/hosts/hosts-ioc.go | 5 ++-- client/command/hosts/hosts-rm.go | 3 ++- client/command/hosts/hosts.go | 5 ++-- client/command/info/commands.go | 7 +++--- client/command/info/info.go | 5 ++-- client/command/info/ping.go | 3 ++- client/command/jobs/commands.go | 14 ++++++----- client/command/jobs/dns.go | 3 ++- client/command/jobs/http.go | 3 ++- client/command/jobs/https.go | 3 ++- client/command/jobs/jobs.go | 7 +++--- client/command/jobs/mtls.go | 3 ++- client/command/jobs/named-pipe.go | 3 ++- client/command/jobs/stage.go | 3 ++- client/command/jobs/tcp.go | 3 ++- client/command/jobs/wg.go | 3 ++- client/command/kill/commands.go | 5 ++-- client/command/kill/kill.go | 3 ++- client/command/loot/commands.go | 16 +++++++------ client/command/loot/fetch.go | 3 ++- client/command/loot/helpers.go | 3 ++- client/command/loot/local.go | 3 ++- client/command/loot/loot.go | 5 ++-- client/command/loot/remote.go | 5 ++-- client/command/loot/rename.go | 3 ++- client/command/loot/rm.go | 3 ++- client/command/monitor/commands.go | 3 ++- client/command/monitor/start.go | 3 ++- client/command/monitor/stop.go | 3 ++- client/command/network/commands.go | 5 ++-- client/command/network/ifconfig.go | 7 +++--- client/command/network/netstat.go | 7 +++--- client/command/pivots/commands.go | 10 ++++---- client/command/pivots/details.go | 5 ++-- client/command/pivots/graph.go | 3 ++- client/command/pivots/helpers.go | 3 ++- client/command/pivots/pivots.go | 5 ++-- client/command/pivots/stop.go | 3 ++- client/command/portfwd/commands.go | 11 +++++---- client/command/portfwd/portfwd-add.go | 3 ++- client/command/portfwd/portfwd-rm.go | 3 ++- client/command/portfwd/portfwd.go | 7 +++--- client/command/prelude-operator/commands.go | 7 +++--- client/command/prelude-operator/connect.go | 3 ++- client/command/prelude-operator/operator.go | 3 ++- client/command/privilege/commands.go | 7 +++--- client/command/privilege/getprivs.go | 5 ++-- client/command/privilege/getsystem.go | 5 ++-- client/command/privilege/impersonate.go | 5 ++-- client/command/privilege/make-token.go | 5 ++-- client/command/privilege/rev2self.go | 5 ++-- client/command/privilege/runas.go | 5 ++-- client/command/processes/commands.go | 10 ++++---- client/command/processes/procdump.go | 5 ++-- client/command/processes/ps.go | 9 ++++---- client/command/processes/pstree.go | 3 ++- client/command/processes/terminate.go | 5 ++-- client/command/reaction/commands.go | 5 ++-- client/command/reaction/helpers.go | 3 ++- client/command/reaction/reaction.go | 5 ++-- client/command/reaction/reload.go | 3 ++- client/command/reaction/save.go | 3 ++- client/command/reaction/set.go | 3 ++- client/command/reaction/unset.go | 3 ++- client/command/reconfig/commands.go | 5 ++-- client/command/reconfig/reconfig.go | 5 ++-- client/command/reconfig/rename.go | 3 ++- client/command/registry/commands.go | 7 +++--- client/command/registry/reg-create.go | 5 ++-- client/command/registry/reg-delete.go | 5 ++-- client/command/registry/reg-list.go | 5 ++-- client/command/registry/reg-read.go | 5 ++-- client/command/registry/reg-write.go | 5 ++-- client/command/rportfwd/commands.go | 11 +++++---- client/command/rportfwd/portfwd-add.go | 3 ++- client/command/rportfwd/portfwd-rm.go | 3 ++- client/command/rportfwd/portfwd.go | 7 +++--- client/command/screenshot/commands.go | 10 ++++---- client/command/screenshot/screenshot.go | 5 ++-- client/command/sessions/background.go | 3 ++- client/command/sessions/close.go | 3 ++- client/command/sessions/commands.go | 10 ++++---- client/command/sessions/helpers.go | 3 ++- client/command/sessions/interactive.go | 3 ++- client/command/sessions/prune.go | 3 ++- client/command/sessions/sessions.go | 7 +++--- client/command/settings/beacons.go | 3 ++- client/command/settings/commands.go | 5 ++-- client/command/settings/opsec.go | 3 ++- client/command/settings/settings.go | 5 ++-- client/command/settings/tables.go | 5 ++-- client/command/shell/commands.go | 5 ++-- client/command/shell/shell.go | 5 ++-- client/command/shikata-ga-nai/commands.go | 10 ++++---- client/command/shikata-ga-nai/sgn.go | 3 ++- client/command/socks/commands.go | 11 +++++---- client/command/socks/socks-start.go | 5 ++-- client/command/socks/socks-stop.go | 3 ++- client/command/socks/socks.go | 7 +++--- client/command/taskmany/taskmany.go | 3 ++- client/command/tasks/fetch.go | 9 ++++---- client/command/tasks/helpers.go | 3 ++- client/command/tasks/tasks-cancel.go | 3 ++- client/command/tasks/tasks.go | 5 ++-- client/command/update/commands.go | 9 ++++---- client/command/update/update.go | 5 ++-- client/command/use/beacons.go | 3 ++- client/command/use/commands.go | 7 +++--- client/command/use/sessions.go | 3 ++- client/command/use/use.go | 5 ++-- client/command/wasm/commands.go | 10 ++++---- client/command/wasm/memfs.go | 3 ++- client/command/wasm/wasm.go | 5 ++-- client/command/websites/commands.go | 14 ++++++----- .../command/websites/websites-add-content.go | 3 ++- .../command/websites/websites-rm-content.go | 3 ++- client/command/websites/websites-rm.go | 3 ++- .../websites/websites-update-content.go | 3 ++- client/command/websites/websites.go | 7 +++--- client/command/wireguard/commands.go | 10 ++++---- client/command/wireguard/wg-config.go | 3 ++- client/command/wireguard/wg-portfwd-add.go | 3 ++- client/command/wireguard/wg-portfwd-rm.go | 5 ++-- client/command/wireguard/wg-portfwd.go | 5 ++-- client/command/wireguard/wg-socks-start.go | 3 ++- client/command/wireguard/wg-socks-stop.go | 3 ++- client/command/wireguard/wg-socks.go | 7 +++--- 228 files changed, 735 insertions(+), 491 deletions(-) diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 47bddfb9bb..1e8382aaf9 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -24,13 +24,14 @@ import ( "io/ioutil" "strings" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" ) // AliasesCmd - The alias command. diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go index d8b86be31f..b9f48ee227 100644 --- a/client/command/alias/commands.go +++ b/client/command/alias/commands.go @@ -1,12 +1,13 @@ package alias import ( - "github.com/bishopfox/sliver/client/command/flags" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // Commands returns the `alias` command and its child commands. @@ -31,7 +32,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } aliasCmd.AddCommand(aliasLoadCmd) - flags.NewCompletions(aliasLoadCmd).PositionalCompletion(carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) + completers.NewCompsFor(aliasLoadCmd).PositionalCompletion(carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) aliasInstallCmd := &cobra.Command{ Use: consts.InstallStr + " [ALIAS]", @@ -43,7 +44,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } aliasCmd.AddCommand(aliasInstallCmd) - flags.NewCompletions(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) + completers.NewCompsFor(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) aliasRemove := &cobra.Command{ Use: consts.RmStr + " [ALIAS]", @@ -54,7 +55,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { AliasesRemoveCmd(cmd, con, args) }, } - flags.NewCompletions(aliasRemove).PositionalCompletion(AliasCompleter()) + completers.NewCompsFor(aliasRemove).PositionalCompletion(AliasCompleter()) aliasCmd.AddCommand(aliasRemove) return []*cobra.Command{aliasCmd} diff --git a/client/command/alias/install.go b/client/command/alias/install.go index 663e9c0ebd..5fef274d7f 100644 --- a/client/command/alias/install.go +++ b/client/command/alias/install.go @@ -26,10 +26,11 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // AliasesInstallCmd - Install an alias. diff --git a/client/command/alias/load.go b/client/command/alias/load.go index 470fadd946..672d9c8b5f 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -28,6 +28,11 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + app "github.com/reeflective/console" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -35,10 +40,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - app "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) const ( diff --git a/client/command/alias/remove.go b/client/command/alias/remove.go index 850b2cd292..d84d1b168f 100644 --- a/client/command/alias/remove.go +++ b/client/command/alias/remove.go @@ -25,9 +25,10 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // AliasesRemoveCmd - Locally load a alias into the Sliver shell. diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index b098b4b8e6..0c3bee396c 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -26,15 +26,16 @@ import ( "sync" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/cryptography/minisign" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" ) const ( diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 87157225cf..e14efb8fd8 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -1,14 +1,15 @@ package armory import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the `armory` command and its subcommands. @@ -28,7 +29,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") f.StringP("timeout", "t", "15m", "download timeout") }) - flags.BindFlagCompletions(armoryCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(armoryCmd, func(comp *carapace.ActionMap) { (*comp)["proxy"] = completers.LocalProxyCompleter() }) @@ -42,7 +43,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } armoryCmd.AddCommand(armoryInstallCmd) - flags.NewCompletions(armoryInstallCmd).PositionalCompletion( + completers.NewCompsFor(armoryInstallCmd).PositionalCompletion( AliasExtensionOrBundleCompleter().Usage("name of the extension or alias to install"), ) @@ -66,7 +67,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } armoryCmd.AddCommand(armorySearchCmd) - flags.NewCompletions(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) + completers.NewCompsFor(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) return []*cobra.Command{armoryCmd} } diff --git a/client/command/armory/completion.go b/client/command/armory/completion.go index fd592e1062..3097698cdc 100644 --- a/client/command/armory/completion.go +++ b/client/command/armory/completion.go @@ -25,10 +25,11 @@ import ( "path/filepath" "time" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" - "github.com/rsteube/carapace" ) // AliasExtensionOrBundleCompleter - Completer for alias, extension, and bundle names. diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 1df01e720d..9f5845da74 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -26,12 +26,13 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/cryptography/minisign" - "github.com/spf13/cobra" ) // ErrPackageNotFound - The package was not found. diff --git a/client/command/armory/search.go b/client/command/armory/search.go index 3e51acc8fd..ce3fd743f7 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -21,10 +21,11 @@ package armory import ( "regexp" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // ArmorySearchCmd - Search for packages by name. diff --git a/client/command/armory/update.go b/client/command/armory/update.go index 3fb3a622d7..c8eb114a10 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -22,11 +22,12 @@ import ( "os" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // ArmoryUpdateCmd - Update all installed extensions/aliases. diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index b4de5bd30a..66e2c2e346 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -21,9 +21,10 @@ package backdoor import ( "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // BackdoorCmd - Command to inject implant code into an existing binary. diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go index 72f893e788..1b56221d6d 100644 --- a/client/command/backdoor/commands.go +++ b/client/command/backdoor/commands.go @@ -1,14 +1,16 @@ package backdoor import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -28,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("profile", "p", "", "profile to use for service binary") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(backdoorCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(backdoorCmd, func(comp *carapace.ActionMap) { (*comp)["profile"] = generate.ProfileNameCompleter(con) }) carapace.Gen(backdoorCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the remote file to backdoor")) diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 02f0928381..8689680cf2 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -24,14 +24,15 @@ import ( "strings" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" ) // BeaconsCmd - Display/interact with beacons. diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 3854737ebb..78885af22f 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -5,14 +5,16 @@ import ( "fmt" "strings" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -37,7 +39,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("filter", "f", "", "filter beacons by substring") f.StringP("filter-re", "e", "", "filter beacons by regular expression") }) - flags.BindFlagCompletions(beaconsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(beaconsCmd, func(comp *carapace.ActionMap) { (*comp)["kill"] = BeaconIDCompleter(con) }) beaconsRmCmd := &cobra.Command{ diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index 6a651cb07c..be772a12b7 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -27,6 +27,7 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index 478c98aa21..a408efb53d 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -22,10 +22,11 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // BeaconsPruneCmd - Prune stale beacons automatically. diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index bd626eb193..d0ee108d94 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -22,9 +22,10 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // BeaconsRmCmd - Display/interact with beacons. diff --git a/client/command/beacons/watch.go b/client/command/beacons/watch.go index 242c365fb7..9c4a514dab 100644 --- a/client/command/beacons/watch.go +++ b/client/command/beacons/watch.go @@ -24,9 +24,10 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // BeaconsWatchCmd - Watch your beacons in real-ish time. diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index 2c14e4f1ec..7da2b003b1 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -23,12 +23,13 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // BuildersCmd - List external builders. diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go index 16478cd1fc..d80cbe44fe 100644 --- a/client/command/builders/commands.go +++ b/client/command/builders/commands.go @@ -1,12 +1,13 @@ package builders import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/command.go b/client/command/command.go index 21083729f8..0559e8433b 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,11 +21,12 @@ package command import ( "strings" - client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + + client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 diff --git a/client/command/completers/completers.go b/client/command/completers/completers.go index 89cc9f8558..75bdcece48 100644 --- a/client/command/completers/completers.go +++ b/client/command/completers/completers.go @@ -23,6 +23,7 @@ import ( "time" "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -35,6 +36,28 @@ const ( CacheCompilerInfo = 1 * time.Hour // CacheCompilerInfo caches server compiler info for an hour on disk. ) +// NewCompsFor registers the command to the application completion engine and returns +// you a type through which you can register all sorts of completions for this command, +// from flag arguments, positional ones, per index or remaining, etc. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func NewCompsFor(cmd *cobra.Command) *carapace.Carapace { + return carapace.Gen(cmd) +} + +// BindFlagCompletions is a convenience function for binding completers to flags requiring arguments. +// (It wraps a few steps to be used through the *carapace.Carapace type so you don't have to bother). +// cmd - The target command/subcommand which flags to be completed. +// bind - A function using a map "flag-name":carapace.Action for you to bind completions to the flag. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func NewFlagCompsFor(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { + comps := make(carapace.ActionMap) + bind(&comps) + + carapace.Gen(cmd).FlagCompletion(comps) +} + // ClientInterfacesCompleter completes interface addresses on the client host. func ClientInterfacesCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go index 5ababc1579..7fc4e08df0 100644 --- a/client/command/crack/commands.go +++ b/client/command/crack/commands.go @@ -1,13 +1,14 @@ package crack import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index d6dc856deb..5e2f1ca91d 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -25,13 +25,14 @@ import ( "io" "os" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/klauspost/compress/zstd" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/klauspost/compress/zstd" - "github.com/spf13/cobra" ) // CrackWordlistsCmd - Manage GPU cracking stations. diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 0ce322eefb..ab13d083ff 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -23,12 +23,13 @@ import ( "fmt" "sort" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // CrackCmd - GPU password cracking interface. diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index 89c1446a6e..6841d10b41 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -5,9 +5,10 @@ import ( "fmt" "time" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/rsteube/carapace" ) func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 67798e9fd8..373860d168 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -25,10 +25,11 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) const ( diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go index 65276e382b..0a2d734de4 100644 --- a/client/command/creds/commands.go +++ b/client/command/creds/commands.go @@ -1,13 +1,15 @@ package creds import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -40,7 +42,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("hash", "P", "", "hash of the credential") f.StringP("hash-type", "H", "", "hash type of the credential") }) - flags.BindFlagCompletions(credsAddCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(credsAddCmd, func(comp *carapace.ActionMap) { (*comp)["hash-type"] = CredsHashTypeCompleter(con) }) credsCmd.AddCommand(credsAddCmd) @@ -59,7 +61,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("file-format", "F", HashNewlineFormat, "file format of the credential file") f.StringP("hash-type", "H", "", "hash type of the credential") }) - flags.BindFlagCompletions(credsAddFileCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(credsAddFileCmd, func(comp *carapace.ActionMap) { (*comp)["collection"] = CredsCollectionCompleter(con) (*comp)["file-format"] = CredsHashFileFormatCompleter(con) (*comp)["hash-type"] = CredsHashTypeCompleter(con) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 8c8dbdbe3e..4cd7338859 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -23,13 +23,14 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // CredsCmd - Manage credentials. diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index eace7891cb..8b3ec05497 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -22,10 +22,11 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // CredsCmd - Add new credentials. diff --git a/client/command/creds/select.go b/client/command/creds/select.go index 1988a296b7..2ebde7b5ee 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -9,6 +9,7 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index d61dbd51f3..c4b518a142 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -1,13 +1,15 @@ package cursed import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -73,7 +75,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") f.BoolP("headless", "H", false, "start browser process in headless mode") }) - flags.BindFlagCompletions(cursedChromeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(cursedChromeCmd, func(comp *carapace.ActionMap) { (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") }) cursedChromeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true @@ -97,7 +99,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") f.BoolP("headless", "H", false, "start browser process in headless mode") }) - flags.BindFlagCompletions(cursedEdgeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(cursedEdgeCmd, func(comp *carapace.ActionMap) { (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") }) cursedEdgeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true @@ -131,7 +133,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "save to file") }) - flags.BindFlagCompletions(CursedCookiesCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(CursedCookiesCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles() }) diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 1a5dac1881..33a42c9241 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -29,6 +29,8 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -36,7 +38,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index 24fcc4cdc2..f70bdcb42a 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -27,11 +27,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/readline" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" - "github.com/reeflective/readline" - "github.com/spf13/cobra" ) func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index 59c13d5e09..a2f46dfa4e 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -24,9 +24,10 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" - "github.com/spf13/cobra" ) func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index 82aa122518..acf82236e9 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -24,13 +24,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // CursedChromeCmd - Execute a .NET assembly in-memory. diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index 5d42594787..7d9d89c5ec 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -27,6 +27,8 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -34,7 +36,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) func CursedElectronCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index d5772c289a..4808fd6886 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -23,10 +23,11 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index 1b0ab936d5..237ccf6908 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -23,9 +23,10 @@ import ( "os" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" - "github.com/spf13/cobra" ) func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index da38a6eab6..d9f220044c 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -27,11 +27,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // CursedChromeCmd - Execute a .NET assembly in-memory. diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go index 86c5fc9e96..db5e4ad9b6 100644 --- a/client/command/dllhijack/commands.go +++ b/client/command/dllhijack/commands.go @@ -1,14 +1,16 @@ package dllhijack import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -31,7 +33,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("profile", "p", "", "Profile name to use as a base DLL") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(dllhijackCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(dllhijackCmd, func(comp *carapace.ActionMap) { (*comp)["reference-file"] = carapace.ActionFiles() (*comp)["file"] = carapace.ActionFiles() (*comp)["profile"] = generate.ProfileNameCompleter(con) diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 3e6033f1e0..01aa722bea 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -23,9 +23,10 @@ import ( "fmt" "io/ioutil" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // dllhijack --ref-path c:\windows\system32\msasn1.dll --file /tmp/runner.dll TARGET_PATH diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go index 5ecef21500..6c030ae77c 100644 --- a/client/command/environment/commands.go +++ b/client/command/environment/commands.go @@ -1,13 +1,14 @@ package environment import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/environment/get.go b/client/command/environment/get.go index 70249ce75d..e5c185690f 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -21,11 +21,12 @@ package environment import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // EnvGetCmd - Get a remote environment variable. diff --git a/client/command/environment/set.go b/client/command/environment/set.go index 244766f0be..ccfbb5fe91 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -21,12 +21,13 @@ package environment import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // EnvSetCmd - Set a remote environment variable. diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index e938aa63ce..6082df4efe 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -21,11 +21,12 @@ package environment import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // EnvUnsetCmd - Unset a remote environment variable. diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 019af886d7..892a0ffb07 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -1,14 +1,16 @@ package exec import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -97,7 +99,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(executeShellcodeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(executeShellcodeCmd, func(comp *carapace.ActionMap) { (*comp)["shikata-ga-nai"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") }) carapace.Gen(executeShellcodeCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shellcode file (required)")) @@ -195,7 +197,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(msfCmd, func(comp *carapace.ActionMap) { (*comp)["encoder"] = generate.MsfEncoderCompleter(con) (*comp)["payload"] = generate.MsfPayloadCompleter(con) }) @@ -219,7 +221,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(msfInjectCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(msfInjectCmd, func(comp *carapace.ActionMap) { (*comp)["encoder"] = generate.MsfEncoderCompleter(con) }) @@ -243,7 +245,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(psExecCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(psExecCmd, func(comp *carapace.ActionMap) { (*comp)["custom-exe"] = carapace.ActionFiles() (*comp)["profile"] = generate.ProfileNameCompleter(con) }) @@ -273,7 +275,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) sshCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - flags.BindFlagCompletions(sshCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(sshCmd, func(comp *carapace.ActionMap) { (*comp)["private-key"] = carapace.ActionFiles() (*comp)["kerberos-keytab"] = carapace.ActionFiles() }) diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index d2418760ff..da665a55ee 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -25,11 +25,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ExecuteAssemblyCmd - Execute a .NET assembly in-memory. diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 27d0adae09..eac942a926 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -26,13 +26,14 @@ import ( "log" "os" + "github.com/spf13/cobra" + "golang.org/x/term" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "golang.org/x/term" - "google.golang.org/protobuf/proto" ) // ExecuteShellcodeCmd - Execute shellcode in-memory. diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index 8939d30404..ab87a784b3 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -23,12 +23,13 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ExecuteCmd - Run a command on the remote system. diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 0ccdca7222..b892430e23 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -23,10 +23,11 @@ import ( "fmt" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // MigrateCmd - Windows only, inject an implant into another process. diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index c0283c1898..9d2eedd45c 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -22,12 +22,13 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MsfInjectCmd - Inject a metasploit payload into a remote process. diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 27cce40953..473ab9248c 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -22,11 +22,12 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MsfCmd - Inject a metasploit payload into the current remote process. diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index 310d3dbcb4..32f504460f 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -26,6 +26,8 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" @@ -33,7 +35,6 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" ) // PsExecCmd - psexec command implementation. diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index 5ff2a6ce52..76df68b648 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -25,11 +25,12 @@ import ( "path/filepath" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // SideloadCmd - Sideload a shared library on the remote system. diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index 7bbfd7f7a6..55a5f76359 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -24,11 +24,12 @@ import ( "os" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // SpawnDllCmd - Spawn execution of a DLL on the remote system. diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index ae899110ba..131fa53396 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -24,11 +24,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // SSHCmd - A built-in SSH client command for the remote system (doesn't shell out). diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index 08e33cd65b..e1df08e4cf 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -19,10 +19,11 @@ package exit */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" ) // Commands returns the `exit` command. diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 5d5e5434ef..62df2bf6cc 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -1,11 +1,12 @@ package extensions import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index e47864a111..e0eb46578e 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -24,13 +24,14 @@ import ( "os" "strings" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" ) // ExtensionsCmd - List information about installed extensions. diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index b084feddcc..e4ba341316 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -24,10 +24,11 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // ExtensionsInstallCmd - Install an extension. diff --git a/client/command/extensions/list.go b/client/command/extensions/list.go index 52de4a9760..d08ca41fe0 100644 --- a/client/command/extensions/list.go +++ b/client/command/extensions/list.go @@ -21,9 +21,10 @@ package extensions import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // ExtensionsListCmd - List all extension loaded on the active session/beacon. diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index 48a666f6d3..45aad1f814 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -30,6 +30,12 @@ import ( "strconv" "strings" + appConsole "github.com/reeflective/console" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -38,11 +44,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - appConsole "github.com/reeflective/console" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) const ( diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index d64dc15334..14f895fe42 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -25,10 +25,11 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // ExtensionsRemoveCmd - Remove an extension. diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 63dc0a1d6d..351b1c0d8b 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -27,13 +27,14 @@ import ( "github.com/alecthomas/chroma/formatters" "github.com/alecthomas/chroma/lexers" "github.com/alecthomas/chroma/styles" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // CatCmd - Display the contents of a remote file. diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 22e763d654..f5e307ced9 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // CdCmd - Change directory on the remote system. diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 4180969f26..4d086cf419 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -20,11 +20,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ChmodCmd - Change the permissions of a file on the remote file system. diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index c43b2daa1d..ba941a8a34 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -20,11 +20,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ChownCmd - Change the owner of a file on the remote file system. diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index 8035496f92..562b9fd8ca 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -21,11 +21,12 @@ import ( "context" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ChtimesCmd - Change the access and modified time of a file on the remote file system. diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index caa8f8c9c7..0159c4982c 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -1,14 +1,16 @@ package filesystem import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -166,7 +168,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("recurse", "r", false, "recursively download all files in a directory") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(downloadCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(downloadCmd, func(comp *carapace.ActionMap) { (*comp)["type"] = loot.LootTypeCompleter(con) (*comp)["file-type"] = loot.FileTypeCompleter(con) }) diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index a5b994f791..7b6669e120 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 25f1f8b9a1..7803c804ce 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -28,14 +28,15 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "gopkg.in/AlecAivazis/survey.v1" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "gopkg.in/AlecAivazis/survey.v1" ) func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index a500c51191..578dac9ff5 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -27,13 +27,14 @@ import ( "text/tabwriter" "time" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) // LsCmd - List the contents of a remote directory. diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 715166c6de..7a7d00d324 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -20,11 +20,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MemfilesAddCmd - Add memfile. diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index 57ef191c8e..5e5df721a0 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -25,12 +25,13 @@ import ( "text/tabwriter" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MemfilesListCmd - List memfiles. diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 4989ae4891..c10b1297ec 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -21,11 +21,12 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MemfilesRmCmd - Remove a memfile. diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index 96607fd8de..f77e387f6e 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MkdirCmd - Make a remote directory. diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index baa88c6ccf..aecf3af637 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 4111f67888..24115a5179 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // PwdCmd - Print the remote working directory. diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index 20e775c2d2..c5eb4262f0 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RmCmd - Remove a directory from the remote file system. diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 7c39b485ec..fe6f88f312 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -25,12 +25,13 @@ import ( "os" "path/filepath" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // UploadCmd - Upload a file to the remote system. diff --git a/client/command/flags/flags.go b/client/command/flags/flags.go index ea679082fe..99bcdfe936 100644 --- a/client/command/flags/flags.go +++ b/client/command/flags/flags.go @@ -4,7 +4,6 @@ import ( "strings" "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -51,25 +50,3 @@ func RestrictTargets(filters ...string) map[string]string { console.CommandFilterKey: filts, } } - -// NewCompletions registers the command to the application completion engine and returns -// you a type through which you can register all sorts of completions for this command, -// from flag arguments, positional ones, per index or remaining, etc. -// -// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. -func NewCompletions(cmd *cobra.Command) *carapace.Carapace { - return carapace.Gen(cmd) -} - -// BindFlagCompletions is a convenience function for binding completers to flags requiring arguments. -// (It wraps a few steps to be used through the *carapace.Carapace type so you don't have to bother). -// cmd - The target command/subcommand which flags to be completed. -// bind - A function using a map "flag-name":carapace.Action for you to bind completions to the flag. -// -// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. -func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { - comps := make(carapace.ActionMap) - bind(&comps) - - carapace.Gen(cmd).FlagCompletion(comps) -} diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index e8588eeb47..bbf729edf8 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -4,12 +4,13 @@ import ( "context" "fmt" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // CanariesCmd - Display canaries from the database and their status. diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index fb2a574674..ea60cff28a 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -1,13 +1,15 @@ package generate import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns all payload compilation commands. @@ -67,7 +69,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("save", "s", "", "directory to save the generated stager to") f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") }) - flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(generateStagerCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionDirectories() (*comp)["os"] = carapace.ActionValues("windows", "linux", "darwin").Tag("msf stager OS") (*comp)["arch"] = carapace.ActionValues("amd64", "x86").Tag("msf stager archs") @@ -139,7 +141,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("regenerate", false, regenerateCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "directory/file to the binary to") }) - flags.BindFlagCompletions(regenerateCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(regenerateCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") }) carapace.Gen(regenerateCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) @@ -172,7 +174,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("save", "s", "", "directory/file to the binary to") f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") }) - flags.BindFlagCompletions(profilesGenerateCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(profilesGenerateCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") }) carapace.Gen(profilesGenerateCmd).PositionalCompletion(ProfileNameCompleter(con)) @@ -255,7 +257,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("only-beacons", "b", false, "filter beacons") f.BoolP("no-debug", "d", false, "filter builds by debug flag") }) - flags.BindFlagCompletions(implantBuildsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(implantBuildsCmd, func(comp *carapace.ActionMap) { (*comp)["os"] = OSCompleter(con) (*comp)["arch"] = ArchCompleter(con) (*comp)["format"] = FormatCompleter() @@ -340,7 +342,7 @@ func coreImplantFlags(name string, cmd *cobra.Command) { // coreImplantFlagCompletions binds completions to flags registered in coreImplantFlags. func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverClient) { - flags.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(cmd, func(comp *carapace.ActionMap) { (*comp)["debug-file"] = carapace.ActionFiles() (*comp)["os"] = OSCompleter(con) (*comp)["arch"] = ArchCompleter(con) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index 80add10c58..fc68a65b3d 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -5,9 +5,10 @@ import ( "os" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index b5a656c334..ac01a6be40 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -3,9 +3,10 @@ package generate import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // GenerateInfoCmd - Display information about the Sliver server's compiler configuration. diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index 88dffe3e7f..775ab17a18 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -27,9 +27,10 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // GenerateStagerCmd - Generate a stager using Metasploit. diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index 248b088845..a380f5f21d 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -33,13 +33,14 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) const ( diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index ad35682a83..25c58437f6 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -5,13 +5,14 @@ import ( "fmt" "strings" + "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/cache" + "github.com/rsteube/carapace/pkg/style" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" - "github.com/rsteube/carapace/pkg/cache" - "github.com/rsteube/carapace/pkg/style" ) // GetSliverBinary - Get the binary of an implant based on it's profile. diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index 026edd8b31..935bbfef87 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -5,9 +5,10 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ImplantsRmCmd - Deletes an archived implant build from the server. diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 12b6e65f3e..2336cf7449 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -23,13 +23,14 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // ImplantBuildFilter - Filter implant builds. diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index 9d00135f48..307bca8d54 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -24,8 +24,9 @@ import ( "path/filepath" "strings" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // ProfilesGenerateCmd - Generate an implant binary based on a profile. diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index a46d659100..95b71a4cb3 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -20,9 +20,10 @@ package generate import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ProfilesNewCmd - Create a new implant profile. diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index da748cc13f..3081e78196 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -23,9 +23,10 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ProfilesRmCmd - Delete an implant profile. diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 72b1403402..d20e4d7d1d 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -24,14 +24,15 @@ import ( "math" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // ProfilesCmd - Display implant profiles. diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index fe8c8d069b..a72f884351 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -22,9 +22,10 @@ import ( "context" "os" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // RegenerateCmd - Download an archived implant build/binary. diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 593bd8cdbc..83d1797179 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -27,18 +27,19 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/bishopfox/sliver/util" "github.com/gofrs/uuid" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" "golang.org/x/text/cases" "golang.org/x/text/language" "google.golang.org/protobuf/proto" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/util" ) // TrafficEncodersCmd - Generate traffic encoders command implementation. diff --git a/client/command/history/history.go b/client/command/history/history.go index b67102f925..8578f909ca 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -23,13 +23,14 @@ import ( "strconv" "time" + "github.com/fatih/color" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/fatih/color" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns all commands related to implant history. diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index 49f1906872..dcb7f97b6a 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -1,12 +1,13 @@ package hosts import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index 6624e635a6..42bd9500d5 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -21,8 +21,9 @@ package hosts import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // HostsIOCRmCmd - Remove a host from the database. diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index 4bc5657899..42154c7a75 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -26,10 +26,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" ) // HostsIOCCmd - Remove a host from the database. diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index 24e3272c36..6db5dd1846 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -21,8 +21,9 @@ package hosts import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // HostsRmCmd - Remove a host from the database. diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index d222d7b40a..996f92a9ae 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -29,12 +29,13 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 72fa908b3e..0e3c5557cc 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -1,14 +1,15 @@ package info import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/info/info.go b/client/command/info/info.go index 5c079578b6..82c5062655 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -22,13 +22,14 @@ import ( "context" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // InfoCmd - Display information about the active session. diff --git a/client/command/info/ping.go b/client/command/info/ping.go index c98c7ca75d..034366bf75 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -4,9 +4,10 @@ import ( "context" insecureRand "math/rand" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // PingCmd - Send a round trip C2 message to an implant (does not use ICMP). diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 6e3b58f76c..252eb1f2a5 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -1,14 +1,16 @@ package jobs import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -31,7 +33,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("kill-all", "K", false, "kill all jobs") f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(jobsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(jobsCmd, func(comp *carapace.ActionMap) { (*comp)["kill"] = JobsIDCompleter(con) }) @@ -135,7 +137,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("persistent", "p", false, "make persistent across restarts") }) - flags.BindFlagCompletions(httpsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(httpsCmd, func(comp *carapace.ActionMap) { (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") (*comp)["key"] = carapace.ActionFiles().Tag("key file") }) @@ -162,7 +164,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") }) - flags.BindFlagCompletions(stageCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(stageCmd, func(comp *carapace.ActionMap) { (*comp)["profile"] = generate.ProfileNameCompleter(con) (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") (*comp)["key"] = carapace.ActionFiles().Tag("key file") diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index bdb8c4b439..6854befa05 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -22,9 +22,10 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // DNSListenerCmd - Start a DNS lisenter. diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index 1c8e013faf..a1db817173 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -22,9 +22,10 @@ import ( "context" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // HTTPListenerCmd - Start an HTTP listener. diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index 327eb6966b..80c957c30b 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -25,9 +25,10 @@ import ( "io/ioutil" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // HTTPSListenerCmd - Start an HTTPS listener. diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index b54567d6eb..bb8f05a644 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -25,13 +25,14 @@ import ( "strconv" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // JobsCmd - Manage server jobs (listeners, etc). diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 86d9e08b2f..7d21ae79b9 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -21,9 +21,10 @@ package jobs import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // MTLSListenerCmd - Start an mTLS listener. diff --git a/client/command/jobs/named-pipe.go b/client/command/jobs/named-pipe.go index ed4815ace4..7cbee6066d 100644 --- a/client/command/jobs/named-pipe.go +++ b/client/command/jobs/named-pipe.go @@ -21,9 +21,10 @@ package jobs import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index 53d2a97170..b9e3160829 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -27,12 +27,13 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" ) // StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name. diff --git a/client/command/jobs/tcp.go b/client/command/jobs/tcp.go index 1c520fa020..7fbb35c519 100644 --- a/client/command/jobs/tcp.go +++ b/client/command/jobs/tcp.go @@ -22,9 +22,10 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StartTCPListenerCmd - Start a TCP pivot listener on the remote system. diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index c743738092..c7ac3d93c5 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -21,9 +21,10 @@ package jobs import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WGListenerCmd - Start a WireGuard listener. diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go index b27d909dc3..2128351edc 100644 --- a/client/command/kill/commands.go +++ b/client/command/kill/commands.go @@ -1,12 +1,13 @@ package kill import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/kill/kill.go b/client/command/kill/kill.go index 69eb4f7016..a7724187e4 100644 --- a/client/command/kill/kill.go +++ b/client/command/kill/kill.go @@ -23,11 +23,12 @@ import ( "errors" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // KillCmd - Kill the active session (not to be confused with TerminateCmd). diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index 93413efe42..dad7e1e7ad 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -1,13 +1,15 @@ package loot import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -43,7 +45,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("type", "T", "", "force a specific loot type (file/cred)") f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) - flags.BindFlagCompletions(lootAddCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootAddCmd, func(comp *carapace.ActionMap) { (*comp)["type"] = LootTypeCompleter(con) (*comp)["file-type"] = FileTypeCompleter(con) }) @@ -65,7 +67,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("type", "T", "", "force a specific loot type (file/cred)") f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) - flags.BindFlagCompletions(lootRemoteCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootRemoteCmd, func(comp *carapace.ActionMap) { (*comp)["type"] = LootTypeCompleter(con) (*comp)["file-type"] = FileTypeCompleter(con) }) @@ -94,7 +96,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("save", "s", "", "save loot to a local file") f.StringP("filter", "f", "", "filter based on loot type") }) - flags.BindFlagCompletions(lootFetchCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootFetchCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") (*comp)["filter"] = FileTypeCompleter(con) }) @@ -111,7 +113,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("loot", false, lootRmCmd, func(f *pflag.FlagSet) { f.StringP("filter", "f", "", "filter based on loot type") }) - flags.BindFlagCompletions(lootRmCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootRmCmd, func(comp *carapace.ActionMap) { (*comp)["filter"] = LootTypeCompleter(con) }) diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index 7340f92748..e215adb0e2 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -21,8 +21,9 @@ package loot import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // LootFetchCmd - Display the contents of or download a piece of loot. diff --git a/client/command/loot/helpers.go b/client/command/loot/helpers.go index 7175979855..c671b0969a 100644 --- a/client/command/loot/helpers.go +++ b/client/command/loot/helpers.go @@ -32,10 +32,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 2f389262be..bbb14a9459 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -25,10 +25,11 @@ import ( "path" "path/filepath" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // LootAddLocalCmd - Add a local file to the server as loot. diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 4ac8eb519b..911f7856a9 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -27,13 +27,14 @@ import ( "unicode/utf8" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // LootCmd - The loot root command. diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 4e18db3aaa..673fd57aa5 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -28,13 +28,14 @@ import ( "path/filepath" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileType { diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index ff2d4e45a4..8b62de1b23 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -22,9 +22,10 @@ import ( "context" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // LootRenameCmd - Rename a piece of loot. diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index 78997a6e7d..afd57950d2 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -21,8 +21,9 @@ package loot import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index 0f8480ab90..da7c962e0c 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -1,9 +1,10 @@ package monitor import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/monitor/start.go b/client/command/monitor/start.go index e18e3050b8..f722c9d8d7 100644 --- a/client/command/monitor/start.go +++ b/client/command/monitor/start.go @@ -21,9 +21,10 @@ package monitor import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // MonitorStartCmd - Start monitoring threat intel for implants. diff --git a/client/command/monitor/stop.go b/client/command/monitor/stop.go index fe6d8fa4fe..d1f595ee42 100644 --- a/client/command/monitor/stop.go +++ b/client/command/monitor/stop.go @@ -21,9 +21,10 @@ package monitor import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // MonitorStopCmd - Stop monitoring threat intel for implants. diff --git a/client/command/network/commands.go b/client/command/network/commands.go index ad31bb2042..137e5f68c5 100644 --- a/client/command/network/commands.go +++ b/client/command/network/commands.go @@ -1,12 +1,13 @@ package network import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index 93a3d23f8f..bf30ca793c 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -25,13 +25,14 @@ import ( "strconv" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // IfconfigCmd - Display network interfaces on the remote system. diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index 700264bf36..d98ab11af8 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -23,13 +23,14 @@ import ( "fmt" "net" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // NetstatCmd - Display active network connections on the remote system. diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index a1cc3a5b98..f00f0eb3e2 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -1,12 +1,14 @@ package pivots import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -35,7 +37,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { } pivotsCmd.AddCommand(pivotStopCmd) - stopComs := flags.NewCompletions(pivotStopCmd) + stopComs := completers.NewCompsFor(pivotStopCmd) stopComs.PositionalCompletion(PivotIDCompleter(con).Usage("id of the pivot listener to stop")) pivotDetailsCmd := &cobra.Command{ @@ -49,7 +51,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { } pivotsCmd.AddCommand(pivotDetailsCmd) - detailsComps := flags.NewCompletions(pivotDetailsCmd) + detailsComps := completers.NewCompsFor(pivotDetailsCmd) detailsComps.PositionalCompletion(PivotIDCompleter(con).Usage("ID of the pivot listener to get details for")) graphCmd := &cobra.Command{ diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 7356e257c7..99b8dc6ada 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -23,11 +23,12 @@ import ( "fmt" "strconv" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // PivotDetailsCmd - Display pivots for all sessions. diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 4431694079..e00e6cc495 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -23,9 +23,10 @@ import ( "encoding/json" "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // PivotsGraphCmd - Display pivots for all sessions. diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index 506bf9a4fd..ac16fb9b4c 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -28,9 +28,10 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/rsteube/carapace" ) // SelectPivotListener - Interactive menu to select a pivot listener. diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index 954d8cc5a7..0261d4cc78 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -21,11 +21,12 @@ package pivots import ( "context" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // PivotsCmd - Display pivots for all sessions. diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 116a505986..356de26ce0 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -22,9 +22,10 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StopPivotListenerCmd - Start a TCP pivot listener on the remote system. diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index aeebf5484c..d3c840bfd0 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -1,14 +1,15 @@ package portfwd import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -40,7 +41,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") f.StringP("bind", "b", "127.0.0.1:8080", "bind port forward to interface") }) - flags.BindFlagCompletions(addCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(addCmd, func(comp *carapace.ActionMap) { (*comp)["bind"] = completers.ClientInterfacesCompleter() }) @@ -54,7 +55,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } - rmComps := flags.NewCompletions(portfwdRmCmd) + rmComps := completers.NewCompsFor(portfwdRmCmd) rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) portfwdCmd.AddCommand(portfwdRmCmd) diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 6793cba165..422fd6164c 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -25,10 +25,11 @@ import ( "regexp" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/tcpproxy" - "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index 37d0ab7342..188e69127b 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -21,9 +21,10 @@ package portfwd import ( "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // PortfwdRmCmd - Remove an existing tunneled port forward. diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 8314347b07..f6f3c02736 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -23,12 +23,13 @@ import ( "sort" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/core" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/core" ) // PortfwdCmd - Display information about tunneled port forward(s). diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go index 2fc82eb546..f152788fdf 100644 --- a/client/command/prelude-operator/commands.go +++ b/client/command/prelude-operator/commands.go @@ -1,13 +1,14 @@ package operator import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index 3edbfe02bd..174471ce83 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -21,11 +21,12 @@ package operator import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/prelude-operator/operator.go b/client/command/prelude-operator/operator.go index fbd8a7305c..f36a692150 100644 --- a/client/command/prelude-operator/operator.go +++ b/client/command/prelude-operator/operator.go @@ -19,9 +19,10 @@ package operator */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" - "github.com/spf13/cobra" ) func OperatorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go index 5a2e2cf8cb..32095e4a7d 100644 --- a/client/command/privilege/commands.go +++ b/client/command/privilege/commands.go @@ -1,14 +1,15 @@ package privilege import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 106ba89633..258841ec07 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -23,11 +23,12 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // GetPrivsCmd - Get the current process privileges (Windows only). diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index 3e38e666cb..db19a0e209 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system. diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index a58665f4f2..127e1341b8 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ImpersonateCmd - Windows only, impersonate a user token. diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index 1b07338ded..1dd1da4dd4 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) var logonTypes = map[string]uint32{ diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index 3f7a964d0f..5c7daa5f0a 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RevToSelfCmd - Drop any impersonated tokens. diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index 62b2510457..24b38997c9 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RunAsCmd - Run a command as another user on the remote system. diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index 7d05ba780a..0610507d81 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -1,13 +1,15 @@ package processes import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -51,7 +53,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(procdumpCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(procdumpCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles() }) diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index 9b01ce8954..cde8d080f6 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -26,12 +26,13 @@ import ( "path/filepath" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ProcdumpCmd - Dump the memory of a remote process. diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 2b7b030d4e..18e0ea64ed 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -24,15 +24,16 @@ import ( "sort" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) // Stylizes known processes in the `ps` command. diff --git a/client/command/processes/pstree.go b/client/command/processes/pstree.go index c8bb398ea9..6d06b07e2e 100644 --- a/client/command/processes/pstree.go +++ b/client/command/processes/pstree.go @@ -4,9 +4,10 @@ import ( "fmt" "sort" + "github.com/xlab/treeprint" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/xlab/treeprint" ) // A PsTree is a tree of *commonpb.Process. diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index f563cfc993..a12bbe21fe 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -22,11 +22,12 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // TerminateCmd - Terminate a process on the remote system. diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index b03e77e0b3..6857ba8750 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -23,6 +23,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -55,7 +56,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("event", "e", "", "specify the event type to react to") }) - flags.BindFlagCompletions(reactionSetCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(reactionSetCmd, func(comp *carapace.ActionMap) { (*comp)["event"] = carapace.ActionValues( consts.SessionOpenedEvent, consts.SessionClosedEvent, @@ -78,7 +79,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("reactions", false, reactionUnsetCmd, func(f *pflag.FlagSet) { f.IntP("id", "i", 0, "the id of the reaction to remove") }) - flags.BindFlagCompletions(reactionUnsetCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(reactionUnsetCmd, func(comp *carapace.ActionMap) { (*comp)["id"] = ReactionIDCompleter(con) }) diff --git a/client/command/reaction/helpers.go b/client/command/reaction/helpers.go index 85787b8d1d..097c68cb6e 100644 --- a/client/command/reaction/helpers.go +++ b/client/command/reaction/helpers.go @@ -26,10 +26,11 @@ import ( "strconv" "strings" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/rsteube/carapace" ) const ( diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 9caa2cf448..15046e7992 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -22,12 +22,13 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // ReactionCmd - Manage reactions to events. diff --git a/client/command/reaction/reload.go b/client/command/reaction/reload.go index ff0d5553bc..806f4e38b0 100644 --- a/client/command/reaction/reload.go +++ b/client/command/reaction/reload.go @@ -22,8 +22,9 @@ import ( "os" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // ReactionSaveCmd - Manage reactions to events. diff --git a/client/command/reaction/save.go b/client/command/reaction/save.go index 79ed192ad9..f04bf73af6 100644 --- a/client/command/reaction/save.go +++ b/client/command/reaction/save.go @@ -23,9 +23,10 @@ import ( "os" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // ReactionSaveCmd - Manage reactions to events. diff --git a/client/command/reaction/set.go b/client/command/reaction/set.go index cf74c44e5e..93ae3f3d21 100644 --- a/client/command/reaction/set.go +++ b/client/command/reaction/set.go @@ -23,9 +23,10 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // ErrNonReactableEvent - Event does not exist or is not supported by reactions. diff --git a/client/command/reaction/unset.go b/client/command/reaction/unset.go index a95e7d5f27..e45dfae3cf 100644 --- a/client/command/reaction/unset.go +++ b/client/command/reaction/unset.go @@ -26,9 +26,10 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // ReactionUnsetCmd - Unset a reaction upon an event. diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index cc5178fd5b..5022c9acf3 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -1,12 +1,13 @@ package reconfig import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index d68195dc4b..27fdda3506 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -22,11 +22,12 @@ import ( "context" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ReconfigCmd - Reconfigure metadata about a sessions. diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index 74f7d2ad8e..295349d589 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -21,10 +21,11 @@ package reconfig import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // RecnameCmd - Reconfigure metadata about a sessions. diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go index d93f3b32d1..fec21cf040 100644 --- a/client/command/registry/commands.go +++ b/client/command/registry/commands.go @@ -1,13 +1,14 @@ package registry import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index d93f344d71..38e8fc81e1 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -22,11 +22,12 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegCreateKeyCmd - Create a new Windows registry key. diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index e83396781a..9dec10e5a5 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -22,11 +22,12 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegDeleteKeyCmd - Remove a Windows registry key. diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index f60f56fb17..dcbfd887aa 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -21,11 +21,12 @@ package registry import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegListSubKeysCmd - List sub registry keys. diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index a381937784..fe387952fe 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -23,11 +23,12 @@ import ( "fmt" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) var validHives = []string{ diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 127fe5135c..63c391f22c 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -25,11 +25,12 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32. diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index c213623cce..fbe3ae52ac 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -1,14 +1,15 @@ package rportfwd import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -40,7 +41,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("remote", "r", "", "remote address : connection is forwarded to") f.StringP("bind", "b", "", "bind address : for implants to listen on") }) - flags.BindFlagCompletions(rportfwdAddCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(rportfwdAddCmd, func(comp *carapace.ActionMap) { (*comp)["remote"] = completers.ClientInterfacesCompleter() }) @@ -53,7 +54,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { StopRportFwdListenerCmd(cmd, con, args) }, } - rmComps := flags.NewCompletions(rportfwdRmCmd) + rmComps := completers.NewCompsFor(rportfwdRmCmd) rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) rportfwdCmd.AddCommand(rportfwdRmCmd) diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 94b96dfae3..7b92dacb30 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -23,9 +23,10 @@ import ( "fmt" "regexp" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index db69d3d59b..917e46907f 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -22,9 +22,10 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 5adeea6120..8c0aa9e515 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -23,13 +23,14 @@ import ( "fmt" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go index 993cd8dcf7..d97b4e8725 100644 --- a/client/command/screenshot/commands.go +++ b/client/command/screenshot/commands.go @@ -1,13 +1,15 @@ package screenshot import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -28,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(screenshotCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(screenshotCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles() }) diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 4a5430292b..1cf8058b1b 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -26,13 +26,14 @@ import ( "path/filepath" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ScreenshotCmd - Take a screenshot of the remote system. diff --git a/client/command/sessions/background.go b/client/command/sessions/background.go index bc2449578c..604dad328f 100644 --- a/client/command/sessions/background.go +++ b/client/command/sessions/background.go @@ -1,8 +1,9 @@ package sessions import ( - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // BackgroundCmd - Background the active session. diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index 28e666a9c5..20901a13ca 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -21,9 +21,10 @@ package sessions import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // CloseSessionCmd - Close an interactive session but do not kill the remote process. diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index b802910564..23ad82f3f4 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -1,13 +1,15 @@ package sessions import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the `sessions` command and its subcommands. @@ -34,7 +36,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("filter", "f", "", "filter sessions by substring") f.StringP("filter-re", "e", "", "filter sessions by regular expression") }) - flags.BindFlagCompletions(sessionsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(sessionsCmd, func(comp *carapace.ActionMap) { (*comp)["interact"] = SessionIDCompleter(con) (*comp)["kill"] = SessionIDCompleter(con) }) diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index f68c9c92af..cf0056c3ef 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -28,10 +28,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" ) var ( diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index b84f941c0a..9a4e0c554c 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -23,11 +23,12 @@ import ( "net/url" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // InteractiveCmd - Beacon only command to open an interactive session. diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index 48704761cc..4d446d4b93 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -21,10 +21,11 @@ package sessions import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // SessionsPruneCmd - Forcefully kill stale sessions. diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 108f87bde8..ecafa7c927 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -25,14 +25,15 @@ import ( "strings" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" ) // SessionsCmd - Display/interact with sessions. diff --git a/client/command/settings/beacons.go b/client/command/settings/beacons.go index 60ab8796f5..716cc85b36 100644 --- a/client/command/settings/beacons.go +++ b/client/command/settings/beacons.go @@ -19,9 +19,10 @@ package settings */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // SettingsBeaconsAutoResultCmd - The client settings command. diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go index 3bba3d0eaf..f312a6ed84 100644 --- a/client/command/settings/commands.go +++ b/client/command/settings/commands.go @@ -1,11 +1,12 @@ package settings import ( + "github.com/reeflective/console/commands/readline" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console/commands/readline" - "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/settings/opsec.go b/client/command/settings/opsec.go index c9e1ec7a70..55c094ce10 100644 --- a/client/command/settings/opsec.go +++ b/client/command/settings/opsec.go @@ -20,9 +20,10 @@ package settings import ( "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // SettingsAutoAdultCmd - The client settings command. diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index 621622a6fa..aac21fdd26 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -22,10 +22,11 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/console" ) // SettingsCmd - The client settings command. diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index fe02c42424..40e6420134 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -24,11 +24,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "golang.org/x/term" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/console" ) // Those variables are very important to realine low-level code: all virtual terminal diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index 242794ee8a..5b57d7441c 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -1,12 +1,13 @@ package shell import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index 95c3b7786b..498cd4e7d9 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -25,12 +25,13 @@ import ( "log" "os" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "golang.org/x/term" ) const ( diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go index b73a4d25ce..a355b4603a 100644 --- a/client/command/shikata-ga-nai/commands.go +++ b/client/command/shikata-ga-nai/commands.go @@ -1,13 +1,15 @@ package sgn import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -29,7 +31,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("bad-chars", "b", "", "hex encoded bad characters to avoid (e.g. 0001)") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(shikataGaNaiCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(shikataGaNaiCmd, func(comp *carapace.ActionMap) { (*comp)["arch"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save shellcode") }) diff --git a/client/command/shikata-ga-nai/sgn.go b/client/command/shikata-ga-nai/sgn.go index 298d269d25..aea42ff526 100644 --- a/client/command/shikata-ga-nai/sgn.go +++ b/client/command/shikata-ga-nai/sgn.go @@ -24,9 +24,10 @@ import ( "io/ioutil" "path/filepath" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder. diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 80975e5c70..2b9e48f550 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -1,14 +1,15 @@ package socks import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -41,7 +42,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("port", "P", "1081", "Bind a Socks5 Port") f.StringP("user", "u", "", "socks5 auth username (will generate random password)") }) - flags.BindFlagCompletions(socksStartCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(socksStartCmd, func(comp *carapace.ActionMap) { (*comp)["host"] = completers.ClientInterfacesCompleter() }) @@ -55,7 +56,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } - rmComps := flags.NewCompletions(socksStopCmd) + rmComps := completers.NewCompsFor(socksStopCmd) rmComps.PositionalAnyCompletion(SocksIDCompleter(con).Usage("ID of Socks server(s) to remove")) socksCmd.AddCommand(socksStopCmd) diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 84f6f07aa0..d6d1108b8c 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -25,10 +25,11 @@ import ( "net" "time" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/core" "github.com/spf13/cobra" "gopkg.in/AlecAivazis/survey.v1" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/core" ) // SocksStartCmd - Add a new tunneled port forward. diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index f0f8d21d65..9911159d9d 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -22,10 +22,11 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // SocksStopCmd - Remove an existing tunneled port forward. diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 8cb0ecfea4..3be9eb5d85 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -23,12 +23,13 @@ import ( "sort" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/core" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/core" ) // SocksCmd - Display information about tunneled port forward(s). diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 3424c486ed..0a123e648e 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -28,12 +28,13 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) func Command(con *console.SliverClient) []*cobra.Command { diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 40be58c2a8..8ba50985cb 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -26,6 +26,11 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/environment" "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" @@ -40,10 +45,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) // TasksFetchCmd - Manage beacon tasks. diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 04d8b88e61..eaf7e77bdf 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -10,9 +10,10 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/rsteube/carapace" ) // SelectBeaconTask - Select a beacon task interactively. diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index c95fee327e..ef8610255b 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -3,9 +3,10 @@ package tasks import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // TasksCancelCmd - Cancel a beacon task before it's sent to the implant. diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 91d9e1973f..6e0ac33f73 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -24,11 +24,12 @@ import ( "strings" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // TasksCmd - Manage beacon tasks. diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 7528fa8e1f..3725ea4564 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -1,14 +1,15 @@ package update import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -29,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("insecure", "I", false, "skip tls certificate validation") f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(updateCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(updateCmd, func(comp *carapace.ActionMap) { (*comp)["proxy"] = completers.LocalProxyCompleter() }) diff --git a/client/command/update/update.go b/client/command/update/update.go index 933d925414..2beecbaffc 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -36,14 +36,15 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/cheggaaa/pb/v3" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" - "github.com/cheggaaa/pb/v3" - "github.com/spf13/cobra" ) // UpdateCmd - Check for updates. diff --git a/client/command/use/beacons.go b/client/command/use/beacons.go index f7948351eb..9d70c22440 100644 --- a/client/command/use/beacons.go +++ b/client/command/use/beacons.go @@ -19,9 +19,10 @@ package use */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // UseBeaconCmd - Change the active beacon. diff --git a/client/command/use/commands.go b/client/command/use/commands.go index bdc2ea3002..8ed2f1a8f1 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -1,15 +1,16 @@ package use import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/use/sessions.go b/client/command/use/sessions.go index dce1b81f4d..cc360b1dd2 100644 --- a/client/command/use/sessions.go +++ b/client/command/use/sessions.go @@ -19,9 +19,10 @@ package use */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // UseSessionCmd - Change the active session. diff --git a/client/command/use/use.go b/client/command/use/use.go index 6b11371b5e..ef96458fe0 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -28,13 +28,14 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) var ErrNoSelection = errors.New("no selection") diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 5567453e2a..1b4eb4da29 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -1,13 +1,15 @@ package wasm import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -31,7 +33,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("skip-registration", "s", false, "assume the extension is already registered") f.BoolP("loot", "X", false, "save output as loot, incompatible with --pipe") }) - flags.BindFlagCompletions(wasmCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(wasmCmd, func(comp *carapace.ActionMap) { (*comp)["file"] = carapace.ActionFiles() (*comp)["dir"] = carapace.ActionDirectories() }) diff --git a/client/command/wasm/memfs.go b/client/command/wasm/memfs.go index 787e7f3f98..5cd06883ff 100644 --- a/client/command/wasm/memfs.go +++ b/client/command/wasm/memfs.go @@ -5,9 +5,10 @@ import ( "os" "path/filepath" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) func parseMemFS(cmd *cobra.Command, con *console.SliverClient, args []string) (map[string][]byte, error) { diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index ff3ee0ff59..93c4c9e3b1 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -25,14 +25,15 @@ import ( "os" "path/filepath" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // wasmMaxModuleSize - Arbitrary 1.5Gb limit to put us well under the 2Gb max gRPC message size diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index 727de3521b..465477aa96 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -1,13 +1,15 @@ package websites import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -51,7 +53,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("web-path", "p", "", "http path to host file at") }) websitesCmd.AddCommand(websitesRmWebContentCmd) - flags.BindFlagCompletions(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { (*comp)["website"] = WebsiteNameCompleter(con) }) @@ -70,7 +72,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") f.BoolP("recursive", "r", false, "recursively add/rm content") }) - flags.BindFlagCompletions(websitesContentCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(websitesContentCmd, func(comp *carapace.ActionMap) { (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") (*comp)["website"] = WebsiteNameCompleter(con) }) @@ -90,7 +92,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("web-path", "p", "/", "http path to host file at") }) websitesCmd.AddCommand(websitesContentTypeCmd) - flags.BindFlagCompletions(websitesContentTypeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(websitesContentTypeCmd, func(comp *carapace.ActionMap) { (*comp)["website"] = WebsiteNameCompleter(con) }) diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index 9de9620269..86434cc811 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -28,9 +28,10 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsitesAddContentCmd - Add static content to a website. diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index d36c8638de..2dbdc2b122 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -22,9 +22,10 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsitesRmContent - Remove static content from a website. diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index d1340b49a9..3f1203452d 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -21,9 +21,10 @@ package websites import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsiteRmCmd - Remove a website and all its static content. diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index 7cf52d89c7..2e05c2abfe 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -21,9 +21,10 @@ package websites import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsitesUpdateContentCmd - Update metadata about static website content. diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index fc7ee3e7d5..e08f3a640a 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -23,13 +23,14 @@ import ( "sort" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) const ( diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index 5fab9a4e10..28011d9cd2 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,13 +1,15 @@ package wireguard import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -28,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("wg-config", false, wgConfigCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "save configuration to file (.conf)") }) - flags.BindFlagCompletions(wgConfigCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(wgConfigCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") }) diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index a7fcd9e172..8957f2c862 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -28,9 +28,10 @@ import ( "strings" "text/template" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) var wgQuickTemplate = `[Interface] diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index 97acc62950..6cd347d74d 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -22,9 +22,10 @@ import ( "context" "net" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // WGPortFwdAddCmd - Add a new WireGuard port forward. diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index ca57e19b51..59e8e54729 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -23,10 +23,11 @@ import ( "fmt" "strconv" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" ) // WGPortFwdRmCmd - Remove a WireGuard port forward. diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index d6d8d78a1f..ccb35046e6 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -21,11 +21,12 @@ package wireguard import ( "context" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // WGPortFwdListCmd - List WireGuard port forwards. diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index bc1a34e1dd..7d60e6ff62 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -21,9 +21,10 @@ package wireguard import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy. diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index cd11c31194..7436b172b2 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -22,9 +22,10 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // WGSocksStopCmd - Stop a WireGuard SOCKS proxy. diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index aae46850c6..4a2c41bfe4 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -22,12 +22,13 @@ import ( "context" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" ) // WGSocksListCmd - List WireGuard SOCKS proxies. From 16733dde8546146cb67fd7d269ddeb19543ac015 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 11 Aug 2023 01:48:12 +0200 Subject: [PATCH 084/109] Update go 1.21 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 561ab5b9c6..83fbd1cc3a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/bishopfox/sliver -go 1.20 +go 1.21 // A fork of the completion engine is currently used in order to consume the engine // as a library. The fork is a very slightly patched mainline tree for that purpose, From 735c233b20a0cc5bb7c5ba4b35c576cc1d318e14 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 05:55:26 +0200 Subject: [PATCH 085/109] Update console/readline dependency to latest version. --- go.mod | 9 +- go.sum | 38 + .../reeflective/readline/completions.go | 62 +- .../readline/internal/color/color.go | 51 +- .../internal/completion/completion.go | 4 + .../readline/internal/completion/display.go | 126 ++- .../readline/internal/completion/engine.go | 2 +- .../readline/internal/completion/group.go | 823 ++++++++---------- .../readline/internal/completion/hint.go | 14 +- .../readline/internal/completion/utils.go | 226 +++-- .../readline/internal/completion/values.go | 25 +- .../readline/internal/core/line.go | 2 +- .../readline/internal/display/engine.go | 28 +- .../readline/internal/display/highlight.go | 2 +- .../readline/internal/keymap/config.go | 13 +- .../readline/internal/keymap/cursor.go | 24 +- .../readline/internal/term/cursor.go | 8 +- .../readline/internal/term/term.go | 2 +- .../readline/internal/ui/prompt.go | 2 +- .../github.com/reeflective/readline/shell.go | 4 +- .../reeflective/team/client/client.go | 18 +- .../team/client/commands/version.go | 16 +- .../reeflective/team/client/directories.go | 2 +- .../reeflective/team/client/options.go | 40 +- .../reeflective/team/server/core.go | 11 +- .../reeflective/team/server/directories.go | 33 +- .../reeflective/team/server/options.go | 28 + .../github.com/reeflective/team/teamclient.go | 6 +- vendor/modules.txt | 2 +- 29 files changed, 994 insertions(+), 627 deletions(-) diff --git a/go.mod b/go.mod index 83fbd1cc3a..23d1c6c81a 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ replace github.com/reeflective/team => /home/user/code/github.com/reeflective/te replace github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline +//replace github.com/reeflective/console => /home/user/code/github.com/reeflective/console + require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -40,10 +42,10 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.1 - github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a - github.com/reeflective/readline v1.0.8 + github.com/reeflective/console v0.1.7 + github.com/reeflective/readline v1.0.9 github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 - github.com/rsteube/carapace v0.42.1 + github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 @@ -150,6 +152,7 @@ require ( github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rsteube/carapace-shlex v0.0.4 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect github.com/tailscale/golang-x-crypto v0.0.0-20221115211329-17a3db2c30d2 // indirect github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect diff --git a/go.sum b/go.sum index 0e73e19954..e99618c340 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,15 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= filippo.io/age v1.1.1 h1:pIpO7l151hCnQ4BdyBujnGP2YlUo0uj6sAVNHGBvXHg= filippo.io/age v1.1.1/go.mod h1:l03SrzDUrBkdBx8+IILdnn2KZysqQdbEBUQ4p3sqEQE= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= filippo.io/mkcert v1.4.4 h1:8eVbbwfVlaqUM7OwuftKc2nuYOoTDQWqsoXmzoXZdbc= +filippo.io/mkcert v1.4.4/go.mod h1:VyvOchVuAye3BoUsPUOOofKygVwLV2KQMVFJNRq+1dA= github.com/AlecAivazis/survey/v2 v2.0.5/go.mod h1:WYBhg6f0y/fNYUuesWQc0PKbJcEliGcYHB9sNT3Bg74= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= @@ -24,6 +27,7 @@ github.com/Binject/universal v0.0.0-20210304094126-daefaa886313 h1:hX9boCRvCxIps github.com/Binject/universal v0.0.0-20210304094126-daefaa886313/go.mod h1:J3XDRlam5pPYca3i6EqgQ35GCCEoyxafpCbLkta0ozc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd h1:u7K2oMFMd8APDV3fM1j2rO3U/XJf1g1qC3DDTKou8iM= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -46,6 +50,7 @@ github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQq github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/awgh/cppgo v0.0.0-20210224085512-3d24bca8edc0 h1:JjwxKkxzcBk4k8147g0eBQRCIy0UN1Be8AAv6RaIj4Q= github.com/awgh/cppgo v0.0.0-20210224085512-3d24bca8edc0/go.mod h1:IbERvuyb387Hppp8hX0SQTFt/mkej8+OhuS8L0nC2CI= github.com/awgh/rawreader v0.0.0-20200626064944-56820a9c6da4 h1:cIAK2NNf2yafdgpFRNJrgZMwvy61BEVpGoHc2n4/yWs= @@ -87,6 +92,7 @@ github.com/chromedp/chromedp v0.9.1/go.mod h1:DUgZWRvYoEfgi66CgZ/9Yv+psgi+Sksy5D github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/cilium/ebpf v0.10.0 h1:nk5HPMeoBXtOzbkZBWym+ZWq1GIiHUsBFXxwewXAHLQ= +github.com/cilium/ebpf v0.10.0/go.mod h1:DPiVdY/kT534dgc9ERmvP8mWA+9gvwgKfRvk4nNWnoE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= @@ -94,10 +100,12 @@ github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFE github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dblohm7/wingoes v0.0.0-20230426155039-111c8c3b57c8 h1:vtIE3GO4hKplR58aTRx3yLPqAbfWyoyYrE8PXUv0Prw= +github.com/dblohm7/wingoes v0.0.0-20230426155039-111c8c3b57c8/go.mod h1:6NCrWM5jRefaG7iN0iMShPalLsljHWBh9v1zxM2f8Xs= github.com/demisto/goxforce v0.0.0-20160322194047-db8357535b1d h1:hmOGJg3cq5XK2aMs7R4kXXVSHqHMaC5hI5fwkX7V2zE= github.com/demisto/goxforce v0.0.0-20160322194047-db8357535b1d/go.mod h1:q72QzdO6OUjwTqnLCFJczIQ7GsBa4ffzkQiQcq6rVTY= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= @@ -112,6 +120,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= +github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5 h1:Y5Q2mEwfzjMt5+3u70Gtw93ZOu2UuPeeeTBDntF7FoY= @@ -179,6 +188,7 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -229,6 +239,7 @@ github.com/jsimonetti/rtnetlink v1.3.2 h1:dcn0uWkfxycEEyNy0IGfx3GrhQ38LH7odjxAgh github.com/jsimonetti/rtnetlink v1.3.2/go.mod h1:BBu4jZCpTjP6Gk0/wfrO8qcqymnN3g0hoFqObRmUo6U= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f h1:5hWo+DzJQSOBl6X+TDac0SPWffRonuRJ2///OYtYRT8= @@ -242,12 +253,15 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a h1:+RR6SqnTkDLWyICxS1xpjCi/3dhyV+TgZwA6Ww3KncQ= github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a/go.mod h1:YTtCCM3ryyfiu4F7t8HQ1mxvp1UBdWM2r6Xa+nGWvDk= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= @@ -296,8 +310,10 @@ github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/RrM= github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B+gPPjbjINdufl0UXqyYplE0aGhx8= @@ -317,6 +333,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= +github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -326,6 +343,8 @@ github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7 github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a h1:eH0mArXKs7CljsUX6dhN/+IJlhvQ2I0Mg0ku8Ah0Hao= github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= +github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDFXw2I= +github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -333,6 +352,11 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rsteube/carapace v0.43.0 h1:XFUouYcQxx/LNffsM7ivltFvBKGtawHieD1RvZ+vl2U= +github.com/rsteube/carapace v0.43.0/go.mod h1:1l4sZA+/sGW9sBLqEholUd+kn9xKgh2ghBFDYC3D/zA= +github.com/rsteube/carapace-shlex v0.0.4 h1:3GVn8PaM2RCxPTAiwVy9vDQI8Mi7DqrbdpDgf5ZzQmY= +github.com/rsteube/carapace-shlex v0.0.4/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -376,6 +400,7 @@ github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33 github.com/things-go/go-socks5 v0.0.3 h1:QtlIhkwDuLNCwW3wnt2uTjn1mQzpyjnwct2xdPuqroI= github.com/things-go/go-socks5 v0.0.3/go.mod h1:f8Zx+n8kfzyT90hXM767cP6sysAud93+t9rV90IgMcg= github.com/u-root/u-root v0.11.0 h1:6gCZLOeRyevw7gbTwMj3fKxnr9+yHFlgF3N7udUVNO8= +github.com/u-root/u-root v0.11.0/go.mod h1:DBkDtiZyONk9hzVEdB/PWI9B4TxDkElWlVTHseglrZY= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= @@ -418,6 +443,7 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/exp/typeparams v0.0.0-20230425010034-47ecfdc1ba53 h1:w/MOPdQ1IoYoDou3L55ZbTx2Nhn7JAhX1BBZor8qChU= +golang.org/x/exp/typeparams v0.0.0-20230425010034-47ecfdc1ba53/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -445,6 +471,7 @@ golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -537,6 +564,7 @@ golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prr google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -558,6 +586,7 @@ gopkg.in/AlecAivazis/survey.v1 v1.8.8/go.mod h1:CaHjv79TCgAvXMSFJSVgonHXYWxnhzI3 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= @@ -571,6 +600,7 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -589,10 +619,13 @@ gvisor.dev/gvisor v0.0.0-20230504175454-7b0a1988a28f/go.mod h1:pzr6sy8gDLfVmDAg8 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= +honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= inet.af/peercred v0.0.0-20210906144145-0893ea02156a h1:qdkS8Q5/i10xU2ArJMKYhVa1DORzBfYS/qA2UK2jheg= inet.af/peercred v0.0.0-20210906144145-0893ea02156a/go.mod h1:FjawnflS/udxX+SvpsMgZfdqx2aykOlkISeAsADi5IU= inet.af/wf v0.0.0-20221017222439-36129f591884 h1:zg9snq3Cpy50lWuVqDYM7AIRVTtU50y5WXETMFohW/Q= +inet.af/wf v0.0.0-20221017222439-36129f591884/go.mod h1:bSAQ38BYbY68uwpasXOTZo22dKGy9SNvI6PZFeKomZE= lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= @@ -600,7 +633,9 @@ modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= @@ -614,11 +649,14 @@ modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= software.sslmate.com/src/go-pkcs12 v0.2.0 h1:nlFkj7bTysH6VkC4fGphtjXRbezREPgrHuJG20hBGPE= +software.sslmate.com/src/go-pkcs12 v0.2.0/go.mod h1:23rNcYsMabIc1otwLpTkCCPwUq6kQsTyowttG/as0kQ= tailscale.com v1.44.0 h1:MPos9n30kJvdyfL52045gVFyNg93K+bwgDsr8gqKq2o= tailscale.com v1.44.0/go.mod h1:+iYwTdeHyVJuNDu42Zafwihq1Uqfh+pW7pRaY1GD328= diff --git a/vendor/github.com/reeflective/readline/completions.go b/vendor/github.com/reeflective/readline/completions.go index 4ed2c108d9..099a4fd276 100644 --- a/vendor/github.com/reeflective/readline/completions.go +++ b/vendor/github.com/reeflective/readline/completions.go @@ -22,6 +22,7 @@ type Completions struct { noSort map[string]bool listSep map[string]string pad map[string]bool + escapes map[string]bool // Initially this will be set to the part of the current word // from the beginning of the word up to the position of the cursor. @@ -48,7 +49,7 @@ func CompleteValues(values ...string) Completions { // CompleteStyledValues is like CompleteValues but also accepts a style. func CompleteStyledValues(values ...string) Completions { if length := len(values); length%2 != 0 { - return Message("invalid amount of arguments [CompleteStyledValues]: %v", length) + return CompleteMessage("invalid amount of arguments [CompleteStyledValues]: %v", length) } vals := make([]Completion, 0, len(values)/2) @@ -62,7 +63,7 @@ func CompleteStyledValues(values ...string) Completions { // CompleteValuesDescribed completes arbitrary key (values) with an additional description (value, description pairs). func CompleteValuesDescribed(values ...string) Completions { if length := len(values); length%2 != 0 { - return Message("invalid amount of arguments [CompleteValuesDescribed]: %v", length) + return CompleteMessage("invalid amount of arguments [CompleteValuesDescribed]: %v", length) } vals := make([]Completion, 0, len(values)/2) @@ -76,7 +77,7 @@ func CompleteValuesDescribed(values ...string) Completions { // CompleteStyledValuesDescribed is like CompleteValues but also accepts a style. func CompleteStyledValuesDescribed(values ...string) Completions { if length := len(values); length%3 != 0 { - return Message("invalid amount of arguments [CompleteStyledValuesDescribed]: %v", length) + return CompleteMessage("invalid amount of arguments [CompleteStyledValuesDescribed]: %v", length) } vals := make([]Completion, 0, len(values)/3) @@ -87,13 +88,27 @@ func CompleteStyledValuesDescribed(values ...string) Completions { return Completions{values: vals} } +// CompleteMessage ads a help message to display along with +// or in places where no completions can be generated. +func CompleteMessage(msg string, args ...any) Completions { + comps := Completions{} + + if len(args) > 0 { + msg = fmt.Sprintf(msg, args...) + } + + comps.messages.Add(msg) + + return comps +} + // CompleteRaw directly accepts a list of prepared Completion values. func CompleteRaw(values []Completion) Completions { return Completions{values: completion.RawValues(values)} } // Message displays a help messages in places where no completions can be generated. -func Message(msg string, args ...interface{}) Completions { +func Message(msg string, args ...any) Completions { comps := Completions{} if len(args) > 0 { @@ -108,7 +123,7 @@ func Message(msg string, args ...interface{}) Completions { // Suppress suppresses specific error messages using regular expressions. func (c Completions) Suppress(expr ...string) Completions { if err := c.messages.Suppress(expr...); err != nil { - return Message(err.Error()) + return CompleteMessage(err.Error()) } return c @@ -153,7 +168,7 @@ func (c Completions) Suffix(suffix string) Completions { } // Usage sets the usage. -func (c Completions) Usage(usage string, args ...interface{}) Completions { +func (c Completions) Usage(usage string, args ...any) Completions { return c.UsageF(func() string { return fmt.Sprintf(usage, args...) }) @@ -255,7 +270,7 @@ func (c Completions) ListSeparator(seps ...string) Completions { } if length := len(seps); len(seps) > 1 && length%2 != 0 { - return Message("invalid amount of arguments (ListSeparator): %v", length) + return CompleteMessage("invalid amount of arguments (ListSeparator): %v", length) } if len(seps) == 1 { @@ -322,6 +337,35 @@ func (c Completions) JustifyDescriptions(tags ...string) Completions { return c } +// PreserveEscapes forces the completion engine to keep all escaped characters in +// the inserted completion (c.Value of the Completion type). By default, those are +// stripped out and only kept in the completion.Display. If no arguments are given, +// escape sequence preservation will apply to all tags. +// +// This has very few use cases: one of them might be when you want to read a string +// from the readline shell that might include color sequences to be preserved. +// In such cases, this function gives a double advantage: the resulting completion +// is still "color-displayed" in the input line, and returned to the readline with +// them. A classic example is where you want to read a prompt string configuration. +// +// Note that this option might have various undefined behaviors when it comes to +// completion prefix matching, insertion, removal and related things. +func (c Completions) PreserveEscapes(tags ...string) Completions { + if c.escapes == nil { + c.escapes = make(map[string]bool) + } + + if len(tags) == 0 { + c.escapes["*"] = true + } + + for _, tag := range tags { + c.escapes[tag] = true + } + + return c +} + // Merge merges Completions (existing values are overwritten) // // a := CompleteValues("A", "B").Invoke(c) @@ -400,6 +444,10 @@ func (c *Completions) convert() completion.Values { comps.NoSort = c.noSort comps.ListSep = c.listSep comps.Pad = c.pad + comps.Escapes = c.escapes + + comps.PREFIX = c.PREFIX + comps.SUFFIX = c.SUFFIX return comps } diff --git a/vendor/github.com/reeflective/readline/internal/color/color.go b/vendor/github.com/reeflective/readline/internal/color/color.go index 0ab48c1d45..91afc219ff 100644 --- a/vendor/github.com/reeflective/readline/internal/color/color.go +++ b/vendor/github.com/reeflective/readline/internal/color/color.go @@ -3,6 +3,8 @@ package color import ( "os" "regexp" + "strconv" + "strings" ) // Base text effects. @@ -82,6 +84,44 @@ func Fmt(color string) string { return SGRStart + color + SGREnd } +// Trim accepts a string including arbitrary escaped sequences at arbitrary +// index positions, and returns the first 'n' printable characters in this +// string, including all escape codes found between and immediately around +// those characters (including surrounding 1st and 80th ones). +func Trim(input string, maxPrintableLength int) string { + if len(input) < maxPrintableLength { + return input + } + + // Find all escape sequences in the input + escapeIndices := re.FindAllStringIndex(input, -1) + + // Iterate over escape sequences to find the + // last escape index within maxPrintableLength + for _, indices := range escapeIndices { + if indices[0] <= maxPrintableLength { + maxPrintableLength += indices[1] - indices[0] + } else { + break + } + } + + // Determine the end index for limiting printable content + return input[:maxPrintableLength] +} + +// UnquoteRC removes the `\e` escape used in readline .inputrc +// configuration values and replaces it with the printable escape. +func UnquoteRC(color string) string { + color = strings.ReplaceAll(color, `\e`, "\x1b") + + if unquoted, err := strconv.Unquote(color); err == nil { + return unquoted + } + + return color +} + // HasEffects returns true if colors and effects are supported // on the current terminal. func HasEffects() bool { @@ -159,14 +199,3 @@ var re = regexp.MustCompile(ansi) func Strip(str string) string { return re.ReplaceAllString(str, "") } - -// wrong: reapplies fg/bg escapes regardless of the string passed. -// Users should be in charge of applying any effect as they wish. -// func SGR(color string, fg bool) string { -// if fg { -// return SGRStart + FgColorStart + color + SGREnd -// // return SGRStart + color + SGREnd -// } -// -// return SGRStart + BgColorStart + color + SGREnd -// } diff --git a/vendor/github.com/reeflective/readline/internal/completion/completion.go b/vendor/github.com/reeflective/readline/internal/completion/completion.go index 5b80a21be7..dd46657d9c 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/completion.go +++ b/vendor/github.com/reeflective/readline/internal/completion/completion.go @@ -17,6 +17,9 @@ type Candidate struct { // inserted immediately after the completion. This is used for slash-autoremoval in path // completions, comma-separated completions, etc. noSpace SuffixMatcher + + displayLen int // Real length of the displayed candidate, that is not counting escaped sequences. + descLen int } // Values is used internally to hold all completion candidates and their associated data. @@ -29,6 +32,7 @@ type Values struct { NoSort map[string]bool ListSep map[string]string Pad map[string]bool + Escapes map[string]bool // Initially this will be set to the part of the current word // from the beginning of the word up to the position of the cursor. diff --git a/vendor/github.com/reeflective/readline/internal/completion/display.go b/vendor/github.com/reeflective/readline/internal/completion/display.go index 46f13e745a..e4b2d9b632 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/display.go +++ b/vendor/github.com/reeflective/readline/internal/completion/display.go @@ -3,6 +3,7 @@ package completion import ( "bufio" "fmt" + "regexp" "strings" "github.com/reeflective/readline/internal/color" @@ -30,7 +31,7 @@ func Display(eng *Engine, maxRows int) { completions := term.ClearLineAfter for _, group := range eng.groups { - completions += group.writeComps(eng) + completions += eng.renderCompletions(group) } // Crop the completions so that it fits within our terminal @@ -47,6 +48,129 @@ func Coordinates(e *Engine) int { return e.usedY } +// renderCompletions renders all completions in a given list (with aliases or not). +// The descriptions list argument is optional. +func (e *Engine) renderCompletions(grp *group) string { + var builder strings.Builder + + if len(grp.rows) == 0 { + return "" + } + + if grp.tag != "" { + tag := fmt.Sprintf("%s%s%s %s", color.Bold, color.FgYellow, grp.tag, color.Reset) + builder.WriteString(tag + term.ClearLineAfter + term.NewlineReturn) + } + + for rowIndex, row := range grp.rows { + for columnIndex := range grp.columnsWidth { + var value Candidate + + // If there are aliases, we might have no completions at the current + // coordinates, so just print the corresponding padding and return. + if len(row) > columnIndex { + value = row[columnIndex] + } + + // Apply all highlightings to the displayed value: + // selection, prefixes, styles and other things, + padding := grp.getPad(value, columnIndex, false) + isSelected := rowIndex == grp.posY && columnIndex == grp.posX && grp.isCurrent + display := e.highlightDisplay(grp, value, padding, columnIndex, isSelected) + + builder.WriteString(display) + + // Add description if no aliases, or if done with them. + onLast := columnIndex == len(grp.columnsWidth)-1 + if grp.aliased && onLast && value.Description == "" { + value = row[0] + } + + if !grp.aliased || onLast { + grp.maxDescAllowed = grp.setMaximumSizes(columnIndex) + + descPad := grp.getPad(value, columnIndex, true) + desc := e.highlightDesc(grp, value, descPad, rowIndex, columnIndex, isSelected) + builder.WriteString(desc) + } + } + + // We're done for this line. + builder.WriteString(term.ClearLineAfter + term.NewlineReturn) + } + + return builder.String() +} + +func (e *Engine) highlightDisplay(grp *group, val Candidate, pad, col int, selected bool) (candidate string) { + // An empty display value means padding. + if val.Display == "" { + return padSpace(pad) + } + + reset := color.Fmt(val.Style) + candidate, padded := grp.trimDisplay(val, pad, col) + + if e.IsearchRegex != nil && e.isearchBuf.Len() > 0 && !selected { + match := e.IsearchRegex.FindString(candidate) + match = color.Fmt(color.Bg+"244") + match + color.Reset + reset + candidate = e.IsearchRegex.ReplaceAllLiteralString(candidate, match) + } + + if selected { + // If the comp is currently selected, overwrite any highlighting already applied. + userStyle := color.UnquoteRC(e.config.GetString("completion-selection-style")) + selectionHighlightStyle := color.Fmt(color.Bg+"255") + userStyle + candidate = selectionHighlightStyle + candidate + + if grp.aliased { + candidate += color.Reset + } + } else { + // Highlight the prefix if any and configured for it. + if e.config.GetBool("colored-completion-prefix") && e.prefix != "" { + if prefixMatch, err := regexp.Compile(fmt.Sprintf("^%s", e.prefix)); err == nil { + prefixColored := color.Bold + color.FgBlue + e.prefix + color.BoldReset + color.FgDefault + reset + candidate = prefixMatch.ReplaceAllString(candidate, prefixColored) + } + } + + candidate = reset + candidate + color.Reset + } + + return candidate + padded +} + +func (e *Engine) highlightDesc(grp *group, val Candidate, pad, row, col int, selected bool) (desc string) { + if val.Description == "" { + return color.Reset + } + + desc, padded := grp.trimDesc(val, pad) + + // If the next row has the same completions, replace the description with our hint. + if len(grp.rows) > row+1 && grp.rows[row+1][0].Description == val.Description { + desc = "|" + } else if e.IsearchRegex != nil && e.isearchBuf.Len() > 0 && !selected { + match := e.IsearchRegex.FindString(desc) + match = color.Fmt(color.Bg+"244") + match + color.Reset + color.Dim + desc = e.IsearchRegex.ReplaceAllLiteralString(desc, match) + } + + // If the comp is currently selected, overwrite any highlighting already applied. + // Replace all background reset escape sequences in it, to ensure correct display. + if row == grp.posY && col == grp.posX && grp.isCurrent && !grp.aliased { + userDescStyle := color.UnquoteRC(e.config.GetString("completion-selection-style")) + selectionHighlightStyle := color.Fmt(color.Bg+"255") + userDescStyle + desc = strings.ReplaceAll(desc, color.BgDefault, userDescStyle) + desc = selectionHighlightStyle + desc + } + + compDescStyle := color.UnquoteRC(e.config.GetString("completion-description-style")) + + return compDescStyle + desc + color.Reset + padded +} + // cropCompletions - When the user cycles through a completion list longer // than the console MaxTabCompleterRows value, we crop the completions string // so that "global" cycling (across all groups) is printed correctly. diff --git a/vendor/github.com/reeflective/readline/internal/completion/engine.go b/vendor/github.com/reeflective/readline/internal/completion/engine.go index 54de45ab3d..4532cf58d3 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/engine.go +++ b/vendor/github.com/reeflective/readline/internal/completion/engine.go @@ -116,7 +116,7 @@ func (e *Engine) SkipDisplay() { func (e *Engine) Select(row, column int) { grp := e.currentGroup() - if grp == nil || len(grp.values) == 0 { + if grp == nil || len(grp.rows) == 0 { return } diff --git a/vendor/github.com/reeflective/readline/internal/completion/group.go b/vendor/github.com/reeflective/readline/internal/completion/group.go index 7d218e65ea..5252573134 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/group.go +++ b/vendor/github.com/reeflective/readline/internal/completion/group.go @@ -1,32 +1,34 @@ package completion import ( - "fmt" - "regexp" + "math" "sort" + "strconv" "strings" - "unicode/utf8" "github.com/reeflective/readline/internal/color" "github.com/reeflective/readline/internal/term" + "golang.org/x/exp/slices" ) // group is used to structure different types of completions with different // display types, autosuffix removal matchers, under their tag heading. type group struct { - tag string // Printed on top of the group's completions - values [][]Candidate // Values are grouped by aliases/rows, with computed paddings. - noSpace SuffixMatcher // Suffixes to remove if a space or non-nil character is entered after the completion. - columnsWidth []int // Computed width for each column of completions, when aliases - listSeparator string // This is used to separate completion candidates from their descriptions. - list bool // Force completions to be listed instead of grided - noSort bool // Don't sort completions - aliased bool // Are their aliased completions - isCurrent bool // Currently cycling through this group, for highlighting choice - maxLength int // Each group can be limited in the number of comps offered - tcMaxLength int // Used when display is map/list, for determining message width - maxDescWidth int - maxCellLength int + tag string // Printed on top of the group's completions + rows [][]Candidate // Values are grouped by aliases/rows, with computed paddings. + noSpace SuffixMatcher // Suffixes to remove if a space or non-nil character is entered after the completion. + columnsWidth []int // Computed width for each column of completions, when aliases + descriptionsWidth []int // Computed width for each column of completions, when aliases + listSeparator string // This is used to separate completion candidates from their descriptions. + list bool // Force completions to be listed instead of grided + noSort bool // Don't sort completions + aliased bool // Are their aliased completions + preserveEscapes bool // Preserve escape sequences in the completion inserted values. + isCurrent bool // Currently cycling through this group, for highlighting choice + longestValue int // Used when display is map/list, for determining message width + longestDesc int // Used to know how much descriptions can use when there are aliases. + maxDescAllowed int // Maximum ALLOWED description width. + termWidth int // Term size queried at beginning of computes by the engine. // Selectors (position/bounds) management posX int @@ -35,334 +37,393 @@ type group struct { maxY int } -func (e *Engine) group(comps Values) { - // Compute hints once we found either any errors, - // or if we have no completions but usage strings. - defer func() { - e.hintCompletions(comps) - }() - - // Nothing else to do if no completions - if len(comps.values) == 0 { - return +// newCompletionGroup initializes a group of completions to be displayed in the same area/header. +func (e *Engine) newCompletionGroup(comps Values, tag string, vals RawValues, descriptions []string) { + grp := &group{ + tag: tag, + noSpace: comps.NoSpace, + posX: -1, + posY: -1, + columnsWidth: []int{0}, + termWidth: term.GetWidth(), + longestDesc: longest(descriptions, true), } - // Apply the prefix to the completions, and filter out any - // completions that don't match, optionally ignoring case. - matchCase := e.config.GetBool("completion-ignore-case") - comps.values = comps.values.FilterPrefix(e.prefix, !matchCase) + // Initialize all options for the group. + grp.initOptions(e, &comps, tag, vals) - comps.values.EachTag(func(tag string, values RawValues) { - // Separate the completions that have a description and - // those which don't, and devise if there are aliases. - vals, noDescVals, aliased := e.groupValues(&comps, values) + // Global actions to take on all values. + if !grp.noSort { + sort.Stable(vals) + } - // Create a "first" group with the "first" grouped values - e.newGroup(comps, tag, vals, aliased) + // Initial processing of our assigned values: + // Compute color/no-color sizes, some max/min, etc. + grp.prepareValues(vals) - // If we have a remaining group of values without descriptions, - // we will print and use them in a separate, anonymous group. - if len(noDescVals) > 0 { - e.newGroup(comps, "", noDescVals, false) - } - }) + // Generate the full grid of completions. + // Special processing is needed when some values + // share a common description, they are "aliased". + if completionsAreAliases(vals) { + grp.initCompletionAliased(vals) + } else { + grp.initCompletionsGrid(vals) + } - e.justifyGroups(comps) + e.groups = append(e.groups, grp) } -// groupValues separates values based on whether they have descriptions, or are aliases of each other. -func (e *Engine) groupValues(comps *Values, values RawValues) (vals, noDescVals RawValues, aliased bool) { - var descriptions []string +// initOptions checks for global or group-specific options (display, behavior, grouping, etc). +func (g *group) initOptions(eng *Engine, comps *Values, tag string, vals RawValues) { + // Override grid/list displays + _, g.list = comps.ListLong[tag] + if _, all := comps.ListLong["*"]; all && len(comps.ListLong) == 1 { + g.list = true + } - prefix := "" - if e.prefix != "\"\"" && e.prefix != "''" { - prefix = e.prefix + // Description list separator + listSep, err := strconv.Unquote(eng.config.GetString("completion-list-separator")) + if err != nil { + g.listSeparator = "--" + } else { + g.listSeparator = listSep } - for _, val := range values { - // Ensure all values have a display string. - if val.Display == "" { - val.Display = val.Value - } + // Strip escaped characters in the value component. + g.preserveEscapes = comps.Escapes[g.tag] + if !g.preserveEscapes { + g.preserveEscapes = comps.Escapes["*"] + } - // Currently this is because errors are passed as completions. - if strings.HasPrefix(val.Value, prefix+"ERR") && val.Value == prefix+"_" { - if val.Description != "" && comps != nil { - comps.Messages.Add(color.FgRed + val.Description) - } + // Always list long commands when they have descriptions. + if strings.HasSuffix(g.tag, "commands") && len(vals) > 0 && vals[0].Description != "" { + g.list = true + } - continue + // Description list separator + listSep, found := comps.ListSep[tag] + if !found { + if allSep, found := comps.ListSep["*"]; found { + g.listSeparator = allSep } + } else { + g.listSeparator = listSep + } - // Grid completions - if val.Description == "" { - noDescVals = append(noDescVals, val) - - continue - } + // Override sorting or sort if needed + g.noSort = comps.NoSort[tag] + if noSort, all := comps.NoSort["*"]; noSort && all && len(comps.NoSort) == 1 { + g.noSort = true + } +} - // List/map completions. - if stringInSlice(val.Description, descriptions) { - aliased = true - } +// initCompletionsGrid arranges completions when there are no aliases. +func (g *group) initCompletionsGrid(comps RawValues) { + if len(comps) == 0 { + return + } - descriptions = append(descriptions, val.Description) - vals = append(vals, val) + pairLength := g.longestValueDescribed(comps) + if pairLength > g.termWidth { + pairLength = g.termWidth } - // if no candidates have a description, swap - if len(vals) == 0 { - vals = noDescVals - noDescVals = make(RawValues, 0) + maxColumns := g.termWidth / pairLength + if g.list || maxColumns < 0 { + maxColumns = 1 } - return vals, noDescVals, aliased + rowCount := int(math.Ceil(float64(len(comps)) / (float64(maxColumns)))) + + g.rows = createGrid(comps, rowCount, maxColumns) + g.calculateMaxColumnWidths(g.rows) } -func (e *Engine) justifyGroups(values Values) { - commandGroups := make([]*group, 0) - maxCellLength := 0 +// initCompletionsGrid arranges completions when some of them share the same description. +func (g *group) initCompletionAliased(domains []Candidate) { + g.aliased = true - for _, group := range e.groups { - // Skip groups that are not to be justified - if _, justify := values.Pad[group.tag]; !justify { - if _, all := values.Pad["*"]; !all { - continue - } - } - - // Skip groups that are aliased or have more than one column - if group.aliased || len(group.columnsWidth) > 1 { - continue - } + // Filter out all duplicates: group aliased completions together. + grid, descriptions := g.createDescribedRows(domains) + g.calculateMaxColumnWidths(grid) + g.wrapExcessAliases(grid, descriptions) - commandGroups = append(commandGroups, group) + g.maxY = len(g.rows) + g.maxX = len(g.columnsWidth) +} - if group.tcMaxLength > maxCellLength { - maxCellLength = group.tcMaxLength +// This createDescribedRows function takes a list of values, a list of descriptions, and the +// terminal width as input, and returns a list of rows based on the provided requirements:. +func (g *group) createDescribedRows(values []Candidate) ([][]Candidate, []string) { + descriptionMap := make(map[string][]Candidate) + uniqueDescriptions := make([]string, 0) + rows := make([][]Candidate, 0) + + // Separate duplicates and store them. + for i, description := range values { + if slices.Contains(uniqueDescriptions, description.Description) { + descriptionMap[description.Description] = append(descriptionMap[description.Description], values[i]) + } else { + uniqueDescriptions = append(uniqueDescriptions, description.Description) + descriptionMap[description.Description] = []Candidate{values[i]} } } - for _, group := range commandGroups { - group.tcMaxLength = maxCellLength + // Sorting helps with easier grids. + for _, description := range uniqueDescriptions { + row := descriptionMap[description] + // slices.Sort(row) + // slices.Reverse(row) + rows = append(rows, row) } + + return rows, uniqueDescriptions } -func (e *Engine) newGroup(comps Values, tag string, vals RawValues, aliased bool) { - grp := &group{ - tag: tag, - noSpace: comps.NoSpace, - listSeparator: "--", - posX: -1, - posY: -1, - aliased: aliased, - columnsWidth: []int{0}, +// Wraps all rows for which there are too many aliases to be displayed on a single one. +func (g *group) wrapExcessAliases(grid [][]Candidate, descriptions []string) { + breakeven := 0 + maxColumns := len(g.columnsWidth) + + for i, width := range g.columnsWidth { + if (breakeven + width + 1) > g.termWidth/2 { + maxColumns = i + break + } + + breakeven += width + 1 } - // Check that all comps have a display value, - // and begin computing some parameters. - vals = grp.checkDisplays(vals) + var rows [][]Candidate - // Set sorting options, various display styles, etc. - grp.setOptions(comps, tag, vals) + for rowIndex := range grid { + row := grid[rowIndex] - // Keep computing/devising some parameters and constraints. - // This does not do much when we have aliased completions. - grp.computeCells(e, vals) + for len(row) > maxColumns { + rows = append(rows, row[:maxColumns]) + row = row[maxColumns:] + } - // Rearrange all candidates into a matrix of completions, - // based on most parameters computed above. - grp.makeMatrix(vals) + rows = append(rows, row) + } - e.groups = append(e.groups, grp) + g.rows = rows + g.columnsWidth = g.columnsWidth[:maxColumns] } -func (g *group) checkDisplays(vals RawValues) RawValues { - if g.aliased { - return vals - } +// prepareValues ensures all of them have a display, and starts +// gathering information on longest/shortest values, etc. +func (g *group) prepareValues(vals RawValues) RawValues { + for pos, value := range vals { + if value.Display == "" { + value.Display = value.Value + } - if len(vals) == 0 { - g.columnsWidth[0] = term.GetWidth() - 1 - } + // Only pass for colors regex should be here. + value.displayLen = len(color.Strip(value.Display)) + value.descLen = len(color.Strip(value.Description)) - // Otherwise update the size of the longest candidate - for _, val := range vals { - valLen := utf8.RuneCountInString(val.Display) - if valLen > g.columnsWidth[0] { - g.columnsWidth[0] = valLen + if value.displayLen > g.longestValue { + g.longestValue = value.displayLen } + + if value.descLen > g.longestDesc { + g.longestDesc = value.descLen + } + + vals[pos] = value } return vals } -func (g *group) setOptions(comps Values, tag string, vals RawValues) { - // Override grid/list displays - _, g.list = comps.ListLong[tag] - if _, all := comps.ListLong["*"]; all && len(comps.ListLong) == 1 { - g.list = true - } +func (g *group) setMaximumSizes(col int) int { + // Get the length of the longest description in the same column. + maxDescLen := g.descriptionsWidth[col] + valuesRealLen := sum(g.columnsWidth) + len(g.columnsWidth) + len(g.listSep()) - // Always list long commands when they have descriptions. - if strings.HasSuffix(g.tag, "commands") && len(vals) > 0 && vals[0].Description != "" { - g.list = true + if valuesRealLen+maxDescLen > g.termWidth { + maxDescLen = g.termWidth - valuesRealLen + } else if valuesRealLen+maxDescLen < g.termWidth { + maxDescLen = g.termWidth - valuesRealLen } - // Description list separator - listSep, found := comps.ListSep[tag] - if !found { - if allSep, found := comps.ListSep["*"]; found { - g.listSeparator = allSep + return maxDescLen +} + +// calculateMaxColumnWidths is in charge of optimizing the sizes of rows/columns. +func (g *group) calculateMaxColumnWidths(grid [][]Candidate) { + var numColumns int + + // Get the row with the greatest number of columns. + for _, row := range grid { + if len(row) > numColumns { + numColumns = len(row) } - } else { - g.listSeparator = listSep } - // Override sorting or sort if needed - _, g.noSort = comps.NoSort[tag] - if _, all := comps.NoSort["*"]; all && len(comps.NoSort) == 1 { - g.noSort = true - } + // First, all columns are as wide as the longest of their elements, + // regardless of if this longest element is longer than terminal + values := make([]int, numColumns) + descriptions := make([]int, numColumns) - if !g.noSort { - sort.Slice(vals, func(i, j int) bool { - return vals[i].Display < vals[j].Display - }) - } -} + for _, row := range grid { + for columnIndex, value := range row { + if value.displayLen+1 > values[columnIndex] { + values[columnIndex] = value.displayLen + 1 + } -func (g *group) computeCells(eng *Engine, vals RawValues) { - // Aliases will compute themselves individually, later. - if g.aliased { - return + if value.descLen+1 > descriptions[columnIndex] { + descriptions[columnIndex] = value.descLen + 1 + } + } } - if len(vals) == 0 { - return + // If we have only one row, it means that the number of columns + // multiplied by the size on the longest one will fit into the + // terminal, so we can just + if len(grid) == 1 && len(grid[0]) <= numColumns && sum(descriptions) == 0 { + for i := range values { + values[i] = g.longestValue + } } - g.tcMaxLength = g.columnsWidth[0] + // Last time adjustment: try to reallocate any space modulo to each column. + shouldPad := len(grid) > 1 && numColumns > 1 && sum(descriptions) == 0 + intraColumnSpace := (numColumns * 2) + totalSpaceUsed := sum(values) + sum(descriptions) + intraColumnSpace + freeSpace := g.termWidth - totalSpaceUsed - // Each value first computes the total amount of space - // it is going to take in a row (including the description) - for _, val := range vals { - candidate := g.displayTrimmed(color.Strip(val.Display)) - pad := strings.Repeat(" ", g.tcMaxLength-len(candidate)) - desc := g.descriptionTrimmed(val.Description) - display := fmt.Sprintf("%s%s%s", candidate, pad+" ", desc) - valLen := utf8.RuneCountInString(display) - - if valLen > g.maxCellLength { - g.maxCellLength = valLen + if shouldPad && !g.aliased && freeSpace >= numColumns { + each := freeSpace / numColumns + + for i := range values { + values[i] += each } } - // Adapt the maximum cell size based on inputrc settings. - compDisplayWidth := g.setMaxCellLength(eng) - - // We now have the length of the longest completion for this group, - // so we devise how many columns we can use to display completions. - g.setColumnsWidth(&vals, compDisplayWidth) + // The group is mostly ready to print and select its values for completion. + g.maxY = len(g.rows) + g.maxX = len(values) + g.columnsWidth = values + g.descriptionsWidth = descriptions } -func (g *group) setMaxCellLength(eng *Engine) int { - termWidth := term.GetWidth() +func (g *group) longestValueDescribed(vals []Candidate) int { + var longestDesc, longestVal int - compDisplayWidth := eng.config.GetInt("completion-display-width") - if compDisplayWidth > termWidth { - compDisplayWidth = -1 - } + // Equivalent to ` -- `, + // asuuming no trailing spaces in the completion + // nor leading spaces in the description. + descSeparatorLen := 1 + len(g.listSeparator) + 1 - if compDisplayWidth > 0 && compDisplayWidth < termWidth { - if g.maxCellLength < compDisplayWidth { - g.maxCellLength = compDisplayWidth - } else { - g.maxCellLength = termWidth + // Get the length of the longest value + // and the length of the longest description. + for _, val := range vals { + if val.displayLen > longestVal { + longestVal = val.displayLen } + + if val.descLen > longestDesc { + longestDesc = val.descLen + } + } + + if longestDesc > 0 { + longestDesc += descSeparatorLen } - return compDisplayWidth + // Always add one: there is at least one space between each column. + return longestVal + longestDesc + 1 } -func (g *group) setColumnsWidth(vals *RawValues, compDisplayWidth int) { - g.maxX = term.GetWidth() / (g.maxCellLength) - if g.maxX < 1 { - g.maxX = 1 // avoid a divide by zero error - } +func (g *group) trimDisplay(comp Candidate, pad, col int) (candidate, padded string) { + val := comp.Display - if g.maxX > len(*vals) { - g.maxX = len(*vals) + // No display value means padding. + if val == "" { + return "", padSpace(pad) } - if g.list || compDisplayWidth == 0 { - g.maxX = 1 - } + // Get the allowed length for this column. + // The display can never be longer than terminal width. + maxDisplayWidth := g.columnsWidth[col] + 1 - if g.maxX > compDisplayWidth && compDisplayWidth > 0 { - g.maxX = compDisplayWidth + if maxDisplayWidth > g.termWidth { + maxDisplayWidth = g.termWidth } - // We also have the width for each column - g.columnsWidth = make([]int, g.maxX) - for i := 0; i < g.maxX; i++ { - g.columnsWidth[i] = g.maxCellLength + val = sanitizer.Replace(val) + + if comp.displayLen > maxDisplayWidth { + val = color.Trim(val, maxDisplayWidth-trailingValueLen) + val += "..." // 3 dots + 1 safety space = -3 + + return val, " " } + + return val, padSpace(pad) } -func (g *group) makeMatrix(vals RawValues) { -nextValue: - for _, val := range vals { - valLen := utf8.RuneCountInString(val.Display) +func (g *group) trimDesc(val Candidate, pad int) (desc, padded string) { + desc = val.Description + if desc == "" { + return desc, padSpace(pad) + } - // If we have an alias, and we must get the right - // column and the right padding for this column. - if g.aliased { - for i, row := range g.values { - if row[0].Description == val.Description { - g.values[i] = append(row, val) - g.columnsWidth = getColumnPad(g.columnsWidth, valLen, len(g.values[i])) + // We don't compare against the terminal width: + // the correct padding should have been computed + // based on the space taken by all candidates + // described by our current string. + if pad > g.maxDescAllowed { + pad = g.maxDescAllowed - val.descLen + } - continue nextValue - } - } - } + desc = sanitizer.Replace(desc) - // Else, either add it to the current row if there is still room - // on it for this candidate, or add a new one. We only do that when - // we know we don't have aliases, or when we don't have to display list. - if !g.aliased && g.canFitInRow(term.GetWidth()) && !g.list { - g.values[len(g.values)-1] = append(g.values[len(g.values)-1], val) - } else { - // Else create a new row, and update the row pad. - g.values = append(g.values, []Candidate{val}) - if g.columnsWidth[0] < valLen+1 { - g.columnsWidth[0] = valLen + 1 - } - } - } + // Trim the description accounting for escapes. + if val.descLen > g.maxDescAllowed && g.maxDescAllowed > 0 { + desc = color.Trim(desc, g.maxDescAllowed-trailingDescLen) + desc += "..." // 3 dots = -3 - if g.aliased { - g.maxX = len(g.columnsWidth) - g.tcMaxLength = sum(g.columnsWidth) + len(g.columnsWidth) + 1 + return g.listSep() + desc, "" } - g.maxY = len(g.values) - if g.maxY > g.maxLength && g.maxLength != 0 { - g.maxY = g.maxLength + if val.descLen+pad > g.maxDescAllowed { + pad = g.maxDescAllowed - val.descLen } + + return g.listSep() + desc, padSpace(pad) } -func (g *group) canFitInRow(termWidth int) bool { - if len(g.values) == 0 { - return false +func (g *group) getPad(value Candidate, columnIndex int, desc bool) int { + columns := g.columnsWidth + var valLen = value.displayLen - 1 + + if desc { + columns = g.descriptionsWidth + valLen = value.descLen } - if termWidth/(g.maxCellLength)-1 < len(g.values[len(g.values)-1]) { - return false + // Ensure we never longer or even fully equal + // to the terminal size: we are not really sure + // of where offsets might be set in the code... + column := columns[columnIndex] + if column > g.termWidth-1 { + column = g.termWidth - 1 + } + + padding := column - valLen + + if padding < 0 { + return 0 } - return true + return padding +} + +func (g *group) listSep() string { + return g.listSeparator + " " } // @@ -379,8 +440,8 @@ func (g *group) updateIsearch(eng *Engine) { suggs := make([]Candidate, 0) - for i := range g.values { - row := g.values[i] + for i := range g.rows { + row := g.rows[i] for _, val := range row { if eng.IsearchRegex.MatchString(val.Value) { @@ -392,49 +453,36 @@ func (g *group) updateIsearch(eng *Engine) { } // Reset the group parameters - g.values = make([][]Candidate, 0) + g.rows = make([][]Candidate, 0) g.posX = -1 g.posY = -1 - g.columnsWidth = []int{0} - // Assign the filtered values: we don't need to check - // for a separate set of non-described values, as the - // completions have already been triaged when generated. - vals, _, aliased := eng.groupValues(nil, suggs) - g.aliased = aliased - - if len(vals) == 0 { - return - } - - // And perform the usual initialization routines. - vals = g.checkDisplays(vals) - g.computeCells(eng, vals) - g.makeMatrix(vals) -} + // Initial processing of our assigned values: + // Compute color/no-color sizes, some max/min, etc. + suggs = g.prepareValues(suggs) -func (g *group) firstCell() { - g.posX = 0 - g.posY = 0 -} - -func (g *group) lastCell() { - g.posY = len(g.values) - 1 - g.posX = len(g.columnsWidth) - 1 - - if g.aliased { - g.findFirstCandidate(0, -1) + // Generate the full grid of completions. + // Special processing is needed when some values + // share a common description, they are "aliased". + if completionsAreAliases(suggs) { + g.initCompletionAliased(suggs) } else { - g.posX = len(g.values[g.posY]) - 1 + g.initCompletionsGrid(suggs) } } func (g *group) selected() (comp Candidate) { + defer func() { + if !g.preserveEscapes { + comp.Value = color.Strip(comp.Value) + } + }() + if g.posY == -1 || g.posX == -1 { - return g.values[0][0] + return g.rows[0][0] } - return g.values[g.posY][g.posX] + return g.rows[g.posY][g.posX] } func (g *group) moveSelector(x, y int) (done, next bool) { @@ -462,7 +510,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { } g.posY-- - g.posX = len(g.values[g.posY]) - 1 + g.posX = len(g.rows[g.posY]) - 1 } // 2) If we are reverse-cycling and currently on the first candidate, @@ -475,7 +523,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { return true, false } - g.posY = len(g.values) - 1 + g.posY = len(g.rows) - 1 g.posX-- } @@ -491,7 +539,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { } // 4) If we are on the last column, go to next row or next group - if g.posX > len(g.values[g.posY])-1 { + if g.posX > len(g.rows[g.posY])-1 { if g.aliased { return g.findFirstCandidate(x, y) } @@ -513,7 +561,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { // otherwise loop in the direction wished until one is found, or go next/ // previous column, and so on. func (g *group) findFirstCandidate(x, y int) (done, next bool) { - for g.posX > len(g.values[g.posY])-1 { + for g.posX > len(g.rows[g.posY])-1 { g.posY += y g.posY += x @@ -526,7 +574,7 @@ func (g *group) findFirstCandidate(x, y int) (done, next bool) { return true, false } - g.posY = len(g.values) - 1 + g.posY = len(g.rows) - 1 g.posX-- } @@ -544,198 +592,69 @@ func (g *group) findFirstCandidate(x, y int) (done, next bool) { return } -func (g *group) writeComps(eng *Engine) (comp string) { - if len(g.values) == 0 { - return - } - - if g.tag != "" { - comp += fmt.Sprintf("%s%s%s %s", color.Bold, color.FgYellow, g.tag, color.Reset) + term.ClearLineAfter + term.NewlineReturn - eng.usedY++ - } - - // Base parameters - var columns, rows int - - for range g.values { - // Generate the completion string for this row (comp/aliases - // and/or descriptions), and apply any styles and isearch - // highlighting with pattern replacement, - comp += g.writeRow(eng, columns) - - columns++ - rows++ - - if rows > g.maxY { - break - } - } - - eng.usedY += rows - - return comp +func (g *group) firstCell() { + g.posX = 0 + g.posY = 0 } -func (g *group) writeRow(eng *Engine, row int) (comp string) { - current := g.values[row] - - writeDesc := func(val Candidate, x, y, pad int) string { - desc := g.highlightDescription(eng, val, y, x) - descPad := g.padDescription(current, val, pad) - - if descPad > 0 { - desc += strings.Repeat(" ", descPad) - } - - return desc - } - - for col, val := range current { - // Generate the highlighted candidate with its padding - isSelected := row == g.posY && col == g.posX && g.isCurrent - cell, pad := g.padCandidate(current, val, col) - comp += g.highlightCandidate(eng, val, cell, pad, isSelected) + " " +func (g *group) lastCell() { + g.posY = len(g.rows) - 1 + g.posX = len(g.columnsWidth) - 1 - // And append the description only if at the end of the row, - // or if there are no aliases, in which case all comps are described. - if !g.aliased || col == len(current)-1 { - comp += writeDesc(val, col, row, len(cell)+len(pad)) - } + if g.aliased { + g.findFirstCandidate(0, -1) + } else { + g.posX = len(g.rows[g.posY]) - 1 } - - comp += term.ClearLineAfter + term.NewlineReturn - - return } -func (g *group) highlightCandidate(eng *Engine, val Candidate, cell, pad string, selected bool) (candidate string) { - reset := color.Fmt(val.Style) - candidate = g.displayTrimmed(val.Display) +func completionsAreAliases(values []Candidate) bool { + oddValueMap := make(map[string]bool) - if eng.IsearchRegex != nil && eng.isearchBuf.Len() > 0 { - match := eng.IsearchRegex.FindString(candidate) - match = color.Fmt(color.Bg+"244") + match + color.Reset + reset - candidate = eng.IsearchRegex.ReplaceAllLiteralString(candidate, match) - } - - switch { - // If the comp is currently selected, overwrite any highlighting already applied. - case selected: - candidate = color.Fmt(color.Bg+"255") + color.FgBlackBright + g.displayTrimmed(color.Strip(val.Display)) - if g.aliased { - candidate += cell + color.Reset + for _, value := range values { + if value.Description == "" { + continue } - default: - // Highlight the prefix if any and configured for it. - if eng.config.GetBool("colored-completion-prefix") && eng.prefix != "" { - if prefixMatch, err := regexp.Compile(fmt.Sprintf("^%s", eng.prefix)); err == nil { - candidate = prefixMatch.ReplaceAllString(candidate, color.Bold+color.FgBlue+eng.prefix+color.BoldReset+color.FgDefault+reset) - } + if _, found := oddValueMap[value.Description]; found { + return true } - candidate = reset + candidate + color.Reset + cell + oddValueMap[value.Description] = true } - return candidate + pad + return false } -func (g *group) highlightDescription(eng *Engine, val Candidate, row, col int) (desc string) { - if val.Description == "" { - return color.Reset +func createGrid(values []Candidate, rowCount, maxColumns int) [][]Candidate { + if rowCount < 0 { + rowCount = 0 } - desc = g.descriptionTrimmed(val.Description) - - if eng.IsearchRegex != nil && eng.isearchBuf.Len() > 0 { - match := eng.IsearchRegex.FindString(desc) - match = color.Fmt(color.Bg+"244") + match + color.Reset + color.Dim - desc = eng.IsearchRegex.ReplaceAllLiteralString(desc, match) - } + grid := make([][]Candidate, rowCount) - // If the comp is currently selected, overwrite any highlighting already applied. - if row == g.posY && col == g.posX && g.isCurrent && !g.aliased { - desc = color.Fmt(color.Bg+"255") + color.FgBlackBright + g.descriptionTrimmed(val.Description) + for i := 0; i < rowCount; i++ { + grid[i] = createRow(values, maxColumns, i) } - return color.Dim + desc + color.Reset + return grid } -func (g *group) padCandidate(row []Candidate, val Candidate, col int) (cell, pad string) { - var cellLen, padLen int - valLen := utf8.RuneCountInString(val.Display) +func createRow(domains []Candidate, maxColumns, rowIndex int) []Candidate { + rowStart := rowIndex * maxColumns + rowEnd := (rowIndex + 1) * maxColumns - if !g.aliased { - padLen = g.tcMaxLength - valLen - if padLen < 0 { - padLen = 0 - } - - return "", strings.Repeat(" ", padLen) + if rowEnd > len(domains) { + rowEnd = len(domains) } - cellLen = g.columnsWidth[col] - valLen - - if len(row) == 1 { - padLen = sum(g.columnsWidth) + len(g.columnsWidth) - g.columnsWidth[col] - 1 - } - - return strings.Repeat(" ", cellLen), strings.Repeat(" ", padLen) -} - -func (g *group) padDescription(row []Candidate, val Candidate, valPad int) (pad int) { - if g.aliased { - return 1 - } - - candidateLen := len(g.displayTrimmed(val.Display)) + valPad + 1 - individualRest := (term.GetWidth() % g.maxCellLength) / (g.maxX + len(row)) - pad = g.maxCellLength - candidateLen - len(g.descriptionTrimmed(val.Description)) + individualRest - - if pad > 1 { - pad-- - } - - return pad + return domains[rowStart:rowEnd] } -func (g *group) displayTrimmed(val string) string { - termWidth := term.GetWidth() - if g.tcMaxLength > termWidth-1 { - g.tcMaxLength = termWidth - 1 +func padSpace(times int) string { + if times > 0 { + return strings.Repeat(" ", times) } - if len(val) > g.tcMaxLength { - val = val[:g.tcMaxLength-3] + "..." - } - - val = sanitizer.Replace(val) - - return val -} - -func (g *group) descriptionTrimmed(desc string) string { - if desc == "" { - return desc - } - - termWidth := term.GetWidth() - if g.tcMaxLength > termWidth { - g.tcMaxLength = termWidth - } - - g.maxDescWidth = termWidth - g.tcMaxLength - len(g.listSeparator) - 1 - - if len(desc) >= g.maxDescWidth { - offset := 4 - if !g.aliased { - offset++ - } - - desc = desc[:g.maxDescWidth-offset] + "..." - } - - desc = g.listSeparator + " " + sanitizer.Replace(desc) - - return desc + return "" } diff --git a/vendor/github.com/reeflective/readline/internal/completion/hint.go b/vendor/github.com/reeflective/readline/internal/completion/hint.go index 0aeeb979f4..42dec696d3 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/hint.go +++ b/vendor/github.com/reeflective/readline/internal/completion/hint.go @@ -18,10 +18,18 @@ func (e *Engine) hintCompletions(comps Values) { } } - // And all further messages - hint += strings.Join(comps.Messages.Get(), term.NewlineReturn) + // Add application-specific messages. + // There is full support for color in them, but in case those messages + // don't include any, we tame the color a little bit first, like hints. + messages := strings.Join(comps.Messages.Get(), term.NewlineReturn) + messages = strings.TrimSuffix(messages, term.NewlineReturn) - if e.Matches() == 0 && hint == "" && !e.auto { + if messages != "" { + hint = hint + color.Dim + messages + } + + // If we don't have any completions, and no messages, let's say it. + if e.Matches() == 0 && hint == color.Dim+term.NewlineReturn && !e.auto { hint = e.hintNoMatches() } diff --git a/vendor/github.com/reeflective/readline/internal/completion/utils.go b/vendor/github.com/reeflective/readline/internal/completion/utils.go index a07223e49a..64b0c6f3f4 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/utils.go +++ b/vendor/github.com/reeflective/readline/internal/completion/utils.go @@ -4,12 +4,15 @@ import ( "strings" "unicode" + "github.com/reeflective/readline/internal/color" "github.com/reeflective/readline/internal/keymap" "github.com/reeflective/readline/internal/term" ) -// Maximum ratio of the screen that described values can have. -var maxValuesAreaRatio = 0.5 +const ( + trailingDescLen = 3 + trailingValueLen = 4 +) var sanitizer = strings.NewReplacer( "\n", ``, @@ -21,16 +24,38 @@ var sanitizer = strings.NewReplacer( // and prefix/suffix strings, but does not attempt any candidate // insertion/abortion on the line. func (e *Engine) prepare(completions Values) { + e.prefix = "" e.groups = make([]*group, 0) e.setPrefix(completions) e.setSuffix(completions) + e.generate(completions) +} + +func (e *Engine) generate(completions Values) { + // Compute hints once we found either any errors, + // or if we have no completions but usage strings. + defer func() { + e.hintCompletions(completions) + }() + + // Nothing else to do if no completions + if len(completions.values) == 0 { + return + } + + // Apply the prefix to the completions, and filter out any + // completions that don't match, optionally ignoring case. + matchCase := e.config.GetBool("completion-ignore-case") + completions.values = completions.values.FilterPrefix(e.prefix, !matchCase) - e.group(completions) + // Classify, group together and initialize completions. + completions.values.EachTag(e.generateGroup(completions)) + e.justifyGroups(completions) } -func (e *Engine) setPrefix(comps Values) { - switch comps.PREFIX { +func (e *Engine) setPrefix(completions Values) { + switch completions.PREFIX { case "": // Select the character just before the cursor. cpos := e.cursor.Pos() - 1 @@ -49,15 +74,18 @@ func (e *Engine) setPrefix(comps Values) { cpos++ } + // You might wonder why we trim spaces here: + // in practice we don't really ever want to + // consider "how many spaces are somewhere". e.prefix = strings.TrimSpace(string((*e.line)[bpos:cpos])) default: - e.prefix = comps.PREFIX + e.prefix = completions.PREFIX } } -func (e *Engine) setSuffix(comps Values) { - switch comps.SUFFIX { +func (e *Engine) setSuffix(completions Values) { + switch completions.SUFFIX { case "": cpos := e.cursor.Pos() _, epos := e.line.SelectBlankWord(cpos) @@ -81,8 +109,68 @@ func (e *Engine) setSuffix(comps Values) { e.suffix = strings.TrimSpace(string((*e.line)[cpos:epos])) default: - e.suffix = comps.SUFFIX + e.suffix = completions.SUFFIX + } +} + +// Returns a function to run on each completio group tag. +func (e *Engine) generateGroup(comps Values) func(tag string, values RawValues) { + return func(tag string, values RawValues) { + // Separate the completions that have a description and + // those which don't, and devise if there are aliases. + vals, noDescVals, descriptions := e.groupNonDescribed(&comps, values) + + // Create a "first" group with the "first" grouped values + e.newCompletionGroup(comps, tag, vals, descriptions) + + // If we have a remaining group of values without descriptions, + // we will print and use them in a separate, anonymous group. + if len(noDescVals) > 0 { + e.newCompletionGroup(comps, "", vals, descriptions) + } + } +} + +// groupNonDescribed separates values based on whether they have descriptions, or are aliases of each other. +func (e *Engine) groupNonDescribed(comps *Values, values RawValues) (vals, noDescVals RawValues, descs []string) { + var descriptions []string + + prefix := "" + if e.prefix != "\"\"" && e.prefix != "''" { + prefix = e.prefix + } + + for _, val := range values { + // Ensure all values have a display string. + if val.Display == "" { + val.Display = val.Value + } + + // Currently this is because errors are passed as completions. + if strings.HasPrefix(val.Value, prefix+"ERR") && val.Value == prefix+"_" { + comps.Messages.Add(color.FgRed + val.Display + val.Description) + + continue + } + + // Grid completions + if val.Description == "" { + noDescVals = append(noDescVals, val) + + continue + } + + descriptions = append(descriptions, val.Description) + vals = append(vals, val) + } + + // if no candidates have a description, swap + if len(vals) == 0 { + vals = noDescVals + noDescVals = make(RawValues, 0) } + + return vals, noDescVals, descriptions } func (e *Engine) currentGroup() (grp *group) { @@ -95,7 +183,7 @@ func (e *Engine) currentGroup() (grp *group) { // If there are groups but no current, make first one the king. if len(e.groups) > 0 { for _, g := range e.groups { - if len(g.values) > 0 { + if len(g.rows) > 0 { g.isCurrent = true return g } @@ -124,7 +212,7 @@ func (e *Engine) cycleNextGroup() { for { next := e.currentGroup() - if len(next.values) == 0 { + if len(next.rows) == 0 { e.cycleNextGroup() continue } @@ -151,7 +239,7 @@ func (e *Engine) cyclePreviousGroup() { for { prev := e.currentGroup() - if len(prev.values) == 0 { + if len(prev.rows) == 0 { e.cyclePreviousGroup() continue } @@ -160,6 +248,40 @@ func (e *Engine) cyclePreviousGroup() { } } +func (e *Engine) justifyGroups(values Values) { + commandGroups := make([]*group, 0) + maxCellLength := 0 + + for _, group := range e.groups { + // Skip groups that are not to be justified + justify := values.Pad[group.tag] + if !justify { + justify = values.Pad["*"] + } + + if !justify { + continue + } + + // Skip groups that are aliased or have more than one column + if group.aliased || len(group.columnsWidth) > 1 { + continue + } + + // Else this group should be justified-padded globally. + commandGroups = append(commandGroups, group) + + if group.longestValue > maxCellLength { + maxCellLength = group.longestValue + } + } + + for _, group := range commandGroups { + group.columnsWidth[0] = maxCellLength + group.longestValue = maxCellLength + } +} + func (e *Engine) adjustCycleKeys(row, column int) (int, int) { cur := e.currentGroup() @@ -190,23 +312,25 @@ func (e *Engine) adjustSelectKeymap() { } } +// completionCount returns the number of completions for a given group, +// as well as the number of real terminal lines it spans on, including +// the group name if there is one. func (e *Engine) completionCount() (comps int, used int) { for _, group := range e.groups { - groupComps := 0 - - for _, row := range group.values { - groupComps += len(row) - comps += groupComps + // First, agree on the number of comps. + for _, row := range group.rows { + comps += len(row) } - if group.maxY > len(group.values) { - used += len(group.values) - } else { - used += group.maxY + // One line for the group name + if group.tag != "" { + used++ } - if groupComps > 0 { - used++ + if group.maxY > len(group.rows) { + used += group.maxY + } else { + used += len(group.rows) } } @@ -224,18 +348,18 @@ func (e *Engine) hasUniqueCandidate() bool { return false } - if len(cur.values) == 1 { - return len(cur.values[0]) == 1 + if len(cur.rows) == 1 { + return len(cur.rows[0]) == 1 } - return len(cur.values) == 1 + return len(cur.rows) == 1 default: var count int GROUPS: for _, group := range e.groups { - for _, row := range group.values { + for _, row := range group.rows { count++ for range row { count++ @@ -252,7 +376,7 @@ func (e *Engine) hasUniqueCandidate() bool { func (e *Engine) noCompletions() bool { for _, group := range e.groups { - if len(group.values) > 0 { + if len(group.rows) > 0 { return false } } @@ -314,7 +438,7 @@ func (e *Engine) getAbsPos() int { for _, grp := range e.groups { groupComps := 0 - for _, row := range grp.values { + for _, row := range grp.rows { groupComps += len(row) } @@ -346,35 +470,6 @@ func (e *Engine) getAbsPos() int { return prev } -// getColumnPad either updates or adds a new column for an alias. -func getColumnPad(columns []int, valLen int, numAliases int) []int { - switch { - case (float64(sum(columns) + valLen)) > - (float64(term.GetWidth()) * maxValuesAreaRatio): - columnX := numAliases % len(columns) - - if columns[columnX] < valLen { - columns[columnX] = valLen - } - case numAliases > len(columns): - columns = append(columns, valLen) - case columns[numAliases-1] < valLen: - columns[numAliases-1] = valLen - } - - return columns -} - -func stringInSlice(s string, sl []string) bool { - for _, str := range sl { - if s == str { - return true - } - } - - return false -} - func sum(vals []int) (sum int) { for _, val := range vals { sum += val @@ -392,3 +487,18 @@ func hasUpper(line []rune) bool { return false } + +func longest(vals []string, trimEscapes bool) int { + var length int + for _, val := range vals { + if trimEscapes { + val = color.Strip(val) + } + + if len(val) > length { + length = len(val) + } + } + + return length +} diff --git a/vendor/github.com/reeflective/readline/internal/completion/values.go b/vendor/github.com/reeflective/readline/internal/completion/values.go index 7bbfaa97f1..5db020e3d5 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/values.go +++ b/vendor/github.com/reeflective/readline/internal/completion/values.go @@ -1,6 +1,8 @@ package completion -import "strings" +import ( + "strings" +) // RawValues is a list of completion candidates. type RawValues []Candidate @@ -62,22 +64,37 @@ func (c RawValues) EachTag(tagF func(tag string, values RawValues)) { // FilterPrefix filters values with given prefix. // If matchCase is false, the filtering is made case-insensitive. +// This function ensures that all spaces are correctly. func (c RawValues) FilterPrefix(prefix string, matchCase bool) RawValues { + if prefix == "" { + return c + } + filtered := make(RawValues, 0) if !matchCase { prefix = strings.ToLower(prefix) } - for _, r := range c { - val := r.Value + for _, raw := range c { + val := raw.Value + if !matchCase { val = strings.ToLower(val) } if strings.HasPrefix(val, prefix) { - filtered = append(filtered, r) + filtered = append(filtered, raw) } } + return filtered } + +func (c RawValues) Len() int { return len(c) } + +func (c RawValues) Swap(i, j int) { c[i], c[j] = c[j], c[i] } + +func (c RawValues) Less(i, j int) bool { + return strings.ToLower(c[i].Value) < strings.ToLower(c[j].Value) +} diff --git a/vendor/github.com/reeflective/readline/internal/core/line.go b/vendor/github.com/reeflective/readline/internal/core/line.go index b5a4526e4f..7f34c9c526 100644 --- a/vendor/github.com/reeflective/readline/internal/core/line.go +++ b/vendor/github.com/reeflective/readline/internal/core/line.go @@ -331,7 +331,7 @@ func DisplayLine(l *Line, indent int) { // Clear everything before each line, except the first. if num > 0 { - term.MoveCursorForward(indent) + term.MoveCursorForwards(indent) line = term.ClearLineBefore + line } diff --git a/vendor/github.com/reeflective/readline/internal/display/engine.go b/vendor/github.com/reeflective/readline/internal/display/engine.go index 892e9eeb09..8b0c374194 100644 --- a/vendor/github.com/reeflective/readline/internal/display/engine.go +++ b/vendor/github.com/reeflective/readline/internal/display/engine.go @@ -73,7 +73,7 @@ func (e *Engine) Refresh() { // Go back to the first column, and if the primary prompt // was not printed yet, back up to the line's beginning row. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) if !e.primaryPrinted { term.MoveCursorUp(e.cursorRow) @@ -84,7 +84,7 @@ func (e *Engine) Refresh() { // Get all positions required for the redisplay to come: // prompt end (thus indentation), cursor positions, etc. - e.computeCoordinates() + e.computeCoordinates(true) // Print the line, right prompt, hints and completions. e.displayLine() @@ -113,7 +113,7 @@ func (e *Engine) ClearHelpers() { term.MoveCursorUp(1) term.MoveCursorUp(e.lineRows) term.MoveCursorDown(e.cursorRow) - term.MoveCursorForward(e.cursorCol) + term.MoveCursorForwards(e.cursorCol) } // ResetHelpers cancels all active hints and completions. @@ -129,19 +129,19 @@ func (e *Engine) ResetHelpers() { func (e *Engine) AcceptLine() { e.CursorToLineStart() - e.computeCoordinates() + e.computeCoordinates(false) // Go back to the end of the non-suggested line. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorDown(e.lineRows) - term.MoveCursorForward(e.lineCol) + term.MoveCursorForwards(e.lineCol) fmt.Print(term.ClearScreenBelow) // Reprint the right-side prompt if it's not a tooltip one. e.prompt.RightPrint(e.lineCol, false) // Go below this non-suggested line and clear everything. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) fmt.Print(term.NewlineReturn) } @@ -166,9 +166,9 @@ func (e *Engine) RefreshTransient() { // This function should only be called when the cursor is on its // "cursor" position on the input line. func (e *Engine) CursorToLineStart() { - term.MoveCursorBackward(e.cursorCol) + term.MoveCursorBackwards(e.cursorCol) term.MoveCursorUp(e.cursorRow) - term.MoveCursorForward(e.startCols) + term.MoveCursorForwards(e.startCols) } // CursorBelowLine moves the cursor to the leftmost @@ -186,8 +186,8 @@ func (e *Engine) CursorBelowLine() { // last character of the prompt. func (e *Engine) lineStartToCursorPos() { term.MoveCursorDown(e.cursorRow) - term.MoveCursorBackward(term.GetWidth()) - term.MoveCursorForward(e.cursorCol) + term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorForwards(e.cursorCol) } // cursor is on the line below the last line of input. @@ -197,7 +197,7 @@ func (e *Engine) cursorHintToLineStart() { e.CursorToLineStart() } -func (e *Engine) computeCoordinates() { +func (e *Engine) computeCoordinates(suggested bool) { // Get the new input line and auto-suggested one. e.line, e.cursor = e.completer.Line() if e.completer.IsInserting() { @@ -222,7 +222,7 @@ func (e *Engine) computeCoordinates() { e.cursorCol, e.cursorRow = core.CoordinatesCursor(e.cursor, e.startCols) // Get the number of rows used by the line, and the end line X pos. - if e.opts.GetBool("history-autosuggest") { + if e.opts.GetBool("history-autosuggest") && suggested { e.lineCol, e.lineRows = core.CoordinatesLine(&e.suggested, e.startCols) } else { e.lineCol, e.lineRows = core.CoordinatesLine(e.line, e.startCols) @@ -285,7 +285,7 @@ func (e *Engine) displayHelpers() { e.compRows = completion.Coordinates(e.completer) // Go back to the first line below the input line. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorUp(e.compRows) term.MoveCursorUp(ui.CoordinatesHint(e.hint)) } diff --git a/vendor/github.com/reeflective/readline/internal/display/highlight.go b/vendor/github.com/reeflective/readline/internal/display/highlight.go index c45ebb8c71..5da978ca3f 100644 --- a/vendor/github.com/reeflective/readline/internal/display/highlight.go +++ b/vendor/github.com/reeflective/readline/internal/display/highlight.go @@ -174,7 +174,7 @@ func (e *Engine) hlAdd(regions []core.Selection, newHl core.Selection, line []ru // Update the highlighting with inputrc settings if any. if bg != "" && !matcher { - background := strings.ReplaceAll(e.opts.GetString("active-region-start-color"), `\e`, "\x1b") + background := color.UnquoteRC("active-region-start-color") if bg, _ = strconv.Unquote(background); bg == "" { bg = color.Reverse } diff --git a/vendor/github.com/reeflective/readline/internal/keymap/config.go b/vendor/github.com/reeflective/readline/internal/keymap/config.go index e787e2f978..fb23fbcde9 100644 --- a/vendor/github.com/reeflective/readline/internal/keymap/config.go +++ b/vendor/github.com/reeflective/readline/internal/keymap/config.go @@ -12,11 +12,18 @@ import ( // readline global options specific to this library. var readlineOptions = map[string]interface{}{ - "autocomplete": false, - "autopairs": false, + // General edition + "autopairs": false, + + // Completion + "autocomplete": false, + "completion-list-separator": "--", + "completion-selection-style": "\x1b[1;30m", + + // Prompt & General UI "transient-prompt": false, - "history-autosuggest": false, "usage-hint-always": false, + "history-autosuggest": false, } // ReloadConfig parses all valid .inputrc configurations and immediately diff --git a/vendor/github.com/reeflective/readline/internal/keymap/cursor.go b/vendor/github.com/reeflective/readline/internal/keymap/cursor.go index 07b6dee4cc..2f7d476f30 100644 --- a/vendor/github.com/reeflective/readline/internal/keymap/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/keymap/cursor.go @@ -1,6 +1,9 @@ package keymap -import "fmt" +import ( + "fmt" + "strings" +) // CursorStyle is the style of the cursor // in a given input mode/submode. @@ -46,18 +49,25 @@ var defaultCursors = map[Mode]CursorStyle{ // PrintCursor prints the cursor for the given keymap mode, // either default value or the one specified in inputrc file. +// TODO: I've been quite vicious here, I need to admit: the logic +// is not made to use the default user cursor in insert-mode. +// It didn't bother. And if that can help some getting to use +// .inputrc, so be it. func (m *Engine) PrintCursor(keymap Mode) { var cursor CursorStyle // Check for a configured cursor in .inputrc file. - modeSet := m.config.GetString(string(keymap)) - if modeSet != "" { - cursor = defaultCursors[Mode(modeSet)] + cursorOptname := fmt.Sprintf("cursor-%s", string(keymap)) + modeSet := strings.TrimSpace(m.config.GetString(cursorOptname)) + + if _, valid := cursors[CursorStyle(modeSet)]; valid { + fmt.Print(cursors[CursorStyle(modeSet)]) + return } - // If the configured one was invalid, use default one. - if cursor == "" { - cursor = defaultCursors[keymap] + if cursor, valid := defaultCursors[keymap]; valid { + fmt.Print(cursors[cursor]) + return } fmt.Print(cursors[cursor]) diff --git a/vendor/github.com/reeflective/readline/internal/term/cursor.go b/vendor/github.com/reeflective/readline/internal/term/cursor.go index 98980d166d..ac40f80ceb 100644 --- a/vendor/github.com/reeflective/readline/internal/term/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/term/cursor.go @@ -18,8 +18,8 @@ func MoveCursorDown(i int) { printf("\x1b[%dB", i) } -// MoveCursorForward moves the cursor forward i columns. -func MoveCursorForward(i int) { +// MoveCursorForwards moves the cursor forward i columns. +func MoveCursorForwards(i int) { if i < 1 { return } @@ -27,8 +27,8 @@ func MoveCursorForward(i int) { printf("\x1b[%dC", i) } -// MoveCursorBackward moves the cursor backward i columns. -func MoveCursorBackward(i int) { +// MoveCursorBackwards moves the cursor backward i columns. +func MoveCursorBackwards(i int) { if i < 1 { return } diff --git a/vendor/github.com/reeflective/readline/internal/term/term.go b/vendor/github.com/reeflective/readline/internal/term/term.go index fcf730696a..e9d8512fa4 100644 --- a/vendor/github.com/reeflective/readline/internal/term/term.go +++ b/vendor/github.com/reeflective/readline/internal/term/term.go @@ -31,7 +31,7 @@ func GetWidth() (termWidth int) { fd := int(stdoutTerm.Fd()) termWidth, _, err = GetSize(fd) - if err != nil { + if err != nil || termWidth == 0 { termWidth = defaultTermWidth } diff --git a/vendor/github.com/reeflective/readline/internal/ui/prompt.go b/vendor/github.com/reeflective/readline/internal/ui/prompt.go index e253278ac4..44ef0ac0ff 100644 --- a/vendor/github.com/reeflective/readline/internal/ui/prompt.go +++ b/vendor/github.com/reeflective/readline/internal/ui/prompt.go @@ -212,7 +212,7 @@ func (p *Prompt) TransientPrint() { } // Clean everything below where the prompt will be printed. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorUp(p.primaryRows) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/readline/shell.go b/vendor/github.com/reeflective/readline/shell.go index 3a346efec3..da50a63876 100644 --- a/vendor/github.com/reeflective/readline/shell.go +++ b/vendor/github.com/reeflective/readline/shell.go @@ -144,7 +144,7 @@ func (rl *Shell) Printf(msg string, args ...any) (n int, err error) { // First go back to the last line of the input line, // and clear everything below (hints and completions). rl.Display.CursorBelowLine() - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) fmt.Print(term.ClearScreenBelow) // Skip a line, and print the formatted message. @@ -163,7 +163,7 @@ func (rl *Shell) PrintTransientf(msg string, args ...any) (n int, err error) { // First go back to the beginning of the line/prompt, and // clear everything below (prompt/line/hints/completions). rl.Display.CursorToLineStart() - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorUp(rl.Prompt.PrimaryUsed()) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index 75940500f0..d391305563 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -225,16 +225,28 @@ func (tc *Client) Users() (users []team.User, err error) { return res, nil } -// ServerVersion returns the version information of the server to which +// VersionClient returns the version information of the client, and thus +// does not require the teamclient to be connected to a teamserver. +// This function satisfies the VersionClient() function of the team.Client interface, +// which means that library users are free to reimplement it however they wish. +func (tc *Client) VersionClient() (ver team.Version, err error) { + if tc.client == nil { + return ver, ErrNoTeamclient + } + + return +} + +// VersionServer returns the version information of the server to which // the client is connected. // If the teamclient has no backend, it returns an ErrNoTeamclient error. // If the backend returns an error, the latter is returned as is. -func (tc *Client) ServerVersion() (ver team.Version, err error) { +func (tc *Client) VersionServer() (ver team.Version, err error) { if tc.client == nil { return ver, ErrNoTeamclient } - version, err := tc.client.Version() + version, err := tc.client.VersionServer() if err != nil { return } diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index f3dfa5993e..f5f59f0216 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -23,7 +23,6 @@ import ( "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/version" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -42,7 +41,7 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro } // Server - serverVer, err := cli.ServerVersion() + serverVer, err := cli.VersionServer() if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) } @@ -56,14 +55,19 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) // Client + clientVer, err := cli.Version() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Client error: %s\n", err) + return nil + } + cdirty := "" - if version.GitDirty() { + if clientVer.Dirty { cdirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) } - cliVer := version.Semantic() - cliSemVer := fmt.Sprintf("%d.%d.%d", cliVer[0], cliVer[1], cliVer[2]) - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, version.GitCommit(), cdirty) + cliSemVer := fmt.Sprintf("%d.%d.%d", clientVer.Major, clientVer.Minor, clientVer.Patch) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, clientVer.Commit, cdirty) return nil } diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go index 448a2c0885..96430bf471 100644 --- a/vendor/github.com/reeflective/team/client/directories.go +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -57,7 +57,7 @@ func (tc *Client) HomeDir() string { // creating the directory if needed, or logging an error event if failing to create it. // This directory is used to store teamclient logs and remote server configs. func (tc *Client) TeamDir() string { - dir := filepath.Join(tc.HomeDir(), assets.DirClient) + dir := filepath.Join(tc.HomeDir(), tc.opts.teamDir) err := tc.fs.MkdirAll(dir, log.DirPerm) if err != nil { diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index 4b0b81d385..864ca353c4 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -24,9 +24,12 @@ import ( "os" "strings" + "github.com/reeflective/team/internal/assets" "github.com/sirupsen/logrus" ) +const noTeamdir = "no team subdirectory" + // Options are client options. // You can set or modify the behavior of a teamclient at various // steps with these options, which are a variadic parameter of @@ -39,6 +42,7 @@ type Options func(opts *opts) type opts struct { homeDir string + teamDir string noLogs bool logFile string inMemory bool @@ -77,6 +81,13 @@ func (tc *Client) apply(options ...Options) { tc.dialer = tc.opts.dialer } + // Team directory. + if tc.opts.teamDir == noTeamdir { + tc.opts.teamDir = "" + } else if tc.opts.teamDir == "" { + tc.opts.teamDir = assets.DirClient + } + if tc.opts.stdout != nil { tc.stdoutLogger.Out = tc.opts.stdout } @@ -91,7 +102,7 @@ func (tc *Client) apply(options ...Options) { // This might be useful for testing, or if you happen to embed a teamclient in a program // without the intent of using it now, etc. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithInMemory() Options { return func(opts *opts) { opts.noLogs = true @@ -110,13 +121,30 @@ func WithConfig(config *Config) Options { // WithHomeDirectory sets the default path (~/.app/) of the application directory. // This path can still be overridden at the user-level with the env var APP_ROOT_DIR. // -// This option can only be used once, and must be passed to server.New(). +// This option can only be used once, and must be passed client.New(). func WithHomeDirectory(path string) Options { return func(opts *opts) { opts.homeDir = path } } +// WithTeamDirectory sets the name (not a path) of the teamclient-specific subdirectory. +// For example, passing "my_team_dir" will make the teamclient use ~/.app/my_team_dir/ +// instead of ~/.app/teamclient/. +// If this function is called with an empty string, the teamclient will not use any +// subdirectory for its own outputs, thus using ~/.app as its teamclient directory. +// +// This option can only be used once, and should be passed client.New(). +func WithTeamDirectory(name string) Options { + return func(opts *opts) { + if name == "" { + name = noTeamdir + } + + opts.teamDir = name + } +} + // // *** Logging options *** // @@ -124,7 +152,7 @@ func WithHomeDirectory(path string) Options { // WithNoLogs deactivates all logging normally done by the teamclient // if noLogs is set to true, or keeps/reestablishes them if false. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithNoLogs(noLogs bool) Options { return func(opts *opts) { opts.noLogs = noLogs @@ -134,7 +162,7 @@ func WithNoLogs(noLogs bool) Options { // WithLogFile sets the path to the file where teamclient logging should be done. // If not specified, the client log file is ~/.app/teamclient/logs/app.teamclient.log. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithLogFile(filePath string) Options { return func(opts *opts) { opts.logFile = filePath @@ -143,7 +171,7 @@ func WithLogFile(filePath string) Options { // WithLogger sets the teamclient to use a specific logger for logging. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithLogger(logger *logrus.Logger) Options { return func(opts *opts) { opts.logger = logger @@ -177,7 +205,7 @@ func WithDialer(dialer Dialer) Options { // If this is the case, this option will ensure that any cobra client command // runners produced by this library will not disconnect after each execution. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithNoDisconnect() Options { return func(opts *opts) { opts.console = true diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 458c078634..6f562c4f30 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -154,15 +154,20 @@ func (ts *Server) Name() string { // of the application using this teamserver. // See the server.Listener and client.Dialer types documentation for more. func (ts *Server) Self(opts ...client.Options) *client.Client { - // opts = append(opts, client.WithLocalDialer()) - teamclient, _ := client.New(ts.Name(), ts, opts...) return teamclient } +// Version implements team.Client.VersionClient() interface +// method, so that the teamserver can be a teamclient of itself. +// This simply returns the server.VersionServer() output. +func (ts *Server) VersionClient() (team.Version, error) { + return ts.VersionServer() +} + // Version returns the teamserver binary version information. -func (ts *Server) Version() (team.Version, error) { +func (ts *Server) VersionServer() (team.Version, error) { semVer := version.Semantic() compiled, _ := version.Compiled() diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go index 188aa7436f..4c96c2a79a 100644 --- a/vendor/github.com/reeflective/team/server/directories.go +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -19,8 +19,6 @@ package server */ import ( - "fmt" - "os" "os/user" "path" "path/filepath" @@ -60,7 +58,7 @@ func (ts *Server) HomeDir() string { // creating the directory if needed, or logging an error event if failing to create it. // This directory is used to store teamserver certificates, database, logs, and configs. func (ts *Server) TeamDir() string { - dir := path.Join(ts.HomeDir(), assets.DirServer) + dir := path.Join(ts.HomeDir(), ts.opts.teamDir) err := ts.fs.MkdirAll(dir, log.DirPerm) if err != nil { @@ -95,32 +93,3 @@ func (ts *Server) CertificatesDir() string { return certDir } - -// When creating a new server, don't write anything to anywhere yet, -// but ensure that at least all directories to which we are supposed -// to write do indeed exist, and make them anyway. -// If any error happens it will returned right away and the creator -// of the teamserver will know right away that it can't work correctly. -func (ts *Server) checkWritableFiles() error { - if ts.opts.inMemory { - return nil - } - - // Check home application directory. - // If it does not exist but we don't have write permission - // on /user/home, we return an error as we can't work. - appDirWrite, err := log.IsWritable(ts.TeamDir()) - - switch { - case os.IsNotExist(err): - if homeWritable, err := log.IsWritable(os.Getenv("HOME")); !homeWritable { - return fmt.Errorf("Cannot create %w", err) - } - case err != nil: - return fmt.Errorf("Cannot write to %w", err) - case !appDirWrite: - return ErrDirectoryUnwritable - } - - return nil -} diff --git a/vendor/github.com/reeflective/team/server/options.go b/vendor/github.com/reeflective/team/server/options.go index 97a26e7f16..fe0b1488ad 100644 --- a/vendor/github.com/reeflective/team/server/options.go +++ b/vendor/github.com/reeflective/team/server/options.go @@ -23,11 +23,14 @@ import ( "os" "strings" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/db" "github.com/sirupsen/logrus" "gorm.io/gorm" ) +const noTeamdir = "no team subdirectory" + // Options are server options. // With these you can set/reset or modify the behavior of a teamserver // at various stages of its lifetime, or when performing some specific @@ -40,6 +43,7 @@ type Options func(opts *opts) type opts struct { homeDir string + teamDir string logFile string local bool noLogs bool @@ -80,6 +84,13 @@ func (ts *Server) apply(options ...Options) { ts.homeDir = ts.opts.homeDir } + // Team directory. + if ts.opts.teamDir == noTeamdir { + ts.opts.teamDir = "" + } else if ts.opts.teamDir == "" { + ts.opts.teamDir = assets.DirServer + } + // User-defined database. if ts.opts.db != nil { ts.db = ts.opts.db @@ -161,6 +172,23 @@ func WithHomeDirectory(path string) Options { } } +// WithTeamDirectory sets the name (not a path) of the teamserver-specific subdirectory. +// For example, passing "my_server_dir" will make the teamserver use ~/.app/my_server_dir/ +// instead of ~/.app/teamserver/. +// If this function is called with an empty string, the teamserver will not use any +// subdirectory for its own outputs, thus using ~/.app as its teamserver directory. +// +// This option can only be used once, and must be passed to server.New(). +func WithTeamDirectory(name string) Options { + return func(opts *opts) { + if name == "" { + name = noTeamdir + } + + opts.teamDir = name + } +} + // // *** Logging options *** // diff --git a/vendor/github.com/reeflective/team/teamclient.go b/vendor/github.com/reeflective/team/teamclient.go index 9a58747bb0..07fdefd54a 100644 --- a/vendor/github.com/reeflective/team/teamclient.go +++ b/vendor/github.com/reeflective/team/teamclient.go @@ -28,8 +28,12 @@ import "time" // is to be provided by the teamclients and teamservers alike. // - To harmonize the use of team/client and team/server core drivers. type Client interface { + // Users returns the list of teamserver users and their status. Users() ([]User, error) - Version() (Version, error) + // VersionClient returns the compilation/version information for the client. + VersionClient() (Version, error) + // VersionServer returns the compilation/version information from a connected teamserver. + VersionServer() (Version, error) } // User represents a teamserver user. diff --git a/vendor/modules.txt b/vendor/modules.txt index 4615c0c69f..2ff0cca93f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -520,7 +520,7 @@ github.com/psanford/memfs github.com/reeflective/console github.com/reeflective/console/commands/readline # github.com/reeflective/readline v1.0.8 => /home/user/code/github.com/reeflective/readline -## explicit; go 1.20 +## explicit; go 1.21 github.com/reeflective/readline github.com/reeflective/readline/inputrc github.com/reeflective/readline/internal/color From 41aa386c1c2317a56f2249f71a3348fdaa932ebd Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 05:59:22 +0200 Subject: [PATCH 086/109] Update following dependencies --- go.mod | 7 +- go.sum | 12 +- .../console/commands/readline/bind.go | 5 +- .../console/commands/readline/commands.go | 3 +- .../console/commands/readline/completers.go | 30 ++- .../console/commands/readline/export.go | 3 +- .../console/commands/readline/set.go | 5 +- .../{tab-completer.go => completer.go} | 186 ++++++++++++------ .../{syntax-highlighter.go => highlighter.go} | 0 vendor/github.com/reeflective/console/menu.go | 19 +- vendor/github.com/reeflective/console/run.go | 75 ++----- .../reeflective/team/client/client.go | 2 +- .../team/client/commands/version.go | 2 +- vendor/modules.txt | 9 +- 14 files changed, 187 insertions(+), 171 deletions(-) rename vendor/github.com/reeflective/console/{tab-completer.go => completer.go} (65%) rename vendor/github.com/reeflective/console/{syntax-highlighter.go => highlighter.go} (100%) diff --git a/go.mod b/go.mod index 23d1c6c81a..1a2907bf99 100644 --- a/go.mod +++ b/go.mod @@ -5,15 +5,11 @@ go 1.21 // A fork of the completion engine is currently used in order to consume the engine // as a library. The fork is a very slightly patched mainline tree for that purpose, // and is regularly maintained up-to-date with upstream. Should be removed long-term. -replace github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d // Team is the teamserver/teamclient library, and this directive should be removed. replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team -replace github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline - -//replace github.com/reeflective/console => /home/user/code/github.com/reeflective/console - require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -152,7 +148,6 @@ require ( github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rsteube/carapace-shlex v0.0.4 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect github.com/tailscale/golang-x-crypto v0.0.0-20221115211329-17a3db2c30d2 // indirect github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect diff --git a/go.sum b/go.sum index e99618c340..db479f293f 100644 --- a/go.sum +++ b/go.sum @@ -339,12 +339,12 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7u3sKdsKHQRQluOfwv/eXsw+v+r9h50cf1kU8= -github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a h1:eH0mArXKs7CljsUX6dhN/+IJlhvQ2I0Mg0ku8Ah0Hao= -github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= +github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs+3CMJnfXc5SNEg+Kbu4A2AVljPuG5/HcaUdM= +github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDFXw2I= github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= +github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= +github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -353,10 +353,6 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rsteube/carapace v0.43.0 h1:XFUouYcQxx/LNffsM7ivltFvBKGtawHieD1RvZ+vl2U= -github.com/rsteube/carapace v0.43.0/go.mod h1:1l4sZA+/sGW9sBLqEholUd+kn9xKgh2ghBFDYC3D/zA= -github.com/rsteube/carapace-shlex v0.0.4 h1:3GVn8PaM2RCxPTAiwVy9vDQI8Mi7DqrbdpDgf5ZzQmY= -github.com/rsteube/carapace-shlex v0.0.4/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index 2af32deb5f..a370360d1c 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -6,11 +6,10 @@ import ( "os" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index cb89c6c650..e3ec1bf03b 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,9 +1,8 @@ package readline import ( - "github.com/spf13/cobra" - "github.com/reeflective/readline" + "github.com/spf13/cobra" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go index fa3ee06b69..c384db29e0 100644 --- a/vendor/github.com/reeflective/console/commands/readline/completers.go +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -20,12 +20,12 @@ package readline import ( "fmt" - - "github.com/rsteube/carapace" - "github.com/spf13/cobra" + "strings" "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) func completeKeymaps(sh *readline.Shell, _ *cobra.Command) carapace.Action { @@ -60,22 +60,34 @@ func completeBindSequences(sh *readline.Shell, cmd *cobra.Command) carapace.Acti } // Make a list of all sequences bound to each command, with descriptions. - cmdBinds := make([]string, 0) - insertBinds := make([]string, 0) + var cmdBinds, insertBinds []string for key, bind := range binds { + val := inputrc.Escape(key) + if bind.Action == "self-insert" { - insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") + insertBinds = append(insertBinds, val) } else { - cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") + cmdBinds = append(cmdBinds, val) cmdBinds = append(cmdBinds, bind.Action) } } - return carapace.Batch( + // Build the list of bind sequences bompletions + completions := carapace.Batch( carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), - ).ToA() + ).ToA().Suffix("\"") + + // We're lucky and be particularly cautious about completion here: + // Look for the current argument and check whether or not it's quoted. + // If yes, only include quotes at the end of the inserted value. + // If no quotes, include them in both. + if strings.HasPrefix(ctx.Value, "\"") || ctx.Value == "" { + completions = completions.Prefix("\"") + } + + return completions }) } diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go index 67f70e9ff2..0030f15c8a 100644 --- a/vendor/github.com/reeflective/console/commands/readline/export.go +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -23,10 +23,9 @@ import ( "sort" "strings" - "github.com/spf13/cobra" - "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" + "github.com/spf13/cobra" ) const ( diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index ee0a2da046..39c1e51db2 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -5,14 +5,13 @@ import ( "strconv" "strings" + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "golang.org/x/exp/maps" "golang.org/x/exp/slices" - - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" ) var ( diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/completer.go similarity index 65% rename from vendor/github.com/reeflective/console/tab-completer.go rename to vendor/github.com/reeflective/console/completer.go index 5418bdfc0b..374c6eaab7 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/completer.go @@ -7,6 +7,7 @@ import ( "os" "regexp" "strings" + "unicode" "unicode/utf8" "github.com/reeflective/readline" @@ -20,17 +21,12 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { // Split the line as shell words, only using // what the right buffer (up to the cursor) - rbuffer := line[:pos] - args, prefix := splitArgs(rbuffer) - args = sanitizeArgs(rbuffer, args) + args, prefixComp, prefixLine := splitArgs(line, pos) // Prepare arguments for the carapace completer // (we currently need those two dummies for avoiding a panic). args = append([]string{"examples", "_carapace"}, args...) - // Regenerate a new instance of the commands. - // menu.hideFilteredCommands(cmd) - // Call the completer with our current command context. values, meta := carapace.Complete(menu.Command, args, c.completeCommands(menu)) @@ -38,14 +34,13 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { raw := make([]readline.Completion, len(values)) for idx, val := range values { - value := readline.Completion{ - Value: val.Value, + raw[idx] = readline.Completion{ + Value: unescapeValue(prefixComp, prefixLine, val.Value), Display: val.Display, Description: val.Description, Style: val.Style, Tag: val.Tag, } - raw[idx] = value } // Assign both completions and command/flags/args usage strings. @@ -58,66 +53,19 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { comps = comps.NoSpace([]rune(meta.Nospace.String())...) } + // Other status/error messages + for _, msg := range meta.Messages.Get() { + comps = comps.Merge(readline.CompleteMessage(msg)) + } + // If we have a quote/escape sequence unaccounted // for in our completions, add it to all of them. - if prefix != "" { - comps = comps.Prefix(prefix) - } + comps = comps.Prefix(prefixComp) + comps.PREFIX = prefixLine return comps } -func splitArgs(line []rune) (args []string, prefix string) { - // Remove all colors from the string - line = []rune(strip(string(line))) - - // Split the line as shellwords, return them if all went fine. - args, remain, err := splitCompWords(string(line)) - if err == nil { - return args, remain - } - - // If we had an error, it's because we have an unterminated quote/escape sequence. - // In this case we split the remainder again, as the completer only ever considers - // words as space-separated chains of characters. - if errors.Is(err, errUnterminatedDoubleQuote) { - remain = strings.Trim(remain, "\"") - prefix = "\"" - } else if errors.Is(err, errUnterminatedSingleQuote) { - remain = strings.Trim(remain, "'") - prefix = "'" - } - - args = append(args, strings.Split(remain, " ")...) - - return -} - -func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { - // Like in classic system shells, we need to add an empty - // argument if the last character is a space: the args - // returned from the previous call don't account for it. - if strings.HasSuffix(string(rbuffer), " ") || len(args) == 0 { - args = append(args, "") - } else if strings.HasSuffix(string(rbuffer), "\n") { - args = append(args, "") - } - - if len(args) == 0 { - return - } - - sanitized = args[:len(args)-1] - last := args[len(args)-1] - - // The last word should not comprise newlines. - last = strings.ReplaceAll(last, "\n", " ") - last = strings.ReplaceAll(last, "\\ ", " ") - sanitized = append(sanitized, last) - - return sanitized -} - // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { @@ -175,6 +123,109 @@ func (c *Console) defaultStyleConfig() { style.Set("carapace.FlagOptArg", "bright-white") } +// splitArgs splits the line in valid words, prepares them in various ways before calling +// the completer with them, and also determines which parts of them should be used as +// prefixes, in the completions and/or in the line. +func splitArgs(line []rune, pos int) (args []string, prefixComp, prefixLine string) { + line = line[:pos] + + // Remove all colors from the string + line = []rune(strip(string(line))) + + // Split the line as shellwords, return them if all went fine. + args, remain, err := splitCompWords(string(line)) + + // We might have either no error and args, or no error and + // the cursor ready to complete a new word (last character + // in line is a space). + // In some of those cases we append a single dummy argument + // for the completer to understand we want a new word comp. + mustComplete, args, remain := mustComplete(line, args, remain, err) + if mustComplete { + return sanitizeArgs(args), "", remain + } + + // But the completion candidates themselves might need slightly + // different prefixes, for an optimal completion experience. + arg, prefixComp, prefixLine := adjustQuotedPrefix(remain, err) + + // The remainder is everything following the open charater. + // Pass it as is to the carapace completion engine. + args = append(args, arg) + + return sanitizeArgs(args), prefixComp, prefixLine +} + +func mustComplete(line []rune, args []string, remain string, err error) (bool, []string, string) { + dummyArg := "" + + // Empty command line, complete the root command. + if len(args) == 0 || len(line) == 0 { + return true, append(args, dummyArg), remain + } + + // If we have an error, we must handle it later. + if err != nil { + return false, args, remain + } + + lastChar := line[len(line)-1] + + // No remain and a trailing space means we want to complete + // for the next word, except when this last space was escaped. + if remain == "" && unicode.IsSpace(lastChar) { + if strings.HasSuffix(string(line), "\\ ") { + return true, args, args[len(args)-1] + } + + return true, append(args, dummyArg), remain + } + + // Else there is a character under the cursor, which means we are + // in the middle/at the end of a posentially completed word. + return true, args, remain +} + +func adjustQuotedPrefix(remain string, err error) (arg, comp, line string) { + arg = remain + + switch { + case errors.Is(err, errUnterminatedDoubleQuote): + comp = "\"" + line = comp + arg + case errors.Is(err, errUnterminatedSingleQuote): + comp = "'" + line = comp + arg + case errors.Is(err, errUnterminatedEscape): + arg = strings.ReplaceAll(arg, "\\", "") + } + + return arg, comp, line +} + +// sanitizeArg unescapes a restrained set of characters. +func sanitizeArgs(args []string) (sanitized []string) { + for _, arg := range args { + arg = replacer.Replace(arg) + sanitized = append(sanitized, arg) + } + + return sanitized +} + +// when the completer has returned us some completions, we sometimes +// needed to post-process them a little before passing them to our shell. +func unescapeValue(prefixComp, prefixLine, val string) string { + quoted := strings.HasPrefix(prefixLine, "\"") || + strings.HasPrefix(prefixLine, "'") + + if quoted { + val = strings.ReplaceAll(val, "\\ ", " ") + } + + return val +} + // split has been copied from go-shellquote and slightly modified so as to also // return the remainder when the parsing failed because of an unterminated quote. func splitCompWords(input string) (words []string, remainder string, err error) { @@ -206,8 +257,7 @@ func splitCompWords(input string) (words []string, remainder string, err error) word, input, err = splitCompWord(input, &buf) if err != nil { - remainder = input - return + return words, word + input, err } words = append(words, word) @@ -320,3 +370,9 @@ var re = regexp.MustCompile(ansi) func strip(str string) string { return re.ReplaceAllString(str, "") } + +var replacer = strings.NewReplacer( + "\n", ` `, + "\t", ` `, + "\\ ", " ", // User-escaped spaces in words. +) diff --git a/vendor/github.com/reeflective/console/syntax-highlighter.go b/vendor/github.com/reeflective/console/highlighter.go similarity index 100% rename from vendor/github.com/reeflective/console/syntax-highlighter.go rename to vendor/github.com/reeflective/console/highlighter.go diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 49967455e5..2159719330 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -192,15 +192,17 @@ func (m *Menu) Printf(msg string, args ...any) (n int, err error) { return m.console.Printf(buf) } -// ErrUnavailableCommand checks if a target command is marked as filtered as per the console -// application registered/and or active filters (added with console.Hide/ShowCommand()), and -// if yes, returns a template-formatted error message showing the list of incompatible filters. -func (m *Menu) ErrUnavailableCommand(target *cobra.Command) error { - if target == nil { +// CheckIsAvailable checks if a target command is marked as filtered +// by the console application registered/and or active filters (added +// with console.Hide/ShowCommand()). +// If filtered, returns a template-formatted error message showing the +// list of incompatible filters. If not filtered, no error is returned. +func (m *Menu) CheckIsAvailable(cmd *cobra.Command) error { + if cmd == nil { return nil } - filters := m.ActiveFiltersFor(target) + filters := m.ActiveFiltersFor(cmd) if len(filters) == 0 { return nil } @@ -209,7 +211,7 @@ func (m *Menu) ErrUnavailableCommand(target *cobra.Command) error { err := tmpl(&bufErr, m.errorFilteredCommandTemplate(filters), map[string]interface{}{ "menu": m, - "cmd": target, + "cmd": cmd, "filters": filters, }) @@ -322,8 +324,7 @@ func (m *Menu) errorFilteredCommandTemplate(filters []string) string { } return `Command {{.cmd.Name}} is only available for: {{range .filters }} - - {{.}} -{{end}}` + - {{.}} {{end}}` } // tmpl executes the given template text on data, writing the result to w. diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index e6dc7bd3b8..b14a7df415 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -89,47 +89,25 @@ func (c *Console) Start() error { } } -// ExecuteOnce is a wrapper around the classic one-time cobra command execution. -// This call is thus blocking during the entire parsing and execution process -// of a command-line. -// -// This function should be useful if you have trees of commands that can -// be executed both in closed-loop applications or in a one-off exec style. -// Normally, most commands should, if your command behavior/API has no magic. -// -// The command line (os.Args) is matched against the currently active menu. -// Be sure to set and verify this menu before calling this function. -// This function also does not print any application logo. -func (c *Console) ExecuteOnce() error { - // Always ensure we work with the active menu, with freshly - // generated commands, bound prompts and some other things. - menu := c.activeMenu() - menu.resetPreRun() - - c.printed = false - - if c.NewlineBefore { - fmt.Println() - } - - // Run user-provided pre-run line hooks, - // which may modify the input line args. - args, err := c.runLineHooks(os.Args) - if err != nil { - return fmt.Errorf("line error: %s\n", err.Error()) - } +// RunCommandArgs is a convenience function to run a command line in a given menu. +// After running, the menu's commands are reset, and the prompts reloaded, therefore +// mostly mimicking the behavior that is the one of the normal readline/run/readline +// workflow. +// Although state segregation is a priority for this library to be ensured as much +// as possible, you should be cautious when using this function to run commands. +func (m *Menu) RunCommandArgs(args []string) (err error) { + // The menu used and reset is the active menu. + // Prepare its output buffer for the command. + m.resetPreRun() - // Run all pre-run hooks and the command itself - // Don't check the error: if its a cobra error, - // the library user is responsible for setting - // the cobra behavior. - // If it's an interrupt, we take care of it. - return c.execute(menu, args, false) + // Run the command and associated helpers. + return m.console.execute(m, args, !m.console.isExecuting) } -// RunCommand is a convenience function to run a command in a given menu. -// After running, the menu commands are reset, and the prompts reloaded. -func (m *Menu) RunCommand(line string) (err error) { +// RunCommandLine is the equivalent of menu.RunCommandArgs(), but accepts +// an unsplit command line to execute. This line is split and processed in +// *sh-compliant form, identically to how lines are in normal console usage. +func (m *Menu) RunCommandLine(line string) (err error) { if len(line) == 0 { return } @@ -140,12 +118,7 @@ func (m *Menu) RunCommand(line string) (err error) { return fmt.Errorf("line error: %w", err) } - // The menu used and reset is the active menu. - // Prepare its output buffer for the command. - m.resetPreRun() - - // Run the command and associated helpers. - return m.console.execute(m, args, !m.console.isExecuting) + return m.RunCommandArgs(args) } // execute - The user has entered a command input line, the arguments have been processed: @@ -173,7 +146,7 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) - if err := menu.ErrUnavailableCommand(target); err != nil { + if err := menu.CheckIsAvailable(target); err != nil { return err } @@ -231,18 +204,6 @@ func (c *Console) executeCommand(cmd *cobra.Command, cancel context.CancelCauseF cancel(nil) } -// Generally, an empty command entered should just print a new prompt, -// unlike for classic CLI usage when the program will print its usage string. -// We simply remove any RunE from the root command, so that nothing is -// printed/executed by default. Pre/Post runs are still used if any. -func (c *Console) ensureNoRootRunner() { - if c.activeMenu().Command != nil { - c.activeMenu().RunE = func(cmd *cobra.Command, args []string) error { - return nil - } - } -} - func (c *Console) loadActiveHistories() { c.shell.History.Delete() diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index d391305563..ccfcb363d8 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -234,7 +234,7 @@ func (tc *Client) VersionClient() (ver team.Version, err error) { return ver, ErrNoTeamclient } - return + return tc.client.VersionClient() } // VersionServer returns the version information of the server to which diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index f5f59f0216..ec2bcca863 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -55,7 +55,7 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) // Client - clientVer, err := cli.Version() + clientVer, err := cli.VersionClient() if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Client error: %s\n", err) return nil diff --git a/vendor/modules.txt b/vendor/modules.txt index 2ff0cca93f..ec029eee00 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -515,11 +515,11 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a -## explicit; go 1.20 +# github.com/reeflective/console v0.1.7 +## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline -# github.com/reeflective/readline v1.0.8 => /home/user/code/github.com/reeflective/readline +# github.com/reeflective/readline v1.0.9 ## explicit; go 1.21 github.com/reeflective/readline github.com/reeflective/readline/inputrc @@ -556,7 +556,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +# github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -1267,4 +1267,3 @@ tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet # github.com/reeflective/team => /home/user/code/github.com/reeflective/team -# github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline From 3355627516f97f4639b3314b26b54ff1febeed87 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 05:59:52 +0200 Subject: [PATCH 087/109] Mostly display fixes and enhancements --- client/cli/implant.go | 12 ++++++------ client/command/creds/creds.go | 4 ++-- client/command/history/history.go | 5 ++++- client/console/events.go | 2 +- client/console/readline.go | 2 +- client/console/teamclient.go | 24 ++++++++++++++++++++++-- server/command/builder/builder.go | 15 ++++++++------- 7 files changed, 44 insertions(+), 20 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 2d235061d2..c98e32a6b9 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -80,17 +80,17 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd session := con.GetSession(target) if session != nil { con.ActiveTarget.Set(session, nil) - } - - beacon := con.GetBeacon(target) - if beacon != nil { - con.ActiveTarget.Set(nil, beacon) + } else { + beacon := con.GetBeacon(target) + if beacon != nil { + con.ActiveTarget.Set(nil, beacon) + } } // If the command is marked filtered (should not be ran in // the current context/target), don't do anything and return. // This is identical to the filtering behavior in the console. - if err := con.App.ActiveMenu().ErrUnavailableCommand(cmd); err != nil { + if err := con.App.ActiveMenu().CheckIsAvailable(cmd); err != nil { return err } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 4cd7338859..1253416021 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -124,7 +124,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { - return carapace.Action{} + return carapace.ActionMessage("No credentials in database") } for _, cred := range creds.Credentials { @@ -151,7 +151,7 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { - return carapace.Action{} + return carapace.ActionMessage("No credentials in database") } for _, cred := range creds.Credentials { diff --git a/client/command/history/history.go b/client/command/history/history.go index 8578f909ca..27bba1cecf 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -24,6 +24,7 @@ import ( "time" "github.com/fatih/color" + "github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -33,6 +34,8 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) +const sgrPrefix = "\033[" + // Commands returns all commands related to implant history. func Commands(con *console.SliverClient) []*cobra.Command { historyCmd := &cobra.Command{ @@ -78,7 +81,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { preLine := color.HiBlackString("%-3s", strconv.Itoa(i)) if !user { - preLine += fmt.Sprintf("%*s\t", 5, color.YellowString(command.User)) + preLine += fmt.Sprintf("%*s\t", 5, sgrPrefix+ui.ApplyStyling(ui.Style{}, ui.FgYellow).SGR()+"m"+command.User) } if showTime { preLine += color.BlueString(time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp)) + "\t" diff --git a/client/console/events.go b/client/console/events.go index c9699412a8..42cb7b8812 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -202,7 +202,7 @@ func (con *SliverClient) triggerReactions(event *clientpb.Event) { for _, reaction := range reactions { for _, line := range reaction.Commands { con.PrintInfof(Bold+"Execute reaction: '%s'"+Normal, line) - err := con.App.ActiveMenu().RunCommand(line) + err := con.App.ActiveMenu().RunCommandLine(line) if err != nil { con.PrintErrorf("Reaction command error: %s\n", err) } diff --git a/client/console/readline.go b/client/console/readline.go index 578b69f8d4..ab701edb45 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -44,7 +44,7 @@ func (con *SliverClient) GetPrompt() string { prompt += fmt.Sprintf(Bold+Blue+" (%s)%s", con.ActiveTarget.GetBeacon().Name, Normal) } prompt += " > " - return Clearln + prompt + return prompt } // PrintLogo prints the Sliver console logo. diff --git a/client/console/teamclient.go b/client/console/teamclient.go index f703e54359..16b5da8408 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -21,10 +21,12 @@ package console import ( "context" "errors" + "runtime" "time" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" + "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team" @@ -46,7 +48,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { con.FilterCommands(cmd) // If commands are imcompatible with the current requirements. - err := con.App.ActiveMenu().ErrUnavailableCommand(cmd) + err := con.App.ActiveMenu().CheckIsAvailable(cmd) if err != nil { return err } @@ -158,9 +160,27 @@ func (con *SliverClient) Users() (users []team.User, err error) { return } +// Version implements team.Client.VersionClient() interface method, overriding +// the default teamclient version output to use our Makefile-prepared one. +func (con *SliverClient) VersionClient() (v team.Version, err error) { + dirty := version.GitDirty != "" + semVer := version.SemanticVersion() + compiled, _ := version.Compiled() + return team.Version{ + Major: int32(semVer[0]), + Minor: int32(semVer[1]), + Patch: int32(semVer[2]), + Commit: version.GitCommit, + Dirty: dirty, + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil +} + // ServerVersion returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. -func (con *SliverClient) Version() (version team.Version, err error) { +func (con *SliverClient) VersionServer() (version team.Version, err error) { if con.Rpc == nil { return version, errors.New("No Sliver client RPC") } diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index b589d68a99..974ee9ee2c 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -25,7 +25,13 @@ import ( "runtime/debug" "strings" - "github.com/bishopfox/sliver/client/command/flags" + "github.com/reeflective/team/client" + "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/server" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" @@ -34,11 +40,6 @@ import ( "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" - "github.com/reeflective/team/client" - "github.com/reeflective/team/client/commands" - "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) var builderLog = log.NamedLogger("cli", "builder") @@ -74,7 +75,7 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { builderCmd.Flags().StringSlice(enableTargetFlagStr, []string{}, "force enable a target: format:goos/goarch") builderCmd.Flags().StringSlice(disableTargetFlagStr, []string{}, "force disable target arch: format:goos/goarch") - flags.BindFlagCompletions(builderCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(builderCmd, func(comp *carapace.ActionMap) { (*comp)["enable-target"] = builderFormatsCompleter() (*comp)["disable-target"] = builderFormatsCompleter() (*comp)["config"] = commands.ConfigsAppCompleter(con.Teamclient, "detected Sliver configs") From 3415cce1ec418a7a32509dee29d057f9194391d9 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 09:23:38 +0200 Subject: [PATCH 088/109] Fixes to logging --- client/console/console.go | 1 + client/console/log.go | 26 ++++++++++++++++++ client/transport/middleware.go | 49 ++++++++++++++++++++++++++++++++-- server/transport/server.go | 4 ++- vendor/modules.txt | 1 - 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index b1a6fa1de5..2ddb4be033 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -159,6 +159,7 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), client.WithDialer(con.dialer), + client.WithLogger(initTeamclientLog()), ) // Create a new reeflective/team.Client, which is in charge of selecting, diff --git a/client/console/log.go b/client/console/log.go index 8779241b3d..f967fcddc0 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -29,6 +29,7 @@ import ( "time" "github.com/moloch--/asciicast" + "github.com/sirupsen/logrus" "golang.org/x/exp/slog" "golang.org/x/term" @@ -197,6 +198,31 @@ func getConsoleAsciicastFile() *os.File { return logFile } +// initTeamclientLog returns a logrus logger to be passed to the Sliver +// team.Client for logging all client-side transport/RPC events. +func initTeamclientLog() (*logrus.Logger) { + logsDir := assets.GetConsoleLogsDir() + dateTime := time.Now().Format("2006-01-02_15-04-05") + logPath := filepath.Join(logsDir, fmt.Sprintf("%s.log", dateTime)) + + textLogger := logrus.New() + textLogger.SetFormatter(&logrus.TextFormatter{}) + + logFile, err := os.OpenFile(logPath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644) + if err != nil { + log.Fatalf("Failed to open log file %s", err) + return textLogger + } + + // Text-format logger, writing to file. + textLogger.Out = logFile + + textLogger.SetLevel(logrus.InfoLevel) + textLogger.SetReportCaller(true) + + return textLogger +} + // // -------------------------- [ Logging ] ----------------------------- // diff --git a/client/transport/middleware.go b/client/transport/middleware.go index 6ff8d3ab8a..135b95b349 100644 --- a/client/transport/middleware.go +++ b/client/transport/middleware.go @@ -26,8 +26,9 @@ import ( grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/common" + "github.com/sirupsen/logrus" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" ) @@ -57,7 +58,7 @@ type TokenAuth string func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { logrusEntry := cli.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), + grpc_logrus.WithLevels(codeToLevel), } grpc_logrus.ReplaceGrpcLogger(logrusEntry) @@ -84,6 +85,8 @@ func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { return options } +// TLSAuthMiddleware returns the TLS credentials and token authentication options +// built from a given team.Client and its active (target) remote server configuration. func TLSAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { config := cli.Config() if config.PrivateKey == "" { @@ -115,3 +118,45 @@ func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[strin func (TokenAuth) RequireTransportSecurity() bool { return true } + +// Maps a grpc response code to a logging level +func codeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.InfoLevel + case codes.Canceled: + return logrus.InfoLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.InfoLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.InfoLevel + case codes.AlreadyExists: + return logrus.InfoLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.InfoLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} diff --git a/server/transport/server.go b/server/transport/server.go index 4ae54e25ac..5d1f5b5834 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -24,6 +24,7 @@ import ( "runtime/debug" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" "github.com/reeflective/team/server" @@ -88,6 +89,7 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // It returns a teamclient meant to be ran in memory, with TLS credentials disabled. func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOption { conn := bufconn.Listen(bufSize) + insecureCreds := insecure.NewCredentials() ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return conn.Dial() @@ -95,7 +97,7 @@ func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOp opts = append(opts, []grpc.DialOption{ ctxDialer, - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecureCreds), }...) // The server will use this conn as a listener. diff --git a/vendor/modules.txt b/vendor/modules.txt index ec029eee00..968b6a048b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -549,7 +549,6 @@ github.com/reeflective/team/internal/systemd github.com/reeflective/team/internal/version github.com/reeflective/team/server github.com/reeflective/team/server/commands -github.com/reeflective/team/transports/grpc/common # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft From c0810eeb476789639fc2780a3a09078b95cb1b9e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 01:57:21 +0200 Subject: [PATCH 089/109] Update team dependency with first release --- go.mod | 12 ++-- go.sum | 6 ++ server/transport/tailscale.go | 4 +- .../github.com/reeflective/team/.golangci.yml | 11 +++- .../reeflective/team/client/client.go | 28 +++++++- .../team/client/commands/version.go | 26 ++++---- .../team/server/commands/teamserver.go | 14 +++- .../team/transports/grpc/common/log.go | 66 ------------------- 8 files changed, 74 insertions(+), 93 deletions(-) delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/common/log.go diff --git a/go.mod b/go.mod index 1a2907bf99..e59cb2a1e4 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ go 1.21 replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d // Team is the teamserver/teamclient library, and this directive should be removed. -replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team +// replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team require ( filippo.io/age v1.1.1 @@ -37,25 +37,25 @@ require ( github.com/miekg/dns v1.1.55 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 - github.com/ncruces/go-sqlite3 v0.8.1 + github.com/ncruces/go-sqlite3 v0.8.4 github.com/reeflective/console v0.1.7 github.com/reeflective/readline v1.0.9 - github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 + github.com/reeflective/team v0.1.0 github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.2 - github.com/tetratelabs/wazero v1.2.1 + github.com/tetratelabs/wazero v1.4.0 github.com/things-go/go-socks5 v0.0.3 github.com/xlab/treeprint v1.2.0 github.com/yiya1989/sshkrb5 v0.0.0-20201110125252-a1455b75a35e golang.org/x/crypto v0.10.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/net v0.11.0 - golang.org/x/sys v0.9.0 + golang.org/x/sys v0.11.0 golang.org/x/term v0.9.0 - golang.org/x/text v0.10.0 + golang.org/x/text v0.12.0 golang.zx2c4.com/wireguard v0.0.0-20220316235147-5aff28b14c24 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220208144051-fde48d68ee68 google.golang.org/grpc v1.56.1 diff --git a/go.sum b/go.sum index db479f293f..d2748b1c9a 100644 --- a/go.sum +++ b/go.sum @@ -320,6 +320,7 @@ github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945/go.mod h1:1grVt4HaTofvhFUZYtofeRbGXfczNwCie9MYoM4lP/o= github.com/ncruces/go-sqlite3 v0.8.1 h1:e1Y7uHu96xC4fWKsCVWprbTi8vAaQX9R+8kgkxOHWaY= github.com/ncruces/go-sqlite3 v0.8.1/go.mod h1:EhHe1qvG6Zc/8ffYMzre8n//rTRs1YNN5dUD1f1mEGc= +github.com/ncruces/go-sqlite3 v0.8.4/go.mod h1:XvDtjKk5MgwHX7L4I7BPzzKl36bTZ7+Hr6Kr2QeVkVw= github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FBZk= github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -345,6 +346,8 @@ github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDF github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= +github.com/reeflective/team v0.1.0 h1:QsByDuinPxSir2KH1/tCFyQ3W1z/YBX9Y4SwVbU1hK0= +github.com/reeflective/team v0.1.0/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -391,6 +394,7 @@ github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ0 github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= github.com/tetratelabs/wazero v1.2.1 h1:J4X2hrGzJvt+wqltuvcSjHQ7ujQxA9gb6PeMs4qlUWs= github.com/tetratelabs/wazero v1.2.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tetratelabs/wazero v1.4.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0= github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs= github.com/things-go/go-socks5 v0.0.3 h1:QtlIhkwDuLNCwW3wnt2uTjn1mQzpyjnwct2xdPuqroI= @@ -515,6 +519,7 @@ golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepC golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= @@ -527,6 +532,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 412aba7873..3d239beaf2 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -73,7 +73,7 @@ func (ts *tailscaleTeamserver) Listen(addr string) (ln net.Listener, err error) } } - tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%d", hostname, port) + tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%s", hostname, port) authKey := os.Getenv("TS_AUTHKEY") if authKey == "" { @@ -93,7 +93,7 @@ func (ts *tailscaleTeamserver) Listen(addr string) (ln net.Listener, err error) AuthKey: authKey, } - ln, err = tsNetServer.Listen("tcp", fmt.Sprintf(":%d", port)) + ln, err = tsNetServer.Listen("tcp", fmt.Sprintf(":%s", port)) if err != nil { return nil, err } diff --git a/vendor/github.com/reeflective/team/.golangci.yml b/vendor/github.com/reeflective/team/.golangci.yml index 5389185b52..b27a7fdc0e 100644 --- a/vendor/github.com/reeflective/team/.golangci.yml +++ b/vendor/github.com/reeflective/team/.golangci.yml @@ -183,10 +183,10 @@ linters: - godot # checks if comments end in a period (style,cmt) - godox # tool for detection of FIXME, TODO and other comments (style,cmt) - goerr113 # checks the errors handling expressions (style,err) - - gofmt # formats and checks for code simplification (fmt) - - gofumpt # checks whether code was gofumpt-ed (fmt) + # - gofmt # formats and checks for code simplification (fmt) + # - gofumpt # checks whether code was gofumpt-ed (fmt) - goheader # checks if file header matches to pattern (style) - # - goimports # fixes imports, formats code same as gofmt (fmt,import) + #- goimports # fixes imports, formats code same as gofmt (fmt,import) # - golint # Deprecated - gomnd # analyzer to detect magic numbers (style) - gomoddirectives # manage replace/retract/excludes directives in go.mod (style,mod) @@ -280,6 +280,8 @@ linters: - musttag - wrapcheck # checks errors returned from external packages are wrapped (style,err) - tagliatelle # checks struct tags (style) + - gofmt # formats and checks for code simplification (fmt) + - gofumpt # checks whether code was gofumpt-ed (fmt) # Run only fast linters from enabled linters set (first run won't be fast) # Default: false @@ -337,6 +339,9 @@ linters-settings: paralleltest: ignore-missing: true + goimports: + local-prefixes: github.com/reeflective/team + # # ----------------------- Other exclusions & Issues management -------------------------- # # diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index ccfcb363d8..9c9e77632c 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -21,10 +21,12 @@ package client import ( "os/user" "path/filepath" + "runtime" "sync" "github.com/reeflective/team" "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/version" "github.com/sirupsen/logrus" ) @@ -230,11 +232,31 @@ func (tc *Client) Users() (users []team.User, err error) { // This function satisfies the VersionClient() function of the team.Client interface, // which means that library users are free to reimplement it however they wish. func (tc *Client) VersionClient() (ver team.Version, err error) { - if tc.client == nil { - return ver, ErrNoTeamclient + if tc.client != nil { + return tc.client.VersionClient() + } + + semVer := version.Semantic() + compiled, _ := version.Compiled() + + var major, minor, patch int32 + + if len(semVer) == 3 { + major = int32(semVer[0]) + minor = int32(semVer[1]) + patch = int32(semVer[2]) } - return tc.client.VersionClient() + return team.Version{ + Major: major, + Minor: minor, + Patch: patch, + Commit: version.GitCommit(), + Dirty: version.GitDirty(), + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil } // VersionServer returns the version information of the server to which diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index ec2bcca863..975c0d96c2 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -20,6 +20,7 @@ package commands import ( "fmt" + "time" "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" @@ -46,13 +47,14 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) } - dirty := "" - if serverVer.Dirty { - dirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) - } + serverVerInfo := fmt.Sprintf("Server v%d.%d.%d - %s - %s/%s\n", + serverVer.Major, serverVer.Minor, serverVer.Patch, serverVer.Commit, + serverVer.OS, serverVer.Arch) + serverCompiledAt := time.Unix(serverVer.CompiledAt, 0) - serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) + fmt.Fprint(cmd.OutOrStdout(), command.Info+serverVerInfo) + fmt.Fprintf(cmd.OutOrStdout(), " Compiled at %s\n", serverCompiledAt) + fmt.Fprintln(cmd.OutOrStdout()) // Client clientVer, err := cli.VersionClient() @@ -61,13 +63,13 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro return nil } - cdirty := "" - if clientVer.Dirty { - cdirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) - } + clientVerInfo := fmt.Sprintf("Client v%d.%d.%d - %s - %s/%s\n", + clientVer.Major, clientVer.Minor, clientVer.Patch, clientVer.Commit, + clientVer.OS, clientVer.Arch) + clientCompiledAt := time.Unix(clientVer.CompiledAt, 0) - cliSemVer := fmt.Sprintf("%d.%d.%d", clientVer.Major, clientVer.Minor, clientVer.Patch) - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, clientVer.Commit, cdirty) + fmt.Fprint(cmd.OutOrStdout(), command.Info+clientVerInfo) + fmt.Fprintf(cmd.OutOrStdout(), " Compiled at %s\n", clientCompiledAt) return nil } diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index f5fe3f288e..4a3fff0b76 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -62,6 +62,17 @@ func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) erro } }() + // cli args take precedence over config (this is here for status printing purposes) + if lhost == "" { + lhost = serv.GetConfig().DaemonMode.Host + } + + if lport == 0 { + lport = uint16(serv.GetConfig().DaemonMode.Port) + } + + fmt.Fprintf(cmd.OutOrStdout(), "Starting %s teamserver daemon on %s:%d ...", serv.Name(), lhost, lport) + // Blocking call, your program will only exit/resume on Ctrl-C/SIGTERM return serv.ServeDaemon(lhost, lport) } @@ -214,6 +225,7 @@ func statusCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { cfg := serv.GetConfig() dbCfg := serv.DatabaseConfig() + database := fmt.Sprintf("%s - %s [%s:%d] ", dbCfg.Dialect, dbCfg.Database, dbCfg.Host, dbCfg.Port) // General options, in-memory, default port, config path, database, etc @@ -230,7 +242,7 @@ func statusCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { fmt.Fprintln(cmd.OutOrStdout(), formatSection("Logging")) fmt.Fprint(cmd.OutOrStdout(), displayGroup([]string{ - "Level", fakeLog.Level.String(), + "Level", fakeLog.Logger.Level.String(), "Root", log.FileName(filepath.Join(serv.LogsDir(), serv.Name()), true), "Audit", filepath.Join(serv.LogsDir(), "audit.json"), })) diff --git a/vendor/github.com/reeflective/team/transports/grpc/common/log.go b/vendor/github.com/reeflective/team/transports/grpc/common/log.go deleted file mode 100644 index 476805ca89..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/common/log.go +++ /dev/null @@ -1,66 +0,0 @@ -package common - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "github.com/sirupsen/logrus" - "google.golang.org/grpc/codes" -) - -// Maps a grpc response code to a logging level. -func CodeToLevel(code codes.Code) logrus.Level { - switch code { - case codes.OK: - return logrus.DebugLevel - case codes.Canceled: - return logrus.DebugLevel - case codes.Unknown: - return logrus.ErrorLevel - case codes.InvalidArgument: - return logrus.WarnLevel - case codes.DeadlineExceeded: - return logrus.WarnLevel - case codes.NotFound: - return logrus.DebugLevel - case codes.AlreadyExists: - return logrus.DebugLevel - case codes.PermissionDenied: - return logrus.WarnLevel - case codes.Unauthenticated: - return logrus.WarnLevel - case codes.ResourceExhausted: - return logrus.WarnLevel - case codes.FailedPrecondition: - return logrus.WarnLevel - case codes.Aborted: - return logrus.WarnLevel - case codes.OutOfRange: - return logrus.WarnLevel - case codes.Unimplemented: - return logrus.ErrorLevel - case codes.Internal: - return logrus.ErrorLevel - case codes.Unavailable: - return logrus.WarnLevel - case codes.DataLoss: - return logrus.ErrorLevel - default: - return logrus.ErrorLevel - } -} From 90760ecf634787fff7e752051d0d3f0e86c5532c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 01:57:53 +0200 Subject: [PATCH 090/109] Update vendor dependencies --- go.mod | 1 + go.sum | 14 +- .../github.com/ncruces/go-sqlite3/README.md | 11 +- .../github.com/ncruces/go-sqlite3/backup.go | 2 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 18 +- vendor/github.com/ncruces/go-sqlite3/const.go | 20 +- .../github.com/ncruces/go-sqlite3/context.go | 174 + .../ncruces/go-sqlite3/driver/driver.go | 31 +- .../ncruces/go-sqlite3/embed/README.md | 1 + .../ncruces/go-sqlite3/embed/build.sh | 2 +- .../ncruces/go-sqlite3/embed/exports.txt | 29 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1427169 -> 1432950 bytes vendor/github.com/ncruces/go-sqlite3/error.go | 22 + vendor/github.com/ncruces/go-sqlite3/func.go | 186 + vendor/github.com/ncruces/go-sqlite3/go.work | 2 +- .../github.com/ncruces/go-sqlite3/go.work.sum | 4 + .../ncruces/go-sqlite3/gormlite/LICENSE | 22 + .../ncruces/go-sqlite3/gormlite/README.md | 26 + .../ncruces/go-sqlite3/gormlite/ddlmod.go | 231 + .../ncruces/go-sqlite3/gormlite/download.sh | 11 + .../go-sqlite3/gormlite/error_translator.go | 21 + .../ncruces/go-sqlite3/gormlite/migrator.go | 431 + .../ncruces/go-sqlite3/gormlite/sqlite.go | 219 + .../ncruces/go-sqlite3/gormlite/test.sh | 24 + .../ncruces/go-sqlite3/gormlite/tests.patch | 31 + .../ncruces/go-sqlite3/internal/util/func.go | 26 + .../go-sqlite3/internal/util/handle.go | 75 + .../go-sqlite3/{module.go => sqlite.go} | 204 +- vendor/github.com/ncruces/go-sqlite3/stmt.go | 27 +- vendor/github.com/ncruces/go-sqlite3/value.go | 125 + .../github.com/ncruces/go-sqlite3/vfs/api.go | 2 +- .../ncruces/go-sqlite3/vfs/clear.go | 9 + .../github.com/ncruces/go-sqlite3/vfs/vfs.go | 67 +- vendor/github.com/reeflective/team/LICENSE | 674 ++ vendor/github.com/reeflective/team/README.md | 283 +- .../reeflective/team/client/client.go | 28 +- .../team/client/commands/commands.go | 85 +- .../team/client/commands/import.go | 5 +- .../reeflective/team/client/commands/users.go | 5 +- .../team/client/commands/version.go | 5 +- .../reeflective/team/client/config.go | 6 +- .../reeflective/team/client/directories.go | 11 +- .../reeflective/team/client/options.go | 3 + .../reeflective/team/internal/assets/fs.go | 24 +- .../reeflective/team/internal/certs/ca.go | 6 +- .../reeflective/team/internal/certs/certs.go | 7 +- .../reeflective/team/internal/certs/tls.go | 5 +- .../team/internal/command/command.go | 22 +- .../reeflective/team/internal/db/sql-cgo.go | 6 +- .../reeflective/team/internal/db/sql-go.go | 6 +- .../reeflective/team/internal/db/sql-wasm.go | 3 + .../reeflective/team/internal/db/sql.go | 11 +- .../reeflective/team/internal/log/cli.go | 38 +- .../reeflective/team/internal/log/log.go | 19 +- .../reeflective/team/internal/log/perms.go | 2 +- .../team/internal/systemd/config.go | 2 + .../team/internal/version/.gitignore | 1 - .../internal/version/teamserver_version_info | 14 - .../team/internal/version/version.go | 2 +- .../team/server/commands/commands.go | 7 +- .../team/server/commands/completers.go | 3 +- .../team/server/commands/teamserver.go | 5 +- .../reeflective/team/server/commands/user.go | 14 +- .../reeflective/team/server/config.go | 23 +- .../reeflective/team/server/core.go | 4 +- .../github.com/reeflective/team/server/db.go | 20 +- .../reeflective/team/server/directories.go | 24 +- .../reeflective/team/server/jobs.go | 4 +- .../reeflective/team/server/server.go | 11 +- .../reeflective/team/server/users.go | 6 +- vendor/github.com/tetratelabs/wazero/Makefile | 18 +- .../tetratelabs/wazero/RATIONALE.md | 593 +- .../github.com/tetratelabs/wazero/api/wasm.go | 19 + .../github.com/tetratelabs/wazero/config.go | 26 +- .../tetratelabs/wazero/experimental/close.go | 63 + .../wazero/experimental/sys/dir.go | 92 + .../wazero/experimental/sys/errno.go | 95 + .../platform => experimental/sys}/error.go | 27 +- .../wazero/experimental/sys/file.go | 317 + .../tetratelabs/wazero/experimental/sys/fs.go | 293 + .../wazero/experimental/sys/oflag.go | 70 + .../wazero/experimental/sys/syscall_errno.go | 104 + .../sys/syscall_errno_notwindows.go | 13 + .../experimental/sys/syscall_errno_plan9.go | 5 + .../experimental/sys/syscall_errno_windows.go | 62 + .../wazero/experimental/sys/time.go | 10 + .../wazero/experimental/sys/unimplemented.go | 160 + .../github.com/tetratelabs/wazero/fsconfig.go | 56 +- .../imports/wasi_snapshot_preview1/args.go | 14 +- .../imports/wasi_snapshot_preview1/clock.go | 26 +- .../imports/wasi_snapshot_preview1/environ.go | 14 +- .../imports/wasi_snapshot_preview1/fs.go | 621 +- .../imports/wasi_snapshot_preview1/poll.go | 166 +- .../imports/wasi_snapshot_preview1/random.go | 12 +- .../imports/wasi_snapshot_preview1/sched.go | 4 +- .../imports/wasi_snapshot_preview1/sock.go | 41 +- .../testdata/gotip/wasi.go | 237 +- .../testdata/tinygo/wasi.go | 88 + .../testdata/tinygo/wasi.wasm | Bin 0 -> 109235 bytes .../imports/wasi_snapshot_preview1/wasi.go | 10 +- .../wazero/internal/close/close.go | 13 + .../wazero/internal/engine/compiler/engine.go | 57 +- .../internal/engine/compiler/engine_cache.go | 9 +- .../internal/engine/compiler/impl_amd64.go | 7 +- .../internal/engine/compiler/impl_arm64.go | 34 +- .../wazero/internal/fsapi/constants.go | 13 - .../wazero/internal/fsapi/constants_js.go | 8 - .../wazero/internal/fsapi/constants_sun.go | 12 - .../internal/fsapi/constants_windows.go | 24 - .../tetratelabs/wazero/internal/fsapi/dir.go | 99 - .../tetratelabs/wazero/internal/fsapi/file.go | 373 +- .../tetratelabs/wazero/internal/fsapi/fs.go | 365 - .../tetratelabs/wazero/internal/fsapi/poll.go | 20 + .../tetratelabs/wazero/internal/fsapi/stat.go | 48 - .../wazero/internal/fsapi/unimplemented.go | 204 +- .../wazero/internal/platform/errno.go | 9 - .../wazero/internal/platform/errno_windows.go | 72 - .../wazero/internal/platform/fdset.go | 23 - .../wazero/internal/platform/fdset_darwin.go | 8 - .../wazero/internal/platform/fdset_linux.go | 8 - .../internal/platform/fdset_unsupported.go | 10 - .../wazero/internal/platform/mmap_other.go | 2 +- .../wazero/internal/platform/platform.go | 11 +- .../tetratelabs/wazero/internal/sock/sock.go | 15 +- .../wazero/internal/sock/sock_supported.go | 11 + .../wazero/internal/sock/sock_unsupported.go | 10 + .../tetratelabs/wazero/internal/sys/fs.go | 572 +- .../tetratelabs/wazero/internal/sys/lazy.go | 153 +- .../tetratelabs/wazero/internal/sys/stdio.go | 73 +- .../tetratelabs/wazero/internal/sys/sys.go | 16 +- .../wazero/internal/sysfs/adapter.go | 109 +- .../wazero/internal/sysfs/chown.go | 30 - .../wazero/internal/sysfs/chown_unix.go | 13 - .../internal/sysfs/chown_unsupported.go | 11 - .../wazero/internal/sysfs/datasync_linux.go | 6 +- .../internal/sysfs/datasync_unsupported.go | 5 +- .../tetratelabs/wazero/internal/sysfs/dir.go | 18 +- .../wazero/internal/sysfs/dirfs.go | 97 +- .../tetratelabs/wazero/internal/sysfs/file.go | 362 +- .../wazero/internal/sysfs/file_test.go | 339 +- .../wazero/internal/sysfs/file_unix.go | 26 +- .../wazero/internal/sysfs/file_unsupported.go | 26 +- .../wazero/internal/sysfs/file_windows.go | 88 + .../wazero/internal/sysfs/futimens.go | 131 +- .../wazero/internal/sysfs/futimens_darwin.go | 34 +- .../wazero/internal/sysfs/futimens_linux.go | 36 +- .../internal/sysfs/futimens_unsupported.go | 17 +- .../wazero/internal/sysfs/futimens_windows.go | 51 +- .../tetratelabs/wazero/internal/sysfs/ino.go | 22 + .../wazero/internal/sysfs/ino_plan9.go | 15 + .../wazero/internal/sysfs/ino_windows.go | 28 + .../wazero/internal/sysfs/nonblock_plan9.go | 11 + .../wazero/internal/sysfs/nonblock_unix.go | 16 +- .../wazero/internal/sysfs/nonblock_windows.go | 24 +- .../wazero/internal/sysfs/oflag.go | 38 + .../wazero/internal/sysfs/open_file.go | 26 - .../wazero/internal/sysfs/open_file_darwin.go | 26 + .../internal/sysfs/open_file_freebsd.go | 24 + .../wazero/internal/sysfs/open_file_js.go | 19 - .../wazero/internal/sysfs/open_file_linux.go | 28 + .../internal/sysfs/open_file_notwindows.go | 20 + .../wazero/internal/sysfs/open_file_sun.go | 30 +- .../internal/sysfs/open_file_unsupported.go | 18 + .../internal/sysfs/open_file_windows.go | 89 +- .../wazero/internal/sysfs/osfile.go | 216 +- .../tetratelabs/wazero/internal/sysfs/poll.go | 18 + .../wazero/internal/sysfs/poll_darwin.go | 55 + .../wazero/internal/sysfs/poll_darwin.s | 8 + .../wazero/internal/sysfs/poll_linux.go | 57 + .../wazero/internal/sysfs/poll_unsupported.go | 13 + .../wazero/internal/sysfs/poll_windows.go | 224 + .../wazero/internal/sysfs/readfs.go | 265 +- .../wazero/internal/sysfs/rename.go | 8 +- .../wazero/internal/sysfs/rename_plan9.go | 14 + .../wazero/internal/sysfs/rename_windows.go | 68 +- .../wazero/internal/sysfs/rootfs.go | 559 -- .../wazero/internal/sysfs/select.go | 36 - .../wazero/internal/sysfs/select_darwin.go | 45 - .../wazero/internal/sysfs/select_darwin.s | 8 - .../wazero/internal/sysfs/select_linux.go | 18 - .../internal/sysfs/select_unsupported.go | 14 - .../wazero/internal/sysfs/select_windows.go | 127 - .../tetratelabs/wazero/internal/sysfs/sock.go | 12 +- .../wazero/internal/sysfs/sock_unix.go | 99 +- .../wazero/internal/sysfs/sock_unsupported.go | 6 +- .../wazero/internal/sysfs/sock_windows.go | 223 +- .../tetratelabs/wazero/internal/sysfs/stat.go | 28 +- .../wazero/internal/sysfs/stat_bsd.go | 57 +- .../wazero/internal/sysfs/stat_linux.go | 57 +- .../wazero/internal/sysfs/stat_unsupported.go | 42 +- .../wazero/internal/sysfs/stat_windows.go | 96 +- .../tetratelabs/wazero/internal/sysfs/sync.go | 7 +- .../wazero/internal/sysfs/sync_windows.go | 9 +- .../wazero/internal/sysfs/unlink.go | 10 +- .../wazero/internal/sysfs/unlink_plan9.go | 12 + .../wazero/internal/sysfs/unlink_windows.go | 14 +- .../wazero/internal/wasip1/errno.go | 43 +- .../wazero/internal/wasip1/rights.go | 2 +- .../wazero/internal/wasm/module_instance.go | 13 +- .../tetratelabs/wazero/internal/wasm/store.go | 4 + .../tetratelabs/wazero/netlify.toml | 2 +- .../github.com/tetratelabs/wazero/runtime.go | 14 +- .../github.com/tetratelabs/wazero/sys/stat.go | 107 + .../tetratelabs/wazero/sys/stat_bsd.go | 29 + .../tetratelabs/wazero/sys/stat_linux.go | 32 + .../wazero/sys/stat_unsupported.go | 17 + .../tetratelabs/wazero/sys/stat_windows.go | 26 + vendor/golang.org/x/sys/unix/mkerrors.sh | 4 +- vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + vendor/golang.org/x/sys/unix/mremap.go | 53 + vendor/golang.org/x/sys/unix/syscall_aix.go | 15 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 14 - .../golang.org/x/sys/unix/syscall_darwin.go | 50 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 58 +- .../x/sys/unix/syscall_linux_amd64.go | 2 +- .../x/sys/unix/syscall_linux_arm64.go | 2 +- .../x/sys/unix/syscall_linux_loong64.go | 2 +- .../x/sys/unix/syscall_linux_mips64x.go | 2 +- .../x/sys/unix/syscall_linux_riscv64.go | 13 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 13 +- .../golang.org/x/sys/unix/syscall_solaris.go | 14 - vendor/golang.org/x/sys/unix/syscall_unix.go | 8 + .../x/sys/unix/syscall_zos_s390x.go | 14 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 26 +- .../x/sys/unix/zerrors_linux_386.go | 9 + .../x/sys/unix/zerrors_linux_amd64.go | 9 + .../x/sys/unix/zerrors_linux_arm.go | 9 + .../x/sys/unix/zerrors_linux_arm64.go | 11 + .../x/sys/unix/zerrors_linux_loong64.go | 9 + .../x/sys/unix/zerrors_linux_mips.go | 9 + .../x/sys/unix/zerrors_linux_mips64.go | 9 + .../x/sys/unix/zerrors_linux_mips64le.go | 9 + .../x/sys/unix/zerrors_linux_mipsle.go | 9 + .../x/sys/unix/zerrors_linux_ppc.go | 9 + .../x/sys/unix/zerrors_linux_ppc64.go | 9 + .../x/sys/unix/zerrors_linux_ppc64le.go | 9 + .../x/sys/unix/zerrors_linux_riscv64.go | 9 + .../x/sys/unix/zerrors_linux_s390x.go | 9 + .../x/sys/unix/zerrors_linux_sparc64.go | 9 + .../golang.org/x/sys/unix/zsyscall_linux.go | 13 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 16 + .../x/sys/unix/zsyscall_netbsd_386.go | 11 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm64.go | 11 + .../x/sys/unix/zsysnum_linux_riscv64.go | 2 + .../x/sys/unix/zsysnum_linux_s390x.go | 1 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 40 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 + .../x/sys/unix/ztypes_linux_amd64.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 + .../x/sys/unix/ztypes_linux_arm64.go | 2 + .../x/sys/unix/ztypes_linux_loong64.go | 2 + .../x/sys/unix/ztypes_linux_mips.go | 2 + .../x/sys/unix/ztypes_linux_mips64.go | 2 + .../x/sys/unix/ztypes_linux_mips64le.go | 2 + .../x/sys/unix/ztypes_linux_mipsle.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 + .../x/sys/unix/ztypes_linux_ppc64.go | 2 + .../x/sys/unix/ztypes_linux_ppc64le.go | 2 + .../x/sys/unix/ztypes_linux_riscv64.go | 25 + .../x/sys/unix/ztypes_linux_s390x.go | 2 + .../x/sys/unix/ztypes_linux_sparc64.go | 2 + vendor/golang.org/x/sys/windows/service.go | 4 + .../x/sys/windows/svc/mgr/recovery.go | 27 + .../x/sys/windows/syscall_windows.go | 4 +- .../golang.org/x/text/cases/tables13.0.0.go | 4 +- .../golang.org/x/text/cases/tables15.0.0.go | 2528 ++++++ .../text/internal/language/compact/tables.go | 356 +- .../x/text/internal/language/tables.go | 4686 +++++----- vendor/golang.org/x/text/language/match.go | 2 +- vendor/golang.org/x/text/language/tables.go | 138 +- .../x/text/secure/precis/tables13.0.0.go | 4 +- .../x/text/secure/precis/tables15.0.0.go | 4316 +++++++++ .../x/text/unicode/bidi/tables13.0.0.go | 4 +- .../x/text/unicode/bidi/tables15.0.0.go | 2043 +++++ .../x/text/unicode/norm/tables13.0.0.go | 4 +- .../x/text/unicode/norm/tables15.0.0.go | 7908 +++++++++++++++++ .../golang.org/x/text/width/tables13.0.0.go | 4 +- .../golang.org/x/text/width/tables15.0.0.go | 1368 +++ vendor/modules.txt | 22 +- 281 files changed, 29875 insertions(+), 7701 deletions(-) create mode 100644 vendor/github.com/ncruces/go-sqlite3/context.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/func.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/go.work.sum create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/README.md create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go rename vendor/github.com/ncruces/go-sqlite3/{module.go => sqlite.go} (57%) create mode 100644 vendor/github.com/ncruces/go-sqlite3/value.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/clear.go create mode 100644 vendor/github.com/reeflective/team/LICENSE delete mode 100644 vendor/github.com/reeflective/team/internal/version/.gitignore delete mode 100644 vendor/github.com/reeflective/team/internal/version/teamserver_version_info create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/close.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go rename vendor/github.com/tetratelabs/wazero/{internal/platform => experimental/sys}/error.go (54%) create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/file.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/time.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go create mode 100644 vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go create mode 100644 vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.wasm create mode 100644 vendor/github.com/tetratelabs/wazero/internal/close/close.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/errno.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_linux.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_windows.go create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/text/cases/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/secure/precis/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/width/tables15.0.0.go diff --git a/go.mod b/go.mod index e59cb2a1e4..ff937aa9a5 100644 --- a/go.mod +++ b/go.mod @@ -141,6 +141,7 @@ require ( github.com/mdlayher/socket v0.4.1 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/ncruces/go-sqlite3/gormlite v0.8.4 // indirect github.com/ncruces/julianday v0.1.5 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index d2748b1c9a..4a45586f2f 100644 --- a/go.sum +++ b/go.sum @@ -318,9 +318,10 @@ github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/ github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B+gPPjbjINdufl0UXqyYplE0aGhx8= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945/go.mod h1:1grVt4HaTofvhFUZYtofeRbGXfczNwCie9MYoM4lP/o= -github.com/ncruces/go-sqlite3 v0.8.1 h1:e1Y7uHu96xC4fWKsCVWprbTi8vAaQX9R+8kgkxOHWaY= -github.com/ncruces/go-sqlite3 v0.8.1/go.mod h1:EhHe1qvG6Zc/8ffYMzre8n//rTRs1YNN5dUD1f1mEGc= +github.com/ncruces/go-sqlite3 v0.8.4 h1:nizhgJMMJJBrthESCwF30+oOvQkdtizgJ/v35Y0v+vg= github.com/ncruces/go-sqlite3 v0.8.4/go.mod h1:XvDtjKk5MgwHX7L4I7BPzzKl36bTZ7+Hr6Kr2QeVkVw= +github.com/ncruces/go-sqlite3/gormlite v0.8.4 h1:omeGR0XofGGwlbWB5QSEdPQC0j58fDEULrVMLXTIt+M= +github.com/ncruces/go-sqlite3/gormlite v0.8.4/go.mod h1:52uZNxrd8iQVjmxE6l3Dt71zoHpwnoDDFIqB1wW1+Cg= github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FBZk= github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -392,8 +393,7 @@ github.com/tailscale/wireguard-go v0.0.0-20230410165232-af172621b4dd h1:+fBevMGm github.com/tailscale/wireguard-go v0.0.0-20230410165232-af172621b4dd/go.mod h1:QRIcq2+DbdIC5sKh/gcAZhuqu6WT6L6G8/ALPN5wqYw= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= -github.com/tetratelabs/wazero v1.2.1 h1:J4X2hrGzJvt+wqltuvcSjHQ7ujQxA9gb6PeMs4qlUWs= -github.com/tetratelabs/wazero v1.2.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tetratelabs/wazero v1.4.0 h1:9/MirYvmkJ/zSUOygKY/ia3t+e+RqIZXKbylIby1WYk= github.com/tetratelabs/wazero v1.4.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0= github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs= @@ -517,8 +517,7 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -530,8 +529,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 819fb9d6f1..838679176b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -50,19 +50,22 @@ OFD locks are fully compatible with process-associated POSIX advisory locks. On BSD Unixes, this module uses [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2). -BSD locks may _not_ be compatible with process-associated POSIX advisory locks. +BSD locks may _not_ be compatible with process-associated POSIX advisory locks +(they are on FreeBSD). #### Testing -The pure Go VFS is tested by running an unmodified build of SQLite's +The pure Go VFS is tested by running SQLite's [mptest](https://github.com/sqlite/sqlite/blob/master/mptest/mptest.c) -on Linux, macOS and Windows. +on Linux, macOS and Windows; +BSD code paths are tested on macOS using the `sqlite3_bsd` build tag. Performance is tested by running [speedtest1](https://github.com/sqlite/sqlite/blob/master/test/speedtest1.c). ### Roadmap - [ ] advanced SQLite features + - [x] custom functions - [x] nested transactions - [x] incremental BLOB I/O - [x] online backup @@ -72,7 +75,7 @@ Performance is tested by running - [x] in-memory VFS - [x] read-only VFS, wrapping an [`io.ReaderAt`](https://pkg.go.dev/io#ReaderAt) - [ ] cloud-based VFS, based on [Cloud Backed SQLite](https://sqlite.org/cloudsqlite/doc/trunk/www/index.wiki) -- [ ] custom SQL functions + - [ ] [MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control) VFS, using [BadgerDB](https://github.com/dgraph-io/badger) ### Alternatives diff --git a/vendor/github.com/ncruces/go-sqlite3/backup.go b/vendor/github.com/ncruces/go-sqlite3/backup.go index 27a71a9707..17efa03ed0 100644 --- a/vendor/github.com/ncruces/go-sqlite3/backup.go +++ b/vendor/github.com/ncruces/go-sqlite3/backup.go @@ -77,7 +77,7 @@ func (c *Conn) backupInit(dst uint32, dstName string, src uint32, srcName string if r == 0 { defer c.closeDB(other) r = c.call(c.api.errcode, uint64(dst)) - return nil, c.module.error(r, dst) + return nil, c.sqlite.error(r, dst) } return &Backup{ diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index ec168aa0d9..9c15a85f0e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -19,7 +19,7 @@ import ( // // https://www.sqlite.org/c3ref/sqlite3.html type Conn struct { - *module + *sqlite interrupt context.Context waiter chan struct{} @@ -50,19 +50,19 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { } func newConn(filename string, flags OpenFlag) (conn *Conn, err error) { - mod, err := instantiateModule() + sqlite, err := instantiateSQLite() if err != nil { return nil, err } defer func() { if conn == nil { - mod.close() + sqlite.close() } else { runtime.SetFinalizer(conn, util.Finalizer[Conn](3)) } }() - c := &Conn{module: mod} + c := &Conn{sqlite: sqlite} c.arena = c.newArena(1024) c.handle, err = c.openDB(filename, flags) if err != nil { @@ -80,7 +80,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { r := c.call(c.api.open, uint64(namePtr), uint64(connPtr), uint64(flags), 0) handle := util.ReadUint32(c.mod, connPtr) - if err := c.module.error(r, handle); err != nil { + if err := c.sqlite.error(r, handle); err != nil { c.closeDB(handle) return 0, err } @@ -99,7 +99,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { c.arena.reset() pragmaPtr := c.arena.string(pragmas.String()) r := c.call(c.api.exec, uint64(handle), uint64(pragmaPtr), 0, 0, 0) - if err := c.module.error(r, handle, pragmas.String()); err != nil { + if err := c.sqlite.error(r, handle, pragmas.String()); err != nil { if errors.Is(err, ERROR) { err = fmt.Errorf("sqlite3: invalid _pragma: %w", err) } @@ -113,7 +113,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { func (c *Conn) closeDB(handle uint32) { r := c.call(c.api.closeZombie, uint64(handle)) - if err := c.module.error(r, handle); err != nil { + if err := c.sqlite.error(r, handle); err != nil { panic(err) } } @@ -143,7 +143,7 @@ func (c *Conn) Close() error { c.handle = 0 runtime.SetFinalizer(c, nil) - return c.module.close() + return c.close() } // Exec is a convenience function that allows an application to run @@ -319,7 +319,7 @@ func (c *Conn) Pragma(str string) ([]string, error) { } func (c *Conn) error(rc uint64, sql ...string) error { - return c.module.error(rc, c.handle, sql...) + return c.sqlite.error(rc, c.handle, sql...) } // DriverConn is implemented by the SQLite [database/sql] driver connection. diff --git a/vendor/github.com/ncruces/go-sqlite3/const.go b/vendor/github.com/ncruces/go-sqlite3/const.go index a1d6145c3e..9d0cd3008f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/const.go @@ -167,6 +167,18 @@ const ( PREPARE_NO_VTAB PrepareFlag = 0x04 ) +// FunctionFlag is a flag that can be passed to [Conn.PrepareFlags]. +// +// https://www.sqlite.org/c3ref/c_deterministic.html +type FunctionFlag uint32 + +const ( + DETERMINISTIC FunctionFlag = 0x000000800 + DIRECTONLY FunctionFlag = 0x000080000 + SUBTYPE FunctionFlag = 0x000100000 + INNOCUOUS FunctionFlag = 0x000200000 +) + // Datatype is a fundamental datatype of SQLite. // // https://www.sqlite.org/c3ref/c_blob.html @@ -182,18 +194,18 @@ const ( // String implements the [fmt.Stringer] interface. func (t Datatype) String() string { - const name = "INTEGERFLOATTEXTBLOBNULL" + const name = "INTEGERFLOATEXTBLOBNULL" switch t { case INTEGER: return name[0:7] case FLOAT: return name[7:12] case TEXT: - return name[12:16] + return name[11:15] case BLOB: - return name[16:20] + return name[15:19] case NULL: - return name[20:24] + return name[19:23] } return strconv.FormatUint(uint64(t), 10) } diff --git a/vendor/github.com/ncruces/go-sqlite3/context.go b/vendor/github.com/ncruces/go-sqlite3/context.go new file mode 100644 index 0000000000..3e511b52d9 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/context.go @@ -0,0 +1,174 @@ +package sqlite3 + +import ( + "errors" + "math" + "time" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +// Context is the context in which an SQL function executes. +// An SQLite [Context] is in no way related to a Go [context.Context]. +// +// https://www.sqlite.org/c3ref/context.html +type Context struct { + *sqlite + handle uint32 +} + +// SetAuxData saves metadata for argument n of the function. +// +// https://www.sqlite.org/c3ref/get_auxdata.html +func (c Context) SetAuxData(n int, data any) { + ptr := util.AddHandle(c.ctx, data) + c.call(c.api.setAuxData, uint64(c.handle), uint64(n), uint64(ptr)) +} + +// GetAuxData returns metadata for argument n of the function. +// +// https://www.sqlite.org/c3ref/get_auxdata.html +func (c Context) GetAuxData(n int) any { + ptr := uint32(c.call(c.api.getAuxData, uint64(c.handle), uint64(n))) + return util.GetHandle(c.ctx, ptr) +} + +// ResultBool sets the result of the function to a bool. +// SQLite does not have a separate boolean storage class. +// Instead, boolean values are stored as integers 0 (false) and 1 (true). +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultBool(value bool) { + var i int64 + if value { + i = 1 + } + c.ResultInt64(i) +} + +// ResultInt sets the result of the function to an int. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultInt(value int) { + c.ResultInt64(int64(value)) +} + +// ResultInt64 sets the result of the function to an int64. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultInt64(value int64) { + c.call(c.api.resultInteger, + uint64(c.handle), uint64(value)) +} + +// ResultFloat sets the result of the function to a float64. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultFloat(value float64) { + c.call(c.api.resultFloat, + uint64(c.handle), math.Float64bits(value)) +} + +// ResultText sets the result of the function to a string. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultText(value string) { + ptr := c.newString(value) + c.call(c.api.resultText, + uint64(c.handle), uint64(ptr), uint64(len(value)), + uint64(c.api.destructor), _UTF8) +} + +// ResultBlob sets the result of the function to a []byte. +// Returning a nil slice is the same as calling [Context.ResultNull]. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultBlob(value []byte) { + ptr := c.newBytes(value) + c.call(c.api.resultBlob, + uint64(c.handle), uint64(ptr), uint64(len(value)), + uint64(c.api.destructor)) +} + +// BindZeroBlob sets the result of the function to a zero-filled, length n BLOB. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultZeroBlob(n int64) { + c.call(c.api.resultZeroBlob, + uint64(c.handle), uint64(n)) +} + +// ResultNull sets the result of the function to NULL. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultNull() { + c.call(c.api.resultNull, + uint64(c.handle)) +} + +// ResultTime sets the result of the function to a [time.Time]. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultTime(value time.Time, format TimeFormat) { + if format == TimeFormatDefault { + c.resultRFC3339Nano(value) + return + } + switch v := format.Encode(value).(type) { + case string: + c.ResultText(v) + case int64: + c.ResultInt64(v) + case float64: + c.ResultFloat(v) + default: + panic(util.AssertErr()) + } +} + +func (c Context) resultRFC3339Nano(value time.Time) { + const maxlen = uint64(len(time.RFC3339Nano)) + + ptr := c.new(maxlen) + buf := util.View(c.mod, ptr, maxlen) + buf = value.AppendFormat(buf[:0], time.RFC3339Nano) + + c.call(c.api.resultText, + uint64(c.handle), uint64(ptr), uint64(len(buf)), + uint64(c.api.destructor), _UTF8) +} + +// ResultError sets the result of the function an error. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultError(err error) { + if errors.Is(err, NOMEM) { + c.call(c.api.resultErrorMem, uint64(c.handle)) + return + } + + if errors.Is(err, TOOBIG) { + c.call(c.api.resultErrorBig, uint64(c.handle)) + return + } + + str := err.Error() + ptr := c.newString(str) + c.call(c.api.resultError, + uint64(c.handle), uint64(ptr), uint64(len(str))) + c.free(ptr) + + var code uint64 + var ecode ErrorCode + var xcode xErrorCode + switch { + case errors.As(err, &xcode): + code = uint64(xcode) + case errors.As(err, &ecode): + code = uint64(ecode) + } + if code != 0 { + c.call(c.api.resultErrorCode, + uint64(c.handle), code) + } +} diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index 1675dd2af3..4dc8182e05 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -52,6 +52,11 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { if err != nil { return nil, err } + defer func() { + if err != nil { + c.Close() + } + }() var pragmas bool c.txBegin = "BEGIN" @@ -65,7 +70,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { case "deferred", "immediate", "exclusive": c.txBegin = "BEGIN " + s default: - c.Close() return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", s) } @@ -73,9 +77,8 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { } } if !pragmas { - err := c.Conn.Exec(`PRAGMA busy_timeout=60000`) + err = c.Conn.Exec(`PRAGMA busy_timeout=60000`) if err != nil { - c.Close() return nil, err } c.reusable = true @@ -86,7 +89,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { PRAGMA_query_only; `) if err != nil { - c.Close() return nil, err } if s.Step() { @@ -95,7 +97,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { } err = s.Close() if err != nil { - c.Close() return nil, err } } @@ -255,9 +256,7 @@ func (s *stmt) Query(args []driver.Value) (driver.Rows, error) { } func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { - // Use QueryContext to setup bindings. - // No need to close rows: that simply resets the statement, exec does the same. - _, err := s.QueryContext(ctx, args) + err := s.setupBindings(ctx, args) if err != nil { return nil, err } @@ -271,11 +270,20 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive } func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { - err := s.Stmt.ClearBindings() + err := s.setupBindings(ctx, args) if err != nil { return nil, err } + return &rows{ctx, s.Stmt, s.Conn}, nil +} + +func (s *stmt) setupBindings(ctx context.Context, args []driver.NamedValue) error { + err := s.Stmt.ClearBindings() + if err != nil { + return err + } + var ids [3]int for _, arg := range args { ids := ids[:0] @@ -314,11 +322,10 @@ func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driv } } if err != nil { - return nil, err + return err } } - - return &rows{ctx, s.Stmt, s.Conn}, nil + return nil } func (s *stmt) CheckNamedValue(arg *driver.NamedValue) error { diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/README.md b/vendor/github.com/ncruces/go-sqlite3/embed/README.md index 06c488696b..a40f65e88e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/embed/README.md @@ -9,6 +9,7 @@ The following optional features are compiled in: - [JSON](https://www.sqlite.org/json1.html) - [R*Tree](https://www.sqlite.org/rtree.html) - [GeoPoly](https://www.sqlite.org/geopoly.html) +- [soundex](https://www.sqlite.org/lang_corefunc.html#soundex) - [base64](https://github.com/sqlite/sqlite/blob/master/ext/misc/base64.c) - [decimal](https://github.com/sqlite/sqlite/blob/master/ext/misc/decimal.c) - [regexp](https://github.com/sqlite/sqlite/blob/master/ext/misc/regexp.c) diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index 105c216bf5..a80a94a962 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -4,7 +4,7 @@ set -euo pipefail cd -P -- "$(dirname -- "$0")" ROOT=../ -BINARYEN="$ROOT/tools/binaryen-version_113/bin" +BINARYEN="$ROOT/tools/binaryen-version_114/bin" WASI_SDK="$ROOT/tools/wasi-sdk-20.0/bin" "$WASI_SDK/clang" --target=wasm32-wasi -flto -g0 -O2 \ diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt index 2a07fc0c14..94bfa66c19 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt +++ b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt @@ -33,10 +33,10 @@ sqlite3_column_blob sqlite3_column_bytes sqlite3_blob_open sqlite3_blob_close +sqlite3_blob_reopen sqlite3_blob_bytes sqlite3_blob_read sqlite3_blob_write -sqlite3_blob_reopen sqlite3_backup_init sqlite3_backup_step sqlite3_backup_finish @@ -46,4 +46,29 @@ sqlite3_uri_parameter sqlite3_uri_key sqlite3_changes64 sqlite3_last_insert_rowid -sqlite3_get_autocommit \ No newline at end of file +sqlite3_get_autocommit +sqlite3_anycollseq_init +sqlite3_create_collation_go +sqlite3_create_function_go +sqlite3_create_aggregate_function_go +sqlite3_create_window_function_go +sqlite3_aggregate_context +sqlite3_user_data +sqlite3_set_auxdata_go +sqlite3_get_auxdata +sqlite3_value_type +sqlite3_value_int64 +sqlite3_value_double +sqlite3_value_text +sqlite3_value_blob +sqlite3_value_bytes +sqlite3_result_null +sqlite3_result_int64 +sqlite3_result_double +sqlite3_result_text64 +sqlite3_result_blob64 +sqlite3_result_zeroblob64 +sqlite3_result_error +sqlite3_result_error_code +sqlite3_result_error_nomem +sqlite3_result_error_toobig \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index 6a7c852d4953f86fb2c0af7247afb1556fd2b667..020d130a933186c276713930d401b6caf86dddfd 100644 GIT binary patch delta 317836 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%0DYWjgFGFE7IL%qhEVG zOWeX0q*uc+BsrxbHKr@_P(|W6hAdx+@~li(Xq7@{R-)Y4$m&(e-n!_ouh=7BOQo%m zs7I*s1Eypu0+IH1WoXSS(q4s9=@nVC3cXT5Q%6Uf3MGX(N+vH=f!Z7_J5;4Vg9H98 zY31>p#in!w*!X{bOHD#VnNw6U$CyzEty>XcA>k1!2B#0P_QAiq<=$#k9bnWV(QaeKX~#TJ&rI{6>pXE6bvg zJVI(3a|}Y@{12Z;M^9y~+LTPQvOCl!jS2va*1)!CfVRH?s5J1jTWD?pK+!!bl*Uy0 z_oX^Cxd5Pl)}#CC($xQ?dkWvJn)NVov*pTLoK@uDdh}X>F8;Hz>h)>VSb&Earnsz{9#%;x3y z(1>6>2>DQb>i@5x{k_|18URIm_x}j(vPVmL>EA$a`-YTqDsl?C8M8|;OOQz(P| z{GD{W3j+b^X}VQ@+?3K<{WXUcN=4EYsQK^jek$66qd^KvV^tUj8@Q{#>W=1rQ$1LxtBwtC~{3e+5w2yZ$9W<(ko$ zzv+=ZS|{57LMJL!cCi^%g3gFYmS`IoQD6K z^7ay8$&AUw8g5)k7Zlt?x>z`yP&AQ~(><~BN>%FgZ_rDNyQy7^5Uobq40j?=p0UJ0 zugXNa8TzDDRDpb@9u4`M2`ZHEP!p7O4~+((|Nkh0%B^V1-;AvATt%&E%)d!M`vhsP z!puE)!0uZ}AP`WK%`~L*oN;e{XS|tdc6!3zID3In87uaD-naufWAMi9H+bXi?*0GF z8;7sPsT*FB%WD;}iwr|vycgQ*4OyxU-BqzK?D9|ozR-s+z>xx2iHIbAs}yzN>m^@n zLyy6eInjphpcOKqEj5Ek=-8Gv7afhQ2=IM5K@s`zm#1KI%a2|F_t4#Kg7e zpI!jod~eE=9q2G3qpR_{3Lr%zTh=iPwEv@P8!7r>7{T`o_(U z^qNSL)LI}Uuj$lZ&swcY0s`rkpg6n!C30`E|61r9<;tfhE@x#9eTz{r^>Pw zdX_x)6eZCP`Rh~EG+_<-iz0A^?cxcoRg$Kr%M7Nm!PyUX#0fieQC5GJTGA!Cu?v-z z=YF!M%Jt8}AG{=UpQWL=Jex*6%u9JW?m>rBUQ0uuHdKFkH?qszt(sFl*~;#aJ-bkn z7`ac5??ScBDi8Bx>F4Mr>m`xwlFbJ+`&F6Rm1@@;GR>J@jT3-DhRE=>rXy|iHM2~W;4uS_h!+Op5Q_uC z;&gPSE8QW6PRrii6;nyy$usHn(2cz>ddBUL>D@3*c>@d3_i}$XYInz$X?9)?=cKkD z$S-0YNR-wI>8g6kWQTs`M_aPsz~YbFaf8teHn+|oI?ZU7Pjv^KT$IzhQ$GOTJIkIZ zYnAspWvw365e1n&Xo+nPvJQTfclIQIxdPxE1;GvOslcu439`E+kM*RM$t#6-1c(6J zvasA|P50q>xO(Q@p8PDE^}+(lyRus^db!#v;r$bq2xveJ3aGaFR-vXcpqj^ALoyPu zkIus-lf`<|ljV#zZ2njleuKTg<4ddV?1nTIp`ZN0rrUh0<@nx|=unj~+!ej4rsK;A zHr|NDR6R3A7DIJuIfWoaXHT>39!h^X4rI*f}aSLVbYon$>giSI65>bzxS2J%9Dj@>hR77^$zB z^+)EfU!XU58v>8?aPG~h{MC=<2amU*>Nd5DQ6C+yF4R~LSW;RbQypU794uaYKvNt8 zPj-2bSFiT0U6IfCquYS6dHtw?81bt-*^f$=4Sh1=SJi~33&jblQ?LIjWBXHlyHJ(a z!&S7rDkFbI);o(56N`KD_Zx4y-|!mqz8GZ!4TgY@3Rh9tPbM-(=Lfn!KTy0if!gzc zj>-Q;0c_)~`GtyUnr+k_oBxx8`5VDo^Al4rD0GZ7dtN5g^Ks!SD#K4Dcj@D0&jC~- zDO6+pub2j8<3y$bI{++*EzchSy^t%n55Ov9uKaEQRma6YkQx+QJVUj|!Bh_ioA*tX z-3L+)9|L3obC>m0qE518ao$3X3u&l2~Y2vAKg)2k$axxwb~u9SqU3Ms^xZabm5IO$JlB zGWhHwK8y8RD+}wbS}n-JACdZm-Q&J&xpFX-Egz~OeCx2HjnSCGk#BI=3mQlV62_X9Sc8Hx}S*= z;ISEkLr|Kz5dnKiyfK^*%3cGC<+B+8GFOhspzFc>(VFPkaiO9>9L)|Jo8B*@F$Ycc zq41s!6)7ZQtk4}O{Q{*{-ZyE@whn=%k3lyb3i^9rK0lQF81$&2R1t$-F_Z?;23dI+ zJ(e(bqOviV^%#HHud8F-A8DlT%GtxHWu=j4Bk!G{l^>ug+X5pFb6>elpOuO9H7Jaj z;q*F8rYXY-=9#=WoNkF*s3k*8dAVjaNJKaE)ElzS2>2eka?l8>Tyzy)b6}5;=3yPS zVg&US!!!x|Dqi0HI*q)SJ#i>*Hl@AW%`t;ol=^fs{rENr?>3aj>gy<7pEeQOTG;l* zGtMv2GbcLv_#cg*GbYNIkyNVmMaU4AkiPU|Llbv&gdd;&T{XMjKCU4;IZ!8`0X%ia^fotxzN3E7Y4KICr{-U}J7&MU9%IOA%wN}1wUXB}-P=A{eY7xkLg?9o^ zq}k3svt6|s?;RgiE~`$aO0-ShKba~QUo!&Rr69cYg)rt~^(NiGs}m-}DA_ExPo^Zy zA~R{!Tz@KmnM}#m_6zS=H40Ed{$7NKZO(gKH{Vv-d zRHc|%DI<%%+~2}SX;<(Gw1}kJAEbu#8^3bCcWnP zYQ7S~vdk=cI%)rhJe8RQLmiTn1)g_69)HVOv*7#1UeV9i5YIY&aSbQCoadW7A@F-ZtB(YvmJEV*-ee^Y8F7OmF{`eJ~8?|8z5Vl zO8xojjh{z#%9sSwC6Ax=I=mhRv4uH5IgiT5t&PY*CU_w77T*b3WIiR{_@)lt+%caL zZhXVvboVZPO2b!DgJA%|zeHuuy9r z^8}E;PCmX6cGW34Xd&I=XYFm%-{BYuu*Hf6ko0;=__L~!I~P*jV!)r;l*lJgV9Mfr zr={-=O1O2lT8~ilhW%=KZ9gk_1t=`Zp_O?m0+{}=CdV36=Qn6Hq}zozs6)aSL^pBp z2s%Km64gF9{gdI?7Ytr|WD!-1n~g2OaBwk369#(qv7EMuY9yH}SI{kJfJ2NnbHA(V zgfCZ~g_ejlY2$GdWvp6d{F_wKhEE?app5IwiEmQtcnno#>O!$9sswC|_UfC^`D-PP z?oFr)HC4cdU_Mbsh}|?oz=K*MMzCGpx0vD^+OjG%gf_Z*;7;NOh*ayYCb#np zJrpjVL*9q@gM5m`bO*qNCW2Vwn8OaDj0N0-{D~>87<|ZoV5O=sn)gAd{sVa&t1uAe z7KU{{-kH4#sVJ7#9n25H^TPG+1F~f1TbP|4a_L)ePu`cGy+z5iQ~vrEOt>?${!$9y z^5{~ScZSSaO3iU8whXcMUuBPFRN8TB5+8swSdLppog(>5y!-u^Wz@E87T69}eq1u2 zK*s51Zodb6ZSZ9C{UV=vn{IV~`Wv6Lqe3zZ-=-NwPHnL1S2sZQBCM6D%Zu+&f|~#BVKn zR(Mnhjg+*^D^XS&z=Ulp=6Pv z$vSJ`oL!WC)*xj1yBxI!f_RX8V+}pf^vrqQ3}jA+6HLC}lxrwqqPLkoEjAmCL2961 zg;(A1o}BviE9`}>C1f`@Tnk12ihOo0e$-^JJhT=mY*Xd!*-&NMuQ70@B^~?aJ?NJ3 zWn=2l&JsB?n+(TRoEXKC(7-wh)C_xmh!VtcBk=tKIM%Ce3?=ySv1wJZ`{yyO%6{wU z-G3!w@ceto4xcXfz6bi7CSC8-ixJjI0_)J1jc;FsZy-&4vZVD?uEMZ+YH;l7@@RHJ(l(EAD60QxBeWk={g1Nwda8KG zRL;8gC&p;zK>fh{m`U6gBafprTsh#?kBzeH4&Q2_!UKBtc@uk!*Hg8GFK62I1C#BD zpC-3}=Hbb^0%5>b-lg?a#=XQ~#9^if%eW6|NzEA=4qUeB#q=E1{`B+r~~V*ECAP5(}s54ZBe zC(}$+mHQYT@if`zV`}u!8xZ8BU;{X?tm_1!@=;-#8tQpi=YUvYK2OIn2#9?8T@5Vg z0h^{ih)y)@1oNt3fx367UNL>omD(nd#5CDs6Q$5XIcXE6w;VIxu1_4Vjt9ZHQ@RF8 ziXy00bDnlCw*lHwJ*?SWu%K4jNU}nk> zHp2#*BadvR#=-oV;N)n%|X`#dcDC#}x2m5in!Bol%+^!C3kJPS`?O(zT23Oqc;#=ry^Z2zVC?uR2q6 zDSeCVyo<^_a#nb&aY1Q)-CU<>wV4`I`0%PKzk>eseJQ+Ea39i)P@8R89k1%S$=*LaU!RLg|LF=kfh&-Xi4Y%fP8%ihyA~Wk8GQ zU#(?J0;hADlx>6F&a&c5*800H;4g&V^4*kF!eEmlR7q!1&&q3t{9-q3oq5u}hg#5Y zvdtcP&vX8JHXd@}2#=Prd#Qf>#uZ$E7z3;cx4z*DL?+bU6MHGi{rwbv1z9~>4%auY2f>Le1Zk{WTeti^Dz%@o(EZe9}PrE z9P7v7#c>QLvP2Ep7nO@#h@+{P=M~`W3;PH=zkZTGe@geOr9RWb!pb4eX3bmbLvKMe zUH8N3e{-)X;1~o_njj@?`ZlvnzO|p8j5~Z9p%@My9RC%bk9|fB z9rJ!fZ_%eRM`%om>6$u;3S{9@bgZ9*_FXMMJVMor|NLnv<~8n*h;?%92>DIc;Xr?r zqiQ{7=TVwc`}!RKIFeDj&0*=AcH(~nd6!1aS6 zb3obQSQ9i!o(;A|d$3;Yn=h9i#|-@@_u%5jV!T67!7|dH@~7k2J$GG}KY{r1wd}bk z;H?z9F4Wu4seLTUIi7xom066xwC|d%c8W?D-=>+>AstY^w7(=? zJaUR^mPCCvb-Kd^Ws650l&T|5V9qHTbzlA^j{k-0JlM@w9LzlEG`#^Smy}Co%U=D} zOI?a7)k?|UrW-AxB{+HYaPb8BO)d>fya2gp1zheoYb(Sa z^c`3pFM_bcs55jw_VV+7p0|_BWBuC8wu_y$4+{V+=*eHtfHtqlW}hSD;te_ebA;07 z%8x&%*O~CtS!6uLEI>nq_tY0uJx-noaU~O;oA)Y$3g&)6?^I(Sjn5EMxd(hQWhD0i z`;idF12NznD@=B2d zX(ClY&iNX=^{)KzYh`mpBi=6?o~MTzEVSydq=7CsrfVS%2UAWk7Pi6Mb{vocT5^PF z38dtWCZ(&FJlH;Uo*XbgzdlbnN}DL#obymPJtIO3tZCuPd_%VtV_6MI2!p5wF)Ssw z*`vWHzJ>DkZ{gX!DQAC6uNN>fOGO!(BAgsnGHhg)!j%54k%>cC3uR4%H{MqvD%TxtVM=n#Da^ENz*cxXAe}Qo<`Y~8D`XT;f@qH_c zUqP=;Y|ax<}dj^=SW%L~?KPb~Tp z#3+jTdg%z1@E#DnI!jzBL;UsWvY@q!c{|Sj%F0toscnCRSez!u{|Izu%XfafVWVJF zeq(asvom}AglSzT7yLvOvF5(>C(8UA(O77kRL=exYvu3D&wr+V|Jq4Qa`rD&#rgpu zwZ2GKPr-eB(W$;hu;O=LTijBjoOaIFXfnT=aRXGxol&ygQF zL=wFyPdP++u|)iP+cLK~#i%a%=Q2v2{@0$Z+R>7?#f4W*fjsQg#K7dl7Su04AxHCD zq0eKG-Q1!vQfQXC#qIR5{L(GzLoAf>hzIc0$0I7mzYpyU#4+ydIOhpJ2!Ny+`L;)7 z6rlg8@KoXCu$}iD^!AEsNE?~$71F*L%Z^A~X%Hixb{K!KzS}An#E8tuLxUpXP1>FP zc@fYkx>?L8YGZw%nNK`Md*oc7s6l)A5--2-iPETW%_mY(p<*nKQQP=B2W#2BheG4X zCr+mooS4TMC}&ZeDbr&`s(b4=u7`lgJ~=B^+#a|7JzhnJDc&op=J{A0d2H5%%ejw` zeZ3S#vVJj<=vcJ|Utr(EBgLQrGv&+0gg*oo+H{|MqnKz&o#mNgqRGwA9C1fSK-_;5 z=9L|bi!K=7C&j_*&E;3cMKtyTQRXqR8lm;{_bq0LRk)i2?gmFt&rf@&M#j0H{_W!S*$G}n4(c$ zsD3Gn23BvuT~*P-yigKW4e*12__g$hN>RZJ+z`@O863zJzK`VY@}gn>f&a5+TBV2@ z+Bo=}xJmTNof_Nvm%0;kRu$=z^HI z6BjGeJnK{y*MO1e2vYR6`$CB!we7xNHPI8v9iLYdwVb=4B%mKGGByssA?nMKv0pn% z$tSCeH3g6#Ef5MVgXM!Y#JU22qWfGZR#1IzUsEKOdJ%FQb_K6Ud6qlKrgmA!`IgF| zHO2S>x#<6hfxcd79F>a2sa zbkE9hb;Pq}IR76<$5I1JGmoc(+GEOjL@+OWXJt%XQ895i?{wpzuwd1IF2MeMoumJR za|7Gf6(x%7gj8ZXoQ-kcGTFDTsGK+8XreCEBq%L+w5|vQPweH%@Kb9(w=Q(gKZ*Ob zx`*F_8}l%Fm{J@I%t7o1|L~D+ih&DzT{`}$0-UqUb*}I?`Vm!l4~OY^Y*D79rtbq3 z{7Vg@Z8HQEp{V>7qioK<3l&8uO7QeGi?TeUXYa-k(UX61*ii^x9xqVfHzAbr)!c+FvB+))(<&xR7h>i>0wF%dytPXFx(oHbKg9-&@6S+Ae>&6$1Yw z+3_|ps(|SE`yu_sh-B5FSUGTQ@hz7224Z>v>GO|tUU)8` z0n}j;nrc8QP&u@5-Kj6; z%E)RlEBm4=bC|T3?B5vP=3zOzu_z^m37Op(y97^@%IV?MMVxm7zQ)Zgl_9p6S}UCA zhH6-RXJp$Z;yEUY>?Vjzj1clf6Y&Uks@K!S?RktIjg1?L`6e^3sBoDshU7PvqIs-P zB25X5-c3c5VxVSC5wj8-pyz{fQ&V<;~$>K+wi<4zf!1!*C} zO8Jh-11+#veo{VgHzF6OGjuZhm%D|H=y>*@_lTktbCLp_4~Dc%JD4e9GTh2D3eIAAUw{T$V!V#O= zM%>#m+!qWmYDp?`LgsZXye5?aW{6&t((+|Kh0e&l;V1E=-d02(Snz*yMkdA+&T}$< zEJrQzV6HJJKCs}kwxY4fHDsxF;vV`^c5Wxe(J%6HJJANp`i}OZia2Y?uI=HMJ}g(a z7j5$npw7q;QE0J-SL&``kNi>~YUD@EjmMQ(mj#?RO$oDeN*Ho%2KycPQo^7hIYOIv zwgYHe=^qsSkE?Z1JNZ$?`W+Hl=aGgRoZ3OWBo0o_ex-x>S)*UG`#%K6r7z_EheaF4 zWAY;i4}U3JJ|e!M-?HmID#{U^&3@o9fnVIfcHk#OJT8@<5KqzX*(071n{48bNwU?` zVgco3UwT@^0@m7R#RfuN_D5-u)@NmG7g2&CSMDO(0rHDo#Dgf^+eOsi((7GB3zW8a zPP9eol;^~Y5F z<3_&EvTsip2Q-W)rYENS3;9S-(H-JqYfrJ7zLqcbLL~fXc0zANi14y@A6&nX_w*6H zKqcAl^$`s<7k0PdVB%C!SL)A*O4%s`#7GKj8KHl$SZNuNr)8|Vsb%<_m;D1pMp((< zU>L5;zbdLU5-XWVU8Q8QUw%Ps5p*TH$xC9ChU?D3;-sLf*^4v8Jdq~?qQz06O_l7| zhXRN6qdYiF+=A^$j^W}3>YN=MF1FCkrBq?`52O@((~vO3Ul*t7&+KPMiatcws8qf)*PQd2 zsp+8|DEbLik$*-Dcm9V%^zPS|`8spk*us#co%%DGHi!V1IfjZCo%qNvYAWUn5V4JV1W!t8I=Cy!F>Z_Q)> zu#ss6`+E%01xw|!pCKw#>>OH{;N>vHxY;m=!GUw#Iq@B)6pSDg$=ZJu^UG6)D4NIb z|IC=HI$4aqO&PeiA!sJ$M9BA~SaTz6IZgDyl-Q<=24V5)&{uv8m~mm4EM6m>G;R3jr;9hl zP?2491{P`XdFz?t2renJ;60p`D`$y7O2~UqXMAzWNyK-+n3eCq)B5u)kqtO<#cWab z$&d?S(?8Ev&D(C2?i>m7^+GPTABHtdT^ojoKPkLPoqXd3Y*lzje7xoa6(xW%tm&P~sN?0MbD%2E$|Z9|dt82-BOa-yjvNS|HD=SNu2VAeacTf^(u^ zYuGnIE}bhj6g>z%iM}9-kbjT-b?nl_TF2{hR+ivRuAgLycCZR$$$8>?Iw3vtu_!!A zHkmJ473GH2I5<_rXUOUE#a&RoC+A~@`JDWHK9;La$TADC3Y#MvE)dC3IZrMS{n=Ym zCyHRfu^N65Nb}ATd1a8a>S-ah zKxQ<9ME;9VGef?qa{ppP9Y2%$5>eX)F9$f&^c?x}5>Y*mBco+#VT^fzfQme~MAUdN z$Xcd2xt;2Ds$}h6gyJ7*4 zA?ICDJrq6zv2yqf;ximRv-rkj$E^abVaDpLhL`%8d}MWK;@B|Bk&{+OPh7MpEtKiR zesT7-)nY9HkE_>;_p#X4D;p;ADY-ivM($|YXPxL)^bZ!F@PrXFL)T8qZ`Xl{ewUBE z2fi66C%mVk6~*3%Q`=c~cwcnJW%c_oLC49iABbATo54iFuYItHuvXSmIfNpYeIOpl zqqvwTtzD=HU<^~-o$Ez~JQ&f7_=SR@7V+n;7gZb+mtuQ_uUGc|^}?!|^L`J~`rh0L zsnZNMN=`O`)Uky~$jz(lz2xueOQA;yCnBPzlH74haq@z$*&k?Yn^Gcas- z%oDm1V33}iDT4fIw|)Ytc1SCcBR_^Aep<$Eihy(iD*!paW0=Ka-+HQhy8dz-c*XizpXwLd8fB!hk`kT9_c0Z4t8} z_*-p7PDEDrD_ccQD0YxQc{S?5((WbMS*Wc!vyQsldb#Fj7*l75muj0=Cr zJec>P3a!pPEE>g6z=i-8?d&-~Jv*^L>sye01!srg=R{?tBQS$9?7e4_OeUH1p3EenhmL@Xl7lp*O0gp4+K?ikS4A-h*(d zVL8DJ)h;4Jqhlhj;Xl*bMd1OQhCYKX9I!2O%s{x11K79hpzS8>Ec*E%@M)Is#vdWn zB6sB6A=_TCIN#>O;17r=ZhzFa%X-|Geav>F4aSyxPS`%OS!erFezv`C1;IE%y*vs)XpfK4nP2XRz{R^)aUId++OOIW&?Th&q z=3=BcGtETAq3^E0Y%A~;io9f-)L0{Db%^OpE~3?Z{J3}=O0>s_@!E_SQ(o7&%#77$ zOfRwVQMt715Yg^8&1N5M{RaFFO+=rK$sAkj{yPLX1Lb_ng$&j5ve4k`$!6O(;)qC~zG#Hp)O zbU|v*Yff<^h~6QmxC4K#j~30U_*YpOKhHzg^3mA<#nLOx+7x;=Gg=HaK~n+oCxdd8 z5Df|{;0M*K(!?cl0=12mafv}WPEdnFb235EYd==TM^&_ z!uaWR{T&hf4iL|5K$sY?GDegHFhCgR8Jrc0z_-f5@x30gVxPyq5J>qkaU}q0Vl$w+ zxy2)a-b>@;tGdNS+>zfx^z7ud-JQBaI3 z3@mo&5M_vX5JrLqr%=LBsrh0VI^Zy6XQ=7(3Q_n%sjaC?=E07|o8&(p*0U;6++VCK zcymu}+8>4p%JQB%LNta-sXC6(p8hx0RF6I1pGD-kR=ki_dp}MRb;_4EbXh9Juk^Ci zOb%Vz&?&1_8=66lOBQykK7E#H9#}&8T!nV3JW>WraIHWY-KqU4;z9+_eP~0KnsnVz za++w^jzhp<3P=qeYQXgqIIJpggOjLm%fdG^xeNmSdIAr1DFpq9GZv?$2|g7kGz2Sj z&MIZH&~ie%bkV=U5JNdrrG}`H;6l2n-N-+p^7AJAV-5~cCyilPA%XF9Pln)>=l>s# zWnHFd7IYheibpai01lh*UqN8Mw9X3=XYr|dNE6+7;oCHj@H*`=PJz{ z%@WU*@7GWUQK`MA8N~c-QNO&6P~5B3_R_fL&JlBPj_UFpaT9DWr*g!sOf!n=s%9V? z9c>kvM_1mrMbZvv5CLb!wLC8nKFU2WI;iQtI4iCh_!PP!5Nr?<_+*mBAnynV3~^Tc zC-ND@6o^c0^=xFE4Pa0CLWeGrpDX2>JmgwU>s5-)6%V6g|5LeQiPlu0GE&t%5fW(^ znjcUpcBk_L-pv!suf9PlMKD4)$bTH;e;OhRD(NvE%NHk6@^x1g(ITKEMjJ<8(qdb5 zx!4xv7u%w>*yd|iRa|d{%JpP5(FlLutR|j^E>owv=r79$mJ+h_^`X%LcIdo@dYBTr z^SOvIj2!mz5xPU#yY^(`R04lwo)cv`AoN$OEv!KeE85swq9sEA*dWh(gJXjMuVWoC z#0FJ*T|IFhRO#&cqIvl~{hx#z->mwgnYF6FK(`?Vuup;O_yq3Q{{6Ve`nYk$GT11k zOAW+z1?#5j^fZr^%Y3u9*ZOZnUYJKV;Jp|1Q+_6lbJVk;NW<|1LmP^lQ&zlYRsn|< z7~wyxf3T;dl(sb#wIQkh)lf|Me-Q_@xsj-cOpA++Ae!nb)H6^jW94Cn67Uss^Sa1oAQXKRZ*!lv#EFl);pFrY+Ps+HVu!14U)D(TOn>bjQ55sU8zQ9 zz{K%8)wy2uas{eo;d8AssNe>Xq3hnUsTAe#ZoffrIlMjBi%zIboqvPKyUNptZV->7 zw9x(=1Xu6#+$g#i|Dm&u&9dJJp{?cR1Kr^~PQ+LPy|5ZKF6@Q;X5){ET%`u8UJ;j6 zM=>7vd1%D$Kec^55~ep7D)aC(pd1Bjzesal&Xp*NAY`Db*E$OqWoC8BV&HkSXYz$} z(bJlVr5P77;jLis#QsC0e*yOZb3>cR(@u$WmuGWFtGboutI?&Q0Ypc@YH+}Ra~NV znH{|@(TuYXpf&>*vNxu5?Q2~8;-H0b_f|uUt~qCc#!X%n#aRZJYgFXGym6%+i}B(z zhBs?^Tr|Y{d|t}iEkxVAR>+;_?0L=@gHg9WY(7I_OXu}u(#e&d$=lI>JstSoS(A!y z5p|Fjw)_@!bTu_-DgF+t>T#-#s6stkiO;$Ds;$N5;8U(wrJv@s0gqUZkVWxg@F5C< z`0%in6%SHx6+>aQpLi?0rncdN=G`Wet#f?7+e9xbS13$vFA5We>O&cTtXyi%;vR{D z3KaX6Orafzoj1~&_9DeLQqbP^qQJ2c1!zEIe32c*Qmd`>C7-XOc#?lm-Oi$O+-aEb z5$eK|c9BPWnMyn3OPAXBAH;ovs(54^l!du8Uu8VkvIk4)6&KJ>x-Nc>h!=LTOYFgh-Bt*{`$|i&Mg6y6@yNM>98S|EmLVXmYL0gpU0|>&AO@#0W9Jm~f{U2#W_w&F5YjJ;q ziauQP6TVp7DX=I$b7BGx!@)z8|BOQ8#oa}Y`fi)uSWFAMiz<>Eq^;dWR&K?YEuk+b zdJ+NWyhGgL;A#tzNDl3Ohv<@i%#3 zKzL9f53qgI^SpUL*ij^gE6eQ0@zg^_qHrO9p!=Po=`CZwWB?Goaaj7mK4CwT3m@5q zdX&++9wpwcjdQ-VX9;_$8A@2{J%!}SXKCl1;%>}!&ATwys21jKNu%x(MZvQ-;FSPp z2ihmxE%@w>TkaMgF#=of5lN1VsmGrrQ&rpiK7s5m--FmNh;g0a+%Ku4;D3_kGvA7x{Hc?&=(WyR4ENj+g z)>vk%o?`nl^lOR5K;F*xR-|!Yg_vgOTEYV#j`Gs7BhH3&`W+cV&H`r*s&k*Hqbpu( zmo|gq6LV?ceIg6obo_ndWsEhWryla0cV#O5tEYGfDNUPu3NBD_rKiXWk_-qwRIQiD zu7QHi`lu7p8oh$;8{wJ=*z{WU`5*zQ3Zl_jdbAfP3+h_+5^Wu8$Lrc>zQ(<=7lMr@ z0P3zjA}9FxxjrCDZ37h-6-#QiV8ulnaLxi`rAQg{G{v=ZkpSL$NYzYY-qT3&G(>$nOY zefEIJMX}K14~WOC2g1QOSgsEnEFSye?I!%e z5O@opjudSAAa&|1lCXmx?2DeicpgN8&&|*05lM*qUe-#674B&NpeyAaN?Vdo!?miwBGE&{U5h zV9`r`Zx0dQXr4deadEnQn{y$&7oHGPoNr&|L6|~O-jm|lx?|7ij^Ux zc%nkaSg4JlQbP}OfcOOu<{g;dKuuKhSaTP|8!+BIc56g&p2cwY&yC2pa9yP5MV8~| z+2&{)JTFdwaAk}TALGyd5u$6VpYt(q(ijGhJLEnv`c^N9nyfazAZ8j6sDURCuKoCi zQ)^KZ5Oq~GO9O_O91X?r(XZeI@HN<4yOE+Vc-(s<3t;{j0g=cam62%qN*U%dUH-qE^ki0*J|?g(1P)B0Q^vV1g1*@pygj;6IspquEv)}vu>!%wr3G{>+nytQpw zYznr9r~cNUq%qcg6Ar#192`&m;4Tw@l#a2U_^ z9ta1oFcseg!QHtqXrcGthr@q~1>=AK|4id4!uLE5#y(iEp&IM;q8nZkgQ8~s#XL+K z_uhR;cxx|%1;peCCVJV}Wa{!jo?#(=^y`|2b8kVzqI?y;x^cy=DjR#0KNSdS6sNeTB&FqBzv(SdqYdb zWZ0)-_eN#WO=Ija)MO%#<(nZvh<8xWiHPY4c{r`aZl^61wPEYhM6kazls^fd*-wKe z32)>A5Nf2CgY(XqglLn~bZ(M(K$Ex#bP#65UXx)JEux{5!7>-qg2|#f?6O-Xi^kU1 z$u>n)bFN3!Rg@`jQllvdRd|ECPZ534ly8c-#c#mJMDQWUrKUFp^DP1yf7d*?xo%h< zWF1dkWESPtyK1^$T~7C_>#0}dsS}p&hipG4#)0fRf7TFuL9mbn{fK@)f|-0&>EfJd zHjwV8f9bR$=6dO-Nt5F|(^0yS{+!B|IwUAf6Dy!%ZJh>{a2fqMO>}TB*J1fwgLXM} zCQ&!>Ek;@vrt5LEx+fhH(HxqLD*mkaXU-7yX!LY3*?-X$&ZNOJP`!9LzRD5qSpMZS zZH9P{0ouGff1&#!xM3erYsaUH)K)F0jh&Q7i>HTPna|;1Gt}mRuyKou`SbPu8FpWO#CaV zJKgiDD2V5n1c@^uEXGNemLxQQ>92~{Trk9;jA=Am(x8R4TZFB=%C~Tl7;ZyN&MHg9 zOQ@3l-V))-fO!xT>VZkgeWO($oDtzkgN|f(e?VuJi1btq;4*%-puKwB9^+1R=mp-_ z;idbV?tL8y{5Oq$U9?L58s`S!IBUrHtI>Hh8>KbdwRGfl#1+7X8}o+ny4WJ=VzZ{? z^4ZPa5bpr7&b%Q?QjhERS;MUG{^&Qw?Ew1bP0^K`sk0Qh?r+i8OA)=ci2hzG3UHoh zjb)%gXQ=lwQ3Zn=wM^U{%PNHzJJYG>VYjbrnTW8WB-Z)mB9Gh2d`sMK|4cfii#F!{Ji6%}#Cw&|M4xC# zAG`w(%U+6n7jJ(=*S{-1z>^ks(-jt>70YV_nSq2#zbG zUhj(*5j$r_v;ng1r`O*XcbPZq)5j}?iwai?d&Ifv`tcvsai!n`&~-;vtP~~qUEc@u zuI_ao{LzDIuu5cG*U;^&#D_Q))%AfGk4c&F0rcH>Y4mE5o%zS~2sUTHIT-kX4w!fL z)B4r$!@TRexEf2r?SBNFtBiWD6M6LcN1`icC4G&amD|>cVR*7)tH`87Ys6<2W+gLZ zRw@-ck;$|2)5q}C`9GJlPQ=oXwR$mUt`$5!-3{C?G=KL9+&Z`pI$Rlf){A}^>-hCR z>+)%eptI}6?d6kv>nBiaDm-@3&QC=Yt@uRaMqq;VoBEN1oS(u=;eTuS6ng~q|5P*x z+`wX#!!~L53ydT%k_&7?$RBRw8%yg9_j`Oq5tC&$*Jna}&`=QuAO9KxMYntgy|#?% zY{$I5_Zb%Bee$k_K_SV_Y^=#{D*57EkG3*9!7X7f!W^_Po(sD`pjeZqx?AoMPA^_3! zsy%vVv&hZy**UWb^AMLSjJ*~%-MV30=Q#v5T}8ic7A;ag;8P87DmmY=r{gypIQZ$# zog!Va)~dT#pXPjl(eI~?Ux?~1hQt8`=3Dgl7oyffxP>)=GNQkM50b#cz=KqU_4&muqILEMSa!afi*+`8i??Lpi*#;_$iu8)o8?ib8-P}Y zTd}+L)8MTdqp`bgtIi_`zJcEnY}tS-8st}dq=SCY+-;cd{nTR{jLPe2=r$P1%V_yF z(T*4XuWcG%fmaVV4WEEOXF`V%KIA~xY1?+#m{-x+?V=!Nl^v3XKGz81&MK<8LsYGY zdk(y6!$@%t0D(!#jRl&sl&m3Q^(XnQk{u8)%V_=%aVvN7)DDp&0TN5zO(HRpi&^q& z`w_X<6d>|_SZinLPBZJvje3wH7s((RQk}8;r^S^%1*84!`>9?!eZ{BmL@*c4TR{KO=%qd&0 zn~8+c7)K{8rYHA_r=vgRgiGiXo2)od_^*AUJ&QlLeq)M3lfDs?bKl+>BE29{U;8>_ zKu^WIoTWDV#n+HhbH1(MGHLTInC&7O_$`p-b6WVVcq9$7i$swN91Q?s<<$$Y2&w<5 zK3nBGaoKvF^1m1FH}apd0S{3DWFNK_Z^C;R>RGt9A;|Dz0|v6Fsa1hRZzk6d;<{)( zO>nNll6jdr{vfKbyBng!7xWA+y#5P_Kaq7UO$;#vkqJ73ft^tR`G9ghKn){yrg>^)nk@j>B@--@lBf@yXc z8-b`eAmobgk%Pi!O)i5h1v2ekkB0oG)4AQ-X!wsJA#po5Zsi)km>8QU)0635M@xPb zH8MUF-dwbG-r{j{rG0l@s|_HzS|~a7Bgn-Ss&h!Bx!AqyGNNF^&4BdP?U1M$w?^dV zfet0|BzfWToa1}>5O5GnvH7s*QR6HQbD8_B_%|qtQw-w5$4-gXf%~x+gxz=Yl-SAg;pN{%HhohjI+{=OXlF`v1a&CCJs2dQ&{Ws&cH7kRz`=fpB@JpETO#RSTu z-M?zmj1JZ!^uR$k|E9$_+{mK|zd^Y;LqGfmMOXLf2eYY%6*hFVr1^h{>*%>Z;8oU7 zGpY9<==R<}L?;b^G`|ZXhj!Xj1l@jKGzolj-33TF@0}Ni1Jm&KpQ3^PjURs(DRkve z4UA4_@b7FId_nUI-6_0%gZW|=>sp`pB0O8xRnz{4!n2C1{0;xYDSGU0QSbVhAd(hO za%0ra(CpkB@5zS(7Y$1&_5gc+keLvD|k_C1NRz3@`GX!)`mqR{) zn$3?nWGNaG5%OU-w02KC6DXX}1fo8ho{5kjK+bLyDOnJQXFZP&ZV(Z^d3*yNgCC>h z3^;0rIb{~?4l|r`taYd_FIv85MHRGtF3F0|x)fQ9y2Z$3XcYZpWS;eF-^(%b1#4YC zH?bZj1d2ASCdQ9b?CyPfhB7=E;Ww;cwI5Lnw|pqj-X6DPbx*flHx8xk=TetAIVoq) zq)65umGSO$rk);**J@ne&8jZUfvZWx%Y3|7Jzlm=p87He0%+|u1JBv7yB5)4XOm=N z)Mpk?mZq=z8|Cc30VBIekoD2XbqVsmtmn%cK`fe43X*|FFs8aqU`hcrJ{p%99nLYY#__v&82y1GL4R< zN;eHp(v$aglDrqg7@R8W)6L1?IxDCoSvJC-_md?nXU-H2peOnJB^U7P1Z}5tdgM_CMX*Ck5t(KzgwosyYXjknqHp4>UcRI(StD_d4*6g_0Dlu7n=aeD2;|VQ zQ@ptxKsCPP({;fkbPS@lG#jtY3}PfB1vm&K$kJ??jY1)B@t^N$d$vqLNrhwCvI=*= zl_T%Kh=zD&CY9vKq4?y59C>R&g?+%mo>pTcqN()xSsLg03mWI?QID*b^c_?@Si;b+ zW^DBX&5&@YzUz@UMt_7;)C`aWcsj4pMUTv`29Cyg*?^WyNCjnpkqwr-@m9TDg@d)pyMU?iILJ6KTF zed2q35vx16Jx|u)slJdW3mj7xn%>odeEGO`M7kh{=-_530Oi5W{LLczIA7Mbe&joq zFHw}SjDD#iZv$Dpsj5s%<0#Z9Pg-LH3$q}T#FLWXiNkyhstRHD3YAus^&JP#n_t^h zRo3eNBL$Je6<9i)zrYbfO@UQOSfK>a4n6iHV+;gh7Hn*Vo;0jxlJNt7APuyUaV~;o zLG#0-thgV+6T#hh9#;@QdR7A+D5J^MWVZ(}X`uFab`z$P+h;&@6)P<`DYlVbtkdPa z3oaJM2myy7k}%bf!IJPk3o}gbwUyj&ik?I5s>_?eAI4Ufbx@gPRdsov4GLdM4LP%d zwJA2l+El6B$yl~F{Z<1T{{YpgDL+PgSg~NL$^X_~-C8oIA*cr1j-xy{Y_1+w1X7pr z8?2&Wog84@$l!z5m@<6_1xBA^x0;66lBqaoWM(bdopI`1E%~(dIQ1`(Ik3x)FOXhu zg{{CfB)Qxf8hYg@2ZI*TwgTB8VWs9f`V>b!i8l8NimwfNdz=Q;)~!vbeYMumUU_RA zhPb`9Y~b*>MvgkNLH^3=tYUN2CmcV2;m|C7!DT`ax6EUp87I+V87 zkzSmEQ&tBEfAeCbbw_c$05`#f)PXk^L<};%vGX8TN7nPb1y~6SnnxHewjLZiEOXpl z4@_n#mDH0d2=+BY6&P(f92pV_4VoC8N-qy{I_S|WDvb`+1EJkc)$7ZieZ$Wz-W2My z3Ks9&XbBYW+{E!TFh&_A+w@t)F4Jjc@oMgR9r_-_+iPjAtD@tI%IeFI0-hKHB0fW0 zRS4eDUJ2a%r>hDMg5WuFwp-!o+y|c)->i68u?939RUQq9-zK03r;J5Mz%-2^!aX&i zfqdLLds;)8o4uXS{=xP_S_%J=9WnbFKM?E%HdfeB_QTx1*-*Acw2Kb3jBX?!v3}uu zvXLC`z$05TSsjmRHIuu*=Posq*~y3r2O?Ow92*9tSr>#=s(+JAig?9*py*s5h)#WP zl4H=uxtkapDB))L3a(7tAmBzSoxWL4z^!MRLt?`z!2Vm^D6&wt?GwIw?yET*V*_jF z4qrMI=5K^EnEj3asJlA(+^odn^3(rNV?=~38e(kBMGMJ53Hle=RUGgy%D|%W&5Dbr zeabTEU(_{NwWFCm32vhVfibNO**}UCCxG;jP3WVWK@sE zTVc}K)2zN! z`Bc!U9fAHGXeFCE_)vQXn#gV~2VgkkTZ0z-NFTI@Ha#B!{fs?!=)8yMSZn!4#j_+M z%Xuf53R-!qjhqS1Z4D}wswwuLx&m^QbSPqV$E<*jlcc;q{`f(D(Tzi*Z8V1Q_Q zo2&+&HTX99aTJ&!t6EMJm2cWk)=US}GAyX{#>4U0{NiFHBE8qpv+d+f31E~?PdxSt zo20ewbA`6HgJ^Y>^4iOm8ApXDRmbzjfJkv|jG?(vY?4TJucznR%PugUeAON-^B6^S zkPRCi2ak);qNp&&;b>#nf#AAjBN<2qpQeiMprTtEI-uDpH#4|{%#J(8f+$XDW!9Px zb^S8E(m`giS;w$&RI@N*5o74Zc54ruIY!4i$g0doVmiteacG_`*}?!z$0s36^yvt# z>k1gR$Q z4oP5n{5NzFk*YW&O$TCdRP0-X9%LjZDln3NQX?EqdNpbk!b5p{l4%SKv55-6=l>Iazj>yb~l--7QBl9hq>q+#V!k z*=YB{dt|GqkvPiJ%!;G;?vY({e;I4nX$EdKzF~9fhygQ19E2D?AJE`?Wp?hx+2L^J zP72!Q8SW9lc}wPm!l60D4}>?j{Re)$c@IOv_tl7tRwxb*?~9E7e-56EW8r2-qr ziAr4&!B~`7#G<4>2q|<9-S8j`3q$GI2jwt3sHtu)TOWNZNlZz-o6lb^gI3G-*!oW%t>`D&B8Xf0 z6y0A|hnJasm5^BnLl*(Lr2f@2IA<)JypgTp?7 zIE4lS9&FLPRZnd@~(sgS~U`5K0e4KU_7p~V>^EBZfbpJ7$sBxA)=xZ&h4MBCK^fo(Re4GlrvJi-j1eHEtpMI7=BqAz!0jGG#ZSqkI=>1} zu6DiwCKaO$EKM9%nU_Y-QgB-7lc(f^z?m{Fw%KCQ@;x<>q5FsMG|+u`*$OG@p67x5G2?iy)zYOKSbQ#rvBid!fAnY?f`>f1~XQ`*aT!;dr^a8{l@)pS#`i7e)lF9{u%5l#m zm^*^Gd>Q2;QwHmQ=p@G`W`GpTCD(KEZO7bK*tc3l8=jMec7*%2a!DHUFk(}Yzt@O* z6vJ{`N*@)2C~c?x{AZ5u&tmDYW+5#QODN5(K))G>L%5)!x))I9aA3wO)O)yWhKRs9 z!(mRILB9^y%)IvV^7*i(SpB?g=456b>(9rrj*#za1%X9nZCvAEyI|!2w$b6R`4LcM z57NyqKOEFavNkL?Z9D0CQGp(nbI)q`w6ESrO=Tnf_fuh7KtGR=F*h9+34iguSlD&QvJ z0}pL-%Xn;#zv%dQ>1CTJX8?w_l0HFZ+yK?bm~Q1zO@}euijBozU}DWl^09!-By)(WCdE_U(u7v=5OvHLdA zcc$@rIOb46_)|b%P#=KFkb`*@M#MlgWP+?_Pt@8C4Sz`{GHaoiWL8XYK;{@ec}eQ{ z!{aZ>7h-tRI*iYOYrH_g_g;QkW?_QUd2ptttMS11@yqg88SF48seLp>R*zbPgqm10 zv;sh;paN2L+~%N*LIOPMu}nY$JZ~SD@uLNC6=_&}UTYT;;6Ws# z{2Us12l>X22QC;D0`7Zv*w=iw&w%HNh1*Fp7yTl#WQUBfM%34wH&*5ui))mp% zxxk+*v~RAg={hEmUW?@Q2v*~Lv9ExrCH@JKKNgvk*aa5jRg~*s3R5^w-d#12F2~6& zsF5IAXK)6c#}1_wn_p+k!PecupHmefK4tb}A%{vAVI?lp z_C?TUE>qRlWP2Pf^Z0A>`KSvzfhG--IMsbk-jZWp+dXmpy{M+_52Mgh3rH%m6ZqUlU;Yx|QxXpv{|mkShHQ~~f@4M; zJOw;_TR#xED6MQb-;_^g{{};q;niltb^hr@ZUNI~p!Dzb%A2ybmT8iCV%gS}tYw-X z-jw-uf90-YDj~!87n>y)r@1M45_DWl(E3C5m&%N)Aihj$wK3BL;J{Y>Cu{o&rUyX%+B_duJ%b6of) zkkhDVl(Y?G^7xB-TQRRNjOzI|^PFH_!wj>m$aNZ6Ze*7*hbi%WUK0d2yWgOwx8$e_ zlNM^X4?110Ww(zEo3tpWj1ZIqHRJ2WSo!oh!*u)G%%2mgd5TQ-1}^~mJFEGIm?-b z^o{C8^dW*XhEnNwjvRXQLzzMGAIZMXxz<4Ab7|y9kTmAf-j85!Xhrrl(v!9iB|zBx zZS9AQ9GgZ_h%sRD)O?LR$IQ9G$7pu8@9~epFrm<_TdPe}2iMB`+#mnNC#1n?iH(5H zZlDh9WE+SwQ`gCQH3B6%V1efeK!FYnq@xQa752VcFhDLR#=hCIb#gj?Y0P>=!2Cjc z*CS}7jDBAaC4Me-{X|PguYRIqkYK{fqf?*A#=#08po|dz%?}`g03TqJ3BGWU{mA@@ z2;-n&d8X^9uzby%gOguN;Lkb@`YG2 z_VCx)By(c9eh@O%&1NBj^w=by!8ConN#4_J(Hmw(Jm7~GGu$Q8RgcjGVV*-^4-rsq zz$u*>_>C}J_i$cpSXr>6UZsJX<&9y(es{BMSnYWkT^sb9ky19Y<-2iRprwz-wm${T zfDy)@Sc84!`a)(qM_|jeaTP%Om`#npkPY&tj}8gtw!p(`(?!^VVn4@nkN-ku+Fp?K z`WN!+IP-JbA&%n|@im&bMK(#m?V9*j3riD$ufnk7K2P6nk+m{S(ao@UEf^*2))<_> zOCu%aZk6?8A>J_m*#n%{V!*$)%4$`XA29nRSsQ`l&alGk4%9SLZ$TL_EoW)@R$%sF z+O}1u1Sf{?pV=yFDl}mnrtEFu zk*#*fIyTI~6FX!*8>VqFZYN?It6?%)*jj+f)V9QD@B|;)A@i!NJyu~tFr(bpe@;l1 zwO>{MwE|T8?E=ai&(Xl0pdzd2rJXV@Z0_FK3Bs_CzTOEPU^Hd#k{N2<>buMCj>O5OQqE z8!UHdn}yZ*@C!|soYBBx^IOK!?QG|AkCJr9SMo+UrzU+Rn|AjDYMIoHh7kl&-msM$ z#(A~=SFd1`0-w?I2oHiq-F)BBG=!D3#Z1~UHr%D0y)vgJMw$b)t+u5*57uJL-=h1( zU2<`m$Q+;{&p+m8^Mr5$nVVq1AzTa#t?fyp*$`vvG=CiJ z7c}e}Am4a8_zgJiICAfoJ%TI9B!#r@LjoFKK`=TG5& zk*aUfv3->R!DD6R>@7y@v+3C@*20^qt- zRiQvDxfPPKC%n^+v<$6{k7+R^22xt^t`en4<3N~3Cj zYY_OCF$@g%P&n{MKgfYmZ+*=PNJt+aPYn+sP!q(b=K;_!kaxm06S-98@)h~t*9T;k zVmwT_%0qCIVf|ztnnbr7?Eh6sx7QVcd+8ZO`7p)OlQA7 z2sv;cT|Nl62QF{>Q8SQ1KOzqBJZ=6F&Pfy>JOrj!M*R=TKJMWcd5f-N$3}}mnJ>V*U zVEr03f-MR**@XjU9hI#*u;IpJhlbFjVa3D%MK3U>Jm*yc8K}mDQcdG@greQ}oyUpM z0?eX4oBr3?<@452#2YQ4tYfma+Bb(eawq)6$cv82Thu{)XTvc$C=)UzEL&PjK^a>^ zpjz`B?c`!M)%m!rQsuMNrt{xs&WViy^cD-wiVd^UskJMaRved6^)?6K*-%wJPyhvN zz38(U^<@R-O{bIiO8PIS&3V!Ww6M3R?S837JH(CuD4p ztaAUj5#$N9KOt-U^ZqKj{U@24zUf2%NdM9E^5M1lYapwht)X=`|u1}b5f?ks`>RvL;;*9&(HF0 zC`7w|mIrKSZ1mg(XqVeh$v7x62T#e|8{Zwpd9CyG7Ga#%h;#;g)et}>jaTl8U~H`6 zU<=_-xkc=z)AHpwq~;}~q(*FAYXflD{xCXze;RHDgmwWVVI4)SWS~?;8T6?#inA(Y zQgJ%czsh8R_C09P4F*2<72oVKxz=jOH@WyipR=-W&y9k=X*7Tzk;OcO^5Od^9>}o= z8iNHeIMP^*k~R@WY1kmjdu;`43-r4XiM6o0fVA*8s-2S~^8EoFx`^qWTGWAB3i~70 zfvrQV9?zxi=U_NKN~g}rxA157FLH3!B$M5r5(wG_S+k-{1@x#jR-^e4qtsX9SNV*M zvqr2m{}Ox+>wcHZFaeMLA@4TxQ+i01Mo0dTZQaWjbMH%ny{Bg9q33GY42E#ir1MCK z=8nhtJHF;TJZ@#w)1mUI@t^X6v;$^9Fl3C z=8aTz0fJ1u3$l8Z_4?sKeyD?%tw`Q$>q0=i5s%Omc)wtw)$mQL9)EY;$G-l`zoz)+5Y64sTBBEUO(^;!ZMP+bLPJdo* z_e3hX2r*9IPowuQg7z$;!xv>A7%^J?C37Ptvuqg+*Ycphq_@rv6lesM*Ubh{*j#-q z-CFH6Vq=b3JZKJm{Fm&OJ4JfkV3RRGr(8J6@W+gGfr%JJZnWO6arMr>;n^*tS%1qR zjxECx?gFk*%;-->sC7&Dpv$&+f}Y(kH4)AcExL}o5B2YjvIzM7_ksL94fec@ewL5 zB}f4)EK!RH45z&L;}NQ9{8`pvA)SJDSd8Crl;`(UKT@S2IPBI))rkGB#gQsCbzB)j zYk_L(=0+HM#yg-)G1@^7dMi>T7xYTUeqj)7H1NT%nU4DZcL$&G>lXJUI*0b0eqeng zF-r9TCwMYSO#%yubYh7inL1S>#@3pz{-8&lDhp>JPjIUAtg|}22StI{8HGxkNSV}> zpY57Q=u@Yv4Q_GHsWS0iOth+r_pXmtkK`PMmZ2F#u4WAWaIpq(C7C;DeYAQG2^xhi zm62#NmMjD~ar!#EONpQbWb9RgYj^e~ML|9aA}b#F$EjZk1*GY!dZyt41-OnQ56`@NZ!tyVG?R-*0y3hZH-g) z5qbCODNUf!$6t)Y4+sXWy8&4uWOy%A8|Cnu@V5H~ZDRdu}EGFf$XUeHTj zqF-8&tO_$O>l<8tX*^_VQ&wfUvjE6(DOpu@{0;FS(mj@Hrl^Wh(*ILX5gkrZ&sV^q z(1J*nitW_}k(Q*YK}ds0O;dbsMb9+#8C%Tr)79(zcSpKf#DAa6P^-0>n#E&nrsjOf zpqUzeaoE8-Wdg@fBbQUPhbP(t^%EF_Nz%W0a{zgMp);8(7YA3yXDP10(l|@qk`{1d zMZxILzwIDSI7tG6&7>^V8{PUfi+kt0K3h4gFd-W`AXu~L?i|$Ahise4mrE?V@(Y;f)TE!s-3)T4+M-2F zC3w;dnp+bS?uSM(N_$e@FDl!4#NQlhh{d0o{mdg4^P3W=O0THmy~ zYLm6Xz(R`xR%&3nDB%41;NNFxYkjc)GCEmbjlymo(!ku!>l%dYW|U;1xQ6Nu_#68+ zR8IsGvZ6dNDzd5TbVEp8*zt|P4WFgajX?8t%EXSG{XQLLsWbCTWgV2jZw2A-u9ACH zG9A56JzG4%in5O!aKojDfkUE2zB@b{B|ju8!4il{$O}Xz8<4VGeczwm&96|9gUqY?Py`LBs` z{tyKdkX`Ol=k<9|{0E!b$Y&4xpeE`*V7Ogn+ z#ul+9yF3w+n+@h^o91TLh->7b@kRo*?G(`$$IcWqi4hK`D zj&S%%2wwg(@WXM9z>maYduX%_qEds1h{Kh1!9mR2KhvZlLJ%<`5c|P5E5?5CJ-N{~e2f+nG@RnIG`)RF6Yj6~}Bxp@Fk+H zA;MUk)hz5&(9FZCH#N9LA7sm_<<{qD-p%T1H;UMJtj3f}yw^Sq2P*Nt^K!a4o{?@940H%b*7yRos^ov=q*A%*@d<*5 zdVIJjFnfGxeeL)}v#z&|ul0^*7mo&D7f(ogri&-oUZ{&lgR_e#1U#%zx{Vz`{?dJFc=Q>l=rIYIaun zK$=dSRdNu57i@56^_cZ6-Ft_sLJ_yCDlBssc2SM!{@Yc25R%)P*aaq)w{M3X#}A&? zB?w+FqBHjez|?e3VKdn3#{EBMF;KZ*p_wc-n5 z{#g;WdG#0AKZ`F=i@Q{O8=hEnl%vIXGuf4|SXMEUm^LrY-jSLQoQiGV*)b^u&GY9(-iyeNc+#k+Y|2W-GIib2v1j zfAv&tMVT#@N^Xu$q2f1HB=u^pYSQ_hDqG)=D^oet^96e>weF=Ff(yqwDd%ZNGQBwf zR`a)>2Jsu%9Cq8!dZ|WGH7@j0&4a22f(*?SY};F_8bf=lr_fobE6Fta7%bvReW1Of z+s*rgbeowiQ&!)yKI%H1rEuh5Y9uQfO>;3cR!$hL4Ah}5329^^3{jb zfruh#!4iy<>h^^papA+N4nKOTF9`M7hm}sF#>KC==^OBf%GS+K=%-FF6#fpSvi_=< z;^J;AsmlP>P#q`!Ic|We>lk-POHQJfJIB089;kBCD^$T@uk?)BkgE}I+G(Kb zVs)JOQA7KdJgSncsEhUSAeEnmukcx?4&-EWVuc%T9YT3|hZeEv${;l_xYT?Q)Ek3g z>M14X5H!4&3Wlisn6;84;vk}NQK`Aqa|pCTWG@dW`dokl&a79~%z>a)+Zg9X#{9ONRloEy)m;n9KMJoq3-)Anan>!<@;;a)N` zma>PbXZ&YO#KA5{3x=s)&3J$^q-%&|3LBvGcTM6`KhM(jjLZQdcZP0yR&7Lbohni_ zAgR_ZQnS*RAspv80tJOfKBhBm?8c!Z?BRk9r3i-A1r+z3N{U!8kwrQflOfBHP9(o-)VK|~54&84+1J3BE=M40@X>cQxF?m6{tlBrDT(;VPAHIHIgL?0BZ z44}qW#V}=*((lEpP7rglfH`$aRQ-5X&d`76FW8qbw*Evz&~L{QQy-uYN>t6_k5PFY zBA}_!LWtgMUbB{u_u%dLR6plErmy#y&-w5Nef^_(Ed$p-o7Xr@*?i8G-O;{1aE+4h zZIDCYz%_Wgy_T_bmPSO)>0##1WxE)pc{9KtUWM`-^x|-po;zWNHksdGiN~0%#u!|J zS3wSQg>&0hu;m7N&T zZv4XE>iV-5^h2L7$rUMA(23_&YhIUnBh-5T`Xo`r3+g()X#Rp4{{KX`6(iNO%pxoq zO5xyCR>qEc*eI(eGWNhyRYdQPR83njN>^sL?Lj7vv2qP?8po#vb}f4tihOlPK~@do z4GWRW$HPCpb2M;kH=P=-8U!DLk@;$jQ4d*zq&`l^CgPn}#%fZ(W2_n#d>E_&^x!!C zaOya9SFkOJ>-6V1wJ>3hm7`#>RL0gKiI{pi#i}mzB_fEpxVK! zJbMBVAA$Z8)F=@X3-;)R7N8cJDDdkPH;Iki`UIH;%unB z02BBB1@hiZzR9Xx@H^N5KGzi0pnOyM5xGh29VKQk6eb;$$8)C#!EyN&LJxVg%|C@K z^!ZekjADh~PgUOF7kHCLPE(z1ORvxmQvvkYG?gCq6t5=JvT1N3>q*F=i__HOK?p8Q zfF5SkG*Z_ifn+CDnCEi@8S5gsr&qXNe>xVXWDeavT_pxvLsxx+r>i|Om}2Z;B>1Od z#{x089IRmzfU6*{GaP>@Si{DIGc$|J#dQWdIwxd-S3?~en>DcEP9$q1@l#uZSP?^H%}!{yZI_II6Dl|Yd(B}Z_$YPYPj|ZLe*ie zz)|Dcwu%IMh=ExPR2r%yu;H85zY_<^_Zvq88oxl@Rr}iA^L2ey{o4wp*t7@{3GdU0o*={eFL#L)2ZznhnE zn=rrjq4rDF6zFn4E`^iy42fmXJBsLmWvWxwM^-kOux-6B|1*HIq>aS>+LL&Ib}qvU zs7N%#kxO+JJ7Oqzxhk|iP4_QXy`onjJxp+M&{UlLSufF6jecLQT33*fLc=^N6;23cg{FsO>xPwsKmn`+UE>1AMEo z%AY=@n9?9q(cnY5tzHX@BH^}Ihzd#6`#qHuJjgrj9UI<(S0wx$P|p;4|2;Kbt&>ZU z+1KTLbw4I{<@;*8>s6CjAqKz(U&zFj>QQT}X+G5w0(>i;V(Sdak4cw)^vp&_>%6q2z2kLp$R)6yY^;*Kk?NBZ`ZWxkpV_P%)*g_Ai zRt@||lg?TV!}t#Re6@Pox|0e&ROxE{OuKs*_4*L;1`AFr_b$mX?97r^nO9IYe+eTFo`vO<9!L(vTz|HF9*{B-$ zA9`H{oFxl-0UQDRxs9rM@KLj{N4+D8A(iX=KdJSEjrycgbLS(422UCP@iA$F z9}5RJ&p{1>TQ4PpQ5xJ_M`J4#0;bzKJ?&4?6TCh#Eid^?P$2D5qkI>m|s{Q@{fz`@@ z5A~X?HYSYK@=@_}X>LqKR!gsJSE0G{GRWxkiJE5ad0{F)7xz3PSvBk{*;Z&wCZ$Ocw{l@ zuWFMBd*N+=M_G6eu|e@wd=l0fzS1x@ka&<>XlB@EFcKhD72Ot`M&520;x=F9P-~a~ zIj|`L7LbB|I5y~+T`DVzGY9oC6Gb$Cm-=@FVjIecE9KPGjQFnI*r?NK?rzmpeOaP# zB+?(dRn;miQR+(mTA)OXDp&E13i#SsoQwihF}_rNLQlM2`laIIU^jfJ_Up(x<|;a} zjwI=Ud!oY1mgfc4o#` zYL1v9(`iLZMFit#2$f|71{&Lv}Z{`4)aZy!Yt0a0`^tS^S|5-)dO=?i#o?=sWc| zGc%faR5hin@70hLuKoZ?7SaP$Q=K6J&IhGo(f5d^-bFus4+$Ik@gX=Yd;DNp=STez zLSb1q%03L`_w0|*P#gzTVPp_}sq+Cf@!s&X$=9PlaS+178v5lR#LUWex|ekdbv^_SuzsN#yC1e43K<}4gBaj* zjx8VPgO+LGVa#hQ+J0E&fhb(Te_{wW*)orM)+DbsNMqP|&Atnu+Y-nT_$JF4n9%p`j&4SGB3wiu{u*yO?7Py|K%h%OE}<`3;U z7Scst19(VobWB}k*2C+1T;=9%lPKU1^H_lwAvT&|`QvtYr`t_i^7P}HZeb$@sqTb+ci%}c`qQ-Zq-p|wb>t)@kTUAj*q%kLe^zgWibvB< zL7<*V51jfx#JvZ26jj?loY~Eub0(XRO#(?s0&GHnK_ zYDO%D$DPhsHG$sw%~eQFxrE=I3AE=o*RrU;oUmH}XJ%&)Lx|Ie^R8kzrpwO59~|KV z=XJ;gWTC#f>@W*Ng37;{e*Er%5ejNX-}9K~_~A z>47&g{9R<&txMnCn)Y8pu)qQU=#}%N;`BdVH zYh+Z=AIi;A(z+|ampK%96)a&6J$=tW@N7Oc!mZ#7NyZ2=nk3`iJu1?toKbB+K-Upi|<1=g0nsZ2iWb|KHQ~v!ZG` zRr?)2RkLZw?+_tp(@(!6E@n0r`~wP;+0^(C*O1`pVQFK}ABeJfhvNT)-sW!__owR_ zAlFNOf|eeq%ux*G@CHGL-7vwDmo(ZWW-MoA9;I znRN?B(uEX%3(msF3BPLKSnj_Cs=a_N-g2D<#y@l$^m4Y(`xpAd&$@pD)8x>=zg=Zh zk+xYoirCxFP@v07FqZ`A=du!8|8@;E-wx|l*&O*GL2 zO(P;iiy~JX!1{>m?2`r;T7LqaaAeH0wG$|^H!Y$lm3uy1(V_@F4t?X72r*L5%yl8& za3~FQ3wFw11hJXL)mNUf&Z{!L`L54-`` zJEemYEqLX7^Ft7`68k56zIJ-O*c1aPZ#u+?r{sajx<(Rhh!LsAb>H_fqM%`nr|Yqz z2rh|n;v)vZeQ~0+vDbGyPLy?cZfRE&xYO1&n!>;QCe?_?+TEmH@nSvTp-6)05d@wD z0FUvbEaZDHK~!Ol>#0Ohz_{uAGZDL3#_lQ33)XfJ76`=WrpwJTx#6hitmkzi+Xt&W z?I*rRlSBb$>}~#f{jk(b+)m6w?%==Zl|rHp$48c*y){Cfl z+NmU9;0#SJDce>a4T$Em0)Kvbw3HZz7x$MEFWB#AQon+TwtqQO zaDlqDnW8>W(zQ%{1t3^jjIvu*po67F9KLd{v{+iqpQOPIWUaTV8;IgBNcnX)asyK$44Q+@i&8RBM7(`pE;&qg{e_Uo#S~bxQ zTIkepYExAdB&r5b)sKo&Om$I3;Ss9PMLMX<9(MxutghE?QFZYwsGE97^n_gUpN9my zSOvP+^pN0Uq~LrrY4I}>HKuEbc92Kc)et3Pk*gGX0EqQLDbjbj2F`cjg^IOAtH9q7 zX6v!Ic(Imf$=ABIK}!}=m)e30AFis6RU(S7BYuR-R}$sc$MD~4EId@AuHfPWQIE+K z`sf>%hep>G^fK(L0Y$B@hV!CKZYYeK&E7C*X|BXUix0;AMU@UGm6)Bnu zI_W|ykwBH2iAsg$ppH4B%00G23d$H@een~h%<#;mQOyL$HE(Gq`s0Fwlt~?%3yyr& zfB)Q1r9~Ig5--+98eBZuTfi|_p(e=0GYRJC)Pw;x) zq3%zLgYcWL-cI~(q%5ANooi}@Re>@k*?PnNiL}T_x=PKS!YA&~mrsdDi*uqc=4sBb zvYqKEQqe<~hIA&ZX50aWLPrJH?;r+-=QweqKkgvP#jHa{UbF|v+&06ei#Ixm&IzdI z;qfNfDtoVo&FV?01h5dEkD^k_=VST!f8qrCLQO$92cU2K-;0#$8)?(iqA-AizJFR& zj^QzxRymZ`WMxn?qL+(y6c$V%Jv(Ccexzv~MWs?ZoDiWAw2Wvv9_gttSUus{qNAx1 z&uw@M<6Yds+ZQ{E94uLOC-FG%@}W**3S^s}orSKxnA2Gl#R2=Uv(ORazjPM062L?- zW7Y?sVEsl=_fxxzNLJ%C=bisSf^jb%5?$>gI#ik~&?2@>SOnw)xVbTW=>u#cFNX`A zV`bc4F76%<##O(#h(>f3-HXh}`lO~YE_G?ohQe49e{GM5ENr>68<5`}s@_fP18G*> zMVV5%FPtCf{n4QbOC|bD1+I`>m;qyt0(+e5Ese0s&fP^aP~PC~q7wLr)!jvHUdIdF zMS2}>T7V~FT8Popi^id`_7*xUfz#+{in6-{tQme7ETTVx+!?*GHLZJyBIWh0ku*6l z>%@>*tH7+e)_Nj#I040g7WEMCVHz!Zimnh#SN0TXm|Jd7kr=fY4k+9bY=&ns{oYd) ztEuN{deZ?c#tQ?i`F9P&rRR#`1oqJH-S4)&M2R##7jLnDe&1Ux3)5KG3tZt}w56Bm z4M0mZBGak$GoojZy7@LfBPKcSVVFZ0i~G|;J2@C-QWkL530j{eI^jel^cIr>*kH;& zx1xQ$vC%syybso7iLXQ-aX_0JZ#^#>fOggWk2nqHvS?q?1ee}@f%Ny%t-fH*F8DU} z6DU{kBVFzfM&tsO82~bSfz}MrXl>CzptZUKHKE7fuk-#_d_j=??TU2!1;L6RV6dg= z@$8FYRPr6Jx?|RmW(SGlm!iJa zgG8nS*3M(Eiely}XmFqshXv3ajLCy$>=x7 zA0}EdQE|}laUd$M4->sYej@s-Q}}8aYG~LwN4lu?Xy^5G0YX|79~02C3mhl2#K58QMDA4Pjs z)8LWfNheg@C<6jQsz;th9Y=}An(~BG&InP0_Kgz73u1I|a{8w}@{Jay^O_g2WwyGV zU2yOojg7zH%NZ?3Fv*A=E5_k6|4S^`=CMrb`EL{?T8Faam0lAs-F4%e*F|bzcW^&_j5PU;g8Dp%bwbo@O)F z!FCI$i7MRSn`xpWx~()_!-4K+!E_s_gKeh_iHM@486r++2;%r7HV9OoA=)rt!3H`J zaQ5~LaHJRLyO|itsu?1hip>=3>>JFDrp|(T!aq=LH+XTDUi2-qz*dG%pbdc}qWk_N zrpSq0kqlMF#cVyiHM2!^8Z%pS0{Htkn=~(;BNjlzQfIDs6g|B@SA2-$+<2a-!=p23 zbwXr8S~5@bsnPR=UX~v7?PZxXUvqQ&Ku1ty24OTz5Sx^J3_-ajfH(h#B`7ryk4`;Fl$00y=_-6x4k`SVzw{GhVI#VrU59 zgXz!*z9|N>fPd~yq0Q-Cmx_m?*-_caIi_9grR<Pd!+az;C=`u2x z65kdJu`Ry0#b)I5czK!Vg3IA$*oTeqi^5V4qCLx@Z<<7f-w`v7Y4qVcf}0bLNq@_2`d0hi>clUky@rdh*t#Y7)ROx=^&ifi$DW#Nz4_n zgEXGuHt-O~A52*xE;M|R!*Bk1iSNshsJ%9}tOWnGfzGVNP)<P z1NB)gs-<0YfJfD4R4bh2(F})|fAeb}9Om@lpV0Qz5KVyZ)(AFKTw4RuluL8g0bvF~fy>C$PazsjV-xoTw*{B!Po4b7oI7-}ICtPSvM1iYd*BZGsu zf&X~){tO3fA*0P7h@Chk<31EUFrM=t0#jX~)*p$ce7xs=1UYd7UHwS3EV=j~-l}>GaSiqF?L*L?Z04ek0=q^NHYT!L9`rt_ad zCvky>PL=hj`vxtWWpB{rxz$Smirj=q<=eFZstMhjwAOqz4kfi`U=YZTr{&UX;f<))VKOp3T1B-5uO#0 zy-Q>6ddbo~D`@UEh*Ae>$2QR76%@W5H1!bm-!5t=;!TFc@84;3&@#+=*}17ZCL)xHCHw0(i!QrFFPzOCyTDq*OutJM)d~jB zW6%Ryx)wf!2Z(N#Q_ZE`B9TU;i;RrbJ>-)@97EQxx)e~@&Tzo`i z1bcvSYWkE-?71wy54}l8jzY~4?5Q$a@83Qq@&csc#iU=%|D9MFe36~>c7F%NJ%ipn zE-FR5{Wt7Z+9W_Hk3-0vL22Iu3};XizMP~!-vii&5`8bSOF{jB+V5Bfcm17VpvdeW zrYQnTr%V~(i<`}9E(ym3NQupK5OTgfV& z#NK>PJx+=WWj1p*1>K%$7uSqYP>ZIAx#v5OVS&e>QrXsmGvwJxTThAwcQYZOxiju7 zp^VO*vE&rs;R5CRK}?j3Q0a?3aTfmo<>nsW-XBCChjC$6eOP`v{RozP8eRWUq(^Sl zAq@zu_iQpKdc7!2jn9Je0n?oomyApFpP$5X{DM-nDAhQp^~}$m6IpO9K6p-afVQ># z&*BrT@2@{Y)_amh{UXNYIjJ=M71k~syI;Y#pQ6;?#ANii`Zo~ROLXctQB9w~MZb!I zzRKsp!h;!Ye-Vn-w`k2pk>9vX+b?457wGCm5aHkHl~EdphA~mrxw%E`pA3EOp3W8CgRHrt_U4p`}36$SYuC-8dpWF{3y(5 z(*an{5zOfTG`vLMT)xHJPxR=`A z(vM%fB{~I9pN-V_I_UCG?kDJ>+aewfTi+Jd3*fX$wq@9-l#!Q&c6z~W-3JQU^}=CG z|4X!r=EKH&hNuQUY`&3y!R(8Te&&w7(I4Ci*=Pi&P}9Y-(9Bd6-kkZ-BeJg}h+AUu zY==XR#k(z?vQ^wT)-z6cB8O9#ktz-jz+ED(3;!U|b z*j*gDJ8#P8;r`MgLN-LNiz6i0_q-e-D;t-6#oe;76Pw>CpPZEnr|{G$Z=7GR&dN2e z^$HCMCKd;!$U?fEPijZCg3G=^c66o&&0?#S;~lvmF0|aR4W#BVsfZstW1oW4kjxa15AhFVj+!; zmBmaL9jx%wIG9E*d%#{DkChK&{-xq%1x)u_(T5oytLNXg`{Z%1ZFe(5HvHHp7Lh>O$laZSuOZc8B zECKVn_e|>Ll`Zi1)5T;u9r6O?j?$o_0FdUXvUK3@xv6pj$YZfI*$sd>E=_8jcrZ=o z(O<4!TdXKnOuvrB@@+3FVSM&~rFb#?&|kTXOUvSNwb7scE-vE}AygLQeJU0ZDr2A> z1%&uYmyo9oz=5Zvd_4B7j$X30Uvb{z|Fy;dA)Xr2(qRUmYNc@bnL3w}Dfl&{6vp*4 z?JFfS^fDNfT?)AtQZi+EJbffnW?|H=$^g!CGi43j!m?*l)zVTIa_(MQ)=$Y@rgMd$ zC{ME2!*UA#@pwI@!we)A{;agD!w#O%fA_(;;mPMl{$BBayiL%9{kLtVdZ39{0-P+of+`De5#uVwRKv1er6JX1zkBdVNSdqE z`;u!VTSI22&*Xw{iHN-7Fk}wy&_@v) zU^8tdo|^P}f};TCt0_N5`RAQAaj>q@A2o3n7g1&{J^E0$$Ojw!_qF5);3KEi)?ltV zpkHgte%P3&>&UmTc#gVqDK5+E%Hz0beoaTj$x&B36|uwmB;}T(V`}R(3|ve6WK=Ho~5!l-8jWI1z7E+$C}DYnh0{P z$;nNDX7%zXgfrtuf*ldo9{()|Di6YG_gpiX1`DUVxvU<}S&q3rj>~1L&3t(x4br|0XbUPXK8hkfe%2Gxle<)~V95w)q7I>ZsD1!sW z9m48&J>oE-1&s+ccn0#0=VW|>uDnOHX>ixK6W*5NsY-?T66g~pa!epiknnJ&f zB&VEwofBnMZW0v>DI*T^!AvoE)Wl%OK~WDxcS8NaPP1AAV_Kv64mE2FN`8T|+5*jd zO<%Q@#q|*5Xi4?RBCI5jrt~K?Rjl`fY*pbOx?t@KG`oG$5K8KI7h{)GtQW=r+xio7 zK}*D!lnkr=2R7N_2Du$4AahbLmh{7BD%<~=D3 z=`ltJ$C!_Pc@mu50g7*j6R?ANw$qEc=}UJeeb7!8PUT@c>e<88qqTEm<0}DoxGU`> zOZZ4#ok`I*oPu6!FAMUHzR_MbiWqy=?}|K>F1MGxwY#5L&gjAC5(|n`aFF^wB}+h} zqNikkFid6#93!1ev?+eQ)&Xv}=zpA!>(gHyWs)Dl5I9+enst&%#nvPD zll2+$=>u}DJ4l0o;=_}0bb(A=7K)4EgE+(EI$_CH(|et;j^ER_on(fwVOD3^3J0@w zXITeI(W#xmRyCq=U1VXKWh(^ncU2cms1ZeXmCr_8KmrsKEE!J!h_3RnxVdBaH~i3s zMzS9O(A9qWsVmU*ek#yS4vgU9@1~vAWm-2`zB!`_w8EAcz0;WCg5ph=tYCoAI0Vtq z0CTQTp`DoRd(g}|BR%>9d>6AhM3LQPaxHzfKj4?SN^Cwx1Bj3SEM>rzlCeRW%d^+T zH&Dx!tJxY^2!1uP_-oX?yDX*OV-=zmNT;))yL`M9gC#gLVddBFYAl6f=uXxm)Cf!9 zIcSY1Qa>m6kV(An)q2Q><5`x`+)&Mv)J#8^!>B486<#==fE^wq;Aj2O}M0Hf$5n?wX)=Bz%$A+4un1p zIU#k1s_#3>XzJA))CR%gy=5)Dy|K4!S^RxuSLbY(j(VDyrD>d^PqWiPFuM+~0@kU} zM~;mAd<45QPhbHqocia;;&k#ax1eA90JuM){Ljnm&UeSQgc{o&p_0}pBJ8SY| z45;6+qBRYSL6d4LqYv~!zN^p6SfftRKJ{QKod$j7OZ<*?Sl?`lml*Uz)f6r(7ro%Wj3#^hlPG( zEP@-J1-zjDu)NYw*d1N)2kIrJrmSV+Dkv}+@y_v6eLj#g)k}?DlzpHbd;dk*!N~RH zdr6+llM6T!z!(HdxR_cGf+pi4eLIMGJW6>*%k(e{CDWo;WGnZQxg7WkHhJ{#bmJ9S zD(T=Y7gtF@Y#j%s6tL!RW*iOQqrO!8Raq3Sn_XXpGGiI-dsRMCvkQl%hFKpv?aGO~ zi>CE8$EPd&F>wRZ*fQ_2^^^vT0w~N-z`8k}qj>t#lY?cwUMCs5de$P?2$%P{Fpy3G z3bbT%{XjTuP{MZ@Q~eOmLoJXR#sizk2&ONf#{WITTKGOb11>rEJ^d{M-}-B?ES4{K zmEK*ra>F5Q6_p<%zYfYBtWeH3RC1o!+C$~td1C+b3JN5T94gb~l6A=M@99VH4VClV zG*+_?7{md3bQr{gRWxpxe4^q2j1iy%tr2p3L=>PiqajXir&eQRBlmbV=;$4vLW{;gXElXB8zTz@4HRi6FoxxLJ`E** zxNx%X!Wh{x+#H<5xs1X*Q|R#tvZOJPhE0&q+3Mz+PM2q+ulPh6Zp6R}DQqhw=UQ{Z zI#_d(EZI0f>TIJUtc`yAA}o|RfSOQqTGo%$OpJI=^u_sOwbCb;Gh)gFI8gq#vaUQ?*J5_Q$6Is4zVipo>$b z0vrVGj|BT;KB|x-ce0@ar!bTk@T-=>tjZ`+Z8HU?W(tbF4k0q&*bCpj;7jo6)(ixD zdPwc&@$oc}h9BwhG(g-2Dmh&~VO;QKPnSj>`e8Ntq!|F^LB7vs$TkjuGy+R0c-Wv4 z)h3+-B=b_{a*X;#lI`Vm&a49#vej%k`W^*DNL6~^fDptV_AiP|!3v1@Iaswz)NPI& z9~=T}PF_7B3n76wcuh#tsLGn1OWwJ%fE}9VTnW<*7-mMlI5FA*-2r~L&0N{Y=6)mb zYvEi7xhLtXxpDz6&&`u{3!I!7P$;2O-~qU1!7Q|K9#m4O*nt)}u4U)*;!yYb@=4pg zBv(Q)o0pwC%KlyyzHoTHtYWuO|Jo*Vfh=i{n%e|N9nwp`1@a}k1>)cTv4vwHlp1f* zz=g6VYA38-C`%-KrLirb63nA^{{?e^>?Cx4q1*_I-NlXZ^w}b*Ep~q{3Q_7X#)5MF zJssoC9Hfr%#<9wa@#c<(QtT4hz@NS3sU_0;e{4Tz36yx}>EIGsM&@2*%hm)^Z-Arp z$0P;P#AJZr&3pqq-XPlahRnX(7!n%Qe_t@9qx!Soga-Q}?Ris<05rE+3jS&Vy}DGE zjYFvm7pXa*uP}X5T6v!xwN3dqmKmlHOPV*ZA!KdE0WNH!~ zR&`Xy`NE|<$SDVUN|u`@PzOB6^oG7An-2dV2jndSPjvfqyS*3f*CAv=vfMQRR5ZiU zB^3nQof-+?Q`XcCaIW=#&5;(tasXRN5ZY%alZRFadE~j7ow*bjPjCnz`xCTO5`mH= z)bMRBC3J{^ggp6eS+LG8fxeaJ4@a7IK@RpEiBF(!Hr%5blVxNqV9CZmJm&p&yBP34SfwU$J!V?y{Ojssgcydq& zTANY+7mhU(rS)ByXFK&@E|+PD3aQ^?=0PAEc!yH8cVttbhU|ABW?ZDX@5oPZY5Ok3 zmxeHZJ0hK|3h`C;5*9YN|xc%pqHC%&gO%^Tj6Y~s}StE_9C*Xve@@Zzw)nAI4(CkDBcPOO4CM&Eb>vwn89 zgl}fZ+kD^A@t4_~yhnSkiiHAzok5q zE`PdC#+LZ6Z$bg^Pv6XYw}?-F6F2lXH~JuUoF~_MnPv;q7b+m#b0At%Qv3DNpUj-u zRHQk`ON@!Xb#|R#D)aC%VIhez9n6G%Z%!9oLN=&1@Qwyh@ zrW}%3uzNd+d9b}di8-2wq{IwqZl^F0Huu*bK=Y7K@HHqRk%R%=rMxk!6_eInk%oy$8EC;hqx8)Z3L*nQdS?nY%llaKPNM?OPlxTT-TO8y^Zs_5)d7LtnN)Braph9-q- z1hql%NlL)Qg8krXZk11amh=8Hf#N6=2ka)xw#w-Rm*bpaIM4_)9Rp{I5E_0wn;!dI z>Wo%fK9`qmo{TxPkGDZfvXt&@lkt@}Cqfto!p?tqIZf-qlpWL#m!5y*@S1Lyf0@kh z)!!Y4?pl5Ukz*?j`a%|gy8`FL*VYqk65JI$=j20l@(X-$udnzHun5?tfji|mB+0nF z6I5h2)!iiv{ZDz89RJ5WOBr{Ct(Np6QNxO~jC;dYY4a`_nrF!o5~Pa26|Kwyz6$1L z@VlgDr6JQrFi6$W40II5lQ^Hxe+8-XJ)DI=0z;k3P&efG?k!>bJ!<=<+!D_j+g*_{ zZdfP+hDy$Mp81s=mgd{V>IAN-Xty#E_ybXd)re`1`dh+0ztLA;$&@0$Inw-F#~g*Q zs^E|;Lz){_2e=_{i``)Fh|28-_qUXu+byfPZ@>o(Vmv3Y^u4!RI`ZU^WPH8fkDh`l zP`W^~5si;kb)4kHmxqyV#k5ZHJ9K`JtZMv1>3e0RLbDnFqftGUharw2D#c;zup zFYJ{=QkO5_S9AH*U<S&oT4^b%s!dvKK&_=N~hMOCi`SFx4i!|VqhITv3u$mRP0N*O#gHg6j$zVc z-CFCi-bDZacr_&1g0G5>DrVpO*>ogVE)DYk8I1Pvio=TpJj_L80L)J}Kd1QzWU~7vK86KHYLubAtp}vZ-Zs0xmQ(W|a->B! ziegQNljHkLct|y(z6WJO>>w7aZF~yVnKudjY3<7DgE(YeeMb%kdnrodkbDtJharcg zKliB&=01I%ihU~+gTvze)!lUdRu=XgU&6yeN){W!6!kwUM^L`Qz{{)X<-_uY0(-$r z@<0j%;j?gHVyOL+;9jDQJ)HApDAhfJEm}aG?aS~ZP^t|gWUBW1E*t?fSYX^-W=oDZ zQnj!btuqnWKK{Pp$E1f506U-AP^)+PG#2bt&o$v#Y+cYrSbBBN-{ zX=&yUd>A?~cbfmZK76-i-dIc6Z*>Z)cXV5)Jx2CgqqWZ)@p+*TwDU(%Ok=?Qy&pkDd((Q0i13pa!L#HFM>|?u;eFMy8_U5 zpi3@=71|}9Kt2sig^rm|I)9a;b)(P0ryykQemWgIfWq!dJ z%wGh+I`%h~SSR__`fJqxX4If(#WCFg1?n9^TG}rb^@ajPL+g>-9KHx%xxkgqP2hF=AYe#Ud z8vk1Ta0v`GO4ePL)me=?;BtsIf*1Jn%kUFwMDbVTOLEjmUa)mE{R#w^9NKjS8X4rw zz6$g(ga%xNzH=z;zAAeR51Jbu$Yv8X3c-)X3G)*mD=&m5gbt_vn`3WGhy{iHS;4Pu zxh8YK_yJ)5@5V;cf0v8z=_n$PHMl?3S_F^ir9WT`K<3Ur%XLLG>r1%}Z4YPcV>=#-26fcm~3nRrh*2;bVJBB#?PVm!d3PBxwA}WV%a!{5=UCOD9ac+}&@RC>XqS|yG$U}55-&0(Ic;f?T;XCoUxHqucK z7H1>1h*2eRc`-&U3<5Z-w+qLr#(?Rbu~@Q(^hT`8E2Y5$IuWa$E)FLxHd`=>hwXv? zae8pi;2Zh*Mt+%`u&rrvH0XI6;*ND$21}pb23>5m0K`G(mwTbWc#lZ4wP- zy85RUZzZVm!1#v}RAGM!Q?M9NpkeRdqVPo3BPEa&FOl!VJ4E|>;hdvI4vkJ!2cp_y zxZW(UkqMTn8FeqHibgjFz67PkvYOzvThPpcszU_YdBf~RHw&tg(Jid7=E=cE&8cFN zdI)(<`y{E;Mty3XtX{0nK7BT{z)KCEXV)LT1!#eD5c^FH_pC;~V*3^X>Uik5MSmr$ z#F&jpO>DC=u&;%?ktCydih4PAoDn4$J1UO-VH@j2TAiXw6dZ3PG3jMlJNJyUe@(-q z4O_7MT})9gIkFAvRY*PN7-`Tah14MK#<-`OhJ{r%9$_+7OtqP`Ak z3><~m>~E%0C$AD-{xBnK_LR}SX<_9IkM%V&aAFK@_gEV3RW*#)5XGR99b*kT=2feW z+cYs%mB!umscI45ZI_0-dwi-W4m76?Et#$w@b&q0)gpQ_`Uky*^C&ZOlW9k~s)sl! zRSeah2T^7*)huXGi3owE2pg6n087(~shuTqS(aig{5tKiARyC%@=8dn*b!*&xqAT& zJfgUY(Hu@qNA#SG8cg8(LdR7K$EppFOzs(B3XS^q8lYrDL^T(T=5{qxOxQ&ee+ z=(^{q@=ZRfDf)BtW(n03+>_N%C6G5m&1!ykY<8$7_`XO$h$fhfnK4O}R8n1s;2T#; z4GZ~B8huqt6&$|t6V5uUH;W-mXCp?4EI`dpj0^>we#ioHEw)~VFl3?B$q{N;{5QWJ zrcMDC&jC!-D2jGgG@__qrs@XHDzvnG$g=+{vv(J-r;U~cN~>pMM}Ep6$npe(AfRnC zO)agu=4<4I!vzwuX^8xi{w}Qw#_YDa1KZ{V64r<^%BcCEn%m2$6QJ^Ml~rf%tyum* zJ3_n5t9!Y}5GwHhB1y^W3TjqU=4Z8J96TlvV}pPS79zyV>--lpuhwRkt6~&|ShKdG z8V1^jP~zvx0LM{i~DTeGNJW!1Rsd@ad@ zYgb7`X>D(xtqSoycQz^sdg{~qYUV3VimB`4K)#9ug56QErZue--yJ<0~}a8?ew}@VRxP6t)U7Q_j?f`k?aTHKv4I> zy10YqY`IgF<<_1=k)FQ3&NWm4hf&}6VlA*|#y2#-Ho$E$rPNW6VmbTPQB`qyyN>z- zj(X46RYihY0|A!A0E7T;Y(gVIXqMMiuQhuSo6Sr1Z%G#ZO+vg2Y3L&`s2=Fy7c>VK z?b)UA13bI7)l;P!uxA&*5Vi;H*#(it_U_WvDfiIcS7mb}}KO2Ut-f~5-D z-b~C<7Y8le6wrrr9ItN(iXifuF z!RSI?HBc|wIDB%QwVDZs`xj!y5SnXY{ee=gaC`}V!zMVv#$au5g35%=*m zxzX6=d7mO1sUq;LDBVase~($@!BFpajZ_U47!wt4ta{udD?eDb+Z(GACAw%gbe%~G z&H-Q#z#e@QuBj31EjrW~ss6iCTodrB1E^sW^+|p99YCULwygnN;TXqeZ*U<@62K$l zDW~j3ACS|eZ5IaDXdOi(ME!twJwWxEDh}oe)f_w!$)l@H)j(tdc&3@!f!#wqe?w>@ zUudrCMjf~lUNS7K8gv~F>o9F;t}2&Z^S)#(#J&x%-#W6aY=k2_n57zHSa1bn6TY+@ z&A?katq)PBT@`WLO+fO-7}UIl%5=Y`-vRN)jo~d+dHLmRVYxlSX~e@Se_Wc=!f*a? z7!DDaqT5f$Td2D75L)F6X@%dxRwB##j+#G=zCQgG!QytS*27=sq?!DGFXLn=ke3=@ zo;X*1kTf9|XI`FZ)Df|d;J+mtHEj-# z-p{!!eVbcBDi7-K?%K1Ux$WQfEc`C6n-hP)+7|v#`;{hGScXz_sMp29GKQbWfIF<= zdAo;mYjfZsj7?Bj*2L1kd(Hp{&NuJn!1*55;BH}=Z}NKCyJv46YAixdp&M;fy+!pd0s+8d3K3E??O09>MKW{|$t7=X3yOy&c86^Cm z2z#i`V=DQ-X6*=_b;u@w28Qq!|K>feN$Y!$sgyi7{s-&B^|m5rC_L|c_Pd=gZBd0X&6 zth|3iwOP^67~6P5XuM%~mVsKaBNoWrQG5=10SorEbRb$cjekNVMju1LAzgI|vu2@v z%@Znr-g-Ycq&^ztDIchhdmt6;zxyNV_oPa%1^;uGwQHiw4fRg}u=EA^oWUPGJb?eg ztz49G!@&!`8~=rakIH=#Wb|Wd*iPM%eiwLZ-X45Y7h2d}Jp#q*Z|zkjT)a;~b2-#E z?kTm>f#~t79o1&}_H|Z0Z>QTG!ATvavYpgZZloK;cWkmbt&^(M^2@Q(o#wVCzrndR z7tfKNhA;;wqRp3kgoTID1~}M4oFBLL2X7$?+RiI=*vPUzf~U7m!~=MV?X0QciF9mV?xJF8N|?Hg=Y9b+(O2S^3*BDBAn zvkO{sCkL)_CnxPD@X)rKR7D02`}z5?+$YGmtOaA>KOOIR&2BZ z*UukGGs+qCN*7f!(*6S5*)gn@T~tZ|yFHueb$bgj5!MPi-bJNFZr#RRvDF=oBf6>v zk*7xRoh|mAc3o9Pd3l1(L%iNq)r|-!-@#KH?W%e)huaOBv6tz?Zcy*9qO09-?p9Go zcf}6%9lC>1t)ki8Ra*2Gdp)%`eHgsyci|?U{nj0N_EnVD1A@gWYHwe1dZ;o`WN+#L zc7HIP=mCw{DN5>z%Sme6Q~dB|*{%!dZBm7`!q&jAOk*^l@dQQdS{a2n-|6wwH?m0E&9tJWL2j0JkvMdXFQqAWI zwp8b4VU}I!Y8DvDb5y;zY6Pyg+*wbH$S!UaCt>}e)AK!j(;F=Q>-0Nc22z1OT7jR{ z2WvT=7WGk0+>4I6f-85qkNVsgo2OOFs0vK zgzo<|b$m(H#r`aKNtKE}11Z6XTne0NK)38zq1DiX>G(@(jB}vdOCw%U1!>sJstaB? z@v>f#%7avQ_~y?Z1lfKnT^^)HM>duD&_LVExiJvatZ$sarOlL&1DGTh&iGW6MC1Gr_uW#TsOH zD-))W{bUFzi{19Hok6Yz8iIpYg3WVQZ$7MB9O{4o7e-)sz0C$rl-XY{=?w` z=sTF9g*wz4p=ugo%vHe9OlN0-m)V1Ch#8JE;V`$LHDazkze0XllQ-x!_Mmkm9yKbk zB6>2*ip|oWgz*_t1Q-5>dMFl26}fjOZhB)`6X*a$!h&JLC{)M;B46Y#FyqKH?#Gu) zsykBVu9-h^>-ul2y1X(Y z-&S)Y){SEhA7pDY6F;;d^XbQyXk?z{d7ZoC_#g)gU0M>V zXFIiUxaTvP`kp!D!oBgmtmBTP&SE@2Gqd=W_ z)e@jOJoY*-QfrhqM(FRSD^;Zey9{qU47z-U~c z93UbPrcSO>&lEYh&1L0$2RCHP)filIHsh4nzGU#qW}HI3R;zabu`z4ZEAX3~xJG?k z@_e{9b~>zZoth5HdE5cEV!wbG%K_Z0J3|b?^J~E{oTqVXRTa+`tc#ZD^f|%j_pF8S zb3EN#s}9^1b^7i5pl7Qn_5(a#MRh+=Go7p8^>X_~4I^)3k-n2zMiKLhDpFuF%NLio3;Jk_6_)JYi+;iEj z;BnwfvlZr%%hdXF_)L6C7e2=THc+{3Sj>Ucd>dx5iiT}d)sruUN3~~6?Ow!v+wmF=ztasLfrbcwd7t#7Q}BD9uKaBS$0&%h5zqP0 zJqJuF__PZ4eA3@@n00bD721JCJWu_1fJ40E`(_8YIrpBu95$8w}fI@Yv%r8|VH|f{b=o^E-1bVwhi@#J~xcA@ShB^9v|F7T| z^bv|f;dJO5KYXP+1Po38mP!C~%S$DosnTwki0~g)-oMfhkV?RDm!Ziv=>9J$1;9lB ztKPRxtstiHFUbiW-=o&tW4s96_xsn*HQ9?J^fHa!t7`Ls-wPGNV7j(f)yW6G#mf|@ zEf5g$o7CF};c*Cc-3Qi7lhR^zY#-P?_)j`=L+B~T zP0)^9Ln~`ND#Zi!ASeK43mYU|CbD-7kn|SLC|D|c}Nk@?0 zp2YionF2F;cX)p1!~?L6u4Np~WD{aVWE&gXSN* zps0gjDi2Y!gPLyt=b-9p{7Jb7K?M(y_Zxk)(Kp~!{-pQ5fn{AFNDajoI(!REdYz&V zLtj+sYmq9XO4iqzE0=uUzLu+*mi=B9aZH@oirGKKu$wq8Q7T} zo>Te;L_OR9DhID#8Ela7T&K#%xG&$U$G}!u*+?CQ!eLB-kh|bvjLL5s+{u&5y^i(Y z7M$LeyQjBBPcQs9NZ<_`c3hRne={7k6zAj|=X1mBAeEEpClwb3 zJ!X2DurRa|o}a16_bT22@uk}Lkalj+y6+(uU8XuG;P!KwE}VemeTh;}f;`=#x+hg4 zs7||+s&kde*lho3*Yg-}tiotN432iq-J@N@qm6uo>J0=TIE@_L0EdCp?3DUX!fi-a zQO&_|Vd(3%WnaJ^`4{ayrP9l3Xk5;{j`|b*FXg|!XJheVhcyv)3;d()#lV_+JyL&w zRDXuL{-DNU^yhw1xAVbLfCUD6XEE(>x^f!y>q*Kv11&&TxY|S3JVOh9gd^r1l4sSJ zeA%{v1l-67{6%-psw6sOnlZHftSadk>7q+#*#pW&Ren;O{u2y&5XXfoYVO~iBKDj* z;vUVPWo89q{NtQjGW_5S9=Aq$XCN`cRusjy^x(&=Tu^|3*$OM+w~*}%3Ol*TEArsd z4#oeXqC@q-1csWS z;BgSLK+H}2s}QJzV*O?)6<8oGnchXRveNh-n4Q1^**=?mlg&`}0s%tUhzNJ6_kUBh z9axmhzp3GlF)kW#UX^yd=Ay;tRpBb{0XKQxb3``Mh76pw7|%E?YQC5-$KC%k&@(Gz zVm#R{x_Vw!?D3u>2ysAGdHm6R1sJnEhoKlbn|RD%_R%~0{P3T^ix?9R40WSbox=VR z)w%nB)$1@q#b|!KpiUuO+K!9Rv5lv?msH!N-*gmXO^gdg8K9qLVFMnW*0p`K>Jn(@ z1p4k0DBEc=FT(|54-LPp5|e&rd{c*w`wosc1uo>F7_7lrds#g$PjfB?C^@1ps|4f` zNC)GJN10bte_+Q2S0GePrEOQ#EZ7J-TvhAskd2aXBuKsn&VM4&HL%h*>EbmtuOJXS zC=RNDR&!PdFTepvtZ4yud-Hd-kFo9xe}L3aqA%@>_fJ*MCUD~z(@j4O0yjE{Q?u{J zsT|tZmxlbQuKERKZn%P9nGt*?=k8Z>^egkPtBpWUvW($ITTt z)pT6y-Qr)qiMN3Fff(PpjYU6Aseh?XSo`e1R3eXk?qBK}OB+-FhW0au^54OdPp0~J zunebZ(;YR(*gmtJ+1i*q^BuE>J;v)?LL>JA5coCzOEVUiAjpT%?MqPj_a%>EPJ%P) z0>f;Gh5o@Xd*>~5TZdUIX(DXo%yh)t%gW?DCChUgG?1(%P}eR@HXHnJU}s-*r}^Ul zK&sF2Jm#*(jLrmSbn@;Qo#YwKa+yr2Uv-&9|Cv&+b(zmOMz|Qw_{;A={joAj z7%k|OGQHmB(8KokI-tGe)2@Sl)4e6FFuXBNFxQZ3n*YJ-=a}}8ZkcAq7(FC!I1dO} zm3TaLBFz3w5Z6YSJyE|e!EKg>a;dS~EbPDu?BzBa;pYmsSqAdvQMdV~W5o;_9%;5n zJZC!#0{gSLRvD->gGbzzeu%_(zoa%%W-Gk9B+4uoGleIX&YKLuM5|Ix;Wn7an0#hI z9L3ChW*ROn^O+TlU6h^AY?5$DE1vKMG>fc~hRRa2df(?m?|;%G(Pl05J|WtC!v@Or zym8kz;NZa3&<~VrcnjhE;^!{dF4dRXd(5>W#|7@Tu;!$wXpEU)Oz_o=F(bA7-89zB zLf0R}nw2r8bFpSeu#b)7u=De1OPpE2nCCkbXGR-1A7}HM!;tB*X94pigiU-`0B=mE zn0WKy$OFv1!(a4{3snf8i#L}dgeG5tnT;TbsR?Fs@tw1@ByYexVnh~VJMRn^Jkkq! z4R?*Own3vwZh~2=)HZ0HtsleKz@46qx|}I&#{cVkmv!)aoS$UtTLcLkDB1{3M0%oG zGWo>JkiJtGI-ocKqloI{^lYM;k}wSlB>Z;Z)98z}oT)kva$cgjzRtO)@({%DItbwlQ{7i)3@w z|8S)5-!hh-g3leGUMXfxW18=c6cdW%ar9#$pqz0ups+ay7%;Mk**xH>7;b&C70|)< z<)Ejc+YcLTV;)k(^p@1DDw}IUwjRJyu&wsnq3uP?RVb7Ag4e7DKv>~5I~d!2 zD%DJb-PxB})NIG28J!Nmm`S(N&8o&FU&Ug8a?pvk#jzk*x#H$8xGXARe##L-PiL4F z(sTUTkl>hed$HdH#~Bi>qi<_vfnM^p8Rir)-t|gi1ebjmOPZ)udV}g@n&ZIb@5nTV zf@^M68nB4i*V5*PK0QB^PLI6jk;jswAt4xY~JyAfl{cF^*v9itMY9fH&s8*A zsB__|&_sF8QO!zbHw=DZCG#B^jhj|B8(=9XRW?)YE#$O6Ka58no%8@M@L~%=NByV( zn%BPYL^eyL+P+l4p|&p-W@`IVf$M=URhab)6|Q2Y7tV!B6xfTo49OaKPWrSi71GWdC{e8|x#a6S{wG&hnaOg?}E* zeN9Nm&?VF|)ARaxutj;Lmf0s}HgllN&F07M0r?`;Wi7MR|83WuYKIOlbiMC?id$-% zW#b1hJ(;aF|F&~7{J{{&7hcC4_rJ0i`|6ktf&v{#OrF$n-}~v8IznXg`*nB&o56rz zlqqFUdU3l`Kt!z=Mrueg!S>NG&p`UHE?9|ibh$40m4Rf{GqXcNvY-jF!@w$p8*y~D zo|znH8#FnFQwL>P(mjsyTV^X4M|~wx*Rn=YnrNBDz~!yQg}JpVFzH0b)i z{Qh*z_1cDJ5u3?35deRNEk;&ZQ+y%u2X?)5NS@@`PsdAi$wu zGL&!lV?OxF499WgDWtQ_^d@Pt{{)NJLLG~FkgF;N{xrJ92p zzC%ZvgF`+8tjD+gq^^cT1n1)u34z7v4Z}2SqaZe2umSHNUf%Y|x=Mo| zG0V6Q=^N}UbCo`L#2n%uPn`%h6lj03tMp1svq3Ste^4fL@8u-3=oFkaK4iT)ikrev zd6iDJ1S5KeI(qFv5$mv!P><_TH%5YE98iZ8mJBAekZa(DVO z7^wkBaT9&s%A72BA=-ugyPs@rHpmB$Nhnyg!$PFzC0f?n+~nrj!ON zJD6RicOM6mXrMKFfOB zY!;6xArh7W3UkT8jvy%1^Ey@U2uV?YbUifcS)I*7Zs9+@0;jigCvc!=Xl*C62=o;D zI|0|CYHw$=sol6pOz@z?-xsP$!%fFJ=^jsZ#$^f>?_w4)e=sl!#Hu!h;OHzs-Mg5X z=w@mcGd{rOyR2V-)Lg!Q795WhoCSEkuez8S)iq11aCU#^8Dk=OxYgyKvCy~`U;xR} zs)eW!OmaSDb~P&oWCUT|w%5!5Hp>XXw{00=Y*+B&e^PiiFxu}>rEb7}f6}aOW@A_& zj&}pweS!*h$FzcTC#$=eD1KlCn~P38ZPpSvCSh<~dFFhv$* zj2`Bbj+4{rsUG;ykF=x*UGz{M!g_Byh*S2 zGFw#(N<@?QXy^!$h=L#0vt_+^7$0~nmnUb|GiK8OD;{pm=6BQaNJAF0;(71ltoEh; z&zNxt3mfx{xy3j_jh{6OS39j^me7(>1zV)hJ6Gtfj^2^&3MUbOP(76&0w6q#`5v~5 z@_pqfPM&GHblUhZwe$nJCYF{>MqZE=D?HoW;ZBjmlw z^JcM_7OCOTl?uexMI$UZ#?#z4^m%B3Aa&*IYt};WJL5dKN;RX$`h5J^>fNzx$bm5iMV+zd04}uj~&R zqu-<7`P z8)&Ab`A?V2TEb&w3>}cS1B>jtH4y40_aYNy;^jA@7Vg;_}^m3kow-&psgzZ zDu#l6ZT+fQE00}OA?)gXsU%b$o5|mSe*=%y19P4;54nf-swK35lxEseS^>yycUL;* zZpk~?Y#%sF()yd{c$ZikI7`yry*CD%(*j6J1{4|oC1E6$*Ie&e$025aC^Gg90nE&! z;zP}H_RG~Fyv#hKH^iB@ApzdgX+zqup=KRpIc*$jmJb{-r!}A70>2U5_tfB9fRVUi z{||HT0UuSd{txfjnlm#?76>5?vI(JsROuj#bQG~5Vxijt76cWqKtNECA_0U)dN0z8 zu+%HqX#$FkE*5MAumA$W|NG3@mI&TlufO;6il3a_vomw%%slh-f(Kot?7`*(tasco z*nBWYZy>5I1;%jK=HaeQG22L2W(%HR2yj>ws{%eu;pSQ4=8RXO%^8vzC&4^`^9w66 zY~^+Aef%8mV+S%pno!^iP(;~+mgkt0L#!xBS{3bHg%4mw@z-KSjSw+o@3THbz`(vv zvxk^T#uC~%1Z>Y@Iy%I>F}&=KzWmpX0zcWZeM@NjQ1G+M>HDE(XCShhUoc<9WycFPMK-)tAi*!1)zMnfErltSw8p4{ea&sOVr9BL@f6VK%eD7cX$h=sPg@%r+#y z2HT&ujxrytq+$IYwAK^2EBq22^1TEz%1_WOqs`=^3*kT?qOE}oxV?y;8Es}-N^jJw z34HgZevc@Yjjn}t0Nl_Vy*t`m1d9IH81n@vAkU03yWw*CSo39oz@f3`Bm*2)-*Eti zd9-AlxgRh#FxPBlTD+bU49M~*q=y50T=;q-!;L{r220pDcV?2gD zMxTz4uon&-pDW`r*6Z}-1heOZdNr7?Ea9!Wz&Be5W@X23K^^eVLdo z=f1JTET%7`0jf9A%)m*#ccS@k=DA+YH=V$%<}PC?c_*27Ayl`=B=b_E1$IaU*t-Fo zo&?p4012VTf%f`ke#(pV;UV_H!iiHRgU4M?8z-A(kmBXYWLOuv({Gc_=c5=hq=}Bf zkkEx{>gd31CzH7Z7&-8o*_|!p^ItQowO_y%6c1yqe}$&xeO(w)T%1<`OZTmw`{y99lgSn)h|V?`OicVrd)%G!Bzyo9pcSX1C14 zE_A0p^PquPOJC0e0K7r&`M9j33iH9=E~N+Nn^|EG4cJEzQ0I5BhX&J!2+`(Ltx*q+ zNcyOoAUm2*PPy8Yc{?=>>d^H#~g=9 zQl|9qaq#Cq4T*=UR{v1fJ|pb%JJ{YArIrphmLB`Vo6-WM>x1K(XJd?1kt6LH4!qyYy|& zrZg>RHhD-xEg~oadq0N~5|L(sizmVB+5$y1u@i7WErR@v5o8NTsR*jeD3tn33rII@ zFuS$wu9Hu2l^)}N9q;=M=J!!75j!Uj??`A@{GRLB)_6`q-zJd1CL2C+`DVCuW;`q_ z1j6A?l;ei_5LSLKB8`V2@3dBJ1Qvg%TS8OM+I*`io!AT%e2G%Fm~Yq*Or(8V%*J7- za2v8Z1VZ)YZ0rti`QK;g4}OL#KloE#YdD1el~Xu34X{T(j!?9|91NnLYp<`2qR_b* zeX;wR`$(cOTg?{sGZX3Kt>!~H(cMCTI-bK7=S8jj#S9aJ zn*P%;fk1CuMAZT!F-hW3qjz%5_^4c!5*ZxzkkVGf056WRA88y{=qDii~tZCnrU zG)tv^{skKWo&;7|-?WGMB>6wRV@;#~8H8zZ)#?BFflf zmKS@OiRJzu(j9x?cL7HRBr&v-C>co6w0DnLx~O(9z!Tswo1jBmXnafK2CDL**{Vza zOo6d{Orfp7A>%6VA{47^XJVfqeDpm<`#%K3@DzRfp*a?h0;71%6)P0O$14_k6jrE$ zUF%lap+U1NYlHjunhov7)S&kx=q18DiX(8~uqGIe2*Jp(hlmDCNIO3^pHCiRw+x@i z=cZo*^-i>CFqOI-FegHP`NU^%ySW^!_z8S-5N+||r{-Q%BMyf51KhqvJtx}g(79lTn3*x1aXPwm)b|n%9hjz^!5))eanxS zkA|1n6_~J8Gu+o!98ja9I70Jj+flQM<-pHE`XcV~7eYD=hCn~$on>cRQ1@fz_)_5v z4=6ScMgdp~oB|MvuQ_;I)ImND|GySg@woW}^lw`4#@NP&qcMS969ARyrfW7;us6@- z(F40_`*9rT-{`C3W;ySx$nzD-8|<4ziC>x@+rOSjKYj`O?|jNQVeSdPup{jMbsh0G z;VX;p{R+6|VsPD8u#dn4xW+eT3NE*N1L!mh0>HZUTc|ZI(o5f(Rl|te8920D zYrCUH8I8DEa{c66crNLj(;g_CE1bmCMpKuQW}3CIti)L`tH569&ag)Wq;){y-|4$d zub(uBcFKSDV}!&1M06~g6H|iM8XC$*3=Z$G@64gG_IQ`&S$#cweC6-)9t)}a_t?Q^ z^!)c)(*wj^O2%644}TB$$%WM52lKP&QVp?GZ`W9=T0fdy)IubQvGdMH41H^U)P}yJ zKbl*^mIy?Rysm*Urq!Vw!U{vA zL`@Y=ZW!{rsDKYsxKCEN4|L0+;k82P!Bb}W@cS5n1>7{&MZ;=}tzU7m(2TzyEO{0R#_+y50t*)wm~QAnS}nf+XY=+RA;q2}u#THvXHMWa zpor6I3|j^yXb2b1-nU>6L-qlr?G9|={;{iQJqjy0{1-FVno>OsG=Blwan`+j@L{*~ zdG&ua%ZK;S9$3Upn}?f*_t37b6ZGP*W)o{);P7Yp;nQNbpy#&pX6G=x*aN4y=`|JaJI{ktT1<5>nESv4#{C{)0uhWy)$tWt>JGod z1N#Gd=y%vQ=h2J5!<7~F27iaz3_hwxqzDfVSbLl z?Bpxv3pvopgVVJ8v}1|Asf8sIIKssp_){!)N?0gJ`Lj>}pK>j}vg8-8EUtwDcLCPj z(xZfg$Q&lX5d5zx6@-NXHwy(RthcdcXx({AjBLRE6#1nN>j5#cL3I3B*#Oh5V-HTb zYHl*1p1R8r8OGw^Gll?}UP3?H#Zk+$G62VZ#1~le{`jDeGfoGXM{DOD+EwX^;6;b{ z%4KzU1np*VhhE_hIC?Q1^zjRNgg9e_Z8spH2hriKa0eWtm=2chCPRq;q9A%IQ3sc) zN({iIxL4eYOLwnmWkE=546%U6Y91b|X}+;EW!Uc(FQeCeMMMK*XK->6Aq;@xoOq#g zVrUP}qBtOX;zf+<_Gccoc6ik4`9@{3M`e8?Bk2`zPj&2LU?cUy-ln;8yFbx)g1Y!b zEn{AAf=@hPFFyyNNT9`;*t>>C8nBAXhg(IhTTbhi>6;TwEH17Zb>{&M^e zA@&hrb({tQ)-muIJK?tlQ1`KW9|{0yQ|B0jye|meQbO2alBC-bMG)ZbDJdepHsIY3 z<8|`UxagMhF$(r5DQ+}s?Q&&G)Zf6t8D(^)fFUt>JQFZee}NsAL>wN)bpkD2kg*{63UC(*KU4)d2v(40t0dM z{6(i6VmBN)Wo!Xo?@ULQ&E7Ns`SYFfq7rn!r^|~NkNQ|eUZKJaSdm9vDu}Ku(!NID~j=$@X3mz5iVJkL>AHrw5cR&)wj0R)){!{#@SY#XF`xn>1sX9l$))2iS z1&UCVk@n?y5?Yj*p-*L4>^HP@M zHfF?*+nmx94%Isi!$3+}-xfMkOFWmqq*(F}QlcGm^gdX6&ciQ>*}u(Og;9{~?t>o_V>|9YZ+fd~IBtplB@ zCu+4F!|~osqJb1MoX`e2eTQ%h)^`q=asnf*M<|4)QvPY08`T&1K4i2B`g2Iv0~UB2 zJyu_ou7)}j`+41c$lVO|2*>~k+hvMge~h-*2(utIeEX0#)fYpdm2K2O)VCvH*Ru_< z3W!N)AkHB*`)dtFYY?k18;XS}Rxq-WxHqH`!E7zJFnoYU1b_eR7A6~uM#XmnCKXa% zVa~u3Two%P?rkh~fn1bpA~NEShjNs`5r#8FQIng5pPp$V%Hpxp(ZK$ao!)FB-oe-5 zH;GOtvT^t(k#yrrcBDaO^(K#r*T740NT`vDG5l;JtxW{}{~p1>hQsG>$x;J5sDc=8^$getUiWaG2S_I*y5nu!OC9L?919=}<%RGMwi2`Ot#)fsBR&+) z3S&Dv?jNWAt;J}g#rihlh=C?Y+lp4`P_CW$H!k0_L%-S7>Q*rvK_H^B^?5rkW_xka z`qrL)n5c?S)7!wp&8Dr^r9lTVG5jRpRb*lhoCzN8fDvH8NV!9FGu{h6e}`~~q-|Ef z99UF~8QEQ(@UT(_LLJYgdAKP=sL;H% z`1H!%A~zNBC^pvbamWdOa8$JwWgKJp<_7C`5_d)%1Dyf-SkLwv`m7cAh{UkU!x@;) z?P8tU^+TOZs-B?l?-5O`rW{Q?mz%~$6Nj4es|0W93}zCZVzuvs0P=qDt@{MZ;4Y<) z?-%vMN)u1uyfvw)XR{uG{WWfQKpa5n`V2QcP*f#TdKWP~Bi8{}JT4c}Nn-{-*53Cs z5CsR@KqrJ6k?(X7{$oIj z0~`!Ux9Ny3Frm4~wO`U^3sq8qUN*>9~bJV?UCgGy~`Up1>6^wY`|iq7SphRxaE*wzudEbIHlx5CjiUlRlzN z(iR3FsNLDzh)SDr?DT-MxCPm%AxUqc4ShtZH2nj!c)AhSsI>bwa4Ka3QPpSrh!WTx z&tqacn3x@pLCumo`EgO7kAjo-Huogc-H(g=s{D+Ru`HTZ&Q$L$PH=mu!ZV_rb>n{HU~t(pVuRrT;LzjaMKTQ; zARY}rV_Q8uW5mBi5i0W>U^tI%eh!?(X`1$&NKJU(k-{oOXP^{-%f>nwIF9dpPWa=m zGCD|Li~;Se?`8V^Ik3S8socLHn&k!W`xn**FEjRe;m43es;X4l@jRCO^yGojiM}#W zB&EIygHoV8a6tleg+2_6ukdxkpjT=8Kv9AL<@14JcLAod$bT!>6=AvVQ2lsO|rUF_l?qeV+fA1P$jGj`~+P(z*7E_i}1FzHnU zEcrG$xc(m>6kMVQrRZ3ZK)pwbea41hqnE`*28?~9M7kGe)@#X}9-QXOqr}4zF{>oR ztj9--SFFe0CC*L611y|+-x%<}c{Fs4Xb!&jy)mM8$-~eSUgyb=F;W>aR&;1~M0-{` zEFy=jygus&UI6Sm>!~5-R^bQ`{Zd$EZsBKN8E78k0gs1+#a;oz@*aZxYj4Wk6l%+N z9tRCY9(nUzsWdvtnMi55KyrE1G*@(VYg8>M{W(u*+L$X^GcY^G>jU0R01BwRDZmh~s?)xCg zk4+QlymPNigWf8Sc1;rp3#?u2^9qG_^z*)(4t%;bXwCpVL*|wAnW9A6Q4~9KvB#?s zia%u3VcF@A20P3IV&YZoGYd0f`Z`M_@paKGF+FnHz!X#a*&@^Uf%?wI(35GzY;lV` zJd{<5Kr1NFaRfKw4)G2CR(+1}%M<*oR$v6_zBxFQb7|-tQBrVn6rJ+z2U@*EmA3C& zPWzXr;-2x$K@SDzGDnoEG~Uoj5t!qFh7vG19$>&f%kv%w%Ki;D25SEh-(<>|D{_zl zAvkBQxXV#uh1C(31Ruag)^)%?Xd{V*LKj4svQP}?Yzd_oiPU1+jl#i&V=bl)*_GNY z5)=9NV~fOOzCN=U65M$D_hOOL4)N93mTL>8Es2$Df1r`Ci?N=mcsV;FXjTa=)KdLZ<)zrU9BR2#w2fPE7WkdlotA>U zK1;ioikp#e*tZO5;xx5hhJGlrzD(R&4A~mA&pTJ4ail`y`4R13CZ2=D&~7;x93<%W zYCmE)Xd)wdf5a-YC@p-8?d%J#!n`uSvPzFX=Pikp z-arjw>HZZW8ETR4XH}B-d6p88FoX44V`$n6fn>+1=&(}g9P=Gkf=k#*gI0>$BBM!+ z28~(?`e~&o%8yzp(jz}|8mXJ!c9o=?R)IMgKwVb>>kpv$t6()5L%*#Ox0TifcTzLC z*g$O8~(a z1z@vP*T`nU4LOUfVuNv9gk{Yd$csOad#z~VnesJL;`P*St+?NF`ilM%T(K6&J*uyc z)zTFT4{0r3i*@35_e2LHQ=0Jvwr%4&uzwTjIPRCirek_wCpZJV-fw+@Fl`_eaQpS5 zKd;ZkqF3tCAM3?)Ir*LV{?>#dPJBk-*Go=*X`R~uSQ(mYFVHimM)v`ItY6PT;6O3! zxpWt5b}2_C@S9A8{rGv;FixYv`dq8OpEI1|{>ZP;4J(eas-{G;JoVTpvJ%5tp1>c2p9|zzSd6A`6b(wYK>G5l z_|MT7k=z2IGkxK7{p|!gwNa$U&DrD*xO~mL2(5G#r}CRX4!hGAn?$LqZvhiPg$WiV z;0eIZK7g8wp?j%352RKAwOfZ)%GZ+0Y!=xlO7zNRAd2Jk`ew1CT3BH9OHjn@ObA@ITIBF^pBi;f6f+>Rdel3PECcvwb&RV!-jggf%$o^j5z*_A9$)rWiliw zL*Shr&fuig=eLLq&s)Teaw&bQNG%b0ay&DsoPsYNm2hv{Dr$?x8(qLG*yBYscB{w~ z3s6j2dsQq7ZrsX*tUK-fw`f&qjJ7mpdhqu6m|;4af}X=1=JUm2NTgH8I_s~^sp*>{ zs91MJ6%l4HHj(k(N?RTEhPRyB5WMEYg-@(H- z2La_zu)FE>S^9W{oQ0UN4)xLMe8UU;sozY>;%QEc+V`p^jb0-%z!3i7WcW_}7 zceJoc4ln|OKJ?+`RBkP>@35HRX2gaT3TJ?WCY~Qo`fF>0RY!hXy($I6Xt*I{gm4&* zmD84Q;)L0wMlpWloM`Oa|Jf^d@^Y!Xm}-(SZ~Q2~vQBgRkG`@MIiz11PsV#9u4ef= zqO^U;#NeKHU?2nfwbA%*T=gj7J&~4>W@)B?!E#Xy8?bGYbE)}zkQ!FdviHFEPoj+X z!EOQXy)W7_d7bdS7?-;LO{+{-j_>&tR+l)D7L)^;k-;d~=mTg6wC zKL$4db$g5D8G^cJt3-$Jt)Lw{#4>10p4llLi;!bC&VJrbxIk>Bdb>mi&l=RFa{v#I z+a;2Vk436^Err6^22Z~Pq&T7d;~ka3shr#e&i*td?G|%mfc(EI`0C3C;YE=f1I1o_ z*M#t54B^H6zCr$?4B=+%cDr(7ARL^t4$=W?|1*UDS7B5k`1b3FGQc`p>ur*CCvnY^ zpld`~66o37IBn2fG5~DdBLdMlxwLD=$)$z^$I^H#oRv`2=$}^tadLlJ3A*<~alJS> zlZ9Z;YKr&i55L(6#-CW2S$O_^rQ@%ftG|}P~XxBc$0UEI)Tr9~ilsKwM{E`prR zdU3X?Euc9ci{d^@^Xhk2wW0Jjmx=CjK%_ww{PJUQXQgoaIQ%jnf;RU}^X)>qQEqO1 z_xl#ReFt>6klL^5Lq;-P`B+q-Z3je=Gz@}n37HP4kl1hnJxu7SzP-_Ic8YepJyRfdlL#bojZYtFp#!r&L1797%Nc6Kqi)#eXU;`~`becs8}| zXFyvB=Kl;r*BaXJnOJ>Cer7Y)nph~VEmrEXIK{QJ`Ezj}JRwVdA?lP{tX1DxmeMCq zJM=99ZiJ?L4AMv76coW$&Y*r@h|Zqh=UIxfkG~KN62klpZb>NWYUrG|83)BwsC>5^ zge)?H4j&XfO&uFqj5+<*heVfzT!*eD<vRTymA3DGjf zCUoV5=;#>qtshI{fDD7f2Y zJ5Ad86GZK=gFpTRM?*XeT`C6?Pm4bs_%ityjOBe!#L-Q^z|x>^++FS@^L8Oc66+H) zwOUatk_1%X#r(znK3`t2*soCM;?+`rgZcP0HUCZAgAs;a!RGG$P1MBcv7ZyQu%;>T zH0L)q(>&&kqi*N0fv0HcIdKD8A3O)M&u`S~yeOL=){s0&V6;i6$2U7u zY2{&0D&24qD(V4*(L2)ii=t-y2I z=08L>ABpl;p!3^Gov%R3(+k|nyB%8;k2NU@`C=x0az#{S_;g+sRm}mJTudZji>JU| zXbigjE}Bu-fif;Q?W*W$hi2ufA(Q@OpQ`?zyCn^_%Voavt`ycuX=f8)`*YO5A#cMR zN8ypi%-~XoY@BujYMk84*UqNg?Kv>k!Z}rhtQ`Il>>?x?_7QG6FXg|HuX??L1`B@Q zUwCC{g#TUe%Da$k{MI6}9kX;(ipbw1dz9(1wue0kZRA@CG{5&N*^n;8%jr<9PV&iy zNHx0OC+n3M0UNI0gEEXLM8g!W1PqNcsdP~}-3Qx6ep}bhqImbMlu%4IM|IE6#W0Ut z8c?Ukqn_c8 z;+WuIdMH5-$QjHWdf3Axu-Fm9967>OPZl}C+|gpL(;mYfmCDB`miCw8q#C8J$tb2X zqnPe5HOOC@8AWhI9A}@ytU7xKMMWXb>~dXBiJu=9h5nl=^GMqS-iv#)_7<-hdLDAa z%VF?4>y`+(yFfz|)&u`&OpP_RjMz^f1z7H=`7KfL&!1XJ!eOieVfA zKjX(|1$s2N6!s^VQcKHHpn&yDV~82lxwL$^82b;n>@2G%qHh=gI#T&`nN=hN0CsRF zOaMEl%iG=2ZGW;9(@Q`62mQslBa%7t@d?xcDQ87lW54VZw;nv+FvEAAR{P}`Orc4J zyc_zCNg0^J8CsViZ^qI7Jww*GIpjzHDFn*!Y(TaQ9EDRDDs;o5&U3`j^>I3#AX&xv z5fP3FBp2l!-FW0e6SkA+)YMH&Vc zd`VRR)&=^Ys{Fuso5tTDlOykq@@2H{23b92C~8$On)R^r50ucB-w0GxXXxq;vf&-0 z^7QLp<9DkiGO~iy;kfX6`JH+!7FqM&zFxoJm}>Gd14Z~QR+pO?X|Jy#r&R{dAJ&1l zR>KjFVg!zOJ@iqCtjV6QJRNC&O<5N9-}5zP3*&sSaV?oN zrk!Pts-& zJDWXpajoJZ73`p3`G)ddJJZ!+jpY#U80f(K#c^Z-{A0=2M3w`IsoMmo{S~^qiEMAY z5?s&(_#R(>xC!Y06{_7-R)6#rH#Q#&$RZ1~Ah;$$VR1d5z(Tnp=i}nTQwr{BD)(rD zJH46gU*gbI@F=}AK$rqMZEZ7BaeZ+rmAzT6LDiqnZB#vz^dm6dHv(04@Eb!!3 zSgr9vT#9l?_u|%ay8Yw?YS~79z>DB(D~BV}e^OgnAD6vt;RQOLerPMpV4x!HfLta9 zZ)hj)w`X3~hGQ#tu;KdyIomAxStk?5)}emavRma24Dw8SSsRz7?QyVH(PjNDSmQSN zk{x4ixLv-lb?e%u9HDRiSh2OxqLkLr8K6=|z|qjC&Swf1U46cM$es*1uVd%HR9i!% zid>Om&&+WQhSPrV${hd!%&l`r{nisZ%GUUHxTCCzOZ?ryo3GOCcgrK}I9a`uT+i3< zI>~)}-E@z<1FcZ(^G0J;@aE1k*@e~*bdlfT(z2_Zg3Ix)vUbtk?`x)pQ&zBptvpU; zyUDFpew_;S(Q7D=1OxSxpjSFSb{+dqj1Rs;j+oCUu(F@s2Vv>*c9%ER8a)=khLb)7 z#nN$hmqorB{B^}jS0D(DfQ$9(sg}ucBjt3L6+IV+djcMq)K+$vC4Kl(!Dg#tV=cWS zJMag6+8rTSc*ce9@@CJmAKltW*Q|%kLQ1!XdtgnE(8wOLQrVOH-GLeNpukVXytEk< z&oa2s13c&gMuy$dG_VYwVgQ*Vbg_qQ*lE#=tS`?2|AO~J0bf)<0=dQ;n%S9V0KbMN zVxk&wVCjpjpJy_~#2aitXdS|jMWw7ZcrvfX=$^8!>%daC?=^bAr>y82y^KHp)>Ec? zHe>#5JxuK-YvvsJ6`GQ6p>e*0a?TkzuGiD=gpYn>OyAX)y*)&rIy0)yfbP&C)M3gh z?!bPbFB*YH%!D-wG(sPL-&91;a&z9M-w*LN!CUf0ZIi+7a3y=Knx`GTWNCR}0S{AM zZ{yisGBs}FYj7Uo*C_rVpzc|^^+BxIY3lo+OtKGi)943fiv6mK##J}E{3B|H)(^=S z|6-s*p(L#v@;xkvBlXO1@rwOx9%atk&c5JA4n8dO}vz4O%}b zFL49hC`~>4%7y%^L|}{lHNKzxjem9bm#6spTYrl&SpBq|$=`2(MmFMM$2}v1{Jr(F zG7r~ay#cbF0TF8WbFy3cuyV=bceO(U(_u$QcC#@TjJve|E6?q8|G(tp@kbnRWn>do zMqINRP&R$>FF6gOEYiVK-|;Gu#yt<7ZYG_5UcSOo^*}iqJe3+Gt5svJi@i~ShrctJ z(}o-Xh90hw7OR4D&5{Ash+t^I=w}ZCL%o4k43aCsfOZ)S&SeV?A1v#of{P4=2(cd~ zJ4x!9qt_PtY%o@D02w)QmbGW>H+5|YDAb;52>32X*7t4&g|%E3Q0jYfZO4dz;6Mh? z50O4Qw9awE(R@89u+hF|01}+y79uV5jj=kwEmBI6?L^J_~v#%6SH~JxgDe zkD#EHW(B=|PeY@%-;21)G9>?nB?`_WmJ`MVy;I~zymrAar^=T0L>x0GE1Tgun~ktK ze8@C$#v0F%6L6~b&5)%m*$jerJk(-a=;937KElznwe8NCvKKsEHq4ao@UVktK^Xuh zY|tE8375rlz^AXG^K&#eS7WZM8V5gl=IF=KLv!WxzKL%3LiHy#G@wl237?%Sr((P@ z^W-QnxFzSqixckFO&7|RxQtjRAH}@RE|kd-Mdcz{D>4`8&Vy|h$vO_;upvui8k)^m zB3tMC{mc@1Oe4wt%Vb4nu`e%^Zv!iBTP`0dK&Ji{(;Mu)0>WbAaMn&$GZK&t5NA|J zA$sIFdSRt}QttUN6aWZrS%*#e!&THUzq8?sJhP9xp`^PWRn-vCz1q4agKLgaz% z*U1zQf+_W&Ppm`5*6oBkIFQ?bZrjg<5te0H@Hg4(<0t8!`1< zdS#=WpYfqR!^gPM$FPrz1_()Gzf6!E8%($!=!EXvgt>f3>o#eX(kGi_H}4E|@S;^R zKz0T-+bo+x|2k~5-0IHy$)4%;m*A+cgRYDusN`8cg>pvHpU84_G7=KZq+V~y{+6q= zAI|s3--2j&kS@K22OOl-w{gDnsKypY85-<{@B0gHD1*WSbzHLfQ0rl&DsH2`kCI|0r7tdP1y;NC6E5SQ*y*W zxm|J~baL}{$#=nAKe}5EDsbjvth~tE850Wa(#bvk%+_({LaMk&)?o9HhtAY>CsXC= zZZkM!kL+)FPqM!myU76EAphrHS=?H4AJ#l=FAx)amG{aA_;SJ-a*X|TudKtP#i1yM zGnrcLgANj39rV}^{efdZ05rIm7%HoWe>daANyr*+)97cSvmOX zN6=1$Y@^36%1|_n^8n7lhTshcSkT=NeECx#x_^LWK!tcL{TzDkbJ@(;8rfa(;LJOng)hPoWW!8=VW56Kzu)wuPrdzBG3Y?_7#->IG1;?%W(S$r=@STzKf2qHYS-mEWJf6@<^l^$ ztU|$w{R}5@7F#h-c(^q*O5rq-|JgO4hd0DJb|mq&>{a?23u3nrj@C_wm6Viv?WI6A5?G+Regp0{WJufe4R$9w zDVLtqNmK@}6(yYayE&D1XGJ#x}Ztos>O_u)-UJh_@dKZ~Eb+ z%mMPt{tjC`gGPP_bUJ{(`%doti?drO`Bk6Yi{As~wV;$Ae@N`BH}I}4JFu9{A7y6dfJ~*0*%rWfeIMFk6i8&9 zr}fYGHY}@hN@;BfcP`IJ3)moJz=_WS3PulUKnTvCWDU#eZL+bv$xpIuu@CJ~Vdo#} z>7QhEtiZybWXC%#^}D4Pfj_Uu?*nOC5K@%D%h$vH|L~vS7R4B(q2tiA)TRWjqtifM z3_u>xcq(d0W##s+Q?hP-1_HLR!bG6Yf=_?;`IrO&EJF{Oj&D%bbP5<;UYNb5rcuK@ zIW%RIiBay0{mP?YRK#D>`c;wmwc1}M7 zz7xvd{giiFCbig)JeBOcg~es64tjDz;<^q_W1JvRI6z9vx|GO+jFJI8?SW|i>ZnhPp;aB- z@zm0(*dYaz2(blE`jm&Z?RS{8#;G{EOaG+X3Kv31Fw;sd#i2C(K2&Xo!$T8XsvQ5Y z$)#H86}VUb)m$BitF3qQQ?WAoPCWJTsFqllwH{0qJ}if@;`TUR7`iu3y~ZQ`8mGpk zzv*U_#pj6S42X#dnp(1o7BKTB%{A2xnbDs(78SN6{>jY(MhHAs(a)x8U3Z&1B><4Y z=>f?^!B0Letb7T)rL*~4jd6U?PIu*|J|wH?D^&G_tw@X2)@!p{#0x=9P`l7Np*lOq zIph~qOsd)_B;HD@F{Ov-*dOO2ScN(86*?1#rSduJHe5M0r?K|JOjD{mURQ@H!RscD z9fRDoQmOkr9EZaWKgGOy`M0kEcYL2$al9EfpZq0!bbj)xbS$7Mf{VVLMIDN$r}#4m ztA1NV!7e~)@wj!0#>Fd+S%d#k4NCDTIQOvsQFOa`hqOZy_R>us`BZt{flEI9$oq;a zj`#fEp>kY;szy_aDSgI@sqUepw;~&M&TbDG9=ge?+;mrQ#YY8CEkg^6t406Bql0*K z1NL!RUJ|43vxA4fX*}X`FDI(fI2oxWH56`p$S6fCdmC={f{LT3N-7SBMwk0=F_Tme z>suD(CMjm5^O95-9IsoGRW%GUC|NzpH@yR%EJ&aM?TEol4cqs6fo;II8}b5l6WLgooyrQCY}KwWEy6 z2mu;=FUwP67LLMMdNNB@LC00E!RKyUmbw|AquZap4clL>tjhlL-FM5XCi(6j*KNzG z`k3yc<mkRKg!hOy5)ZrV|WA2lztdh~YY-JFxbu_B7+KX?9D8HFzQ~^PTOKnvE%&PTR z!0)Rl_O0u>4%n+del<4W7FQKrPc~`03Qn`atrmXt!~9b-mI-2 z){}J5oO&wVLM3>R@#QsMb>z>4&-+g=#KDCk$v@Pu1cvpQ@)(d-w+?`ajph zF+Lc4rasmPto--}7;8-ML<3dKj<@`+k){hEDlg&Nr;V{1`>0J5RTIxE8o)-*YNFuh zI=LA>dT-L_;en+9vUMnq!9K7aT6zHO3Bh6HCN^Hs`OLyqnRI>uyxA7Xh;NGVC ztYTc|d7cTVmvzIoJo8(csfv7kwpqAMnaS0#*`ldZbfy`mXN@`aW>pXT*2g!iHk{+T zR0~xGV+C5M!Q6X$3v~xyOSFU%3fEg(s>c#Jsu{ep%cWJnV31{CFlg((mOzizpee1? z$^r*4wwhj{v@^Pzo@%YO@^g2!R{kt_t(`HDLK7T=fdu!k+p_%AJcfiNQ*GBb( zeW!mLaA=!pVH>p(-@3I`?I97ZY^!dzbU03kFBjXY6UK2m(oVH9R#Mqp)a%AO!M(RA zc++;Gz3o+!(JA;{d%zr$T_$xg zRW!9;tTC@prbf1VMw}n;C{#Ou&u2s=z!62V(kuvqLbQ^GUayl zXm=L>A_D~yVw@M9Vdur-Vc*3B$gXgv2}gE#^0_V|P|xpNmgy7ur2soYWRT-KBAqBM0K#zI_#_HY7+|E;+qA-wzPKJRUmAOZ!%Yw5EugE!TCFY zTFv*|nZm0ABhFK|yKuDMrA>FK)Et0<5^Q+1LBtKb@v}>N*1|sx%(AZg1Lz0?3$l}O zeQ2XMpoDKDU?<#hcBrFEw{Z2=Kf?eQ8h1=&T;|Rr<0{V$%uT~rLqlN-*P!OFa3t3Q zzzr`nz^`X9vA}eCp`-c(G{Cg1a4uFTho4x;XUnk1ASGA_>&Z=Co6F<5`>kHDMSCQs+ zRt+5(n!db8mH!W;3^Cpf&b?O+up_`M^#O1x%c%7Osu^63M?at{q9EG32UPQ%wZiU# z7g5-190hUTwLm;R4C220Aa3RZaei|BlHu&(__TjLRv#VMHLH#`DT*NGl}M2*YY?aoBzKyV|hp#lT*chKzrfMrv!W0KHlHuq7LSqc+m=Tf|z zqpHo$6pr&nIJI_aH|>2?4S-(0bvCHn3i?;J%8b&SSlnJHniFeNj(|NR>>3u@ z(;!T@qicwH=Y$DYVHPnzxzx0`(#^RF|nZ4PJvltV4ppu!p^z48vMJm3XC!!-C8ulEmtZ`GnUTj7>ogYVVH z{{I8MQy*6;MgO#{^zP%Tfe2OjWAtV|p%M+am-wGl!*cYx{^gqfXOOur#QbNJkW;{; zhu1WGEGz@U|JB?qf|z5s6?(s8t8vMeNJy|3dD)P9_p-DF-oa;0r>EnCV1oStKD_oS zzYDy<`NnSDe73&jw{cP`gi_v7B;PnJuQ+nJFQ1ayeFE>;P_C9sLTK2B5yZ()vwnw2 z#Rl?h{XBd`TNfrpPdx?Q*yptGDb)^@-qQMk3U;UF{nX=8XQf#DSg13j(c_tZY6o=M zoBFFea^Um|GT8JVB!fI&y~2*y<2v;4pOjusJ*^%`4B`FHsQGwn<5`szUBFmeSSWn2 z9r$`at3GLSKyNNcb*ScuW+(VhTy|^RM3n*TJ@ZxI{qRY$x*fibC|L=_TmfmyoM0uv zr+iLB2dFxg|BK=1!~iuZ?U)-m$(d{A(Hf!LJy->(nBYLZdoN9VPIZXy&J~hjyTfDn zlmvf%4hqG8sB9v9rt_6e#FPG1Hc?wJ9REobnSot;qQ@z&6;gSq?P!r_) z!5BCxv87RhC!dF+6B}G%ka{v)WB~<2ZQ;TZC=jY^D_}2>KMIvX|Mvo+ypu89QndUh z7mlzJ@kb>1{0(EgRIZn>pNV&{%U~FH@KOtM)SVS^Rv}42;UHyEYDx`)1zc; zu*hz`#k;zPzMsDb_-O8NCh~{?jL?B&u>9Fmth=H15}*KX4}ZfkZ7ox=a0nTJU)7ZR0KhpZGeHl(P5eCh?Aw=yLl zGhd?@)jN>bjF+H!)t7Wy^pf)35kU;Gd6f#qqj6p(rYJ=@P71{u_)NgaIiAcB>NVpn znmYp4f}^y51aus`=+X!%`QM`ZMygCGJ_e73=su42k5muhQuk%pt9Q{OFRN0SM`7y? z6y?*4EO!V)!bTwi4yP6$d}9qM8%@lek=kyTHY2ll1ZN+_VTIqZkFWUTI||HHnLn~{ zfct@)`UY|>)WR#jY_WC~4lg`;N2z)V`STt+IPc*k>O2aTgj8%{EIE%-sW@U#V zF`J3VU}!H4R<7Uz+xQtbBFwSR$Z5kW1S;~1s>@wkzM?uSh6Y%xA&vXa(9%~_!xS=< zcGfj~dN}m-J1`FSyow%}MCWnPuQ#K46-F+YxD`}CSEagP%r+3Ud~dEwi6+dc z5TkR7lVA zDkqE$>s0Mwohsifs8i*8IP&3CSXN#rz6m@TsGwE2^w4-U%^Zj4S#K>S0363t)d}hW zUf$6Y)cqW}_T2miHNtjS89B#LlZmQDXSv3w16z zlWFK&0@D=JwPkP)0tK)G`{wg|mB4$kGRp@Q+G>ZLX9bFxz@(awPbMEMlmy`;MB^r_ z7dWkFF;Znq3>gwlh!roJ+5FBy$o4%n+nb2kLnOF*h;Z=xQ7$1h#R~>~M6l-doBSFU z{Cz6(np(jFee{}omVazJMfJ$pbr`VYTV!BKHAf1l1{L7&MWmyT*1LyO+6W^hpOPb@ z<0!Q75ndo?Wk-?~aBHK=Q&j>c+;pm{=$zw#_d@)1)sVrW-E`QeCy{TODwkMb746HK z83VC-w@iaQ_Bf522J_W%S}{%4t`w#h5$;5zNhYk;qRa5Ae@tq+h3pIQpghc}O^8l~ znG&e14UIAL-M4f34*Q?)>#`mW>pnd-1I`3zXweK+H5n;l!&92zfHE53$q)dHb!rAY zCMHpvnW}tJ{smy>3XsC?cq3=3v|EW`351|8{tQNTMrQ6b=>?gL?;F?$)Qh9iz-Hh! ztPama@9@#V)Ig?9QYv2rcra$QtMKh?wYFx;+Oq%)dM&4QHnxlYyeWBG+c2wy3}_bEXBE$I}dWi z3feypP8cWX)I96tJvm=htR4FXSZ<`?jUE~Pz9^Gj9&-&)K&&&A3OM7mXTB;|<}DV& zu+qG(OeHn{{^on`FfBCXFO;}IjpegBe}QW0w{-6yNsL?J0L6vS4c`;M9GY>37tKPr zz2(wF3ssxs7l01k^&Omev}y0a=|h~rSjY9!dkdi`9zhotstK^m0v$)#j(kE_tk=Bb zIwHB9*J#foRWokMS)L2fwR^F8I%|l*0W0txt?Tex6Zq&Co&ci95Ss!{+yOwIu~^+# z6u_Hubqe%`SEpCr-Y^);7yw2#|rii7V)4uOW>x_j~-tFuYtc#CXXqvuM-Ntz8r=@UTnndlEsX#K5CY{5GYk+8c8rpT5zl;y_Q^=i0Y;>CVmjmjV(r(dpteH|-W@eP$zHk20o z+C)(1wwgD1S9Qu^#HN5wv-| znqz;-pa+7$tGP5G2>D?by%khdWemNfi$P5rvo@$eYJLVmbDnaq-Oeex>GqdZ!gXh| zbc1@GXVP(_>c%r!zYz@gF8XF8%uM~L^d|T~?V=u=;NH}a=4^s<$}T#(3A(&p)M&GY zuE#gS7^!bI^bFFB$yPeD8NGK=;ubi);bipO0%U;IJiA4czIQn|E$}XrX#QJjUX(G5;Z-yKTfT#3Kp0v5Qo3w@+cbI5?qJ5t z(26vsMvS0GfUNf}Vz(Kb$yMJ1Ge#$WDH2bgysdgVf$?Jbt&Z=g2V6kGsEV;|rz&M} zG8rlQ3Df0Q!Vx#nK3KoNXA!!05~=W0xvHy?4Wn2@eSFglmq~GE@F$ zFq6q%G~u^&^bQPe!@M(#G&o}D+nT#&@3L6OWxFEX>DOHvi&ojKlH=!Mq(~xr^t)@f zYRmm*?N&DykjAZJwU55vtvW(TLiS7OZs6R{v79sM);+3oi4Zf-3MI?yAE;~=ZQ7%n zx0}t<6-RMj*GN}*m~8W*%7`j{|CTzA7JsN7F}6|By{dkRRZBEW1uc};uwwezzU|a? zuS$wODXRX>0z+rn%coGfh_C*(7;QtxtnobZcd2{h=wp;Sbh6- zXuCEG;IS2&TKs_)`~S1m=Nd*I`g|Y!+}@!w`&AjwD&+TvU_rO;S1ETspTbOElmYo$ zI}j2dctIRs4ma%wS$vO*f28j8$Ko0O9cRYxS`;tx%srx55bh$M06HuzTwB{4_U?R{#eFvMUfW1zFyL0*8^e6`zpQ#L5 zwM_UJ&3E}!bp)z><5SJ$eEKN_YTT{$85U>~jrj~b?OfXP8C(oklJU7JCAZ9qNRd?W za}^T-|M!3vv#-H1*%p8LhheuvjsdO#cEJuTpw)J7n^LndZKzuOVET2w7RbS@Il&!1 z^0mHD{R^NEt=N%7TfVS_j7wi=V%Fmzn5Sm6{h)dtm&S+GSX_1;QWJ3La#(eSnba9( zowgrVJ?@<80Y}4XOO}xu*b@EDSa~7FsV1XP@&cO>>6s%SP9Mc3q1KG0Vsz{ zG7ANkEDG?k>sqL%XsGCT6mYPDa*nD&kF3y`019raNQj$R2Y}}ykCbp;w4%iRDO8X| z1COb=f0XL_qH9su!=Gpi`!mM+GK{6<2$_VV)gE(*`a<^0VG0f_syl;uMi_Jmwx<8 z4Y(${GsEaE=WEp|ip~nVS^4&g624J&@UXs>y_M+cZ@{t4MJ{-_MfW4;xA1IUL6yG6 z`B_2te5)GSQCxBIw@^l}p!dIpfBOnjC)Euq99GPlCu(^TEO0;ScM_;1Q7W2D_1D36;50>0y%s?L57-3JI}yfz3)$|rV~9Oahw8K z+4hsl??%&%v#N55apPQpEhCUTRXa88 zoT#;ey8I27mSF(AHux7BnN8Z}Z4+Vwolz#RMv%|_rm{;xVDzo@ zFjiyKpfN<;y&5^70_@~-fUtQ~{T#C$_>xY~om2N*6HUa0(FC}n(j?F8qjd9m^?12e z%QR1%iP9y08zUiP66I$(2HwS+hrFJETNkaa=1rqFFDMsXI1ly2stNS`1r7JJFW>;b zMP+|iw?dI(WdJn-6-DwWg13paxayroE_t4RXS2Mi0I66ag(VM98j>Ma=`h zZ34l8E!jZdS$%}dTN(IPn%;Ek=<+7P*!#H4Te0qVHUvQ8NYeHUK%Ya)?R?vB2Wo6) zKmn*T389t{v#R(R0xJugWyJ=MoMK0M0{dWANG4)x32yHno+S<~TxlhxbBN*7GtS1- zr+K`OGPZZcd1J6Wvo?sb#zkX$mbvEAm^g10U(Aba^~m3$$aZ>5;VIw7d6^5r%hdfl z?{O7=NwM#N*ux#Bw-QGD)%4zNJVWh-7x_Day@hwUf#Z8ddLM&UrHk^`FTUNAiPN8* ziT~LZBol;?mMCxS24Sn7m6Q|gK*Vb)5V>U!J2FLY0ee%D*W0jYxIer|fUzZ1HNCvv ztdil|JO<>3P@?JMG|THP@uwfPlN1Krg#nSx*;B;Z%f4y}Jyyh9HYr9OWDhhzN@n)W zFc9;;qzD#s8|^LPt;>z$;=LJstsIY~-bQWWyNqimo^b@6KU+XofxT`e8Qmfo5w{Bnp#201qrV%w;q|0-V~r>O*!j z!sk#I{Hi4w#6D>2M__5VxkER9kKK%Lh(gWrEAx%~g3P_^=ipqPp@YS|S(O)UawDq{ zj|UDu;0Y|&-z7eyzy`-vfvsPTI({zS8&t8lw?3xdvpBy+a8hyX5kx@YQA9N=q*6C+glrR85|PlJB}CfD`~5xVF6R#FrvLkX-hZFJGxwb5Jm*<{ z`}V-7^?5p*tgQ;%UKIt)z^$=-Za*V-3_G#n)?Qek+R3V!tOR|&oXLn4pUGsGBj2he zTGGNjmd$QOHrb(UHV41P=db~|oXBDM-lL#$I1CU0S#om@%WxxQ4QsGUUX#n(z;GyY zSz~bT&AE&!D5h5f37Rjv<6_a%pd}MghQswjdfKJ(!Rn0T&0{q|kdvx2Q(2o?1Demx z)mczi14&PpFH~owt1Yk2{MtIX8xQf?nd*#mv=%kguf8=H>1dP9UrTE!>Zp2#j#h}~ z*X03f){=VG1HZn^V=Y3TZdMcPFkjBA$(lIVLiU#TRA))%!`gTQsu;bY`g)=k>u#!) zNaYx22^<;-vaX8bgjT|CEPW>~sIl4!w3o?|bug~^^3^)5 zgV|Lj$?LL4)PX6Pm+RnUSyTtV$$@oQ4^!9tvkt2+57lMOEJJKtkF~J;e6AjA8vf~* zXX>%r@YP%DvyQkdsn4!8$B-;5=dwKD&Y}09*4}vYVX8uy4vE`7Djb3Av*D zL^VR>;6za;oJtJlH&Ac_V?(kW*?1o7X!LMbFSQ~O&{N9L-C&u|`V|KZFRx#zD?UL&ov-EKAA=xWIr9K7ufgX)?PyKUw zwlVAB+wG>~51>rpMqv|{m2~>7S%Ke)ctNDaK{3&H${9`AmEoF_Aa?R_6E>v1)xH5z z(1|%51$O+0{!Kj!6vtRT&O9B!><>yf(N2`m44x7|olR@UlG;Yz`1-h6_dhfOvMNQr zV7}U(L2sr=N(5Wje3%sm8aUmQJ+DsGd#)L42Fvjm&47-_WX0y}X8qGqMBG5mQLq9U z>QXtjIpn2{a$$28DX2-~`K~!zA2r+MEm*Tl_k9;VEczafMXLZ!-=^=uUp%2gxq-^+ zEm=X{;a!#&ao__f%QaE5kP)G^uEUg;Y*K~SirthL8&B~pI8MUYA#1f_c_8iAwt@^Y zPCn9#-KBjVI7By5r68$*wG9ggw9CZY+R6b1EC)}g6tI?+N4@09iVyBg1ym6Ot4uVC zUy@%Hu-aiRi!umcLYRD21B-&weGP{CJ}=3>2CIY9e@hJ36_+mzRy}n$nJA%y+x)4f zkFVhIg84WOs^le^-kS9o6r2*AB|EUL+2Bq2Vf(24eAB%DmOL7L|1I-=KvwO* zDmRZzB2XM$;UIx=wPzr3@i56{quiLW-i9Nn!>8^l%k1C|tZC9V05wJ0=b4u}Ac(u= zyB%2XoRed%1PuFW;yvou*0t4z&`k}Sb!2xr_mKVcr&cU8umL}{sFg103{JLN4(-g^ znM8fICcAe5Z9+147uFey+|Di#;5G#+Tm{)C3C3R~fJ56FYM`8+ijTgx8&G~zU`{vo zx*fLTuGg}fzD;DRa!|0+w!r9X*_T>n>#Jm+NBTa!9T;{U8%hM@P!D#ec0yj)ll35$ zv8X3YL8ohbvi%wmy!3k32VoYj8`wvetUz3)!wkfNSPnX?C2;sH$;kH&oVk8Hd>d7J zr-R?95j>^^{r_>KnxuRo`Er z@4~3Q_p751!vHFd`yInY-gY5y!nbe>4ch9HWxOcKYw8s5`{F_+=swUk3RtQAf0&m^Q49&Mo zr4vFs`r=7xznwMlO*#^>7Pq;bO@~&#>vjNmIEJXr9pGkVa_}AOQd}0?p>W{n9nkQ~ zP(~KQbD6yRPW)OTpShDY#IJ34LZmH|6$Y^GK$_bIuuE`xY5>rxOqLA*CY4G1K!s3< zS<2Ram%RtF4BQ+(kj=S&Yqo^GK?;Jf zZlmIDN`tUbki8i)9&*ucznf72RkuMbIZ*|3!<>XL$>4jk<{(zxe4GLQ_~1dxMlpF1 z%S%9?02IKM&v!_EIEeZE)=v|+Byo!V3&*%LT%F6e!zC>sqyoaeYrFVkYGxx9}+Lw_-&HF2d zn!gL~HLol0h0=0L{&X+97v!q{eNX@w$|Lu&RGb;)xt|RSlUF)tYSR7exVBi1d;s$B z7>8`~AiG5V@&GFc{+LbIPag#QEtY&3tISX+kfcf{Y~eUi@RDJGgs0@~!`SI?uNBbi zpoiEm)*FFA4>K)7*Hx2;S)QCfoSh7}OTdfIjR08w8rVL9J+0LbvL=60NY+yf36vd4 zVW!}UquYbb3T@<^M}P~z$sZnJwR2225u8JH0ERH@j)lrh`Vwif=IDQyjf+^l8uO31 zK%S8fLWd;~^DyYJ1gbX}JS^dT-1a-4a$KmjDaJy_0ul-(bOOeh<2&if!$+hnKFEGK-QRGwj@ zS#MN{+%cNfs;;_6l_O&hbx%T*>fUDU9(`9E0}@;s=rx9Yr2$c!j|CDvCx?uM0R`Ar z?{StTcaH@gER+f3pu3jJ#^YEuZFQjcIQD?1EevcQ5BrNYM;1;5Us)*UOk`8JN zN4N$~Okx$(p=xoH*&cfE^O(mTU4|V`m$f4@d zXQ5Om{!qoJa8E<+P`UMSb}7An*Hk$6^QW?A!5_VX*BbK3RK}B4kKwq9(98NX5T#kN z)il;RF{J&{QN&plK=IqkC#JDlRi6Qp(g|BQiaJ{m=n&jPl1ReIAZ_L6(^#%q%PR@F z53VOzWAj%seqHeddlOvu_a|64Tslo>V;a1S0-%KT@kWhyBpT3Bx5f#aGr&Km$-EhCSh>?btSNsn2_M#!Kc#;Q ziqMNlGa{0{m36)j^UgVPMIeGH?95>hVsa6Y>02e+&t#oF+|pf~ob{Vz`JUG(WmD5%m-(|;gZi^H zAHgM^I!3{c1W*7>bDt%7Ir?8h_|B%C_yZ^sf-vcDOC^%NW3D>`?=I;ogr zf5NNnfQ^BSEpKQ(_}ia0x%-29O_ zY-**2O4=Vo;);WOb39%Rg8w~143IvUCB-i4z|r_W<=gj>`%s{s!D_3QmiUnhHLo8Ul)t}JX;O#f zQ!kss`z5cK;B@~hFmz&Qf8jTVVk}~H>jl}B!+3hMn<%6s%&rtCbm)V@xUkv|^%*&5 z5j&>#>U`o7l7yV#vBp99NN&a4N};`q7L?@oi&<9D5)fgf9fQo9PG3sRr@~wjx^_|f z7C|&~U0_X(r)8lTnCtRwycRFVEn&TAclIw~-RausRcKNt3QwiNmv zu%r7@>?p3wm$JGQffO!yd{mGUnB!7A5aaiy>=J5F_ceAGU1z_>@__*#zs4RZ2Z|00 zsfINLgc<*be&lywAU0c-Cz|{^PF?)cDc9BJbuTEZg6o)zuVhu%Kgz1GC;TCMyum)u zGGy{HmYX~noEYe)GR%~N+cQx2%d3{L+B}2UqunUzitSnRu^hLIU1MMNvD~wa^-0e1 ztMYV**Q(3_Q z_&Xc83Q4*X<>Gf)$M!G6_lp&>$Xb>mo>$g7N7Pcm;w|4}U)LNNB%=mGgK19B@f_3xmhiGrpU(>SeGuQGKvi(Yys1?c^ zReSiFYOCb55Ygp$bbF2!(!U(2@?KZpmK#u!}-A)qP(T~`z$)z6O3M#IL znPPR}p2?2W7s@-=LgN@Nr>%wQZ-U&rmZf@!nk2!g7fNj%Yf?04lFMamn1pyCS!S#l?^w-`LIwvuo0%G$?}zr&`%c1UpBJpS;HyaMNJF! zRs5J4KoY=00E-`jx@Dvrs->#;!nj+sjy6Y;wxSh`4AgpZpl0 z)J|^wnDr})E+y`_$QquItdSX#HT==CMoN@4mWqQBJ&Uqaf_0V?&#AMVMs=3c{3#>- zsU(ZVscL*hrpo{{*kh5#P@oU>t4Ij3l&lX6AtV`ugb+_hY!U<#IxY8{VmPXySqjIm z8scxWAq?h*pFSw_H?x&6>mJ|C29>i6Su0n>WND(x6=5FhrHOq^mK!e>f&i1kmObUj z#^GPU{Dp73{CZtm?QFzwK}Sn9M!n}7S>;@`rNNB__As+u1`nrr^h}I6C34?W{;U9(d$ac36Yr zHt;h5`x|n~XRx}xAs2tfjEDv4)MxCra(b9$le1zn38-@k=I&$}38=+ELPi=iiy?Bu zPB!q)3kzT|#l}YoU}~msXxPLG#0YFS?2C+jz_JR!x@UH=>kyu^s-E4l*{m`-|N99ib7Zp9&8IeBvDs}DCZA4E1xent` zn;!7s4VzIXZEm+?66gS-Q=KE zK8nh_p(XC!!wPeh+0moFjzJMR>GTnJrxA)pL=YDcFA(ZeD3^SJaOT-^ z^A~W|d?v5h%d#quveP>*>ugSAHgfo0)->cFa2l^nQ6s^zSwVi2We>6iCr0!6URJOA z8y-q!A;~Jwo=#e{4!uF`9HDm_b_!@YMArS1Jq!Sc9vo8Pz*)lTBw~X=*MhXn@4A4Y zK^1s8_$5onl-&EkA4+81eQcHXp**&awQe!y7c2nS7F;CB#+(&M4pXcPm*C364YCjR zClUff^HD60<}zqMOlT`)`T;f;mjwsdHDU!sAkz|xinoYicYeisbpDDU+i+3!HN#~* z`?RTip+{w)jthm|f9Ua*Xto@ip%2Wq!*Z<{6-i-4r6-JuIRA?%aShZuyebwYJ2vet z3O9*cBSK-P3jz4&J2D`_!pfA|+!}(J;S2FHl(Dl~7UH6KnH#W$GXu`8-}cDYh{L+z znHc}K_2vY{BE1p4dHU5Wt_Sln+IW(tuUJv7BjU~}z8f?uvdUH?S4_lJ8M*%WhBYth zi_Wl?VvUh*tm^xDhF0m^dRVT{JNPsmsCO3^|UT9Sr>BF6Wldfk%^ z967An3qt>eSH>9cv_NmzEH;kH6q8hj=h5Jc(sMoW9Z;4=&^{8tq+u8{kG!xPcTuD) zV~i|g?kqU==*)|RD7#pBvlyl6Q(KakNF1{evLFfjH#VUx;w+H^U(Di!B;6CC!IW|4 z#m_&m`dP)&ea7a*L9q^y6JtE$vX0HP-q|l({|H0zmYH(akF1(~{F8FUkF0$UoU2LR ze`7P4g?>8@Ry632G!4v+9oQaFErkso#4R1k|8sZ0lSP<08wPSLH zsf@^#hY-s;MIJfC()FRFv%rJ^;Q*Seeo&?yX8r8HeIiF3hB7fvzIK?Ugat*iU=`os zsw58`X4h6bhy)NU)G0&@_EQ~X+l+B*h`RvX9aK%&W^9u;A7RZpnO`xA8l$F{39)$b zC)E6c-j4-;0>(^C5H}h_rB?DxoUtFVXr-EBo58ja3)aZ*kFXof#kow5_=zKoDGz1NG%jRwJ{PrY=RqyPtfFi}tq58Hah#B+BWEbl4XkIx>Wo9R zl~4+#2nz^dydpU)q~_Q{Y7X5jU-MH5Y)DzFswUC}utjNbg#nmUi zcOm&^%Lg94%tH}b`108g=+@!jE!>#2Iu3D~@4XssV>ezy8_gJ1?8oC`!j|BFdSChB zF;+2w*4V7jWV|N#A43?G`Jl*r06>`z^R^kB^90%2v5mOX*uEtMDO-Y&0@Mh#CQw2A zF*?Sb7iQ21Oh7Z=$DPLZm7(`nM!m0E!<GAw*r1y~c^8yeE%0OK0~{6N4_#`TM=7NWRZ-XqxJEhQ2^Bm@ z{ZwIGXC^}jFvgwxVB&l7$S*AIilrMoCgXMzE0}5@V9blUgP>w#YV@7(uVZl3f%M4E zr`UrnH;s=oR!)K!^1RfXwh%B+(*j9AqX`!vNx_B(WX7+E3^z$q4w0nbgYS<9aoU)4 zZV%Rm@9hlYu2J&$4Zq(JBy+~(a~pOwKaHW6;lo=#LZs6L=7%QpJ^&9y6LfPPh6Z`8 zc(QEq8{&xj%D(sWN)U*j_zku`3*Cin{8%df$q996L{w`X<}OD4*XDkZ}wC zP(nswSjgB<4dwfPu$=z^h0XdCd51$~<3HI_-$_-_BFka?_JlnCC(Aj1afq0V21+ix z<}~Y?XqMcf8VKEEk9YTsxa0N)UBHMVJK6u79eklwP zaT*^G8Kgxah>gW4%f=FocMoT4!FoY9qhm7B&M7ClwVjuucGy8X&+y2CBdy9j!9~^dO#zfWK}_9un!`cO{t&@oIF?CEY~}E&7!eBh%DqvqUx)-!syb0 z?x3Z1pFS40Y_b@V{R*B6a_)z}Zv3m0JI{NpVf;vOJut|kAz9sAY6j(nzr?j#0g`t%&0XkVX2Kn_o?ishw_4b;?_LcvI9mc+kUds|m-mKaO;A zC%N=gz&VQKQX&K;8RYrN+JjUB*uCQ7x&N}^<{_F9|E}@+u1LB8u}F*W*Ldx8_?he* z&ub`w6R9}e${+S3^D%S5lBsAe&sT1|y9bQ3y!@R|hPq_wGUxXE#5 zn%UhXVymMi+&Ih=+6CE%ia_F^EFei3<{aeIfkk;1x2`fG+lyf4vIM>|tUyz!$4tiW z=c-ZM;@0USvZ?la3g`18i}x=_jE};5B!A_+VPx?xs*m8}QEU+)m55IS!(xJpRO$iF zTr3xXdc>#Yn=ID|-q^S1>u|9w>C*XcDu_|%9oz`W%yt+X<&_n9hl-aSPEKcN~IOE@rrwsT+G<&Qvub_7rhNvg#7@?kQWUoQNG z*4>{(R=AM$!k=Jjbw#nCvX@}lM4JDVq~%^fo{E`RB!;jQTLRq~ruZ@Psx+SGd%^-9 zqtbY>s~EOWpRD_vURCxf@}|j_>3ldr!SZx|1zpdi^L98OyiHYpHTH65Ri5Eidx^by zw<^!;HVq;$@z(#<$mOLOyom~%rP?QIuN`D5p}lrsCqrSglQMX&eam9`S_ZGksBSG} zb{kFfdAT(MW9=t%GWjYLf&MO&UlqZ8tKT@Ls8V&}!B9V6ZGTh?G|u9as7Au7Y<`s* zqdPQ4%Cb>obYmc)F*eBIkS@j8?$?~sSyk7q!I0oH;gJ%%VH1;II1RL6$>Oax>ax*8Y zUoG$pEhyJvvNM(b$T$Bm8mclyxCup_I4wOZK;zcEC%RrZ$hx z&RScWn;8h_i)xR6esUe2+uP!V3GKgGW14bTBamg)7Gko5DK%wA9SD&}<>oq^N|7C_ z!&l?7tS)bSk%vS%qP#RpBIpNE)>gyG(PR4SFL@5G|JqVlj!qU5n>kbCz{+mOh z9LioyZiw%7gXzpdui3mt8x>v9{+raJycq{mt4c(el5qZBQ@rt4$zVJgqH6TP1=f zX!6y39%qMf?#PuIDklfN%IDpn*&@1tFopCI3ZzWN!u#gi?OM>g9a)(5I2JCXUt#To z{)=_CkaKW7nf^)7EH)3gKNsxa!6*-Q+NSbwXR|meNRCwYN{a;fpW#j&Q>NC2SR7_W z@mL)$<+X~wg4@X|@>sqKeqo89_`3r;LyQ556o1)+6}hWWzFK%Ctvd~774EkP7WE4R zW>}$^*g$$r9md)pQpd3S*>Xrj?u-Z&R#dZ$^6xv9uQ%itW75U-QLz!PpE%VWIn6W| z(LDNBvU?-mk+{^ejd-CC+%emYqlD-Pu=vKj)&N!c)n+uI!g&PI#4RZnHhj z6sInLwUx?e8uL_~4E1(no?fwEsFDGUFN(qF-^lM9^J`N{Ede`#ag(AMociOQY)5ds zFE!zeRK&{NYpT``Mu!#n9DSI@8uZj4|2oh{OYT$(cxtA zur^dhuhc@MXWNVozau`#ED zeGE0^XAR!dOG8#t&WgZUgWs;9O6Am&3YTgR%Gp=&_H9cL`;cc*YOSChGbfTY+VCRB z11JJFXt_>Z?`^}YRo)QHP}Wp>GF%;hf=L6+QrhyqS@RcA2{1AQlk^o71M?siVuPH3 z#)We5a*@;R4{r2Ox#Z_okT4Gv6Qd$Dr+w=aK?<>?PSE>=d zP|%UT;C&Y2p^NE+Sj@_{Lo^EW-E0l1b$%zxQ$S=gg(6~+L0%j@B~%t&$t$IStx!-795#v_ zL)6Yr7}*7sLK%djVm{dde!5bOQcpB+t|NkwAGB+pL2SQfzZP zQJ_-H9N{aG?XrLjVp+oi7^uYsKB=svE3W3b&F9BwBZ9^6#z$%K)VhJ_Ex>JHV)*+& zY4iKRkAuSgA~UW5H$E;qT*JG@?L7&a1(IQMAlsp7qpCskRm8sY92DgOfodEtEG)#a5M&xO$0Vk$n3>E_pYCV}N z{OWZ)qi<;F#&24L=t4#h64+n0kh1fe0x5e~*>Oeb*x+;&3F#`IA}s6l;MNcgL~4dK zDwI0LIRgMi%rQ*-!}RQ8b!;;xOX=9)>6jGhI%|9IYdif8NfNoI1ObtSv~E~TBENFq z+}sl);W9b9C%-m=Vph{f>|UHYy{ujwE1JeMoM<)4jNOO+i-{KKXFVun1M;`Vri?_P zpD1PsxjX#yW7~k6tiNG-4gEwf{+RIO@6kjyy`Ja6q22F#m@R*o)34`~$sC$>1Fxd} zDVyDZho|MuH}K=y8F}4}&`OVD;26vSJrmD%`?9*UkhE-NGAsl1I@T{1w~Sg8zE~D|1>lyqh<&kBXNA z@8*5kStz~Af(;h^wA^{O)nj2r@0doQxbV$`cx$yq8g}8T)Cye_3W+P~qloqYCEbI0 zOYLl+?O^_$h8?MM4?m4d&7ph;@agPOem8Pj?!FiMvrvA0FYgGIx9)vBC25ZnE<{q1 zG=Lq+ig$gGzev|p5At^Dz-lET!2r;L+cg{1Vw^X%iR7zN*=rcK&s6NH zvhs=@Ghx;Q=#|5Gt{NR+68TnfH*=$(ldJYbK11H=iiAe+1{j!+B+_$GG7S% zX31v=L~Zs0OkD%Ip=!EK|5H9cf-h|j@?uP~n`ae}DoMLDGalKn_yLvy?*aLagKy{A z3!$t*A*W?S@JZ*yq^gvTPwQ_twQ?k5hBmJdqg^?YS5up3r;+09*gY6&%}3PcwRnU- zR_lz%Ooj1Kw7jxufo6eVq{C0H%lIq`QN~zk#|}NhM^`)urj8aQ%VQ?k8SL$-B3{Ki z5#njE;esMwFG2;ZY&s_2m-0}EVxF3G){{k2Zoxn(7i8per1@6MmcZt!h5XKcI&{Jj#c* zo3=IRts=1>N_|CIrZ^?)I-vMqw07UC8X5nwlD*Z2soD{};cQ$8h^4#OoOz>R(I8fU z&5>vFE4G$=3}+zu>0@|vAa}1Z{3-2V;O8-XfYXbOa$yPF*ofOE@QI)}$0s1FY?jQL z2m@0;*?%H$2Dj!j6ZvTT%9_M+hO>NN5}$^Pr-aYd`UMu2@MKMUD)7N%ezixN70_pL zx7I(rYN!n!5)~1)ZBbdA7f@LeBibQG7Oy`YpG~LSp-4GSfyu7l%?VG4KLJGfA;~Yd zPmB+|Bl#K)NsL8L@pStA%u~Dqk zG%AEaL8t@{D={ak4j+_d4>|k&Zr_u#-g8*_8S<^?c&DV9LD9hm*#&M9SU;icC(VZy z6UMpu;6qZ5n$J%W77Sa!bLec3xi2D+0N2$EcpbVPUts>O{5)@gGd{XM&r!PSW%UQAy=XoCu)$#2w@@%?aJ^1>SFCxSZzeC-9^dhfjc~2&m^6vEej#8dgIdTS$qKkg_ z;?|C_uqDhZ<+nv5jI1huOnYQi`C(J1EQOGf1`86QEq~i_6&tO5xz(qh$2ucJhOYKoUBi zu+fpJJ6x9*9mzQ_@pdgIQE@2r0P6vW4}RH+o1#}`%OD4`AB;_ZG9KxAwhri&Joqq2 z`JIci9IDET1IAw2^ktqNS<#D`zmM|W`WBku&oDE&&o++`w!Uw;*X*e=1Pn1FSukr~eA5tV`sC6}(QGDQOetgDTuYl{_6mU*d4N zWd%?6qrMC{2G}0yI(E1dkkd{SFi8oQn5%0g0$NP{6!M=%oP2O4PxKa&mg2BlL_4P0egp4pM=t90GU(zx z0|(1^Es|-HH}R3)QG3Z>1XFmaoU@7hYnM1F;m9aJ=>gKpvV(3L<#EA;=6hgD&!SL# zIBUM&#G86od=zwPmCBl%xxa?$K>2i|UM8)AUZ+YD>g6GuNk~SG6XhQ(m9sbV)PYoy z13Rp&#^m&+Utk7S<>_BgW>d5v!W<^@W~qp}()N)&QB3eW~aTuN;=6w}x#brGij$3Ee?H*a4=cPJSVZ>dh740bw| zUYM*NQ<|ZA3}Dh5+s6l6jtRCbrj`f3qK+sTNBI%pY$UU~@*%`;iS{8lBc#{L_dQnW z*mD8t*eXzviVEn#CWVOlh3zlZAwWR*CS<&juRs}KzS_cvx#p}uoRRFimFN17BZLkT z0KB-Ra>`a-uL!W>CXEh|b{b*friYL~Ee@~(3zgT@S>S+;%+hMIiOFqY@euiKt-paw z#qY(XXIc~4d>c=z`_@N5DQq!LV#DW*{Uz~a?WD+bK*cR4P!wX^TBIcp`Y2<)rMDu%);u!DZ!1UB24qo8$p^ic{yg?|@7ck6bZ z?fX`NA@oe#n6{l)@qPap^$Co|jW@QFyMGgM^$R9q`K#v}0ZDJ z3=+f!U~>W4f|v~T1RG%%AaI~W4eHbM-pL>OoA1YL-ad0AmbF1CFn{WH3pq&H2K5I8`TIGNW#{t>I zL73=7sS{L;R(`)bL^#nKoUay0wSquQ_8;p)(JF;vpDjw5l}v>fzX6d<+Xbkxg-$_j zgyjg)?$64yJv^uCqy zroMv+q*Bm|rTXFv-lH4EW|`{)37NV#gCz0o32+)ySUH8=!^j9a0X;ofrpRHu5&STg z*o7sA&yH9&mbhqdXo(SWj3oxm4Ek#DJYu;TUg zXqq+Qp;7foTSG>KgFQUuc*~T-!~46@#ajdw-+kEaAo>9TkD{0vPw!`)y%lI<>fQ>p zzOx>ux5zi#Gr}1??Sij(>jYGL&8lJ_L7(@?X@l8i>Q0JzCqdnzrSW~OmPU5PRkcVr zTU3#cf0U3b=Pgf2rj^_IH6Ly7Y#sV}apUh+#)=xg-{lM6@pd$T!{3<$$p7BF-uFEp zNxp@jzvuP6{Q%pLB*;Qk`v-ng;^O%E{`h%sH3bGDQ3F=1#d7u!ys=>&*hQ_WO#G2w zfineq{K&h476(dyL`qFmw^rbfX{!kMWxYc@)wwj@w^?3!h}TS7Y04!e5i6zwJ8P+& zaEMpUcmbwB;2Q#0aQr5=41f3r7=Jhr^0F9Kr!|LQszL3EBJ>#EPIA8y=9f15WP%d&{D<0~}2LX^9+on72-)_62C~Lp2(--;9t! zcaZX|J3KKvd3VHuz`zDeo)U5%(`Fvw{wmQSGX8iXASmtsq-=5|L_i>1MhD1P zu_-1tX~8D*%rh;^gJHW+J2?Sx;Wkc;g@@IzR1G(%EhI2yaYZ=1ilYJWfWUdk=Hvzx zk!F$~Y)smchS^)O-3mG}jn9IPemF}YJ9tPktt;>RiML0<=4(IkO5O!U_P!NgjK^?|lr1vP#(3S>j9_7`YZWa6kFzIoEw}riW&Iv@h{w_D3;ExlU z+;Ebo+Q+%&11Awt40Kv~k|$;U>B)9sJ78o6+og@MwXp^N2Rd|Go;b-5!(g%h7ii4= zIS1@CWHy_!qy`4j1COzxYI2!E4U)sdWAN zEL@4>;%8)u=kRmJYB87Y-mHn7pb6+79GLHG!s5UL%_RqBHM^jo(x!Hi=^7i4IZC}% zVkJ4$E=DI5Ygst;)rQl1#>UTdhz6a;qXEnm2wu=JdcRBMj;O#dgK#T>ykOW^4YNd2 zXa~Fs3`>CRmSV%OvG6273j*lFp5zd4NScr#OW>36>CrM(A@K4H~HPi+sr`+KNRc0R!BUzH>;Paf-@SmC*;0;kO{L zu7W!4eX2&)$jRckL^g1VbVC`sPF~5mF zLU%_m*n!fJM9 zoFM<#4RPWS+z0L4VhAiM0k_cY$e&yvFS31Tm^>uL|e+heLErC9J)xU{3bzM zhuh7V$WqCi}WD$nD!=7bJKwvhCR|L z#=$vNDl6!sal|=b)goh3M=f?ES|(GK04pF?IM0M-#VCk&BTdf_o?8umcm#@@3GPq; z4R>IzF2*{%^IjyFpk0$al0;kYODBSA%Lnp>B+--;Q@Tj9pZk z0$ZC+>yETi(|Gq=vRD#H4cJpjJPN*YQ)N-P(jUmU%CqND3O2L`SZDJ<0hY;0l|`*i zAHr6dXK(tyh#xy!S>(39VAx(v8ioqnyS0j_Q+Y>l%%<vKDsWm15 zQZ}$!DWY1WkBgELLY9b1;Qep42H0?_@8LvsN&lf7YqZy-lPN0ZTg3( zJA{}E;2Du(szQpmjB2T33^`U`P8CDpkFA;}RLzgUX`(NFev&5Cd0my##r^nMk}h(R zRZ>v8-%gU0n|wGxfsJxax~QeCmPgY?p0-9-sVZ7(AITn7L7w^rUacx}HPjCNG(*(Z zcFxQc%_2)@6{2JE{VO4QSf+LPt%wy9j3~s~lPNBPM3d|nevGZLU-U=Klc)URT`+*_ zvcwpDzk=&rNK1&oap^nck6EHI+W50k-M6RQpDkX{S_j7Fh;%#BZ5C7$gCo8DUhzdvK7Ka)Zw9hOK*h|-qWUb116*%*eyuq_~HM#h+l z83prawT=K7sw+=7%NJavd+0V){l?5ypqrGdfN4fziQ|}b=ZX6eQ$8Y3TrNJP)uM!c zKi=0j%Z+)WPk4c#4ur=9-eQR?xlop)^(aDGd7P?({f}t>F=44rXc-EDAca7_Ra10` z0EZP`V)gm*qhGN7tv#3xEAGRWF(fAj&;)70cRV@BsE%6@EptQCauI-Q& zZmf`e2YHbpm;!L~)Vd+yC`@({Ze}Cp%Fm+~)Ed$f(>zp2%e*?G1O=_?))n_)2y^R- zz1mtivL49GI{8vP(fs^t9h3J&t#x*N(EwzudwuaWKGQT`JdDr0kuTQcGb0*6W?n0o zHxPH?l5+{9vUT#IOROKYLP<;;tbpX_OT-f(D34t#nrHy;_Zy1$aT(r7%+$&PiH${P zP5W5h)I{8P{@F1re6xXA>hpwzsM-D6MAS!ea*d|q7EuN!IbgAp9bkIcET3*F>S&+H zbxlP*ZA;)(Q{l90Tjih4#CFs~`lLCCgRzK!25Y3-Se<1WHy};qBsR<4>21LVbIDFj)&Q1Tkluys1D~QgSa2u~rmdR@-H^ zA!?j|Wn(h#sFfXOh%#)}wXMZnw1q3L5VNo-*SEn!;TZBZqIdUC=oGNf+7J)UMznSW z7p?3tCcdHA;qbPiFwwd;4)AxZ&XKmFeq>74zGJdwsJ?G#C%RyD7Pb?k{%cpaw-?Q^ z4hz}?wmy~H+KbNs?k{x^qiC&acY@?lCcAgS!!kL#leivX=6gFqa#$wqokcC*$0%t5 zl^&e+i+7*K^fB1`yhfdKpifdHV=fuo%v<>2GDb`f;y{8L>-i`1S$ z^%{q%mEUrW`(GK z?z3XKurWo93cHG?k;z&4XiSqMJ}N)!YUNn}JdpE@BP`$oc(wo8 zNa4llZXz?XbJpylm?%D}DWS>v)>d&;F49J*l*asl*`8dRDgN~WmBWAfcd%V`3(14v zt_anHsPEN*m$R=Hn*ghKUIR)~ChgY(!}`fq*NSHN_0Y9qBQ9;ai@CUb(;X6eKPj#g z$MH++A>P5|y&jNdAxiZWhtIztG3~ZmkQaN2nvp)N5EIj)Du`j%i&@@{@Mw9+{`rA? z^?FgAwCMNP5KMGH z4RH{fEG=xaFzpm{hUMl>=HEUFXMlxU1uw$L9W++pgxiqSL-Qw)9SSqa8=!wLYu_jy zCF|jm8$}vUkJ@;nXy~4TzzHPINLO!>A6dBy|5j$LK)7~qZ_z8#hn2;~R4_}aAMt&x zJ7`6Vm=;<=!H_;;GgQ9IZvqL0%ye&GaU1Fr?CvXipn`vcLXlR~7UWjt1L+6j5$XjQ z8!mMmO`hdeJ_Y84z7mp6&#hPk;J@IBBRNs(O|CzO)SH}g>P?YZ!KE7MH`V+(BmKGM z^_wX5#v4*^ECGZ6Nxi9Lw{>AoRUb&{H>f*6hmZsc`-$orgw1jNMKz%5;{LD#9+W5g zi?^|ii*8mLPu4Bs65pr6sB#CSwVQ4M7XKhqZWVRihgZk>bwE>>TSe`jRM8=qv?5N& zfRYwPhAwNsl@*U-0uhBrpWG^{nbuu5S$DN4>#pX{fpxdSZ6dXjG5}K(3ixyStEuRt z;nKKGRH`}Dj|ap;5%6bdSt&p@QsVrOKSLO*aC5#azD?9qwtqL-YrS&nA{fwrzD*=n zC`A1`kVd5S;O@#X9%|Z zmHsWFRf^DTe=;dHHq;!4sD(T+eUr=_2zx-8{Ai$9ipv9ciCx&Zu6K(UaXEFj_yITf z4FVc$l8pz8D|lJ_;t>$LX%-c+lj8=9$F)PU@(|G;RK4#IVW}D#EKjJa6UIbKsXC!t zJw&WSSCj4$wIYPUDy75})TE@86Zcq$V@=nnU{yLQTtMldbPd^asOWV5al{0DY8?B9 z0x8O5wR^?$xNN*vWJ8WTa<7;M6{YAt*xt9w&G$h!StlR7U(|qBI`@8YJC@)50Ccqy zdCvn-ReQ=K=C7U)ikr2Pz`G9$oha4E!(a|ND&rm!Yw)Y=A<}=uXc~IUgSUX3 z5V@31>FN?CKpig;&tdnbPX?hrF5j69XIWdYE(C@_kT@t0PR1U$mAO;IjacyFDWdg% zT$h=Ti)tw#6J*Wx+m+#6na+ZvYV|nG5oOXnRV>5hy{Q-#2;Eee2{y_4(?mP`dSIG( z6_@HyC`-aOPl!8i3R6F8s#;76E~TmkC05eIU~Z-|Mpz-Jn#W-(RZI2qbkQU-?Th+` z%zRR$M6K)K0|E5+#J=F;VChqCVbQ&6!E19 zGQ%mrbgY4cs;}4*Dw7*GBnZOL)QsjsSVD%YPAj2hL7+=gd>{%d@;6ZH@^s>lZ+ zf$D68F4!|b3Uoqm|ceeJ$Sabl429ypDom}yp89GhV=Wc zIbs9}*gwt@ms_7Nct$j`{=W8EXiA&p;b%otj{;jexNn`gBC~G@H4vd~F{`^m1v1Wt zD-aYbG>n+lD@4hiiT(byy^5waZej_F15eaVM6Y^L*%9#Q?Htg(VOSi-x zhlS05RdxVd5wfM5bu#E}5J5T%0^gOL=7CDJ4!k%I_Pq$cT0R?_xm=a3`eDAPsev&h zJ}>U`z+M756RFkDJt~^GogfQdeY^blc`*`(uud<4I&G6PU$A;_ta?UF^j_&1zrO(P zy=aTA*$u5 z+`b6T_y*< z0m-RE<}VZD@oV`q7*%`9^fy7Qf06y)g#My_rO0D%!Ya{IzWbJ#gG;Xfq?J>0b3k#; zT5pSa?pOBG;TWZI>)WDcM3J$PB9luj2XXXp3Wcy0GE9WN$0SOsMYwu7f-lUf8n9tc zGJn0aT=;7Zr^<$inkBLhnnOWxM0$p*JNSdrlprG6kk)fzxu_E+_2FFVyWSBD0W*p@ z5~(NBR!8Y5liv}y+PAEhC*Q%6^^*nfLOJ+Ne*Z3*bw63}J*!k`wV%YawaR|7@jdY- z1k~d9#mA9@J&cvsiYnoPKbMERgeystv3Loi>z8@`U~%WEU#1GGB#;)JK!+ZB&pGt4 z$m+GTn*`29CE8k9sQuF~pE?fyp(NiXT2!Je+ zgFh5CyPq;WyOh^Xf(#jUFJv-}Y3&smIs74P(w_zDt`fVo2#Q+$TQONtlz*%38Y@Y% z!a__Mf`WyGYoKiWDG#g>6=8b$WsS(mYYVFveX2yswla@$AHqR+_6YoXwrkvFb|q5iZSvsOHkRf40m$^VbD4m$!% zD7r_Ty^LG>0DlTyX- zD=Ci&tJNON-w1MZR{pS2RJ9j-rMnEAsi$mECLXqr^2)_!qK^GhuiR56n%hTvWtERb zF8yxxv1p}_@hVvs?kYXorK5Gp$0CQGzVGSEcD(zR9|;7sqPm zZxUT1l?nY8Q3X|A%eYNhqebpKg-3->*I=4{R2buy=QV0!L6!x$YCu!u|6XNPz-l@NPLjV*uT@ zG6oBcK^PVW9UQ3tLS-eCjbY*zX!8r@iY>6yE|Gh-h(f?-i>=~njAF`GL`0Ry3fsg~ z`(s|YV4HG3CvOMF_ms!B!`4tDdwmK~r>FevQ=m?XY`;U?i(l{V5VLXV`I)#Yvu&2Z zdGADX3E+rc*$5SpY(lcqPWjbmz_xX=#!j&qTw%vfQ4AdEu}gHv<&|Ax6)uB5SJKA2 zpTpEpCR^?Xv)(Ru?k2V@XYUb>Tc3)zFi0yZ#k39zl`4LrbjQ_Sz%JEKUb`3gTP9EK z75!+AUy4}~RJBTtG4-!bXQ;PNRQ_L#bKE|0D@Jx?A53c{vdw<61HV!aU`xv6F9*nX zE=#_GWKt%t{u-c!HT+uiNt^+N5oLBDO!)Z#e}zT*44L|kc)K&4sEYeTsdGj|3@aqX zB(f<;s`@SH+ID%%w}_J{lUd)18+w58#3`RnB|jqZZ2DL)72&WX)L2PfVnp%x`Mnr6g$vpd4|U=P zF#)pM$RELIddjzc6!*l#l;Ru!>8(uW9~3v>?xcfa1}<5L6mm>B1cA7x{N<3c$Mro7 zUqMe4C)F3|5iz z?@~;PzS^aNVQ|8T zo`Da46_?rxGJhBA!(QEgD>$<#JAlBk#Sol%c{_j-oP)<2^O1gWj{7M}aQ<6{OW}PX ziTU3gPZ51gKv-g?<0(+lPQLpm0+CAORj0voO5}pmAe$xf%xPsxzx52_ol4}DXGOZ) zc?QVZQ)d39Zr%SEI2BwS<}Wn31;1W9OV4Jwb^2j8oUuwb+JO*Kf?))CE%HQGOjJo( z0Xk~>xArk!nNP=bLuR|duD_%GiGvOGZ5j!HKRWg1_;59seg#C~J6(DS;x|vZ^g(d6 z-5RHN$Fq0h^gAHV=D78apfPv5_1Y-F_>@~GI_2`{NsPSMQ1^yS;i{Xwx2_-Uly|MMMtv>S^*wyk1d0<f9G-gISGZZPsv%y`i&_Y$GQj9I$!N9sEHy53QlSSC%L8vK;`? zr;=Vf*HQ+skOCgyI8kQZhE&TX*j}DqE^=Zsl{8etYFSxtwEOcq? zt)k}ytI43AHC2<*{BBiEhF*tlXh9V{WE(=vy_rnaTBfJylxI{cMepn$^`dF#8j+$m z=n_U^%*l$x);Yz*uoYeWBSk0c7FDUqGPg&SywOQVC#Q2{mgG9WaAlm}TqdXLkqSKJ za;GSnEip}x98hU2vzpJt1$^HK*O#V5Qmefw!DO2@lkQVte+HWpiufj+mvwU3oRG5O z@^gQ}NIxU?Nk_9Hu0ttRlpPi^tRn$lQ5zU~!dAlntgo5|C#A0f{4ibmp1eF=uYLj1 zA-o6|w7CV>07`01^S8_$2DOM!p~yOS6m2)>ZXr+q|gR4#{zq*>g$~Ll^f*q*?JkyXc>~DM_gHmpOVvZbbt2rr~fI=O6tGr z$whvTN++YB+70rbUI~Y0LFaNh3J3{;@1r=2@z;Fw{dn?up(dkYOMtF{qe+9YUEwIN z_6$@SClNz`te#-=sSpl|C7a--f{^Be$bAj><>Xxb;U*KI^=F|qd|iY9ewS~uOY>4< za@%Z&Ve5p?f(D_c5dJNJ3uORO(iZDIWvgoXWhnDBteU=xKk=<+Kz)r2(>O@{TiKzy zUf;g*Tlr9R{jv%xH<-^{hU)>?XK;IUb^Z4+NJ4E2qd--f z4JI0#KMkc9$4?u0G^Dm(#lCVvU}9|&b^6Kab@U6=osCHmQF`dvI(ipOr%PQm9l5Tq zz9GEZWMai`KU>e-?N91icH2R_ZKvH%sjn})fDfjP&1<88|Yxq0gG}aR=j&UmwbDDmmxR7JqV!sH()BngZj=2J!L=$~{ zWWOz+i*3J^U1CQQy>X6@yAg*1Xhun}OVn3{@*QWmXu4|T9*n##O#|gF2N*{ug~k_W9GMgvp98t-#w>K9 z#sY%lw?hVq+)+%UJ(j_%IzwqoxACpo9*3Hl@dVyAKk6{o%ls;SsIPuFE%MbBvQ|eu zE%~c5>;Cv6`;!wG*-`IrU0t8CSRU@Ar!<=XvH8x0CW&#W&qbgo4qMx-v)(*~*1(Q~ zC}<5Lj~#eCrL$h8;@4ZlJ*%C^@=5GS+rVF)_3O2wccgW&4jL>mi4b5!x_)b4Xrc~d z*}l;7V&4anOXziU^EWS#*&ccM(e0L(FQvD!(=UhKM=?Ol$MHkWE3(QCV}*>rN>8hJ z=(F&=fOu{K3z}E;03dCUR`ewvtDB+OnEQ(k-Lz1V*|;sUQ72-f0*2uR;9(rbH^GmX zXyY&lZRkM|ZJ?0{2N;2AhwXFN02g!s3iB$=V}!e?hAK_`_$b>J#jz%6;u-~_n~0N znvY0BYk5m|eRiPF4M>-@ORpStqh6D)i*D4b6i6@gCeRrMhNA;RDIB1-@$ENSd;Cpf z!sB=nwAEuE3O)XDEgr`QA4_L%v$y)a^(xn+xtq`z`fLa0HWrl7$P|H8OMto1mIOPd zmc-D|Ag(JcDu*VSt*Mx*nja7r^U9`C$a%f>TFrvp6N+O2(HnDzI*S9YtFD|^p{s2O zIShU{NPnGubezcGl{Nb48Aa&FMcRNGrpx$Np-FI<90Pzz6F~VG^GkM;hEzK{L1k$8!Da+?YCtNb zMK#lm#cJcNHl2@wb6Q&lR+&EI4m>JheMY0f8(kStN!sy1|?BN-d_k~<0`qgQ18?)Bx+ie zMNlA%PG~V#S;qA*)SmJE^a0QlPW03FDs5+bf4yF2NZY|`2eloTljBI+agw$p{Wn8l zfo{|6X8jMm+~^klGxajRRj(ITmE7T%y+KvU9afc~Ap5-`Rmp9bs#4(oTlI<>`kQc@ zUZ(o%dAp^*sKL0qga)IeZ75!TPpCiW-b(cfd~mz|yr<|XuWw&xyN*MeQAe`aIgpO{ zixx|*K@Z-43VNs>}V*v&IEdTg2#UferWRbG<}~!#X0!|1p_4R!^3f-S>Z}dlNXD>i>Uy&b>2pXYQTlyx(VrF*CUL z8q8Qi*`k;`nGm8BX+xjtQ_`-LjHM(+B;FOu`WZWAxs?CFjx;XC!=L;ANR79K#&C7<6%HLX)p4Qx(C2t;LY*6L}BNTu## z3fNTIHNO&8^pAHjLk6@-_|5Rq?68Ys!6SMo>E-PS$Y36NSsZ&ruX@8P+Y>Iw=l6lN zuOH_Mri6CjG-SVm1dir7H=|uDCLHRV^db&RHbdtF5Q7FA%6{8-7 zk?J+EfPPIDpFXNr@hiIl3J!f6KqZ(oFIc(AH7uBgv?_^@>3IONx{v9vlYi#7j{)kA zh56%pyyn@oUFOviRr~90ZPfq+aNLUO-tDi~ymZtEIX!cTk?Gk(eBOL| zIA(gEMKI!Q17-xFum}vckUX8Lk(dAF^1YJ&uiF7$BmOY^d;NiFZ z2@K#bae{uG7F7r8)m(!Pi%SRURb7J*iyP@WP6U7d?OcJN)@~X%gjLU1{VqEG@{+z~yjYyOm0h~j);xwRFnYuYOF?g_^EnzMQ zB1ePA!dpP#4ZZuL{N#IL*VKbHruQeNkjB%)uJ!G zFJHpSrUEI()5rjqZHDNrlivFbpYcMRd3K0ih0_}Vo+Fg`5?}L%R*0qODb>7h-dZWX zL(^RK*888CW3s!hG*oZWX!Rs??Fr#RD}n)Q_z<1r4RXN1oAfnL=og}8Sfn*#z)-!) z#n#>Z*4>Zn*WK3ZU&OwC#A>)!tRJf9N{ot54_J3UwqH-MUN@J^{`x_y;X1ovqSf%T z*zf#qHT=YCXdbo5BxswltZl`ePwHJfFId2{;z>Q*x9bF*u@yLDrDFG!dfiZj+N4No zL+VHHeo=yApIgF!*a@kAM0QZxHVG-)5v`|3<9*Ox-2apw@V!H{DzsC6Xwp-9HP4sU zQGfp_y^i*ZIPjES+r~`v7RZ+0_tIi|YomPYieY*u-wTWA#$M*^~bMPJWDEvH3 zZ*6lLem$zPb;g$Jihhy`M!_N#p>uF+wDrH|?hJTqc^eWX?>LEcMI{h8?Ha- z5j!X?cBy!OxL(|JD(bB#hep#(qymyCI7zsmKl@3_Hp%=TDm1eA6g3?rCw=KNde!JW zRddMsyGKAFyT@I=Ii%bU&(00?^E3L(UXT%aG()?@b0hTnCCgE19WsOq_*=#}<8%An zK@a>}3E}6?jRb6{}`>tZP4lm!R-}R?klT?r=oolN8!6jy|gwrhFqQ z-cGF8V4t|`IsJ-;U&%Ww0y=~NhvQuTz z>@_XF4(-_-_nE6I>(k$}RxhvYJ5|}1oY}v!hSn0srW(Mch%-ArQqKov3y#uT`o2VU zR590aTC2=P31+dG9+@kOEy3zR8 zi3IMrH|2Buv7d6`PB;yDe-EiHF#Mf#Cp!F{D90j)UsY^;UQZ~IZ9kW44nPZ)XEEon z5$*mj=a8iT>IIaFYewrjSdiOBOOABJXubOl$hZi#2Jud&`-`_P!nP?kDK!5%!ipQU zKpde3uvF5Bj9eN?ATS;`DZ;RqD=157(p`QS=lg^{kPyEDv)KqnSX?qjZ^R=zPKN2Z zv^*n4$rw-~bAu<#6?$z9HW+BCsSDL_p!sS_mg>mjQ1u&iama@{N(5BXlw&7Y+u~)@ zlDN=CHfjkt0u*T{e((kTf|AG#Lmv@L55N?6ZNpR^H9_LO7>J-sHdDNkQ8mF8P9$=D zsbVSI_L{oxh`f))>ICY&?1exErkI7GSFsS6&}_iWsVX1mGq`cAp5M?0>yHOx;2kl7 zW8dJ9cIFJQ(+W%@>+lq@c&r{Mk!>2Aqikr8Qf4}rheRGnYmonBjFH`f<3t=-QKZQU z#f9Sal()Q8^%4|W(_a<6Uet3v%l8q;zAJ{ls5ee{Wtb=Qv3Tc2J+JEi7YPj^9l^WF zL1-1BFa|^?0kFYheIQP~sOQ|i{TpgRiGh-XQqd>32d4u4qcKdK$lR-z@KKlBxu^2L zae5Ws5&!_@qtW$`#ME(m&D)?JfMy0~5II%o_9QP|GxS&GH3jMe;_0G5uV{yynGR*( zSH1D@KYdwTH(n2Te%NEOXM@J;_24-@Z@ix5@*Wt5DyQbreeWfGNUHozYeJ_veC5mf z1FowuGgmT_@CS??Az zYZ&>XapaHYkv}ep{LwD*M;lZ&yK0iIWG7Hv>l_*4rEA^lNqSL~iB$V=bf8t2!zi$v zCkZT}7>KA-0PQwve5)>_|I)bB1Efr^1YR`dc%Bl zT7Ty$f6JtZ*8O_Q{f5fljm^JHV6cn}HCG;7qWoQWSM&p`WJWydHM-d9q#PdsdrohA zw0IFeS@HG5UPRB7vP$JI(wUownhfgZIqNSSvy2E$)S-BDvg&YMAqWuuDIk_MvT!z# zGsY2FDY@qrnOMm=Iz-B;^IxfR^mj)Y{n7W~&*TiXow=2HWpsF+{gv1Uh?WqUbpO>E zH~!oHO3WI7<(+VK#{br#Ds^cIC9w7sB4u=*SUXMca$#whlEi@@nBtYm>*0c34~T@) z$@;<1%0LJmOvdwXQacd9DWb!4-Cq)3jNj%h+?-QPkgD4GG$Ss@pyYtUbfgCcFV?k$;%NE|@=zYrH0 z!Q$sNU>;ljT~ei4v!Tu^bNd_}H3i!QH7OQgx;L6^LcZ%dXPa44F1w<14+R;O#k?e> z-%s)$KGV)w?|^%@^VVH+uUNdZ2j1ro?x2f745 zf^YDoF(q;+^#&8*k&{jJg&HGdWbguA)`|FRf!;o?IOv@h48oRHq&*48)H)0Gp6=UA zNnXP15SJUnSfU0wtD=#k+zuofSpey$VbCBT8~HGhUl!@(D819L#ri->|CF!lo(n%1?ALap&}oOGr-M)EWq*B4HPpnCEMTM)bI0b zS(X6v^24IfTY57PgsE@gKv0QXqGo0$8Cf4$Rw1L(EdkUF&Uf8s)k(0Aj*5sKVNXKD zkyQiP%`F zvOUjqTf$!m2Z;-PK+dXA-e)b-+iJ5#uVs2c;k=}5i6}!F3fQ>)`fPY;;)pa1x#)L3 z{l-@5bEs2jz2Rhp>S&>`G-`m_mx{H^^gKd%2vN%@|DZY|St=HYB0P1$%jxC}geOVg zz<2aJY=jqj2X+c`7r;^4ejCe@BdYm#px!^XZvLEp8&F7Sih4d041{7}(momWrSO^> zL|Ms$jQ`3$S6oeBrj{Nv9;A&8?_Q2zTaWmLbQp)lqwneY{*9(L29PVtE}`xoYz58x zgnsyw(mglqgH|ivgQp+t@B7}O8U9w03fu`fr;{mxN3!dan9rqrB??zL=Rd6 zM<-MvT#bt_gmQ>8R_HfmAAy@82req7>m4M`K;gzg=0LJn>LU>pIdi363#WU-N3<-@dt3?<(#&Il5e`n~U{qexk9(=M$aSPk0v3ouoEpOJsGNfgVGn$u7boH% zr0R1;-w*WW+FUW?1HB|0w-{A(j7v%L;jd&Yq{p9%0UZ;qR_T>1AH!_oQ&I>?V>UD& zs1fk6?<&348AHc7&tvH61W^`L`P0i$6v&|;T_wE`Dt(AB?LWoUAL^aFufeJ+vwt5J zvp&=x@C>2ffQ{g4y|C(^a>!V=Gd70?{--EejS!j>;?vczik=Y1R_irfgFX~h*XTKc zLx2-9v--$2KGAO)bwi^+N}}kVJ^&-pV~yV9T!8b*8vU_cb8rw!4gSiV%pqs$!p(N?=CE`EU+m@)ug-`=Lp|x1B zBmPN^_*KRQ0ZV~8C&DY8!NLGB>lF6uDlEa$MW}5ktE`o-99ikCimY^5_S6W%rv7dR zo{J)E%v8<@H*M{bz4qso_`zCvzswM^{}ZubonFZWOX`|+dfg~!HB=^S=ZI?%nQ+6u zn=mq6#8{BavUR$Y>7BD|)Ok%0X0QlonYK=PoAS&xG(l_EC;G~6b0rSOhIiEG!r2^u zv@1WkiX-ldbO7SSr}|i+{^!^0jVOu8dfgjMyBA~ZaU|=gY6Tk-)%|y3NPyG1l)JiY z)UVX$goinJ7S;(?*vyN)7 z;p;Z*|8ZXxZM+k-3;bzfbZ}~bRJlG6#DqrJMHwKKvPI8U#vs|b##{7OV2i=dfD4QZ z#?hrvz7;){K>PMtaIzLeClnr-#5yuPL#!d1E{p#XW}q)U5LGEJI zc8+`&qTiQ@Go2Uy_DlF(gJo|2HN4`sio3qni`14y;zYl+)SO;W&)@@CN&5q`d&*~7 z?Hj!nX!DK|mL(qgMz5{y5R<;qYuLPE%ub&-HjD0ws$Oyc%AF`Ez+NTAcc)_Nn&-Ca zlN%v}1q^ceQpSPfAC-&r=u%__7e=T=ZZfg%kc053SlqM?;_3(D@ooBe6r^R_^;`4< zUSj;?{fY3Rg+k?k7`h$e!+x=DyWUkhD5`&pq5!{$P2cKuYN3EI$YC7H$;N4T$1T-_ z;B=-T8HKE#4fxY1i@*-OVIGQq;2VK>>YUUv!T3-WO7e+|{s4R)JU)HAcxZ=SfW3ch zhyDf8epht+ zL9dV8rK;4ciW82|fhxZx0I0yyW+7B%tN7*z08ek>+J%%gdql@w`lTpfGGZ6x)m~!D zF1<(_DXQ$&JK8Q`6vuksZoRqZD@adXK;nYkdcEW~Akvdiut)6LtzUs28vLktsAH8t zfreH87V0hdIW~3OM~=||YSjO>uDwFjKN8b_)E8hKuK7vkVOjB$PKoAU+Jm^S=frP& z5I59ayznzXevH`kvwk-Q+t@$C8}*y`!7d)i&a<2{!3c~cw>EY4(gO1u**T6(gXHA2y^XL z@zO!P>zOsGFZe|_YWISj8aoH+J0%EMyAL8iw9{v!hC6=I@1}I(1d_7gF_as7#O`14 zttBG+5Rx1X)yDq{k!8K8{i_~ZeRuG$dcOwHY}A&AD#KqJ1Q98=mwF|LhvEZigzfw! zkrURdA9rJDhp6$J-Yk2=gv8MB%?SMsX;(qB7j{FdvR0d`OW}i=Pq!^>2Hc( ze%A+)n&!U4`cS$aJ`CP{si=Mg^k=DPc0{k9f%m|m+5MRB^*N$fYpeEX4vxMM9dP6; zlJ+Z8Kr1L2Xi9QiV#5)=lJ=(f@rYiKYRvKlFCmv!eGO@TDZ*RfrGd%t?7C zD%JZE?$jhtxCuYWzhulgC8Qy|Vpl)5-*8RcF7l7+)$OjRt}%6mGJ~~`>i)dQC+t^E zFHuy(AwN-xpB9R{j_Mc1^f2qF-jCL;+A$o9-r|8{81rng?3fIYoSRRSwY0kv_{9$9a-XlWK}tC-fFpUL!yP zxQ2r#C<~TobrKM~Ty#6B-|mCg6gVpq{NEL8PU?+(@IA6`xKAO_dy8m)N+08${VuU! zk{#N0N^bx>n(>z&h%S{P3IrUH5XlKX_!pf0wu*^==?xMj@e>=-Ym!atj{l_>RF!z& zpGIUdDd5H*E`4ee$_A$)hH$EAeHxzd$hLl3wJ@uRBpvV>$U{ji^M|LAqHW!{L2MBS zYh#UFh*WI<)z~Kdy4c02CfQ*Z>jm0zt(#56uixBE;4&hf^})>}@hpTFnkBGj@M~oP zQyiC7=Fri26y^{<@j%p39?H3}ezoPdOnOjD+p6$T6>qm@b@sA6@KXJ}th4rIc$Jrpqe4N~rvLuI7gjP5vB-yl5_&o z8EJRy(W$tlT<|*EdtIcnU=&6xR8mVEO=p7*lZ8M=cF<)K3zGCLVua3=LP^fgq;e!h zEv5oO#gP0n=tFx?EMV-C=v>v|ID&O)DJkIUa4H7d&vAAUAL^xDY#4xd2&vO`WGLUn zSz&a173;gRp^ncHP^jX)BsgyvtYPAx@Dauq?lG8>epYd8ccufCsiN=7P{*Xs%Ms*D ztIYZgmWwUim%%QJE|EH%a$#Pbo*Yi!Om#S_&fZZUQt`bZlXbsrh?mS|386huBwt6i zKxkt~bs$*<vLea zVkmmWrj?t`>e_PPmD#Mb(MyIJ6{o`diy4w_;<#9t&8lXs-G|A0A$`PCx(z~OIzsBQ zSyrVb<^teW3WaV!c7$9cLtCecnh?2SGe&9k z43}@CxGWdLS}yL$Wd&KYy~qpfh71A$G8g(1D>Y`k_;m!&aBC>~xFVNT0+0D+E~{Z{ z#k8uRo4v$URateUN4UQ#d(aJ@Q~XqwH6a6g)oQH3XR@8xSM2Cj)mU5Us!)yHs*MwW zRb%VY;9>*W1UpX!Ad|$H?YxDNM4~L>f4b9NLzkDN_Y!%2R-2i_q(P=2xhW;Az0uFA zK}^T!GE$&9iO(kCj8rHS{H&(cITd%2ov+x6>XJzTMj0)00<21o>@Uuoc1kc#P8;9G zjW{v51J9^|nQH{K$Wzl&Lj?^pxhAaE^d;PF&MBfS?@ ziSa-&n+GLh3Hp9j{oTztPupkw`zdDMiQVJtSWZLn`cj&vb*9XO$0_`(r>@ZY0@L|SPr~G z{+Gut#?J4|V^y$kf9A1)v@4I*WDj6h_Sclh?)F;p*nM1!-Q8)Gm*jj56Ixr0;XP?goLtE8g>B&;$hKr>6Rk_nwbe(-ScGVM!dK; zORr*OKRq)=Yh;7sv5Xhzvph?Jqom5nW85>XNX*V>soq{RF$wNsWj?z(4JF8naKdqb zpat91+q}B0 zuFV*R2I-0+$F>okPLEh}2I;Y;ocNgZ7$}QCMRViJOplRhrfj3~z41@@6V&V&ro(}1 zzk(iIA}&=Xu#)@1!pq zv)jDCzCo%V=pm+v%bT!jHJ8B0)PJ8{O8V{;=~7Gi~2u&0dBFgxTn zp*_$tEcJf6d8TzWe%X+wEE|Hw#MCoT((>vzHNWUwUo zbW>N7-$h3PDt!dt=p^%y*^5R4{7q&rA`Lw*VTIa9;+0Fl?=2SLOIYJ5$F44-^B|;x zOWBZUAFATZkq9E=v3|bvpL6{kTd^B#eKaY@-)P0!AiK!XR!k5d^L%R-^34C;tj^l| z*OaX5`-68WSMT5mYY`r_6d9%*1Yni+sP={I27G%)A*)>pI|1e)pMs)5t>sR*u@m1H zvL^)$ zvJokM&gYofIiA-P^H*~t8%thZqXzTS^2ES4tPU92S#4MgZFzWC8y0jSHH@b%yBW0e z_O`5xcQ?5;gCPqgiC?R_v&A=USuJgKSZl|wB2{14_G~nid%N1Rws^7L6>NSDSWQtP z1xpCr(vaA3M65tK1!A@CfN48*1-|gMxUmDf%`e+at5-wdl880MV>X6CCHx&)X_XPz zLEwCPxr^o4W^$(Wcpso z%1`QS5gEmtY7-fpE1SqvD3dd#UXjEU`SYJS#Db#Ncz3+0*O{e69h1&0gP=9(znk#u zU6{&9$fO9M6_mvq23x6B0+m0Tk*Fx&YWlp<+YmrQCJ`5Py0CKmuk5`o&;RQGiD_E? zS8cCi4@7q}Ly=DGX&MpXB!d_fm+is$|HL#iOgFPRSF`^Dtr%U|%bsFzi*fq5Vo_IC z&;IdaS9WJ~9rBcQu%)ybk#)%XyLEt!R^~CzDp5TOfuAA*65L!MqrhD}{#>cFD|(=% zcc(0CkVM_*5qo^awd?}&&j(IBhkw4K_z#8TD-x7~k;+phS3BFo!(ttXBitb}yRqGf z`8d&yRdK*w64wd?CvO2TQTkBFW2MK zUkG*sG$V^e?HgFVTi}ZZfdZ@`dE&&|ydW|6VB7UzysEQOL@8$$cByw=as#Vg_Q)OS z6{KX(Z)8o%?!ysFFZ+1vM&^(9p%Acuqdufd>kl`wrrH`Yx+l9pw7ZGjGnB&+2TrEcJySI!YQw6FV^M;lTjhXkE(>SrGHxoB~?%nH}wR9Y&kyS zQDFY?qbO~{6J2pgDAkk%$>E=hcX|PxL~~D_A^V#oTM?#g9_74bf51n?m)IoP^fm#n zsc8~-_GTYyyG4UrSYrg+-g*m+>QKhq!oJep5M%zsj8vE@WTCc(QltI)f7tQpeyG+a zNAj|?Hto3;`kB39{WjQ{p~4z=J6np&rT=BKQG0#Qe_6f;A3Sy^Yr^-KeolTV$WXY- zZgJh6Y&BX}@588i>-&A!Vq6}%i%~(+#(mi|typ~37gA}FIMSD03y!zL-B8va5O>|p z2E_06<^)9Rdsr0_e-CS>?G=~Y!)g`mg`5>{2rya)Q|ebVVQ{MkKh6yPX)%Y6VVT!-Gz`e|6eV-K*QU0;V5nF9NCc%LLf zXuxq*{EU^Ibq32)*RcLUxQVP5*Y#s>;ldwclQG3b55bswKz#iWRO72f%ERow=oYCY z#nI7~K7(&R%o;@dsMxWq{Rk_;;7T81PhdrAKFU^Na6df?$z`<&J_ahaTJ#)%tq44h zxpWs>ABSG#K=|n6U^>i4ie*{_G)D(t0@~LD*y~sq>7G383AU^10azfVMyA_S{BTB$))7RArAR;-w8ijgu<#IS^4d>&}gR(~P$sMsAZxMv=~k`9i{5Psg_*@SBF8#ulviaf~$o}qO!|5qlNwzrd7%;a!H{BNR(y{ zaq>lW4|emeaqvGVJ~LtQ$K%*#mHzbV6h%pD43I>)aU?-rfOqwHpoF=i{dkb>9pe7+ z{|AReWmFvivb19YlB)=IyVg5ANU#x_{?m(z0nG)gehB3@;zHX*_RH+Tl21QRM34aB zHllU{#rkt&rrTMl-9f}g?;QUBHQ_QVkvMkMKMI`a1zFa`l~69Y#20o?2m-@OX1 zY=`Lm8qV_$@$_r#smiieqm*4yR|nwbwxrh@li9W|#i6&595df_30NiO0k$vu5IJJX zBx~7u3Jljf#Di1dbK6}^nF6_^x7ad;&D3^;OQy2H8UmrT=~%;G#6{ED9Z?QUoxGzp zl-U34>Fi)~@w_5!Krk6(YU2#>Arz3m<9{lLdmezUz$Dr?_%a0u*bz>*BrPZ zAW73)uq4IdCUY5>#A4BQ9;@pe;zLXp4mNjiy)xk>tPpK#A-jiV%3)tlOg zpgg@Piy^@r!T&%6>`X);DWA+=qU1a8QpSjKieL-?7!BqT$%43PpxvLxn<0VVHRqy}^b>cSA)}j^lMw=@x_`4InqUJ&V~LzHyol9(!7!xzK9fu!OCN&R6Z+F=7$Dma?~_eW+{Z zs1Lbj*M-@`2*unGW|e$nVB;obO=DMQ|K5Y@LD9^rkHb%dK*$yOs*JoqNdjvwpu z9S~#QWDTnq2mGW&O+ser00Anf9+J;dew2B^JWO)un@}S47N_2X1-@AHc#BmnLEV=? zG6K@f&)b^+<6S*1NJpz)c`J~w9vbcnKGq!nx+5FYm=4<0hsC#)g zwtb@6{kSufT39VQm(w4!s^DmLVjP>|sT+XtqP@jR+&}+*R2^8>HGapYD8|+bjk;~6FIrj?fT1l1!vbR1S2b~gye19QC_e%u;lca zZ+rlVjt|M()*A%T2njQxIReb2idSGs4*1yF170NuEFY9P;F9BKe&0j~@^+ac{`1Ti z%qhy-u`gIqc;d_#Xol{PyzRfpT$Hn?h?rjsAQuuq{wM*GN;BX*J-U)Lk1`!u6#>XB z0D#4K_&tFv3hU3LJttuG1Tv|dE<=u6mf`Q6uLt$x42PjkNpA zP}b>h`ZK%Bpe1_$16ISg0|iQu!c3yxLmx0dWd%%w=>vkO%uRBL3M`oT`4C*uhO7E; zbyb~w76WIX751w5(^8X);sSZViAkX6$ky?ROFX}d{U>**27IX_yu$D4kO~M%f~O_m zBM-{VVv+ixRH|P5AsbEH&c`3J>w)}hu7;grr0BJp9kJD+_spK1T8cE)M(-6mE|y!IJOfIC896EjLSnZQ90;fg>;wjxkV9h8CP3)KUulF3BO`2H!yFYn1?8xa z-x1k10Y3Oc=BY;GkHsaMnLm5k>3IC0QW~dy^hvbH2xz$VoOl?|edcp=k321=Y-T|N zt48fAsY|wHGwbh}J%=(EoEF!8#%lV$_?8AlNs3O3;h(Wu9cP+PX^GTRUZE8de}2a9 z^URSoRZ7MEpRc zeEJQy{g=eSFIXebH}o4nYHeX1yn|87*N0Tq7a~8EHiq*RPn>n)TH>)_)B(a?HTwGK|(IbNK=;|>X(UFPP2?= z=p`H*ls=_}ed$XKc)a|L*_4U{U$T79J6o~!_>ub+TwJDWfi!>%{Fz{0z}ZlizCz=( zX+?5O&|tEH+|{{O^~aS>1i@|qyMOi-s~II;D(|RvQf?o_H`)V&2Xpk`D{9%l)5MpU z)P_u$c3+j$zEqm(Xjsl@YNV?Y`f9mTRB5U|OC6TV*hKm|XIBbS19rylsyQHALzVY{~dDHZP+je_m8UI2v@($$xDC`Z>kc4L(I=ky z?hH+S%{H5*o0Sa+Dih`i;3X3_;(J!LXQU61)UtG-<=5YHs07_nJtl_i3?-=CLC`;2 zqib8g&Pxdzi6OI6ZptEIkY+(nrLj1fOih>{{2^!jz%DAD09~AV$d&Jx=h+%-x|co~ zRd=y2F|q2|GVqB!9+Bi1G`&R}1+T&U3YxxsmzqsPr7MnH(^Rq&B~R-4cOaC&C@qoY zz}>7`+5Cm$10}xM&Fb6~fgN;fZ(zj^rLMn9OBPS*^|#6N`X7njKeF*T6MRL3BL9^H z(!u*u;vg8zpY{m;6GEjC^)%)uCUej)wtio@pkm+RGZ${s6Y~1mf(5 zlZMMJb4pO;9_80wHiDjkd4vLC>0U@_Q^c=(VJ_?~YV2dJw5j5jeK0#u6C?J)z&K63 zxsTO~qI2~WJJ`+`KOC$cftrr5e}p+smjUAK;M<4j{F55xf&{Ay$UF(#9LP~zQJl%u z#^sBf_OliVk{F4J`&mxoee=xpoFpC~eO+U?x`1gU{xKmGp;;~vth~?$YH6~N`}VU& zlui^Mq)#@N=)8H^pz0XPEW#oOqR*hck#Rt%T?@{19`a_v94uW&^#A$rLrgfpw&$)| zY1N>oBK1Bf1y|q(whu5<6n^m_b4MM4U>uK{eG)>uO!u7f%>CIhR-YUcXGoYE%stcU zBdvVdsSa#C^z_jq;bJ$cd?htF|TD>y7;}F}fRp}l`#<7wvhsiLaQfj&c znR8Zr@f!*ewDWpGa> z^Ca2%@rT(1QT(JjYdKN9LPr4G@a0EH(@`uQ`-8QzH5qAsZ~Ztb*}diu(qx2>{y|=R zy~7=jQT*8?G3hv)UbZht;`swdVi~|8CjA*>5~K>d63EF3iX3nW6qE`7pMZk6=mdP4 zUln^#uy-$i)t3UYkQk6fA5=$H2W$krM*1p9Ue)y2A#m_=<{xoE2sp93IX;Z@o zyu6Wyl*!docoQr63Q{%2Bl$|N6kc$lOuj-SDv}}^D+e-yO+nxg{wGE0Xy1!3Q+OMhiYGy4)fqnsNp*Ur%A`6Er1HY(BM%;3ERLk|Os$vjrSXOK zsfh`hvGYg7hRnF^$jHnX+F!|^=|}d6%ra?zWz)k4=170$6aGp>|2@$v?(pzABd3Jv z;iD)p?Y%_;XnSuHBlMqco|#jE?g6SJ^xsU&PdCXA+6<*J>3@8xcq^S>U+p(vFbTYr z%v6jlyEp*kMF(RxI7t0>(Mac~2ve0Cs^th%k%~3^AmfWP3Jo)O2l&fBXz)hfx3$nR z&5vjoCZ-v@hPF|xF?jv(X@ghNvM@AC06@Ce=%7+CsQQ__aVq#)C_{+Pb?MW^J(>I= z&(hhHMyOQm&E)mFfCGik8MQcz1647tBh(?~{Qp+s*CCbDib}kJgeoPY)PjCqlOnUR&=Y(yV_zQQdxISlVTynkN8juX;)LT_=QMmU6{o`)=Gu13eUr(VHF<0 z)`Yc4&D^b-oz#Ol3dN!XYus z&+m;6K@Gofz(7DbP0T~L06P9cycWPIJtCF__ftWw2@$_;d?~+$e^+lZEFFb*ND4n@!Ih1*-(pD60>UY zn&#ilbCJIc(j)|3YA=N_$)f{&^f{tNZQc;r@|xPbz0BM;xi;^VB9SDiGF%97K3*HZ zGDB3$=XC%>X4Axxe0Ono!N@73*U_KdtIr#Ry%PH}6yqJ8EQLXOAc~Wemf-N|5AtcfQc#pxacwZWB z$SPtot%Yy9_^g13N#cIC4)2YmWe4i;mL*f+Lqi_B&}X`&TZ8m4!r#(UBtC@aB-m-> zh2kcw_%!(fmd7odZzQJz{B1SIQ>(elY(71Tibq z9GPV3^Z$$O@6*`NyL-@5+Dldht8P1jy!!z@JHKJ@L~|$^!Yx7nByEur)*IGNX{rB?LPA(mlTENmR05h1HL@Y;B z*G6QVBeby-N)Ifft1v{BCZx)zRP?xj*Xa#o9`uu=p;UZ<#5cgHssVF^d`S~0ML!KH zC=fhy4lGI;Sd=m#$l>9)>jHlD1!lfZ3=4y)2j0~~e`LYY5!OPC6pmKr_(-(_%5!T2 zFs=*5)CPPATZ$kM%3SBefd(Z-mXsz9d3*kb)C-N)pwRJQ)E;20(GB@SnY2~}EFdqT zgLQ)jd&pD(d+i3E{%AV4Ejm?YQ976HF)WXM!bdZ2PABRegK-NQt^Hxo_84t zb9~vWYAtl$t93)02GjM`eON5T3+N$eTn$tB2ew6 zqEcgiH7<8H<_)rz;w1J7AfaEtAgoRdE9wL5OT!Br^JbbB7JHg-C53c_7!V6Yq*cFX7d|cwBG^_^U5x0lqM_;g^_0 zgGWH*B&uwXBa$xJpkL5=1IqN7NVzKgP{x3x#?eN2d18TkxKzE#w1niuV=ri449$U;*P$6cJfd>8nD7_)Va&M?(Bo#K2!)#Oro^ zTYdv>5~v)b*ySrGDsL*{EnH8|6{(l;$`RW3aO;f{H9UwV zvWX^@4d=JvX_}Y3J7lqlmqcMP&q-YdVvD^o)$8JpVqULg5W1#h(KgE?Jvk#^fU?gX zi)NDL!SV$xq{$(Dp%Uf95T05?cbUzH#5Ols9+$}>C5DES*zMhB`=PPzV;Hc+5T4o# z=^_pY`;6h+qcJ%kyZa~e$ClKFi2T%ot+neD9S(QQsPpVKy5pOf2c&qHoA4iiWRrJF^5 zIg@VP-Ih%^_PjIF=TfpE*f~auz3q8}%io5?n50TO6+;O< zuYk^Fr09PI&xRmB{tCz*3&qMScukL_@>rS!SMVA{;ayQItP(rN7EaN%1JB322Xw#} z=Zlv*@F0FI>j1nzUwqSn=cd`oUfm!ZQ$>77UJnI*8g=CDZHgunEqlyF%WV_Wd8J+f zNt_{n=g?n~6T7z~zqhMRHB{xKBR57>Wle%5QejdC1%17k+lkk`;sn;-1=%zR#v(+6 zJwY-Y1V8gn*wqedASl!XcS+MlZ{YR;U`E#R*1C~n>zD6lM~Y@dAHG+06Qjocae)S^;#S(5^Pf* z--wqy5?^5MQ$|^O2aZC89D7G$Z9X~c^BR?x-$Q4CuPP4Yh}W> zTm{{Tc2c}`HSdZ`YF9oA)}o1Bp%U`Ug=eG(uz%tjbHT_OX2}972jYmkl^jU#Yq{du zqZomlxg;pXbtG0VaF2FLdpQB04h|Jj+~3Bq$_SMvU@4bbw;6zgx`7XVqEx`DTnp{A5-AEBnj zH}dh|UANuHmGDaSLyoFw$q(Iq6Qr5$V&+XawQFC+L@*2Q&1cO*^~iN3kjio?_uUMQ z{Y)|SX5iuZV%^Qayfek#n|Xcw%Ie7*HbUjc6r9txQhSVSQ8M3lJ~VJBcP;<+<1aVy z^p)`k$(@h&ZBI@`Ab;-(CEq8ab}xPdmTYJ*{sE@j zwl~DDuz0*TuV>){Xsdw_Uhgf7hHAG!cN`X3xA2bIr{cC-V8AF6V{YO39qm)85$^V zZ-*dRB>uXc3#`HT|MEMvjpOg&`?XEtz#UkSO=16?yon37aJ${b@6{kJt?tYJKq}Sn z@_TruE2@}PakwLtBn58$epP<0P#^X*L3T0Cr0nQ9Q+2Q9E96zHu2jCheLu+IDRJz6 zsq?Jz0MB7llLE;RLP7*~nkariszQc7z^{fXBveAOlP^Ffg(QIFj}P!Gq>7%(4-D$Z z+li6~xd)*4^n<*i#Ym9S1jr{**1!;_AC$<4_ruvcB|7!v(XzF8pUQ4*?8mdB>OvY;sXv+ITg}Fg$!_@ z$Sy|r;j=_)3QCdfn=DQ|#DA>9e1a1PD90oJ}l!$+XPuA%%sU}burcW>d zB{~*8B9HdANBFQx^OB%^gnbH3BLF-_*5(EZe)LgZ+d5=a_2zXU3vv!v0mt=T;?GAR zmG>6KkMRq=#5735T&WoR7_UM8KS|O3RSB^p7DZvHz$*cAvVutT`=Um^DbQ8h=S_{p zQ30o_UlyW@agH(l3uK5>;p03D*sRCnJg1t;iNFv{dU&LUS2&RbtiTJ8^G24zl7c*8 zu-x!Ck5o?~W^J-?_lIp{skpR1FSM%s4e8HYNvMKRQf!#Oi$on)dTMbmlzmlwV#*u+ zIR_uUVF0h}@{l-^41E9CKoj4)ql=;#hoNax!oK2Z3CdU#=>ocAAkXRkw+nmDp+!(6 zcrmg#Li#NPh*C9}t4bsre|HJbwRj4^ufRUR+_Ta!Em*59n=LL0HZ z#1?eipro&hQzg9f)n>|g`8|9}W{!_8gu1?tY)}$7ULC|Q>ls;y&~Rw|BKCKrk+K}a zo=%9^`G?Dd{Vv-)Tsy`*obRtqu3@#$G!Kiy!C>*CITaHWBfku#^#l?rCj&VFDdhVf z+k;J8zqAKyK9r!P?~0v+c`KiJfGHxXR1^#`I7Jj z{HHiDl4r#iQR$-fL!d9)D)tTGjjba_QaFxS-J!hT;z&Uj)cc@gmJ~oPdztVsDU#F6 zbQS>Cg7yV)){(Fzr86Bll=qOw&#u=}@T4^Rw|G3CdK8dU4%+wLL zWY1JQ@)StJOqyVoX7wy?I)YgI^$4+qN&>!+x1Z#ety(2CIq*oeF-r}E;+v;{O-ZpR z8Qug_cL($1(7n`R)-sNQPAqK@dtp=n4MXCPJ6XJ5$tn7CMXh;>u?wGx z`OoquplG|E<(FDS-;y}eXag=5cRVNIXW(;uCMaI*k+5r!XxvgP|0NOsBCqe= z{W7h96fIl6$n#LFD4-B&RZ>V%iF8UiM4B`MQ38v<7HYH+tH_I+_&TDqB&`F_#*5J{ zScV%%SbX;)uas`8%212igLWXLiQ{-f@7%pKJQ2A%RAMjqj6EsmIgCOFf={JkO3Y%7h4~igx39P{kw!cPq#9fOo=oG+yXqOU3^2XWTtD}a9p&b zqQ=X-mW4cEpC^eyH>>99q(e!GRLx8A>rhlpe;LyCXJX6C{L%VL5j@Zb5bJB|dK1j9 z4EjB0`aa2R2G8h*OSO4l^nZm@9p>e)@TO6rPW85Ngzu%dO`{1sBie@wk&c#7>Z*oL z;KlZ70jrDs3Rj=VKcXTYdnWPSjmw)|F?l8sYrjy6H&B@>lhj_rB)f~tUgN{DN}rg& z(kAnJZKpi|yzK%BBBXG+X@7r!q~_rxoF7#s?x@2U8>(D@lqsNgX0b$x6%ZaPoe;-Q zA(|bYHHFVcp5X8`(?GN_rDfCkSX?^KfEQEu@RKvhyJ~fK@&BM#!R_x$d0T!wieaHA zCj2T|&g36z9|~<2uj8EzgQpd(+hi86OLRvOwbWTS(q79+Oq(TfX{$Ms80t@7t-M@g>^8P62AQAV!1{p~U z?K!w>0|+i(DBa-hU&yP}?N7ek(v>wXm_*T7h-d*met?`?;WbH;C2o1Z7|aw)7IMF( z0gzMcg(b*u=I(+PvW**UeqYFI1Wl$=wn4e7cz>N{?nfi%z*>OjuiFADAPkEz`VHQ> zq!$5&Tumx_0O%O>Z$O8|2*?iaD<6${LbVmd=s5>s6gR#BX3#`q(b0qU?tFva>-}po zfuUq&dMq*}CPhoGGINfIkCd2JEsEGaQMvtAFsP~vPokf=1=nIIHn)lkn5Dxf_M|2tRkq=At@nrvEql_30S0< zqZT8;#2&Q~OO>Oxa4D_C_%Qg1sp7&gZxyBJ6_Y{chxy|mO$Bcv=pjmORh_vbepS(# zL#Pi;j;F}GV4_NK)$x_hah#bbTM9{kyal~ucM*DwAZ1M^{hn%8_VG!?6!J`5T^dhUEyDJT_EWPI2iwJU{6pA8--Z zkBT4P0rwVBC0@APq%evyq(X{*L2R{{yBw}EFxfAcEX9}0`2{)B_J|z#&<|SLKTuFh z`{#dGYX8W54i9M6qDY*%xbj`w7AQqhEn*9#0?I(LP#lp+Oobz(`aeZ;7I38hQx{P$q9-iBg+Zuvz5F@)DW*qXO1RVzKcT1`@C+;vCk*yZLl-h zAq|T+V_f7Hic*s^x%CWgbfIIb@her!4ndjf?ibp%QtW=87y4*3T$b{t;Rih9I&4Te zW_w5Widf-1p|}N{H?SD`LNW0JUe~*QF?@@NjeALK`he$qH&az#nOI1;SK;@rCG;E0 zl9xo2RXpe&D~n))-o7Myui`nif2ZG+4gzjMH=-p}XfXR2I4Skx4r%eI&<*R5zFbUO z#f$!}RhN<1lB8idM+M4rSCDLxJ^S5rRhVp%{ql?FdTv#qTsFGg zMzR9s>DBy2#HzixhF|R^yc$XE1_&7rZYA|)oMT_V~A($qjVl`E>Rv&cBv9<{2hNIbnxDw?LPN$CpAsg@~6FefcjZP!CTJ5%&uPcSz=RnPDt zRA3NAlaa9Y!FuVN@#}it)Jsm$Nv8I-(T1~tr($1!X#=l?ufMl}+*;`CDFiLqq+%we zV%kRDz!D&+=&-b=7l{!YB}BipkvB)Nq)i+7m$=N@#P0%&l)0JDz-8HHoTQJ$!OdVh zdy6|i<4sdZ*Ox>by$2QSM5_&OK>iojFUr6t<-^UNw5PWsNdfpr1?=JbCeLRO2LdHU z=v?S%Ac{Wc+0rf}HG3Y@7hv+|QpdCCbFh4vSMC<5HP?!kTliC8pjU3;w~04Y+4K^pvx$sqk>?(3&-U_qEE(ziGLI))NhpVo6RLEy{~Gz6Z1bk@4Gi}SsIJHu~NS2d?MQG!<@KT;B_Tk(3mA*s%s zuczrUQ_M7ft=++E)t&x3YC{kPiZiK&Pr9pxz-ASdgfg*KrKHYD4v`;C_D+cN{YBwU zxo9*-OM*$3n~p`pAL5>!_M*{^*Ttlra?#++V|Me$PTtzP@wG$<%hGJt`a2TxlE0>gb(6@QXd;K0wDf2>xAX z^{Q%|%2phZmy3e)q{eC3F1gKf3Rq6lvd#daw_I-M{ao-=u-P^IAc7!4OP-$$H@W4f z@8(%4Fn`C%=R|%l+Rba!P`ahFpDfQl38vH(9g)uQvE4l1Qme}|*vo9##Uw*EJ$-*S zuWPS%?(pp4=^Ds*<)8U( z(7sbYLurosvU~acAdE}*@*cS8`=GS@*aveDq(w3U;R33L0q6HY?D09OsX6vnw5bTX z&JAj+(#a&iB{B;_;JiDGp2dGc-GXtV^?n@6BJsd}KF^2fL3f{E3OMMc;W`KSdg2<6 zALN(e`K7<`5mAL+nxZIhq(({u(i91YkZ|EMan&K7)9DkqJ_6w&!vh7vM`u$p%<|SD zX~o=kh|j-L>DiIe1p8c$K3eKbe)^T)8J)Pg*pBv0_A%-=esNSBR<$gSgnH7l*nkA^ zoLi&~D{>8hgHiVHybZv*=kNU5sPC`ZzoX5G?ca1O)(*q)`I)%vFk<_{V#;COU0WPJ zewa@rm>B;D_~x*19i_YC`lHB|@OgOJQGShvoC(K{Aw5D^TzOnR{NHilx}{>xaXu2y zuKklw#avyqU)p8uPWKOMWr%W0yFh8FgB$`XLdt80iS~{@JG6E7U?VJs$>z^cr9KFy3_d zTp(FsXw{s=01thPe~|?a*@%o+C@}M|%Xo&a1Kq|Il(b;2+h{}Aw0NUUx1pLZfJEY? zuB=S|WP{NFVHYxQ10^Pj3sG&-NHzpH1S-{%5=_zO;MWU2y|~)%EV-Ud%X3Y16JV3_oD+ zF~ewuUvC+=5D=OAB>haskC8Qrz7#mOvVfVM0ASQR5#YYsK13El2c zt_j^3BlP9D!6XyjATjAO;?aW42*kaeZS>0o#6g)y?el}_p{%~B9|S~pS&s3lUp|5l z6P;e%X9 z)s1Oa+FPLN-_unWjr4LbzoLJKna@%sSN2=5L5b-kY)}RX2^*xuweppSd;Lbu`SBUTcC z6+{GCO6cf2hybAf_032Xfh|Ca7^LSwN!#6VZGkpjIpiKBn~LR1Q%Hs~Op)-4d^${d z3Miw#MJM&1Y-eTo#JnlPCk7+GgD*f~3%EFagiNF6st{Bo)63`f9nm7sD9DkCVCbtz zY8D4oZ^+CQgC*Z92Id)g#gRoObZ8wCGaZcE3`cmUn#(A04XgpfN!(pQcU~Mu5l5Q% z$Vz1Ze8o?BMtj1wjcOX1RD!@-Bpf#M8y}h_dek&-*4l_SYZ~R02UH#Y%Vj2{sf5=u zn&LRMuVt(+`Q&M60!UsNPP0c|j|?JY@?>-gl5}TM6hD|4MO;-G5J%r72E<|>QXt|b zngO}V0WrR|(KMwvsLdNtRAoT0G7jNawT-tyG{@!}r?v0I*aD*kF6#@7mcZWLI>sZO z=Mh{%%8TK3jB2DvR3KSpIvh!aay@>o1DrlnceK^@|6X*fXWX3ytb)bu=-1#N31|PT zP<%g38q?ic&uECvNU3jp3sSzXJ_yRvaOMSu2V`DUZD2ecC48zf$`Rp{%BW2ZjE>rF zQLUle^lKX$wXvR0G&E|af9<0Y!L>K^3H*F!iq{(&LEqQDY;uf5Zaq!h)1GHZp^GA^ zPc;M;>m{ygWHhnwjcjC)u(Z9A@t(Y=Siye3&}a+v(DEXql_X_lrB{lgD>_N_%RNat zF&wA`!!#)DB8YI`MaF~CwW$z&6B8R74XRFtFiNKkr&r(OgDM}fJ%q2!aF#udjSFJ; zIoQM~NQ+I;Cwepi{r*1uNE5^D)_xZKn;Vq0Y*KUMCR|Q5H-5op?z8U%#a@13WJ~?9Y_4AJUVMH zlSc=7zpUy-$g?ETRYcT|Mi0r@{6HJ)1YO%ko}g#j7%k=GtT_E5kzQ;tfK#B@xGB1` z6=Rg&DK<99oOvFA4mc9%u1Uuu!i-U-QMVd1ZnYC z7;V!Jn2;bN$6WdWas3rWV?2BQ3gdcPeI0sEQ^H~Fte4Mfk#LyjaOTytm!24N4Lpm$ zV+K8EnrmdHJ;=y&4dZUr%J?O4 z8&5+yfeLsFQIU3JQ0- z(s;P*FK}%kikSkQjt&W#Vx#PB#ZY7Q&PJcIC*VjTmdd%#U5rX%duO9@w4(}9M}dxN zG^ezD_A>Y$2*tHE^U27YDL6)0Dr_|hI!kuNZYpMXF>a2IKs_^#=%Cb$UVfEvZAowV za%vE4-Bgqd+iTrYl1ua-8Hx3DFeQw?%dEiXEXjz@8`{7pqiNJiPo4Cws2B4)1D=Z{Hivn_yP| z`8J6EUSqUFR?3Cf7{PxECi=BTPP7ko>C0NEv(`y6C3jw{vau>SI09D*4If-t{SR2VClJH;o%q>V0N=a3W@e26}IFbg55m089 zLI}zhdez>}nq$xM!fzv3BifHTNk_b|oTRsp(HC^&kv_&XHqnNd6IF#cf>=d(A+n1o zau<9VP?eU9RXWlEmwVim^@CU3IZJijahK6Dda5ckM)BQU#^upIR3e}Zr2KJ6B5+$@ z$eF#xs=g3QmWm^NA;K&bfxC@QaK;YaZPdfBoO_JsxLk9O(I1zM_h5|??|rXP99?4- zD>(YLf{+!muBuENbOVd4OxEGK&zOQt5VP(xE<+}W1NVU$hX+FX1ICRmjI?h*<1l8} z`ynHUUr#;+t=v*E>mlP;?N>43VYFQ;mOpG<4x|wOh>=8MSn8w3K3tAJYSfD^FW4ay z?Bn8`of9973~rfFvTu5mKy= z9AK1apNrHdjHj_|jmb8t+Q3^J~Ub!PJ*V|Lnc=yJ&! z%6c?nurVPzQ5CGuS8pKQJ>s0Xpn_deXlqQAk~D=Z9%3|2KV|9wrH&d|mc;QPM#K-n zOsPaUsv(X%Hq>aRrmR^v)Oh=r{gP!xWE+GF__(J8HGLh(43GkNCseD7QLw4|>i~?Q zP9RYE=}Dus(=VH>Zq=L z+Ne#}4I_*kkvbd{xLE8TZq$_vN>#m(11Ru}@j}wcHxSNC)q$2hWBg2S{BMN)X0sc+ zOGYS44pff8(Tb}663Agm#Wdj06hQp-3*lRyg*a2P;$0H>hs&Ii^MgrMBEar?fnrV-SA4VGW+pn4-74BL<@p4vC z|5;SGETSt>e~(c{jVOLo&#GfGDc&As)Qnb&(G~I7c4jQEl)%}-F?<=%5{^a7=M6Pi zgzC#k%(5*8D_ixC#o*YY5PFDeLVWqW(Wy-_v_uAJh2MFf^r(hjgdsp*3%Nf&6h}EL z#M+n#&_i1fwl23Gh&x6bRqGs{LqC0X2lS&4l=i;6^uZ}mPlfhG8i)m>jV#yT6tQ-+ zQU71Ut&k`cHL9|7e@EJ6?QGIe17VenF|LCx?W-}y6xWJ(ME@6z4z8UG#49fv_33)_ z1z7XCi#}tG)@U_*tl6s5i!rUjYw=qNv{BL1d6UNIxmAJL0pUS03YF;##rX!iU0R8I zAi2ZXy@qlX@Q#ZlL&=FKe{y4WKM66qAE0f2+}vP7nYtg3xUgGVrjiha9A_m@j7-#V zDv&GlvVpv!-nu4`)7u1Yxe~}{3Zo;{kp|R~iqsW~YX|rSc?F91zGT#kg5Uo?8wHL} z67*#+88-r`vR*dE5a?BV)u=5tzii|Y+#P$_gumLa7^Q%}4X+r(-J=I5i|Z#C4KE%$ zIGIAzU{%GfJ`FSkNun?~GpJ@wD(v zG#X{DcqX||y*QY)+7WU`PN{w&JnHoSmG|ZGQ54(1-Lp?7D>EHJSOizx+4WvGhAa?; zBoa2)Fv)b1A(NS5W&+{f-@OwA6=X38+L1LN$RbNX1Vogmps1j60TEH-jth%BZt%XR zs=H?b`g{J~yYH_ze2VTq=hUfFr>ah!I#u0Sh=JNNeQV`Hgl8e%j77S5Y-Cg~W|D24 zzu0+!7`K|HKk8OSty@t8;T1b~{XP~aG`8zj_y9h2E905nO6j_(-QU-0-=Prjp-=1l zQD>q6ruJua!~z&PI{M9`n(e-vgwJ_`5DtfS^qU6`2}s+N+(;`Mo1B-%tNH(6^eDX- z{b@BZk@IRMST}vl(4QyLswrsIB;c7R+zAFnwXY@tshVAQc=Xk!&dZE>Jp^U)RpyS0 zYngMRq3s!E)-vZUbUm^RQ~2nuBOh_zWj0JtR^D0Vyf(dUr;YkgH4QRbI-onBbV`K1 zcC~XXT^Fx*?x5@KYn*>ix(|Oj7w=sXUDFz8uX7S}JKTnGKrr`Iy;qK}abAYZTf08y z^oW06){3>xWfvv#vNA>(@OVAAx`!3}3Rc<>C$JJ&=e(;OD?35m+ql>r*E?@I8yjBl zyp$@jWW94iJ8Ziudp0=d{W-Qvvvc;JV_$D}KKXkw9#MP!;T8F zT1?yIe54(hc6A&6xO3K@V=bHiJL#X@e1_JTE=!)^dZ~ZHS$8&P+ZK-Pzr{KAFE>xy z7U#;pOuT-pbIRG}YHc}Yn{)DCW%baL&JFE2wQJb}Pdb91OIWRx4h^q zDAfX>?x~4eghtItoT6_LPGys6d_KoF7e`~oiTSuc_Mpl2Fs?n5wITIsS?O z`Xs&uHO{@sfN(7iT5RpK4@_;lckosI)*-Jt&o$ud?bWSNq}Ez+VB$f&|M7C8yO0?9 zPVlC%wo3T$L}F-)2lv%Q6!T=$UUznk_n!L1-lH!uP79hdSbs+E`G4#U{*V6lI93bo z-6YCQZW1bm<&4t#4d+!c`uof3=`1uJ4m}{8ju6+7|C4}b!bZuN0n$HvcPb{}Er-O$ zF(kwddE@Z@c_zcU|BQe|0-b5mSCmjey#M`gIt`aAVVR0m>MzQYH=W~RnhyVT-|#PO z6D5Y^sZHws{F@T(`NjT3hi5Vz^H&-EC4Thhy%BjexCO>J|K_?Up^B`f#64fqqvr3anGh>8E#K}0)7D?1K4$6*KI zqIaB!@MJjTd=h7)b{ukE>G*x0MLUA1{CLPY4R0aE-gVA|aLI?A-8$sCPvd7C-(8@i z$(XhBlxq(=`;C!M8lA6cz#sm0zX&TZ6BWlFnlcO|vj;7l#wr!l2%T-LWHAH!qi6Wz z0I-@Oe<90pnSj5?LW?%~Y`{yR`(-h`a&E@#%-~puW1q=jP~#o#V;;!~i&Omrunx^0 zC6h5X=!?^{Lwfl9>)9c_Ione@CPX_DKmSU9n488YB4PT-&?hqba;vs#`=9(BP`)^2 z-+hHSN@jCslKO|hp`f`p@4Q9)m*UQ~xs;J*whLo8(46F^zi1ETA=t_eYC&5pl!q>d z8HIHnD3<=h`U|3jxK#mq!ssHT+$vC^lTgi8H4b3`n`u+ghq+U_Vmb%k2YU7?n(at z*nF>w?$_uQ!2g@^7i)jY=Pxzj=SG83H=Z}qe2 z|Jv$;1r}{MfQXYbG0VTYTN6(o5<^(Ict9Fo%4d5_0G@54|4-K%+(aXHCUY5G@$&E~ zP`ufq^g1ebi=AtN=@nr4C?v^ZpU@lGVy5mM^yeyZcCih|1zF6J^y@;c1UHUQy2zTd z#RSf_vjgw=bCT?Yv60#KWST}{>eCSRPET?;7Cd1-gpJk1r;QHlC#MCWA=6;TpLN8e zF_gJ=)?sI3U&H#vTQ5p?{WHlN3DyR@TbE?JE*)$sDH>Uro40k3$7MOka6_-HuhhG? zcQp(2Q)Vu9Jt;o4HGhdKB8m;l_9jK8Mt4!qZeAELA~mCU8Cuf!8u4a;0h4dT45 z%a^+@6~$+j))lV#ILKZ7sH@cXxLKf%ZE z_v4=OwIO|o^byj>NS`2mD!3aPtq$8e`^`UhUt0dQ;BLj^sFIt9`l538ieR|L6Ybs? z`3**;+e%k%todQ9W0PgggQ75Oktk%&76mWT)Lc=B3LMP<20oNJVyn&)naIYxX!MiWgY}|Xn zFD(XwuLq05A!K?FsrDbDa6y46EXqN~v7)dR*G))AfxBanDC`C!AFf6)nFb~~NC!Ql zPyzui2kZyv?l#bmg|1dYnEkl!LYjm8Ux6+-L=@)X-jAz-YwU9XD~E|f1BmA%?SfQQ zDBxw(bm0_Hc-1Qk+sZ{@I0XG1j7m|t=`bq3v|*NMV12>GQf#)OZ<$Pg5T!$96nz-~j{ ztI))`=yd^9vH}7$mLqfPcv1NDzn~TX_o8-%q#iWGn;E z_luBzhZa|&$X>Kh+C}|YtzE2J zAAQVaH(+_vyw3G^@jKQ-DAq47II7WW?Hy7)8H<#VJXtWJXP1+HHr zeTDQj(ov*iNXG?t(;BP8@^7?~m>v_{&3MXu7Ca3u0rla(6;QA7L0BOmFZ7{NO+X6u z92tW`%;{His*gf=h(^!r zWJ334rK@5GYeXT{h5EOwg=_}MmNx!Ula_lIxTSk^bqIADw}G7EV)Rdx?yg^l%$F5& z)>`hFs2CNcDYFgCGSWL+H0Fz-`VOd9%Q|b!k$Gi-DwtaDjZnQ4Q(qggzN=gmTpmfU z)qb#&JQwo$4E)A&yhUq^Z_ytz$3x-kq5YpRdOOZR3)90o6q?n5Lh+D!Ek+Jg1|l*{ zY76>XHn43(dNnH78Tn4&!R$xlc0olqAe$pc6uPF{wZepDz;)|^(txyFtLAE^hZ(?} zgI>^rhYK%8w(bepCSnk=(($cDrV|&mPg0)%b^hvqYFIAY2REtD-5IU0?nd=l?KUq` zM}W39ss2X8l(gFni90FRZ*p~vwc*|}3mP~Nh!ga%6%Bem_1TTk@+@fa0*_5^pl%TO z!X9b*v!COwS`qVLl`e9j2xPWwgTe1 zOqmgBA@HwYa+;6s5Uav$wH?efqyl8hotQiZi$XJ)Xc_CKh{CtP?LhMotqmQKn5_VO zI|{fQBj{W(TmWd!rh$fpyhF89%0GI=iOxgMdmI{j3k>_f zfX#p^o6#0zL#Cp0-a=i=raxq;T zz#LGhT>7c2D0Y3aK^ThWxfN+7QURWCNqBDQ(f)Y^@VBe9l*gk!k5cngtNe%;;m51b zbWdqQ!ZT?10Z+6x?D5ML(O_*<4*M#rlrKJWWr$0aUq5qYU(vGA=76n+ z;~7Ttu*-ZWI5 zI{ugHbG`b!2Xyp%4p;XeAwrOwMkdYi^@4jFXv{vQqH;U~bB+<|Kd>3hijF&JM6m;{>l z(ELBj@N!Y81NP@0Tg*e5TplaNG%IZ5ex z%$2279dq>?q=2ds>0zY#NDGh_B0-D7Vx%QVO-S@xit93@N062yt$1DbO1 z9teJyJ%Lrh9mrUY0{Y|n8IYf%@&DZb1c+KuKsIm>QWfz-*}_JoO-PR;ZAMK`JY#co z03!i{3dkcsXyHj98g|+o>y)vbrC!RoA6@RDb>;8?!Q_G)_)t7>BR7d};hF^a-_cdb z_ep{KOTDxiQw+h=;4>s)*thWhb^_PubhbTiF20Y(j7g}0LX7a-yTYm(F{~;9H=(1> z#o*fxkyfCXr*I{|W(Te$&eOQk?-^Vv?L=x(UjE5-F8;*Cb2f+9C@5e3T)N{clL3={liSxC&{2&`0Pm zD0Yj~b8FXMU2{_m4}7X@vPl;hp8Is`J2vUA4u%u=DR*?1##nww##5qlLthEwv}vZ@ z;rtYR`Z=T&)Or&J#1SO-E?|B!4y=VUiS%<6F^e2g=!I#n2O5Tc-$5DcF?QZX>WLne zhT7!eeh1(&Tsy=5i6GqvGuB1D&&GXM^?oNUkh|gGG>8^rXwL^z1Md4*VYmZs#Qp4C zQFvH|_bC&F?vxqNYeC;bWpwO%_&m6`0`Ud%o`-uA?w|0$eN<_l97wqgn1g6VXvG|E z7be8+7KL$;dI<)0Er!c-jQC!#3aWhG#SmP-n+6+$`{Terjpt&}90JWw zq|MOEe594Y^_-4EaeW)K&3D62;`#6BRxF2DK-)RnW63Pz@!Knu7n`J z0%k&b9E9ru%LD8^JkP^@C*1D_?Km{S?MNq3=u|MDjO#flU^K3s@jT@oj1~0fe?!Qg z$eV_-PxZeF+PE6&Z%BVP2yWNTx&dh*k{f9d)`V>h%IU7sO@`(<%Fu37 zW2Z+@=wTF8Oah>w3sGPu?$;{6cazRj?mO!0obKK=*Y4;;#nDfl5*+TPd3J{gFJtXI zC3cR4Pv7I&cIx!$7&h~;!khY_-ElFQ3zW=#X}ZC0+%V3nn(mQ&NL6s_L7x%CeE_Kj ziGF@a47k{eVT~!VfTxirvxalN&HE-p(g{!fVR|;I|RJH7p9JSDLon$k zwea@%lZ2m&{B2tC5S^;fbC^Mh{ft`72SHC5wMH;t%2f$S1mO2*czV|APIPr(0Q?EU zpNsq_HRU5e;pqo_;{p{=&su(JoIS$~F(POof{Vdm+nsR%wAKUuh=wNyr;&P~0QwCq zGzh<-^%p|Hy(IIt;+K^Cy#y^p6GKqHrxy4h|{)-{KJ%Av}P~LtF z-3X|78m&**uh4Vbz?7J~Df6?0g$S*LJ&O72Ao7xMB4LjJY9RDULZ_owHT6H2faiq}@COWuslFY=&+lG$sW&^FU{#kgxb2k&(40H=_vagE`7ll`eA77Mo6a%vj0H-CDX63AYV*hE#y|;3lp0A7}%WGjCx+rvZIpc?|e{ek`ihzRB>@Rsf$4d?Rks z&IzG5$j(Y8!J7%40dxzYKSlh!cz6Q(AfY<|eT2|o+zj0(qU#?8+6i<6Zqi~O1HT7& zG6$^iRfKl|zm4!AbPryzif$#e1aup2vMo^Bk%R^#(uNX)kO_imE0I4FgCh$7oqZFa z20}OECOb0*JpD+1DxQ9ADuaW>Af*PQ2Yp0ma6)5Hze+_@9@fD~IgNmx(-DtZYU+gR z+ptn~sH9HSqEW@DgHj^0KI1T$P`FNZ1Z0Xx+&Zg?$X21fx}(ypT#?(nRU-^S7vQ?8 zsT;2DTue#Y*c3P&NAX@ra!{-d5tzms5i4w!UD>Vb4F(ioTu8wN8|7FBlI8qEHG zL`58kDg`QS-HojHjYfw7eJ2Xo3`8vnZ;pZBEf9o88i?Qs5l|$j3f7QRZdUOsgNDc8 zJrJIL^uN|-Ew{pr+6HVIg^s#|8>2vOgv`;<1Z5EXM|sZUk3#Hx>M3ifD?s@t6HJLl zK?Kc2P>G&!LTf~@xIkq=1P6)W{8CsCl&r~hVFE$@I*9hr6ga-nt482%T!-;zxCjhZ z0iSI~HyM*40@3vxZ4ii{l?W(OI2N5zW1tqm2u>1#X9e5@bPbJwt3hA{P3s}TfyJ0b zAtND34>9*PfSCw;aKlPS)KgEjh>Ib@2_pCg2EQJ4&=_2z5?l&`#tk4i2^-q_Cj>1- zFdS;STAR+O{Vz*kafB#Zsj*ORf|HP!s{|xOLo*1HH z(Fx!mwGhRth3MI%;$>W`Q@|*IAnhB>6IX+Pbxvs8UH=67EgW`t18&l$!$<0sFm&9j z2z@=!+i=sV6ismw0&p*;g>h+tUVp%*Wg8LnS7u)ZZ-7<;TfnX#X4{@5PE6r5z@o7?VuVB z%owCwkVyFAlrwlWgKF@tz}}WXb*n}dLl#m6{Ti{>AQr?*V@LZJ=~~NBq4iJM9l<}M zA`Yy5Rc@g_;YM^QKrI#Jr(?oClOb)BT%B0#Nfdj{A5jsz#A1*9L9xWm-Lk{(=)gup z&w62O0oT&)G4!l9V6qQm(y%|H2Mu<#Xw8AYXVxY z-O1-L8yRYVpY}ZP*=T}+h-m2Cn*e3XZzl9cSm>-o^d3S3=st*>>}t3WbqTVWSVa)p z0zv&Q5L^LM*o-ly6;JqHF*vtDP^$lt!rOc3dfW)#S&OQdCXud3#~CsPb)4f_v>=Wnq7* zQ|ttw_GveAmB8^?{;J(kNj}Qes+#KHF&~7l*o5mgc!Z5uRE>ex)E(D!z{iX*2m=9c z1dmNc5YA=Vqim#1GdH;O>PzUPJR>XKEL&cJya9G!UsiNN^0B zwXMp?0n#Pi4!6Q6k5`ao?`fw)yjqyM++YfLYGm<;Z?NIMXn-^&mQ)!mEf3a&JYhMB z?!9s(8V*i!SaDxb8z@hvn@Cg+rPv7K3wZpgbT`4{ua(m%hc7Te4oBp4f|mP(5jlgh zgk_Jn1A!)naoE)9z+E&9ex9i8Vk{>G%BAGWTZpG$E{*v9A!icYA1tr#Xva-$fNrxg zaa&#`msf*hL=I1oy^N$&8sIEvc`yKh{n@DiMC9^lFwB^Bo;$~w9qU3YgCRN4)l%c} zgJCzD*U#_HF;#?Rxx2;dr)!TCuP+jU@F=V{P<^f`GCmwV&&)(V-xMheS6^WAlm{ah zn(6OU(3tpG(=L>N0aF)EbLio>U6KYf3}DV4o`h1O1go zaOh<%EtTs+!9KlB#IKJL4}Hz}ucmiDQ$0D!@C6E3d`53!e)dLmW+sIPB93W*+-172@M zw4%?AsEJ?3%}uzeq?@6j^+&40QD3a@uw)2E?H;Z0R`e;fm6q1j`lA(ni*V=hdU02* z!hC&i#+}zU0kGlVP~oeKRz!Ry4&3^Ko@m4utr!7{NNpJ?MrvR$z@suEW!CUxl-K?yNwHg;8fjRrgt{5=tvV1r%qK?}@HU-kEp*O6x5q)X zJ}(2^p@X8n8ea6B7LsB>zfujAgRu~m^Pz;Xu~bjUH^dY0`sKWEI2iV%sNxJ`LYAd^ z<#HeTXGv{M3C3J`hxl_o4Lyt!Z(1BSiUy&a5eF3Tu~?ze@jps$z_addj%C!-C#gzdSCPDz9;=PE*N7qWZ+vuk^k~a>i;j{SkbS zKUhY%Kq}KnxmIA%p=QSTtqf^7m=;F+qE*8pmE$|86sW3~$}Ew`hcy@@1i}}oigcOa zEt7}IH93CS6V9tswp=5n_KId|b>K)%U$s(=?1|KdWjBp~R`(L9ae^XVi~cZCLI-!3 zm)F*C-fC~DbE(X7%XrHS_e?A-oTSx%)UaZVs%XVOG(b_13-eDc-zY9bi5xA7hW|_J z2}3Z13Igb4(SPxrF}W|R7;69T3~#(FE=(+44){IcO4%Lox-oVG-g?o2ky{XmvX-AL zYK&o_!^}WN?-G+iLDgU+c!QEz>Jh;a7_(DFO-Yc7YOSPQC)sYiThy9^@gXx2@K)R- zYMs*^4f+Q3yI0g&5YPG3M6G4istyhZCr(#Nufz0spXgFs$nEuxki#|Ty0FVL#B>!r z9Q@^QVQtM!G0j`1>YUekmYA#(vDTd}YAR;cDU>JPFLrL<(8D~{@@Sf5JY{~l0b=!3 zjRB5Lc!M1v`5T@VP> zMn?pxUq2`&F>MZ-6qO?n=^EgZVQCpC6fs+sj+z6-mC7{EO9Mf)N~7rT%CMF42om*S zUW)Sg^-_n}d@)_kmyg+~0P3k*0J*A1;DlVI9L{Cg7K)B?>hdLcDvvG_(_z5ELw%7b zM;8_@)*CVp7!A5a)Ouw}xI9kYB-+ZOGSl+XYxRtyG4_HJdDdk*w7?tB_Xzq0Gm|;N zKmc+qSL$z&GGi-r;?fDQBAERG6~4+x(SD405LC;mwNh`<(wYz(MXOMEMw9D{AQ$mm zEhceL5xU|UF_}N)`}{aE_?U((M2}u8+Bq(k7pz#P5yE)X)&$mznbehrLt8M&7(*D1 z7&-&`Z9q?E1r85R^m&_g)eo-?6no&xgg5G-QH%jP&nA7W5s2&OaZ$6I#hz;9D=HfY z+0o79=w`i^gJpD{YB}(Pm@;V+cdu&6OW7i_DGD=`YD~83&BVE@O}|a&Ly<8;%6Sg@w;4>)ldz=JWd47!EsL<|(g+ z_1&es@0PM|+Z`7LeA!5RK_76$uOt{oGcz^5C}x*MA*6m z5zXfPUPm(R{~%_loq{($ETa6Qo}mP5s-N_3LpZATNim6$0}d`rq$j3a7^Cpk_X$_s7v58dhFrBTi#H=w13I zc~ZT>fmH#uMnRw=IN6ZmDKE#AtZM5nLmIF}SV6+cpGaJ%^f%Z;QM{TMf`+CVQhkB) z@F-7tE%%7;HfVDh(S|kaa*si|c(BwtcCUeV)lxVZSa)~=5f7W#rx}t_3}s>VX1XCo zeJrGxApQ3lQbWW}U!u-1By#{?h0fIQA-`u5>0p*2opf4Kiv^Y18)q9bJcZoFl$qV3 z((X6F&1TaNJvA7TS*JtA=y8rA8A$R;nK~a(3n68av5m}CGKOF$WuCziLBp!WJZNxn z$=FCJrF%by@Iwa8e<03b>IsS=1xA2OwkI6LXl^v5;dw-O(jd9g7og7dupu1~*0Io} ztkC%kltT;dNNo-IIkCtBLn_GF=-^)HLdJ;!hz)ozVkEhID3b7t<9SdbD3%yHXmuYM zsEx>8lC#O6Ij~G>Cdtw`j9Z3b!3pv*1KfycPL# ztuUnX9t2#`gbFePk1GBGsY~WcgXXoCzyQ{GnD?_vSzI7>6IUxw7r@%BF(lW9Fg>VF z)nf)H&8fp=n7zCJ6vvGI+PILUZZ>e&K}PO*j`r}Oyk76D1RFsoXkD>Kc1X2lG|weqCcD*${xn4(M$8 z8i4ETZJm(x#a7k_b(vw_;AZ#j^NyaCh)5^2#yX@!N8f@uBRJ8`8und-<_QQIQEXEx3#D%3J~VXX z{REwk(Xqu0txG@B>(6JHkM-x`u&1)d^NAseoC_}Dr@Dm0We6_UeWnB4@RugRKT(bs zN?8{j(c#ovQRo-?aN(<~oGOfoFO@5bq>h(;bq0><@@rj3TKwTwxK>A%@kNNX95Yxe zvDPjM^*ye419F>DP*JGg3B6@#>BI)pH<*E02DT*lR&OWL1zDi)^iD`@XgN(*ebV>3 zGH7nkE&GA@a>ZCIb@2bF7eh!^%ufbwHAGBDVS!aKiCfu|Iwn6DE|&{~SR;A7MFIb$ zpWCr1Ag%tQYY+X11o~B(Tr71N{@dA=?e+WFu)e3xhV?#uHmpy*Q8`{Lbu>&iDz=-Y zE;rs~%m~Yopnn3qTUuUI{B4R6ODqN>T@hre(T2IOnjY^qYOV-hZo*;^_#UGYxLN9S z%e_WT9aIU}=bT^|ue@ObnWkrCdUID)P{eZ5bfY$ZP=>+5Xz)IxHd_^97N;o_)^3K< zcC#e;XBsubMAT?|hUEG#3e7U=hF0ZH=4!T4vwpman3byYJwE^a#tt$hFGRD&$54aO zO2FLO&>Y1xT#~MPfD}Z=Yh(ZuFjY0DY_3rowKVs_iI}I?O*Mr>gF*P04=RrjmwLn= zGCB~}<%Q>zDMmYm@rLx!?F=3*Mzjy+)`tQ2|jru z=YRkN+4RV=IF}SCSfAn^Q9dYeN0Sr4N0sg);0&(R3uo;eM#Ga2 z6Q~WX(rdsO6^G@}YGZN)GN38kexE0@#;66Sw7Hj8jLG?!(dDUxe^U`G#&!;7M&2-M zja{)bf^{Vfb!DZpWrWlrZ=K$|sIfF5*YjQ!*DKv^Flx?+MwY`jo0^rBk(kgnDwmFw zI*Xf>!Fam;aa}-SOkuAOtp&@&6u{YR?56owFgd}Ad3EqDAQMe2jPQv+$_<~C<=&#S zjFh?!-D*s!MF5t~;3UyDV~0>}q$)Q!F)+GH4$CwvM4mLJ`XbO`1yk7}Lu}EQ+987EZ6lHbXG{iZP>>EiDsZdyO41>=EmOEi8}H7|IJ(?K8Sy1=$9N z+N9(wL|)YuPmNVjk?-+G)dPA(RRyrw`E6qd+Qjm4Qq@=-)H@$mTr`Umg%RS0 zX{ikjn)Hq_t5WrLi)y3jDSS=p*a1qzGF{C!)Kez=-{s}T5FF%%a5wL;ZYzcc zEA!yHdcE)IEyolTL91b3EBwAu^Pf582Syfp=RK~tUp_pkHlq_;gA`njU^e#qC*{?l zNj}tjZGQD|n>@bO7nZ#rDU)xJoY^1iV|f@lQrO2@i-yN1%KBRnLi<$NbBokN{7m`s z7A&NMmFW0u;1G(&_)EU)92=(4rZARF{Gav+Kh|CL@Y zH8QV54nEEl{aX3gtx{I!qsER{%#~Nimm8!Dn$36Y6iBx~1cNaDCik2n#w~FaDse7mIbTml;c~z?KmFsSkdUW_fp9%A;*{t-V61q(~ zNBl`?xJ}AVKWR)>tHlh#&&u}O(7%4sd6LA$cLaskqQ7E@b0v_^@tfWzM8(zgyD?4O zsUIE;vPJJHofi#C^lWUepazlCm;=-e5eoO#o3x2`xSWIt1~gaWnQT(-yj|+-y2}KA zhgJ?Huq1wLLqw;Tlv%e+S=UZAr9!R}Plb$-p*%tM-)+*oA6VF;@DRCfM6h5$zk5uu z0dWqr>2$C1A$VUpP0yg)7@8oan-KhuVqCEZ01M;Yr(AT0)Gcd9y9~o<#0^D!ZKiU^ z9a6_3vye}#mTEX=o7DMTUE~g`jZD%aqW7CL*9S9;iXQ^kq(Rwnhm;kYW9sOmk%Mid zNv!oS8c`rx`2kZ3+w!5VL+YQa>yMraDi9o#=b1EDPwURC%fn_osMjICnmaKJ^N>k% z^=L;h-#0qoRdi5p83qbw{6>>DK&cZj%Y$L}uwK4u)Id33uN?C(_^3wEV}Y{fPN_?5 zp(#x@`I@7$$dnR<-9;dQ#}O9m6ma2~o3+H0Ouo%+_d{bJ6DWisR@RQ z+(CqLLCHJPGHQMTj)23;L62NWor+-jzPg)hgV;G+Zp!d@y?lom%j8-b=PQ)zQmIqF zM@K`jj2uf3K@(5@>waTQqoGe~a8(OVwE0ucWtyCT$+3zNoDuo@@uDCa3CcH>H-dT`^YInvnk~ljfP_maz#S zh+#|~#SUE%;tC;XAO7hxfOKHUAmcA$c%&?Gr}C&r>K1D;rFan#Wov8-JU^=sQLZWU z)aP{NVbe+V1fSO%j+3e2U3!URFNoX|iS9O~ctRonB(1J5=#?1dO=VQDdTizSqH=SY zl$o{1#I~YUp5TJ91>5$L5-XF=GrnxldUMbcNh_#T7o1|nKAFu5BPd|~x-J52IG6Sf zlWxN0I=TE!ouf89$u7QS$_TNb1v|sRw^8@&V}-V%Ya*2gl%{fQdB1H+jnk3`cF>d- z2e4@7JErtFgm1haO3X!@ukXg?g3B8^Y)Xk|!FKF>i7dEA-e+yC^z%v?u@4f7+gE95~1ADPZktv?$|!{B|_(P*Vjxm$xZWj^_1Q%9_} z`(PEM2H?pUuyF4uysea7UdeUwrzXb)@XYa}qlYGarWHQAYaMAq~>SOIdC zcoYw(PQEv#Fu({5d=lgbUDbRyv#{_-rFVtYsmD*IjB+eA!`c)=#3xOB2N}10epaeM zX8gs}UD@c9vXmtik}d03eQ1-qN|?`x)$wo2PSD1F*A+!$K;2V6W$Hi;!uNpl{aBk7 z4|AVxPsxLo_2$$XYz>SE4#mfWYJ!pIWV4-Z15nqz%gna~(EbyA!P>|a^O<4%5_s34 zspiypX;kLjW{Cg^;eO`r^t#8KL2z_=)Gt0q!B*NoW#W<$85SP(oop0`^=h` zz^a?$Aa(N2FhlvU5(=4Vc3^G5cLfLZo7JA4O}exf5)IBaYrYTTL<9JKvxC*0^J_3? zXuWL&;u9qyPq{qDtl4{(iN}G5$x+V(X4R8ZCRItPvAO0BA==X*uKMP~JhL`Aje-`K zhm>Fape_dXS-8{>nYGCoipLZoD|)HCn^ytmg(pWUJ_<@AnvIS=CH~>3`z$;rE#L+;EjfG}%QDFtB6{xgD%FRBh=_2UrHS#9P6 zi*`tflJ-H@m~CEcg%Id5t|yAJmiU9wwdPc>TtRjojHr_9%+@lG-xDa8*PD}k>}(lj z+rZ`I!$_U|AZIi0-U;B&6!WNyZsh$t0TGrrDaXgbH-4O>ifcUNlt7QNT)nv+jJN$0 z?O-_G1-4tvnumh(Ky)Ujl#Jn4a|+ZKt_`U!;x=op+jn$Itnx{2HVXiEP$g(|SR;?mEz+k`pFfY50m$^z`W&Dczi!U+th zdVj&pj^(Hdq;q61nwjBb<8qHVtsGMiEmwK}$c?^a#;$Q$Ep2w9g6f}@zXo-30Vy`nYPQi6`Fz+Ns*y4;ctfu+ z_xP|3h1GbI=Ta;2mNKqJ>T=P3v$lNHNDB%NnA2qDDSG8Wa&)3B2i{iJ)nL(hP`4V4 zm?oZr!gtK6L|ss*`EZAHD(d6~0p@JKtB3)Nk;6*2fYkA}_jD3kBM+~NAP`mfzL`a> z3*gJ*%q}(+Xn*JfbB3=S06nJ7tgW_aPn5PqKQ!Z9vnPtF=p&^81;jo!+XzsM>E;uD zOGe~V=mk&~yJANJnXmVmZkI;}d{{oj!w#RDle{pfILLyKI#H55gkiNDcg4IsCQR=J!>zv%^Qt&N`ffVa*ZsVRgdvbW9l= zl(KprH#>O~&=@1j3DJUq6K44QiLr`rl%}ARdCj+aSLWM%xj{Y~d}mIrz%rEr_7D>W z=6eE^lzRef=N*tAly8EP^Qs^9UciElC1`=@Pv(q?6hY1Ld$7IF`{GHngT!KP>ObV4 zm1{zn<$f`zFhb%>HsV)vrv6M?XZ4~E^PAbp5EKT*Vr>+TE7f}ZzpLe_P&S#JGN&d| z7KKkI0GQKPZ%Jbm#h#>SRSCuC!jmn^dm*Xwpt~$w9$Em>keXuA=IPP#`YI!u5rkvA{9a z_&#OBcqwb#3`^ohg*pJ$h1g8BB2;|@DPRp|SyCz>Hd7nbVYY?qv%T7|u)jYcD{r3$ zrFU5BV9jZB?D|JgwEa25s0}zY)PlCnl~OTj2H}o=Bpq`P!t}; zPMj^Uq+(qF(^`z7PBHt1769N2&+wbKY*VbS*6mg-3 z(H^zntgf5wZ>wR!l@@KfPyrOgK`3CAMf2U%v4;SLMcZX8?!(p-ku{dg$bfLUAM@03 zIZ#_uhH=jhSVkVR&?a0WB&Tex#m++4RNHmR-l&v4V7(=o)Tss8H&{|>m!l{U4e}Yj z*^-Xg3lRn!&?w+L9~&)QlshND=5A8{R*SO%k6Y3wf+UE2mQZ+bls2F@Yar$TGEtwf zq;e{X+EW~Ei=_hx@FNK5cCf%((eoHDY~srki)A^y&63O^q|KtxlNecyfGL-@Ma&dI z+O8a`#qQ8k%8#{(@a(X-G}az3G2zO38snGcg$ShNXDrD93=X=bhTCbuhk9C+ z+b3Wn@>xA52Q3*YfEzN3g}#HH%8q^YW)p6368;pNmW$4;Qk%VNkyKC~%pDFC4D-~H zqjXp&rKfV*A$ZS{tdg<=rthndF}e51K*$&PKo^qi0Oe}aGYprjV@C32TFB|0b=#n4azQ>++in2yR>=Bd_XI>t=zauBb(tx3$bvZ~x; zwc=1DHNw4CW%WN044!6%g6Y*Ewih;?i1Bs~bqM)Bltaa6$Qf3LX9Bm8XtbGDJL{mt zY?c+vA#_%aa<&!58_z1E`>km>zEc~*xW`dZ%FtkSa!8DUw0v`{=?R3aH#}hNkN{E{ z&b6BBa%7)>o)w3heSR1ls_BDPOI^M{7z{sTwW>;0taki`kgDEB1=%`0Q4 zd3em@oo}^;J>C()T)A?A)e`a%excPC@l~<`vB;V_E)on3muWdoxW!gG0hk-S#F|9+ za8%%NHffZ!dvqhfORXt{W$PKrxy)*#=fP;tN33ZK6=QEIv6?QoI(6!yyq6=-3QovM z%OU&WeUx)$$AF3JO8(3!$Ox?BIr8XmK{*?ht5rEzS$Gd@4HuMr7ueAp41~vcJ@|~b zmJ5P;8w*)l)m_p1ssX+6*?kfZ5jrY#J!iq^9Rh5yrZeeT835`eXvls2IIVvYiv5U1~#W4|^)He#ChP7fr1&4VR~_86+BqsJx#^q++eQ zlWP_yPw}>03+Kw3ieaDaz%%q8U4_@bA{6C%PAU4glvVINmx+;L0;6Ww#dGt{Ml$W@ zG#tP^(HA&PyzO38n*R-#Xpge*-#8lllC@*JmH5eV3}q}?qc2-K5QcYiL|w_>jJ(3t z%eO`Y(SCdJT#Iu!0WZ{x=GbSo_#%j>%CA~+D8*NY7eshdzlQMzFwwMHZS)!?-M${P zCKFhDe#45@9czBqk538dg&hIYhRL6?|jvyH-auNIRR@ovo1%TRUKM zmU91;bWC!;XLZJbtlbFuz7_AbB3xAp%U`XLeqeRRfjViMHJK6Jp)&l?nnKSy{v)dk zb4@v1w|2}vwn~X$o%|E4GZBt1OY(fGJX??0&u7+@Kok?UCei2CRQ9arK4MK~05#he z)(&j0nLr~!%k-r+GY-_OGZpfc)fq?VEWcLgEAY6z79J^+=cqL!5Ut|VvBvk9RnlRJ zY>z`|c)U8p6IN%1FN_(momAf_&6A~07kq1lt4bTHd`E`F`p&BEv9j@kkl6RivB^^A zir;XOp>hk6%rT1OfNIQwPVc0ypm<>)pTQd_`umYIv{YB%= zK`X5thQ0Vmtk3TZ&j?=G9RP{Xbve+hVsO>^l1qRC>aOKmj#+aqjL!Dhk)# z(~gRKq}tHEiA3ZtPqQTksmP_DZqwHbY8cW7y8CQ6G#T)+#rF)Qd5V-R&QxB(B{s{Z zo%tcBUyjbUX#szHmH}H0rC7~+F|kDMk27W+q_m7)XKk=)t7gpyWT)!q*fisyg2|hF zz@{y3)%6A5eT@an2K1YI7Q)N8%!@OJY>4pl*J2+$3k*9ypx;Ar0aa>p0+q9P(=up4 zzeXEdnbTn@O&a)xc;_}643_ySAGT@16b-BScLVy(KMTimlB2soZ?#hR?cq{bOV7eM zy+=DxM=!dPARQOQrH19ymUoMlw5d|&ZA;=vH4si7W>dWW8kCx1X}qQ?m}_xaye(8X z)b)r`PX#PLs{m@K6=y+dfIJ$9QlDTiE)VFp(q^Nl5va>5TN3SdjSLWAwernWL`Bxj zZE(1x$KqOHS*c;xD!uNOq|9}3=@^Rjt@X-ncjIW-hPg)_-Nfd(DaknUiTh3#FqZ2! zDX-rxIWr!&rI0pgV*yTOaN_2b1)@9T+dcQr zl+4%*ach7cN!{^9-C)qr!92ewPQoI_6Z*VlbMin%4q{gL&;j@BU$&)$X;n!;D(4lw zbLB@PedAvw*lWwE0D!%JG8|Tmt$6m?993AAt84LB_3o-=Wl_-AY$?duKZh;q-L-YC zj8lKiP*@k>&1Yivx-xK@BwhLjNAaUSD%Uq{PRd>q@WK0K?lGz2Ev0@M0`vQA>4Y3q z)2F|tqyx5O0_9Ueect92C2VC_z?Po}ZFW={`w-CEJGLZt@1>)}htvnQx%93LuO0?N zLI0#dgMxK5#~!w&CqQV1jrrfRv86^H77ti}1rY0d-^M&wg6J=`e_&(&JHco}a|8-+ zYY!sShc>pNVZ5lLd}L#57WT}-dzez?=*Kp;WFlz3g+)6*Q5H;xf&bLTym>-U-25{e zTT;*?4qJR4&xMx8F2Iol=GqEl*@*)9pz)RY7z_lJ`D4Z$G{>K)qpxT^kNG z&Wd9myx2L@E-@DI^Gf^$+gWOz@-XJ%oU5qdJj4Trc69=4}Z#C*`CTwe@Z?iA;nZ?_W-n|K!3llWE% zjd*-TAIl^xLl|li_)>GRhsE}kT6PW|@BAU|Sh>WWs2qGI7;)96{Q?3pEAggqpl^{L^z-r~n+4Lf;PD%EW5Rd5{VhrN0EKa#r*Dqdtz?pwGYvB9IYFpwQ zvAkaApHn`O*lbXnmD_=4b!1RIHmcPkOB=)R-lVp;ZfEh0T-GD_K*iT=*%LQ-`1mY) z;-g}VJ;9WzTHk7Sv6%)iagEl}uW7nMNeB>R* z0eTs8>Eg|FDJ@I zy`N)WQ9fvpGB4Z9bLJxaRHtzpzK@rWv8jP54*#msV-9@E*Urd+IcdW1R%PfM#9m*w zXObMcY`H-SBVho(VP`%AD`w~fKgs;2o%syp6_V5VmOY!Ys$~wxd3FSBsoAOM{b$sf z7J3Ib43Rk;0YHQVOs?_1&CAgRfLT3gXT63;lbDTthv(!F995z{y+cZm2XI#IU3+I` z;{%dYDSkk*84ugL@~6N9Qj+){kw{j0QR97kCqiVJdiUz}fwJKN9LZ_pYDp-$F52fq zu1FRjWJS|4m&ixFMR?dSjQ8W}82Dp*#{>Ae8Mv%v`1-SFd%=*YsSDhhCn$! zu1OXMhm*WYLKu30(L<`@*j6wi7kEqjWBS+Tu%P?OZAA z(yzDz^-e>muX$B-gKUdb>o-T0<8yHg`4~s4y4KE+9_NjfLtpo!3<#v1;95kLd;qBQ z-?ZzFbR1~}c9y@jcOrGEG~D`VoWJ9pNyQZ@Gv`UEH+-*lPWo&BD^sKXffveV1vb`c z?)}luJZMrPL;R$?Gf(Q$=_DW0stT)pp`j$G$N#gE`k>VD>R&KtKq#hv#_CtjhOrVj58eEOK4q>Ke|?7nt5PCtXQSLwC2$V@J<3N65E4Tx9HO5y`IQttC{#9D-5`Tm^mM&3Nc2WMl0fk`!F#W$&(5I5mIz~fwOX8kE+X3)EtGviJX zXZD2h^21UWC1Zh_&MeB1=zxQUb%4roQ7Szm#9p+^q59S zs@+_9Y-Ph0^@6HjoJQt=7kMYpzBtrLSJ!skSrcSCEskgXBKw4ZC#tNL}->;fZ4M|9WxEc% z5_kSX{(w``@ZwZtt=f3M)W$CJkw)YVANC>dgzexZBZe0g4*p1&3;qrQVP5F`W97p| zlJlBRbXn8_$fkVCn=B`yIUk?t3^)~)`MGlCVk!ITBfL~y(S+ia{UV7uvrPD4h~B%F zRbM2MQ}(4Yd9l>7(^v7ju#lZb@U^mWF%0%mE(o!JXf-m z#bM8d8MPd|4i$Ms8Tg2lm9?B#I1jiI`f?a8fU#0rp@bfhT<1T^s}*mmm1@BtCm@<( zm9pv)90*;l%B?N=*Ql+M;HEsrnQ>=?wsY2UW(jS%j^|4BN7nOPxj}78-@r@a&NNO_ zG&{OP#w)qYvDdj#DP1l}w{7CB)o%WNoHsX?bG(LJip^XzI+Us435VvUk;)Tra%hY4 z+H&kWZ2e;jYME_XPoW6nph>K5Px30L^1$qG=fd!6!ogruXyhqJg4ILkEf3ew0&xe| zQiA7k(bJqEy$HoS^E132+N{rkJC&I$q^wI?xK0yYhi6q~XrCSB^v@};uE3{ypI4dd zuEH+P0E(d3irD&WcVaD7#0#8^8EO^uA{Si)d41tMykvECsFFoq;&fy~-7)@A=$H8r zCJ?Fh6$iP2eN}sw=a=#IL0YcvRfR>swmeFU<$YW-aOUkyz4TQF&4KZjR3ig8%!;VS zYYy@n<48vw+o~LWRO*!dI=6!DSc1sseM9NK5@D@3+qD}Ni*Rar^;=5ON*veU??{;B z`l`$+Qgwh=I$>w)Z4RL*DBJG~S03a=)2JrbSIv!?`yH-qLa6bIK8KXoS4!E=cR7=y ziV93^?Cj-XtE7&uHcmaPU=aJjDz(9f zif@(F)%cO4v-0|K$)zk>C0R2+<~>hmF|-`geWGk%C3VaERJA)K{SaStFm{;a@Mp@g zRZ?ch&v{4SH7mylWpR=yr|gK*d9~De#235{WRwuYB(wA-hp<;x;ld0nDflXGxcE3? zPGjV2-cgEizz(5uS_kpS#Zl$H)l%1sj;VShQwYvf{P8%b5SAHh?3xqGtE;7~3%=nP z)mvd5|6AVQsO$0LCf_NJHBxr=_w8DFSOj6>aux>rLAhZKoQog1D%1un;;)JRq*Skw zx(qq#VA~4u{`xa7R}ISG3qW4^7Y@?S858JN)g>73rwQmcN2cOgjx#nmQ~$e;p=Ic) zcE*b4L^cV)2@ap;guI}N`eZt277w0GPIjr!aJcg7%CSd^4UWiN$*C$>oerlYYsY^v z{lx-PlanzTxoWvh#;+&>E5aIM>hmU=+FBrfl`|eA&)RfBO zOMB0to62Zu@0rQT5qg(P4fM=PPU4SUDf8@Pa;Ey?41GHn=l*2n_s3wq8cZQh7-I=+`%s&Azaq^z0XD2CCKO>nrH=xvAAU+&M6hW zpoAH*QE6F=nC`>L`T?NYu&)${&*vv=q0v%LU{X2u?;}tUVsg<1$ti$x-;bbP171zZnjyqrV$n~)0AcNbKk1G?-GO)Gs!Q27Q01`wRPRGZ!FokFNXsN~ fYsxz5KvtK7Mu!TyqTf}0-bsAwt9-m$I`zK*R9~g* delta 311543 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

    c4TaIc4EnmT**fwd^Ylph_?H_M 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

    xKhWncM}8CVd6=5Tf}5)rXl=_3q*X43#9&%mn`v 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 diff --git a/vendor/github.com/ncruces/go-sqlite3/error.go b/vendor/github.com/ncruces/go-sqlite3/error.go index 957a7440b7..c91dccd12f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/error.go +++ b/vendor/github.com/ncruces/go-sqlite3/error.go @@ -68,6 +68,19 @@ func (e *Error) Is(err error) bool { return false } +// As converts this error to an [ErrorCode] or [ExtendedErrorCode]. +func (e *Error) As(err any) bool { + switch c := err.(type) { + case *ErrorCode: + *c = e.Code() + return true + case *ExtendedErrorCode: + *c = e.ExtendedCode() + return true + } + return false +} + // Temporary returns true for [BUSY] errors. func (e *Error) Temporary() bool { return e.Code() == BUSY @@ -104,6 +117,15 @@ func (e ExtendedErrorCode) Is(err error) bool { return ok && c == ErrorCode(e) } +// As converts this error to an [ErrorCode]. +func (e ExtendedErrorCode) As(err any) bool { + c, ok := err.(*ErrorCode) + if ok { + *c = ErrorCode(e) + } + return ok +} + // Temporary returns true for [BUSY] errors. func (e ExtendedErrorCode) Temporary() bool { return ErrorCode(e) == BUSY diff --git a/vendor/github.com/ncruces/go-sqlite3/func.go b/vendor/github.com/ncruces/go-sqlite3/func.go new file mode 100644 index 0000000000..205943eb5f --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/func.go @@ -0,0 +1,186 @@ +package sqlite3 + +import ( + "context" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/api" +) + +// AnyCollationNeeded registers a fake collating function +// for any unknown collating sequence. +// The fake collating function works like BINARY. +// +// This extension can be used to load schemas that contain +// one or more unknown collating sequences. +func (c *Conn) AnyCollationNeeded() { + c.call(c.api.anyCollation, uint64(c.handle), 0, 0) +} + +// CreateCollation defines a new collating sequence. +// +// https://www.sqlite.org/c3ref/create_collation.html +func (c *Conn) CreateCollation(name string, fn func(a, b []byte) int) error { + namePtr := c.arena.string(name) + funcPtr := util.AddHandle(c.ctx, fn) + r := c.call(c.api.createCollation, + uint64(c.handle), uint64(namePtr), uint64(funcPtr)) + if err := c.error(r); err != nil { + util.DelHandle(c.ctx, funcPtr) + return err + } + return nil +} + +// CreateFunction defines a new scalar SQL function. +// +// https://www.sqlite.org/c3ref/create_function.html +func (c *Conn) CreateFunction(name string, nArg int, flag FunctionFlag, fn func(ctx Context, arg ...Value)) error { + namePtr := c.arena.string(name) + funcPtr := util.AddHandle(c.ctx, fn) + r := c.call(c.api.createFunction, + uint64(c.handle), uint64(namePtr), uint64(nArg), + uint64(flag), uint64(funcPtr)) + return c.error(r) +} + +// CreateWindowFunction defines a new aggregate or aggregate window SQL function. +// If fn returns a [WindowFunction], then an aggregate window function is created. +// +// https://www.sqlite.org/c3ref/create_function.html +func (c *Conn) CreateWindowFunction(name string, nArg int, flag FunctionFlag, fn func() AggregateFunction) error { + call := c.api.createAggregate + namePtr := c.arena.string(name) + funcPtr := util.AddHandle(c.ctx, fn) + if _, ok := fn().(WindowFunction); ok { + call = c.api.createWindow + } + r := c.call(call, + uint64(c.handle), uint64(namePtr), uint64(nArg), + uint64(flag), uint64(funcPtr)) + return c.error(r) +} + +// AggregateFunction is the interface an aggregate function should implement. +// +// https://www.sqlite.org/appfunc.html +type AggregateFunction interface { + // Step is invoked to add a row to the current window. + // The function arguments, if any, corresponding to the row being added are passed to Step. + Step(ctx Context, arg ...Value) + + // Value is invoked to return the current value of the aggregate. + Value(ctx Context) +} + +// WindowFunction is the interface an aggregate window function should implement. +// +// https://www.sqlite.org/windowfunctions.html +type WindowFunction interface { + AggregateFunction + + // Inverse is invoked to remove the oldest presently aggregated result of Step from the current window. + // The function arguments, if any, are those passed to Step for the row being removed. + Inverse(ctx Context, arg ...Value) +} + +func exportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder { + util.ExportFuncVI(env, "go_destroy", callbackDestroy) + util.ExportFuncIIIIII(env, "go_compare", callbackCompare) + util.ExportFuncVIII(env, "go_func", callbackFunc) + util.ExportFuncVIII(env, "go_step", callbackStep) + util.ExportFuncVI(env, "go_final", callbackFinal) + util.ExportFuncVI(env, "go_value", callbackValue) + util.ExportFuncVIII(env, "go_inverse", callbackInverse) + return env +} + +func callbackDestroy(ctx context.Context, mod api.Module, pApp uint32) { + util.DelHandle(ctx, pApp) +} + +func callbackCompare(ctx context.Context, mod api.Module, pApp, nKey1, pKey1, nKey2, pKey2 uint32) uint32 { + fn := util.GetHandle(ctx, pApp).(func(a, b []byte) int) + return uint32(fn(util.View(mod, pKey1, uint64(nKey1)), util.View(mod, pKey2, uint64(nKey2)))) +} + +func callbackFunc(ctx context.Context, mod api.Module, pCtx, nArg, pArg uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackHandle(sqlite, pCtx).(func(ctx Context, arg ...Value)) + fn(Context{sqlite, pCtx}, callbackArgs(sqlite, nArg, pArg)...) +} + +func callbackStep(ctx context.Context, mod api.Module, pCtx, nArg, pArg uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, nil).(AggregateFunction) + fn.Step(Context{sqlite, pCtx}, callbackArgs(sqlite, nArg, pArg)...) +} + +func callbackFinal(ctx context.Context, mod api.Module, pCtx uint32) { + var handle uint32 + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, &handle).(AggregateFunction) + fn.Value(Context{sqlite, pCtx}) + if err := util.DelHandle(ctx, handle); err != nil { + Context{sqlite, pCtx}.ResultError(err) + } +} + +func callbackValue(ctx context.Context, mod api.Module, pCtx uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, nil).(AggregateFunction) + fn.Value(Context{sqlite, pCtx}) +} + +func callbackInverse(ctx context.Context, mod api.Module, pCtx, nArg, pArg uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, nil).(WindowFunction) + fn.Inverse(Context{sqlite, pCtx}, callbackArgs(sqlite, nArg, pArg)...) +} + +func callbackHandle(sqlite *sqlite, pCtx uint32) any { + pApp := uint32(sqlite.call(sqlite.api.userData, uint64(pCtx))) + return util.GetHandle(sqlite.ctx, pApp) +} + +func callbackAggregate(sqlite *sqlite, pCtx uint32, close *uint32) any { + // On close, we're getting rid of the handle. + // Don't allocate space to store it. + var size uint64 + if close == nil { + size = ptrlen + } + ptr := uint32(sqlite.call(sqlite.api.aggregateCtx, uint64(pCtx), size)) + + // Try loading the handle, if we already have one, or want a new one. + if ptr != 0 || size != 0 { + if handle := util.ReadUint32(sqlite.mod, ptr); handle != 0 { + fn := util.GetHandle(sqlite.ctx, handle) + if close != nil { + *close = handle + } + if fn != nil { + return fn + } + } + } + + // Create a new aggregate and store the handle. + fn := callbackHandle(sqlite, pCtx).(func() AggregateFunction)() + if ptr != 0 { + util.WriteUint32(sqlite.mod, ptr, util.AddHandle(sqlite.ctx, fn)) + } + return fn +} + +func callbackArgs(sqlite *sqlite, nArg, pArg uint32) []Value { + args := make([]Value, nArg) + for i := range args { + args[i] = Value{ + sqlite: sqlite, + handle: util.ReadUint32(sqlite.mod, pArg+ptrlen*uint32(i)), + } + } + return args +} diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work b/vendor/github.com/ncruces/go-sqlite3/go.work index 0aa07f2e33..18e3785922 100644 --- a/vendor/github.com/ncruces/go-sqlite3/go.work +++ b/vendor/github.com/ncruces/go-sqlite3/go.work @@ -1,4 +1,4 @@ -go 1.19 +go 1.21 use ( . diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work.sum b/vendor/github.com/ncruces/go-sqlite3/go.work.sum new file mode 100644 index 0000000000..cf0b1d6783 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/go.work.sum @@ -0,0 +1,4 @@ +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE b/vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE new file mode 100644 index 0000000000..558c4ff6df --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Nuno Cruces +Copyright (c) 2023 Jinzhu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/README.md b/vendor/github.com/ncruces/go-sqlite3/gormlite/README.md new file mode 100644 index 0000000000..768a5b4029 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/README.md @@ -0,0 +1,26 @@ +# GORM SQLite Driver + +[![Go Reference](https://pkg.go.dev/badge/image)](https://pkg.go.dev/github.com/ncruces/go-sqlite3/gormlite) + +## Usage + +```go +import ( + _ "github.com/ncruces/go-sqlite3/embed" + "github.com/ncruces/go-sqlite3/gormlite" + "gorm.io/gorm" +) + +db, err := gorm.Open(gormlite.Open("gorm.db"), &gorm.Config{}) +``` + +Checkout [https://gorm.io](https://gorm.io) for details. + +### Foreign-key constraint activation + +Foreign-key constraint is disabled by default in SQLite. To activate it, use connection URL parameter: +```go +db, err := gorm.Open(gormlite.Open( + "file:gorm.db?_pragma=busy_timeout(10000)&_pragma=foreign_keys(1)"), + &gorm.Config{}) +``` \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go new file mode 100644 index 0000000000..69cd1791ff --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go @@ -0,0 +1,231 @@ +package gormlite + +import ( + "database/sql" + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "gorm.io/gorm/migrator" +) + +var ( + sqliteSeparator = "`|\"|'|\t" + indexRegexp = regexp.MustCompile(fmt.Sprintf(`(?is)CREATE(?: UNIQUE)? INDEX [%v]?[\w\d-]+[%v]? ON (.*)$`, sqliteSeparator, sqliteSeparator)) + tableRegexp = regexp.MustCompile(fmt.Sprintf(`(?is)(CREATE TABLE [%v]?[\w\d-]+[%v]?)(?:\s*\((.*)\))?`, sqliteSeparator, sqliteSeparator)) + separatorRegexp = regexp.MustCompile(fmt.Sprintf("[%v]", sqliteSeparator)) + columnsRegexp = regexp.MustCompile(fmt.Sprintf(`[(,][%v]?(\w+)[%v]?`, sqliteSeparator, sqliteSeparator)) + columnRegexp = regexp.MustCompile(fmt.Sprintf(`^[%v]?([\w\d]+)[%v]?\s+([\w\(\)\d]+)(.*)$`, sqliteSeparator, sqliteSeparator)) + defaultValueRegexp = regexp.MustCompile(`(?i) DEFAULT \(?(.+)?\)?( |COLLATE|GENERATED|$)`) + regRealDataType = regexp.MustCompile(`[^\d](\d+)[^\d]?`) +) + +func getAllColumns(s string) []string { + allMatches := columnsRegexp.FindAllStringSubmatch(s, -1) + columns := make([]string, 0, len(allMatches)) + for _, matches := range allMatches { + if len(matches) > 1 { + columns = append(columns, matches[1]) + } + } + return columns +} + +type ddl struct { + head string + fields []string + columns []migrator.ColumnType +} + +func parseDDL(strs ...string) (*ddl, error) { + var result ddl + for _, str := range strs { + if sections := tableRegexp.FindStringSubmatch(str); len(sections) > 0 { + var ( + ddlBody = sections[2] + ddlBodyRunes = []rune(ddlBody) + bracketLevel int + quote rune + buf string + ) + ddlBodyRunesLen := len(ddlBodyRunes) + + result.head = sections[1] + + for idx := 0; idx < ddlBodyRunesLen; idx++ { + var ( + next rune = 0 + c = ddlBodyRunes[idx] + ) + if idx+1 < ddlBodyRunesLen { + next = ddlBodyRunes[idx+1] + } + + if sc := string(c); separatorRegexp.MatchString(sc) { + if c == next { + buf += sc // Skip escaped quote + idx++ + } else if quote > 0 { + quote = 0 + } else { + quote = c + } + } else if quote == 0 { + if c == '(' { + bracketLevel++ + } else if c == ')' { + bracketLevel-- + } else if bracketLevel == 0 { + if c == ',' { + result.fields = append(result.fields, strings.TrimSpace(buf)) + buf = "" + continue + } + } + } + + if bracketLevel < 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + buf += string(c) + } + + if bracketLevel != 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + if buf != "" { + result.fields = append(result.fields, strings.TrimSpace(buf)) + } + + for _, f := range result.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") { + continue + } + + if strings.HasPrefix(fUpper, "PRIMARY KEY") { + for _, name := range getAllColumns(f) { + for idx, column := range result.columns { + if column.NameValue.String == name { + column.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = column + break + } + } + } + } else if matches := columnRegexp.FindStringSubmatch(f); len(matches) > 0 { + columnType := migrator.ColumnType{ + NameValue: sql.NullString{String: matches[1], Valid: true}, + DataTypeValue: sql.NullString{String: matches[2], Valid: true}, + ColumnTypeValue: sql.NullString{String: matches[2], Valid: true}, + PrimaryKeyValue: sql.NullBool{Valid: true}, + UniqueValue: sql.NullBool{Valid: true}, + NullableValue: sql.NullBool{Valid: true}, + DefaultValueValue: sql.NullString{Valid: false}, + } + + matchUpper := strings.ToUpper(matches[3]) + if strings.Contains(matchUpper, " NOT NULL") { + columnType.NullableValue = sql.NullBool{Bool: false, Valid: true} + } else if strings.Contains(matchUpper, " NULL") { + columnType.NullableValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " UNIQUE") { + columnType.UniqueValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " PRIMARY") { + columnType.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + } + if defaultMatches := defaultValueRegexp.FindStringSubmatch(matches[3]); len(defaultMatches) > 1 { + if strings.ToLower(defaultMatches[1]) != "null" { + columnType.DefaultValueValue = sql.NullString{String: strings.Trim(defaultMatches[1], `"`), Valid: true} + } + } + + // data type length + matches := regRealDataType.FindAllStringSubmatch(columnType.DataTypeValue.String, -1) + if len(matches) == 1 && len(matches[0]) == 2 { + size, _ := strconv.Atoi(matches[0][1]) + columnType.LengthValue = sql.NullInt64{Valid: true, Int64: int64(size)} + columnType.DataTypeValue.String = strings.TrimSuffix(columnType.DataTypeValue.String, matches[0][0]) + } + + result.columns = append(result.columns, columnType) + } + } + } else if matches := indexRegexp.FindStringSubmatch(str); len(matches) > 0 { + for _, column := range getAllColumns(matches[1]) { + for idx, c := range result.columns { + if c.NameValue.String == column { + c.UniqueValue = sql.NullBool{Bool: strings.ToUpper(strings.Fields(str)[1]) == "UNIQUE", Valid: true} + result.columns[idx] = c + } + } + } + } else { + return nil, errors.New("invalid DDL") + } + } + + return &result, nil +} + +func (d *ddl) compile() string { + if len(d.fields) == 0 { + return d.head + } + + return fmt.Sprintf("%s (%s)", d.head, strings.Join(d.fields, ",")) +} + +func (d *ddl) addConstraint(name string, sql string) { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields[i] = sql + return + } + } + + d.fields = append(d.fields, sql) +} + +func (d *ddl) removeConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields = append(d.fields[:i], d.fields[i+1:]...) + return true + } + } + return false +} + +func (d *ddl) getColumns() []string { + res := []string{} + + for _, f := range d.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "PRIMARY KEY") || + strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") || + strings.Contains(fUpper, "GENERATED ALWAYS AS") { + continue + } + + reg := regexp.MustCompile("^[\"`']?([\\w\\d]+)[\"`']?") + match := reg.FindStringSubmatch(f) + + if match != nil { + res = append(res, "`"+match[1]+"`") + } + } + return res +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh b/vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh new file mode 100644 index 0000000000..fcf9a70bbf --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd -P -- "$(dirname -- "$0")" + +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/ddlmod.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/ddlmod_test.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/error_translator.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/migrator.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/sqlite.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/sqlite_test.go" \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go new file mode 100644 index 0000000000..ac7a2d299d --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go @@ -0,0 +1,21 @@ +package gormlite + +import ( + "errors" + + "github.com/ncruces/go-sqlite3" + "gorm.io/gorm" +) + +func (dialector Dialector) Translate(err error) error { + switch { + case + errors.Is(err, sqlite3.CONSTRAINT_UNIQUE), + errors.Is(err, sqlite3.CONSTRAINT_PRIMARYKEY): + return gorm.ErrDuplicatedKey + case + errors.Is(err, sqlite3.CONSTRAINT_FOREIGNKEY): + return gorm.ErrForeignKeyViolated + } + return err +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go new file mode 100644 index 0000000000..9e2c4c907a --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go @@ -0,0 +1,431 @@ +package gormlite + +import ( + "database/sql" + "fmt" + "regexp" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +type Migrator struct { + migrator.Migrator +} + +func (m *Migrator) RunWithoutForeignKey(fc func() error) error { + var enabled int + m.DB.Raw("PRAGMA foreign_keys").Scan(&enabled) + if enabled == 1 { + m.DB.Exec("PRAGMA foreign_keys = OFF") + defer m.DB.Exec("PRAGMA foreign_keys = ON") + } + + return fc() +} + +func (m Migrator) HasTable(value interface{}) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + return m.DB.Raw("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", stmt.Table).Row().Scan(&count) + }) + return count > 0 +} + +func (m Migrator) DropTable(values ...interface{}) error { + return m.RunWithoutForeignKey(func() error { + values = m.ReorderModels(values, false) + tx := m.DB.Session(&gorm.Session{}) + + for i := len(values) - 1; i >= 0; i-- { + if err := m.RunWithValue(values[i], func(stmt *gorm.Statement) error { + return tx.Exec("DROP TABLE IF EXISTS ?", clause.Table{Name: stmt.Table}).Error + }); err != nil { + return err + } + } + + return nil + }) +} + +func (m Migrator) GetTables() (tableList []string, err error) { + return tableList, m.DB.Raw("SELECT name FROM sqlite_master where type=?", "table").Scan(&tableList).Error +} + +func (m Migrator) HasColumn(value interface{}, name string) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", stmt.Table, `%"`+name+`" %`, `%`+name+` %`, "%`"+name+"`%", "%["+name+"]%", "%\t"+name+"\t%", + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) AlterColumn(value interface{}, name string) error { + return m.RunWithoutForeignKey(func() error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + // lookup field from table definition, ddl might looks like `'name' int,` or `'name' int)` + reg, err := regexp.Compile("(`|'|\"| )" + field.DBName + "(`|'|\"| ) .*?(,|\\)\\s*$)") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, fmt.Sprintf("`%v` ?$3", field.DBName)) + + if createSQL == rawDDL { + return "", nil, fmt.Errorf("failed to look up field %v from DDL %v", field.DBName, rawDDL) + } + + return createSQL, []interface{}{m.FullDataTypeOf(field)}, nil + } + return "", nil, fmt.Errorf("failed to alter field with name %v", name) + }) + }) +} + +// ColumnTypes return columnTypes []gorm.ColumnType and execErr error +func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { + columnTypes := make([]gorm.ColumnType, 0) + execErr := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { + var ( + sqls []string + sqlDDL *ddl + ) + + if err := m.DB.Raw("SELECT sql FROM sqlite_master WHERE type IN ? AND tbl_name = ? AND sql IS NOT NULL order by type = ? desc", []string{"table", "index"}, stmt.Table, "table").Scan(&sqls).Error; err != nil { + return err + } + + if sqlDDL, err = parseDDL(sqls...); err != nil { + return err + } + + rows, err := m.DB.Session(&gorm.Session{}).Table(stmt.Table).Limit(1).Rows() + if err != nil { + return err + } + defer func() { + err = rows.Close() + }() + + var rawColumnTypes []*sql.ColumnType + rawColumnTypes, err = rows.ColumnTypes() + if err != nil { + return err + } + + for _, c := range rawColumnTypes { + columnType := migrator.ColumnType{SQLColumnType: c} + for _, column := range sqlDDL.columns { + if column.NameValue.String == c.Name() { + column.SQLColumnType = c + columnType = column + break + } + } + columnTypes = append(columnTypes, columnType) + } + + return err + }) + + return columnTypes, execErr +} + +func (m Migrator) DropColumn(value interface{}, name string) error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + + reg, err := regexp.Compile("(`|'|\"| |\\[)" + name + "(`|'|\"| |\\]) .*?,") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, "") + + return createSQL, nil, nil + }) +} + +func (m Migrator) CreateConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + var ( + constraintName string + constraintSql string + constraintValues []interface{} + ) + + if constraint != nil { + constraintName = constraint.Name + constraintSql, constraintValues = buildConstraint(constraint) + } else if chk != nil { + constraintName = chk.Name + constraintSql = "CONSTRAINT ? CHECK (?)" + constraintValues = []interface{}{clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}} + } else { + return "", nil, nil + } + + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.addConstraint(constraintName, constraintSql) + createSQL := createDDL.compile() + + return createSQL, constraintValues, nil + }) + }) +} + +func (m Migrator) DropConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.removeConstraint(name) + createSQL := createDDL.compile() + + return createSQL, nil, nil + }) + }) +} + +func (m Migrator) HasConstraint(value interface{}, name string) bool { + var count int64 + m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", table, `%CONSTRAINT "`+name+`" %`, `%CONSTRAINT `+name+` %`, "%CONSTRAINT `"+name+"`%", "%CONSTRAINT ["+name+"]%", "%CONSTRAINT \t"+name+"\t%", + ).Row().Scan(&count) + + return nil + }) + + return count > 0 +} + +func (m Migrator) CurrentDatabase() (name string) { + var null interface{} + m.DB.Raw("PRAGMA database_list").Row().Scan(&null, &name, &null) + return +} + +func (m Migrator) BuildIndexOptions(opts []schema.IndexOption, stmt *gorm.Statement) (results []interface{}) { + for _, opt := range opts { + str := stmt.Quote(opt.DBName) + if opt.Expression != "" { + str = opt.Expression + } + + if opt.Collate != "" { + str += " COLLATE " + opt.Collate + } + + if opt.Sort != "" { + str += " " + opt.Sort + } + results = append(results, clause.Expr{SQL: str}) + } + return +} + +func (m Migrator) CreateIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + opts := m.BuildIndexOptions(idx.Fields, stmt) + values := []interface{}{clause.Column{Name: idx.Name}, clause.Table{Name: stmt.Table}, opts} + + createIndexSQL := "CREATE " + if idx.Class != "" { + createIndexSQL += idx.Class + " " + } + createIndexSQL += "INDEX ?" + + if idx.Type != "" { + createIndexSQL += " USING " + idx.Type + } + createIndexSQL += " ON ??" + + if idx.Where != "" { + createIndexSQL += " WHERE " + idx.Where + } + + return m.DB.Exec(createIndexSQL, values...).Error + } + } + return fmt.Errorf("failed to create index with name %v", name) + }) +} + +func (m Migrator) HasIndex(value interface{}, name string) bool { + var count int + m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, name, + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) RenameIndex(value interface{}, oldName, newName string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + var sql string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, oldName).Row().Scan(&sql) + if sql != "" { + if err := m.DropIndex(value, oldName); err != nil { + return err + } + return m.DB.Exec(strings.Replace(sql, oldName, newName, 1)).Error + } + return fmt.Errorf("failed to find index with name %v", oldName) + }) +} + +func (m Migrator) DropIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + } + + return m.DB.Exec("DROP INDEX ?", clause.Column{Name: name}).Error + }) +} + +func buildConstraint(constraint *schema.Constraint) (sql string, results []interface{}) { + sql = "CONSTRAINT ? FOREIGN KEY ? REFERENCES ??" + if constraint.OnDelete != "" { + sql += " ON DELETE " + constraint.OnDelete + } + + if constraint.OnUpdate != "" { + sql += " ON UPDATE " + constraint.OnUpdate + } + + var foreignKeys, references []interface{} + for _, field := range constraint.ForeignKeys { + foreignKeys = append(foreignKeys, clause.Column{Name: field.DBName}) + } + + for _, field := range constraint.References { + references = append(references, clause.Column{Name: field.DBName}) + } + results = append(results, clause.Table{Name: constraint.Name}, foreignKeys, clause.Table{Name: constraint.ReferenceSchema.Table}, references) + return +} + +func (m Migrator) getRawDDL(table string) (string, error) { + var createSQL string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "table", table, table).Row().Scan(&createSQL) + + if m.DB.Error != nil { + return "", m.DB.Error + } + return createSQL, nil +} + +func (m Migrator) recreateTable(value interface{}, tablePtr *string, + getCreateSQL func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error)) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + table := stmt.Table + if tablePtr != nil { + table = *tablePtr + } + + rawDDL, err := m.getRawDDL(table) + if err != nil { + return err + } + + newTableName := table + "__temp" + + createSQL, sqlArgs, err := getCreateSQL(rawDDL, stmt) + if err != nil { + return err + } + if createSQL == "" { + return nil + } + + tableReg, err := regexp.Compile("\\s*('|`|\")?\\b" + table + "\\b('|`|\")?\\s*") + if err != nil { + return err + } + createSQL = tableReg.ReplaceAllString(createSQL, fmt.Sprintf(" `%v` ", newTableName)) + + createDDL, err := parseDDL(createSQL) + if err != nil { + return err + } + columns := createDDL.getColumns() + + return m.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Exec(createSQL, sqlArgs...).Error; err != nil { + return err + } + + queries := []string{ + fmt.Sprintf("INSERT INTO `%v`(%v) SELECT %v FROM `%v`", newTableName, strings.Join(columns, ","), strings.Join(columns, ","), table), + fmt.Sprintf("DROP TABLE `%v`", table), + fmt.Sprintf("ALTER TABLE `%v` RENAME TO `%v`", newTableName, table), + } + for _, query := range queries { + if err := tx.Exec(query).Error; err != nil { + return err + } + } + return nil + }) + }) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go new file mode 100644 index 0000000000..837d57c935 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go @@ -0,0 +1,219 @@ +// Package gormlite provides a GORM driver for SQLite. +package gormlite + +import ( + "context" + "database/sql" + "strconv" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/callbacks" + "gorm.io/gorm/clause" + "gorm.io/gorm/logger" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" + + _ "github.com/ncruces/go-sqlite3/driver" +) + +type Dialector struct { + DSN string + Conn gorm.ConnPool +} + +func Open(dsn string) gorm.Dialector { + return &Dialector{DSN: dsn} +} + +func (dialector Dialector) Name() string { + return "sqlite" +} + +func (dialector Dialector) Initialize(db *gorm.DB) (err error) { + if dialector.Conn != nil { + db.ConnPool = dialector.Conn + } else { + conn, err := sql.Open("sqlite3", dialector.DSN) + if err != nil { + return err + } + db.ConnPool = conn + } + + var version string + if err := db.ConnPool.QueryRowContext(context.Background(), "select sqlite_version()").Scan(&version); err != nil { + return err + } + // https://www.sqlite.org/releaselog/3_35_0.html + if compareVersion(version, "3.35.0") >= 0 { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + CreateClauses: []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, + UpdateClauses: []string{"UPDATE", "SET", "WHERE", "RETURNING"}, + DeleteClauses: []string{"DELETE", "FROM", "WHERE", "RETURNING"}, + LastInsertIDReversed: true, + }) + } else { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + LastInsertIDReversed: true, + }) + } + + for k, v := range dialector.ClauseBuilders() { + db.ClauseBuilders[k] = v + } + return +} + +func (dialector Dialector) ClauseBuilders() map[string]clause.ClauseBuilder { + return map[string]clause.ClauseBuilder{ + "INSERT": func(c clause.Clause, builder clause.Builder) { + if insert, ok := c.Expression.(clause.Insert); ok { + if stmt, ok := builder.(*gorm.Statement); ok { + stmt.WriteString("INSERT ") + if insert.Modifier != "" { + stmt.WriteString(insert.Modifier) + stmt.WriteByte(' ') + } + + stmt.WriteString("INTO ") + if insert.Table.Name == "" { + stmt.WriteQuoted(stmt.Table) + } else { + stmt.WriteQuoted(insert.Table) + } + return + } + } + + c.Build(builder) + }, + "LIMIT": func(c clause.Clause, builder clause.Builder) { + if limit, ok := c.Expression.(clause.Limit); ok { + var lmt = -1 + if limit.Limit != nil && *limit.Limit >= 0 { + lmt = *limit.Limit + } + if lmt >= 0 || limit.Offset > 0 { + builder.WriteString("LIMIT ") + builder.WriteString(strconv.Itoa(lmt)) + } + if limit.Offset > 0 { + builder.WriteString(" OFFSET ") + builder.WriteString(strconv.Itoa(limit.Offset)) + } + } + }, + "FOR": func(c clause.Clause, builder clause.Builder) { + if _, ok := c.Expression.(clause.Locking); ok { + // SQLite3 does not support row-level locking. + return + } + c.Build(builder) + }, + } +} + +func (dialector Dialector) DefaultValueOf(field *schema.Field) clause.Expression { + if field.AutoIncrement { + return clause.Expr{SQL: "NULL"} + } + + // doesn't work, will raise error + return clause.Expr{SQL: "DEFAULT"} +} + +func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator { + return Migrator{migrator.Migrator{Config: migrator.Config{ + DB: db, + Dialector: dialector, + CreateIndexAfterCreateTable: true, + }}} +} + +func (dialector Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v interface{}) { + writer.WriteByte('?') +} + +func (dialector Dialector) QuoteTo(writer clause.Writer, str string) { + writer.WriteByte('`') + if strings.Contains(str, ".") { + for idx, str := range strings.Split(str, ".") { + if idx > 0 { + writer.WriteString(".`") + } + writer.WriteString(str) + writer.WriteByte('`') + } + } else { + writer.WriteString(str) + writer.WriteByte('`') + } +} + +func (dialector Dialector) Explain(sql string, vars ...interface{}) string { + return logger.ExplainSQL(sql, nil, `"`, vars...) +} + +func (dialector Dialector) DataTypeOf(field *schema.Field) string { + switch field.DataType { + case schema.Bool: + return "numeric" + case schema.Int, schema.Uint: + if field.AutoIncrement && !field.PrimaryKey { + // https://www.sqlite.org/autoinc.html + return "integer PRIMARY KEY AUTOINCREMENT" + } else { + return "integer" + } + case schema.Float: + return "real" + case schema.String: + return "text" + case schema.Time: + // Distinguish between schema.Time and tag time + if val, ok := field.TagSettings["TYPE"]; ok { + return val + } else { + return "datetime" + } + case schema.Bytes: + return "blob" + } + + return string(field.DataType) +} + +func (dialectopr Dialector) SavePoint(tx *gorm.DB, name string) error { + tx.Exec("SAVEPOINT " + name) + return nil +} + +func (dialectopr Dialector) RollbackTo(tx *gorm.DB, name string) error { + tx.Exec("ROLLBACK TO SAVEPOINT " + name) + return nil +} + +func compareVersion(version1, version2 string) int { + n, m := len(version1), len(version2) + i, j := 0, 0 + for i < n || j < m { + x := 0 + for ; i < n && version1[i] != '.'; i++ { + x = x*10 + int(version1[i]-'0') + } + i++ + y := 0 + for ; j < m && version2[j] != '.'; j++ { + y = y*10 + int(version2[j]-'0') + } + j++ + if x > y { + return 1 + } + if x < y { + return -1 + } + } + return 0 +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh b/vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh new file mode 100644 index 0000000000..4fc43ce7ce --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd -P -- "$(dirname -- "$0")" + +rm -rf gorm/ tests/ "$(dirname $(mktemp -u))/gorm.db" +git clone --filter=blob:none https://github.com/go-gorm/gorm.git +mv gorm/tests tests +rm -rf gorm/ + +patch -p1 -N < tests.patch + +cd tests +go mod edit \ + -require github.com/ncruces/go-sqlite3/gormlite@v0.0.0 \ + -replace github.com/ncruces/go-sqlite3/gormlite=../ \ + -replace github.com/ncruces/go-sqlite3=../../ \ + -droprequire gorm.io/driver/sqlite \ + -dropreplace gorm.io/gorm +go mod tidy && go work use . && go test + +cd .. +rm -rf tests/ "$(dirname $(mktemp -u))/gorm.db" +go work use -r . \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch b/vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch new file mode 100644 index 0000000000..01269e3931 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch @@ -0,0 +1,31 @@ +diff --git a/tests/.gitignore b/tests/.gitignore +--- a/tests/.gitignore ++++ b/tests/.gitignore +@@ -1 +1 @@ +-go.sum ++* +diff --git a/tests/tests_test.go b/tests/tests_test.go +--- a/tests/tests_test.go ++++ b/tests/tests_test.go +@@ -7,9 +7,11 @@ import ( + "path/filepath" + "time" + ++ _ "github.com/ncruces/go-sqlite3/embed" ++ sqlite "github.com/ncruces/go-sqlite3/gormlite" ++ + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" +- "gorm.io/driver/sqlite" + "gorm.io/driver/sqlserver" + "gorm.io/gorm" + "gorm.io/gorm/logger" +@@ -89,7 +91,7 @@ func OpenTestConnection(cfg *gorm.Config) (db *gorm.DB, err error) { + db, err = gorm.Open(mysql.Open(dbDSN), cfg) + default: + log.Println("testing sqlite3...") +- db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db?_foreign_keys=on")), cfg) ++ db, err = gorm.Open(sqlite.Open("file:"+filepath.Join(os.TempDir(), "gorm.db")+"?_pragma=busy_timeout(1000)&_pragma=foreign_keys(1)"), cfg) + } + + if err != nil { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go index 65efe3b39e..9ff775774c 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go @@ -10,6 +10,32 @@ import ( type i32 interface{ ~int32 | ~uint32 } type i64 interface{ ~int64 | ~uint64 } +type funcVI[T0 i32] func(context.Context, api.Module, T0) + +func (fn funcVI[T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { + fn(ctx, mod, T0(stack[0])) +} + +func ExportFuncVI[T0 i32](mod wazero.HostModuleBuilder, name string, fn func(context.Context, api.Module, T0)) { + mod.NewFunctionBuilder(). + WithGoModuleFunction(funcVI[T0](fn), + []api.ValueType{api.ValueTypeI32}, nil). + Export(name) +} + +type funcVIII[T0, T1, T2 i32] func(context.Context, api.Module, T0, T1, T2) + +func (fn funcVIII[T0, T1, T2]) Call(ctx context.Context, mod api.Module, stack []uint64) { + fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2])) +} + +func ExportFuncVIII[T0, T1, T2 i32](mod wazero.HostModuleBuilder, name string, fn func(context.Context, api.Module, T0, T1, T2)) { + mod.NewFunctionBuilder(). + WithGoModuleFunction(funcVIII[T0, T1, T2](fn), + []api.ValueType{api.ValueTypeI32, api.ValueTypeI32, api.ValueTypeI32}, nil). + Export(name) +} + type funcII[TR, T0 i32] func(context.Context, api.Module, T0) TR func (fn funcII[TR, T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go new file mode 100644 index 0000000000..2309ed478f --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go @@ -0,0 +1,75 @@ +package util + +import ( + "context" + "io" + + "github.com/tetratelabs/wazero/experimental" +) + +type handleKey struct{} +type handleState struct { + handles []any + empty int +} + +func NewContext(ctx context.Context) context.Context { + state := new(handleState) + ctx = experimental.WithCloseNotifier(ctx, state) + ctx = context.WithValue(ctx, handleKey{}, state) + return ctx +} + +func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { + for _, h := range s.handles { + if c, ok := h.(io.Closer); ok { + c.Close() + } + } + s.handles = nil + s.empty = 0 +} + +func GetHandle(ctx context.Context, id uint32) any { + if id == 0 { + return nil + } + s := ctx.Value(handleKey{}).(*handleState) + return s.handles[^id] +} + +func DelHandle(ctx context.Context, id uint32) error { + if id == 0 { + return nil + } + s := ctx.Value(handleKey{}).(*handleState) + a := s.handles[^id] + s.handles[^id] = nil + s.empty++ + if c, ok := a.(io.Closer); ok { + return c.Close() + } + return nil +} + +func AddHandle(ctx context.Context, a any) (id uint32) { + if a == nil { + panic(NilErr) + } + s := ctx.Value(handleKey{}).(*handleState) + + // Find an empty slot. + if s.empty > cap(s.handles)-len(s.handles) { + for id, h := range s.handles { + if h == nil { + s.empty-- + s.handles[id] = a + return ^uint32(id) + } + } + } + + // Add a new slot. + s.handles = append(s.handles, a) + return -uint32(len(s.handles)) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/module.go b/vendor/github.com/ncruces/go-sqlite3/sqlite.go similarity index 57% rename from vendor/github.com/ncruces/go-sqlite3/module.go rename to vendor/github.com/ncruces/go-sqlite3/sqlite.go index e279601629..f442a723d2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/module.go +++ b/vendor/github.com/ncruces/go-sqlite3/sqlite.go @@ -3,7 +3,6 @@ package sqlite3 import ( "context" - "io" "math" "os" "sync" @@ -25,70 +24,67 @@ var ( Path string // Path to load the binary from. ) -var sqlite3 struct { +var instance struct { runtime wazero.Runtime compiled wazero.CompiledModule err error once sync.Once } -func instantiateModule() (*module, error) { +func compileSQLite() { ctx := context.Background() + instance.runtime = wazero.NewRuntime(ctx) - sqlite3.once.Do(compileModule) - if sqlite3.err != nil { - return nil, sqlite3.err - } - - cfg := wazero.NewModuleConfig() - - mod, err := sqlite3.runtime.InstantiateModule(ctx, sqlite3.compiled, cfg) - if err != nil { - return nil, err - } - return newModule(mod) -} - -func compileModule() { - ctx := context.Background() - sqlite3.runtime = wazero.NewRuntime(ctx) - - env := vfs.ExportHostFunctions(sqlite3.runtime.NewHostModuleBuilder("env")) - _, sqlite3.err = env.Instantiate(ctx) - if sqlite3.err != nil { + env := instance.runtime.NewHostModuleBuilder("env") + env = vfs.ExportHostFunctions(env) + env = exportHostFunctions(env) + _, instance.err = env.Instantiate(ctx) + if instance.err != nil { return } bin := Binary if bin == nil && Path != "" { - bin, sqlite3.err = os.ReadFile(Path) - if sqlite3.err != nil { + bin, instance.err = os.ReadFile(Path) + if instance.err != nil { return } } if bin == nil { - sqlite3.err = util.BinaryErr + instance.err = util.BinaryErr return } - sqlite3.compiled, sqlite3.err = sqlite3.runtime.CompileModule(ctx, bin) + instance.compiled, instance.err = instance.runtime.CompileModule(ctx, bin) } -type module struct { - ctx context.Context - mod api.Module - vfs io.Closer - api sqliteAPI - arg [8]uint64 +type sqlite struct { + ctx context.Context + mod api.Module + api sqliteAPI + stack [8]uint64 } -func newModule(mod api.Module) (m *module, err error) { - m = new(module) - m.mod = mod - m.ctx, m.vfs = vfs.NewContext(context.Background()) +type sqliteKey struct{} + +func instantiateSQLite() (sqlt *sqlite, err error) { + instance.once.Do(compileSQLite) + if instance.err != nil { + return nil, instance.err + } + + sqlt = new(sqlite) + sqlt.ctx = util.NewContext(context.Background()) + sqlt.ctx = context.WithValue(sqlt.ctx, sqliteKey{}, sqlt) + + sqlt.mod, err = instance.runtime.InstantiateModule(sqlt.ctx, + instance.compiled, wazero.NewModuleConfig()) + if err != nil { + return nil, err + } getFun := func(name string) api.Function { - f := mod.ExportedFunction(name) + f := sqlt.mod.ExportedFunction(name) if f == nil { err = util.NoFuncErr + util.ErrorString(name) return nil @@ -97,15 +93,15 @@ func newModule(mod api.Module) (m *module, err error) { } getVal := func(name string) uint32 { - g := mod.ExportedGlobal(name) + g := sqlt.mod.ExportedGlobal(name) if g == nil { err = util.NoGlobalErr + util.ErrorString(name) return 0 } - return util.ReadUint32(mod, uint32(g.Get())) + return util.ReadUint32(sqlt.mod, uint32(g.Get())) } - m.api = sqliteAPI{ + sqlt.api = sqliteAPI{ free: getFun("free"), malloc: getFun("malloc"), destructor: getVal("malloc_destructor"), @@ -153,20 +149,43 @@ func newModule(mod api.Module) (m *module, err error) { changes: getFun("sqlite3_changes64"), lastRowid: getFun("sqlite3_last_insert_rowid"), autocommit: getFun("sqlite3_get_autocommit"), + anyCollation: getFun("sqlite3_anycollseq_init"), + createCollation: getFun("sqlite3_create_collation_go"), + createFunction: getFun("sqlite3_create_function_go"), + createAggregate: getFun("sqlite3_create_aggregate_function_go"), + createWindow: getFun("sqlite3_create_window_function_go"), + aggregateCtx: getFun("sqlite3_aggregate_context"), + userData: getFun("sqlite3_user_data"), + setAuxData: getFun("sqlite3_set_auxdata_go"), + getAuxData: getFun("sqlite3_get_auxdata"), + valueType: getFun("sqlite3_value_type"), + valueInteger: getFun("sqlite3_value_int64"), + valueFloat: getFun("sqlite3_value_double"), + valueText: getFun("sqlite3_value_text"), + valueBlob: getFun("sqlite3_value_blob"), + valueBytes: getFun("sqlite3_value_bytes"), + resultNull: getFun("sqlite3_result_null"), + resultInteger: getFun("sqlite3_result_int64"), + resultFloat: getFun("sqlite3_result_double"), + resultText: getFun("sqlite3_result_text64"), + resultBlob: getFun("sqlite3_result_blob64"), + resultZeroBlob: getFun("sqlite3_result_zeroblob64"), + resultError: getFun("sqlite3_result_error"), + resultErrorCode: getFun("sqlite3_result_error_code"), + resultErrorMem: getFun("sqlite3_result_error_nomem"), + resultErrorBig: getFun("sqlite3_result_error_toobig"), } if err != nil { return nil, err } - return m, nil + return sqlt, nil } -func (m *module) close() error { - err := m.mod.Close(m.ctx) - m.vfs.Close() - return err +func (sqlt *sqlite) close() error { + return sqlt.mod.Close(sqlt.ctx) } -func (m *module) error(rc uint64, handle uint32, sql ...string) error { +func (sqlt *sqlite) error(rc uint64, handle uint32, sql ...string) error { if rc == _OK { return nil } @@ -177,16 +196,16 @@ func (m *module) error(rc uint64, handle uint32, sql ...string) error { panic(util.OOMErr) } - if r := m.call(m.api.errstr, rc); r != 0 { - err.str = util.ReadString(m.mod, uint32(r), _MAX_STRING) + if r := sqlt.call(sqlt.api.errstr, rc); r != 0 { + err.str = util.ReadString(sqlt.mod, uint32(r), _MAX_STRING) } - if r := m.call(m.api.errmsg, uint64(handle)); r != 0 { - err.msg = util.ReadString(m.mod, uint32(r), _MAX_STRING) + if r := sqlt.call(sqlt.api.errmsg, uint64(handle)); r != 0 { + err.msg = util.ReadString(sqlt.mod, uint32(r), _MAX_STRING) } if sql != nil { - if r := m.call(m.api.erroff, uint64(handle)); r != math.MaxUint32 { + if r := sqlt.call(sqlt.api.erroff, uint64(handle)); r != math.MaxUint32 { err.sql = sql[0][r:] } } @@ -198,60 +217,58 @@ func (m *module) error(rc uint64, handle uint32, sql ...string) error { return &err } -func (m *module) call(fn api.Function, params ...uint64) uint64 { - copy(m.arg[:], params) - err := fn.CallWithStack(m.ctx, m.arg[:]) +func (sqlt *sqlite) call(fn api.Function, params ...uint64) uint64 { + copy(sqlt.stack[:], params) + err := fn.CallWithStack(sqlt.ctx, sqlt.stack[:]) if err != nil { - // The module closed or panicked; release resources. - m.vfs.Close() panic(err) } - return m.arg[0] + return sqlt.stack[0] } -func (m *module) free(ptr uint32) { +func (sqlt *sqlite) free(ptr uint32) { if ptr == 0 { return } - m.call(m.api.free, uint64(ptr)) + sqlt.call(sqlt.api.free, uint64(ptr)) } -func (m *module) new(size uint64) uint32 { +func (sqlt *sqlite) new(size uint64) uint32 { if size > _MAX_ALLOCATION_SIZE { panic(util.OOMErr) } - ptr := uint32(m.call(m.api.malloc, size)) + ptr := uint32(sqlt.call(sqlt.api.malloc, size)) if ptr == 0 && size != 0 { panic(util.OOMErr) } return ptr } -func (m *module) newBytes(b []byte) uint32 { +func (sqlt *sqlite) newBytes(b []byte) uint32 { if b == nil { return 0 } - ptr := m.new(uint64(len(b))) - util.WriteBytes(m.mod, ptr, b) + ptr := sqlt.new(uint64(len(b))) + util.WriteBytes(sqlt.mod, ptr, b) return ptr } -func (m *module) newString(s string) uint32 { - ptr := m.new(uint64(len(s) + 1)) - util.WriteString(m.mod, ptr, s) +func (sqlt *sqlite) newString(s string) uint32 { + ptr := sqlt.new(uint64(len(s) + 1)) + util.WriteString(sqlt.mod, ptr, s) return ptr } -func (m *module) newArena(size uint64) arena { +func (sqlt *sqlite) newArena(size uint64) arena { return arena{ - m: m, - base: m.new(size), + sqlt: sqlt, size: uint32(size), + base: sqlt.new(size), } } type arena struct { - m *module + sqlt *sqlite ptrs []uint32 base uint32 next uint32 @@ -259,17 +276,17 @@ type arena struct { } func (a *arena) free() { - if a.m == nil { + if a.sqlt == nil { return } a.reset() - a.m.free(a.base) - a.m = nil + a.sqlt.free(a.base) + a.sqlt = nil } func (a *arena) reset() { for _, ptr := range a.ptrs { - a.m.free(ptr) + a.sqlt.free(ptr) } a.ptrs = nil a.next = 0 @@ -281,7 +298,7 @@ func (a *arena) new(size uint64) uint32 { a.next += uint32(size) return ptr } - ptr := a.m.new(size) + ptr := a.sqlt.new(size) a.ptrs = append(a.ptrs, ptr) return ptr } @@ -291,13 +308,13 @@ func (a *arena) bytes(b []byte) uint32 { return 0 } ptr := a.new(uint64(len(b))) - util.WriteBytes(a.m.mod, ptr, b) + util.WriteBytes(a.sqlt.mod, ptr, b) return ptr } func (a *arena) string(s string) uint32 { ptr := a.new(uint64(len(s) + 1)) - util.WriteString(a.m.mod, ptr, s) + util.WriteString(a.sqlt.mod, ptr, s) return ptr } @@ -317,10 +334,10 @@ type sqliteAPI struct { step api.Function exec api.Function clearBindings api.Function - bindNull api.Function bindCount api.Function bindIndex api.Function bindName api.Function + bindNull api.Function bindInteger api.Function bindFloat api.Function bindText api.Function @@ -348,5 +365,30 @@ type sqliteAPI struct { changes api.Function lastRowid api.Function autocommit api.Function + anyCollation api.Function + createCollation api.Function + createFunction api.Function + createAggregate api.Function + createWindow api.Function + aggregateCtx api.Function + userData api.Function + setAuxData api.Function + getAuxData api.Function + valueType api.Function + valueInteger api.Function + valueFloat api.Function + valueText api.Function + valueBlob api.Function + valueBytes api.Function + resultNull api.Function + resultInteger api.Function + resultFloat api.Function + resultText api.Function + resultBlob api.Function + resultZeroBlob api.Function + resultError api.Function + resultErrorCode api.Function + resultErrorMem api.Function + resultErrorBig api.Function destructor uint32 } diff --git a/vendor/github.com/ncruces/go-sqlite3/stmt.go b/vendor/github.com/ncruces/go-sqlite3/stmt.go index 2fae0b40fb..c26de44cc2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/stmt.go +++ b/vendor/github.com/ncruces/go-sqlite3/stmt.go @@ -131,10 +131,11 @@ func (s *Stmt) BindName(param int) string { // // https://www.sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindBool(param int, value bool) error { + var i int64 if value { - return s.BindInt64(param, 1) + i = 1 } - return s.BindInt64(param, 0) + return s.BindInt64(param, i) } // BindInt binds an int to the prepared statement. @@ -374,18 +375,7 @@ func (s *Stmt) ColumnBlob(col int, buf []byte) []byte { func (s *Stmt) ColumnRawText(col int) []byte { r := s.c.call(s.c.api.columnText, uint64(s.handle), uint64(col)) - - ptr := uint32(r) - if ptr == 0 { - r = s.c.call(s.c.api.errcode, uint64(s.c.handle)) - s.err = s.c.error(r) - return nil - } - - r = s.c.call(s.c.api.columnBytes, - uint64(s.handle), uint64(col)) - - return util.View(s.c.mod, ptr, r) + return s.columnRawBytes(col, uint32(r)) } // ColumnRawBlob returns the value of the result column as a []byte. @@ -397,17 +387,18 @@ func (s *Stmt) ColumnRawText(col int) []byte { func (s *Stmt) ColumnRawBlob(col int) []byte { r := s.c.call(s.c.api.columnBlob, uint64(s.handle), uint64(col)) + return s.columnRawBytes(col, uint32(r)) +} - ptr := uint32(r) +func (s *Stmt) columnRawBytes(col int, ptr uint32) []byte { if ptr == 0 { - r = s.c.call(s.c.api.errcode, uint64(s.c.handle)) + r := s.c.call(s.c.api.errcode, uint64(s.c.handle)) s.err = s.c.error(r) return nil } - r = s.c.call(s.c.api.columnBytes, + r := s.c.call(s.c.api.columnBytes, uint64(s.handle), uint64(col)) - return util.View(s.c.mod, ptr, r) } diff --git a/vendor/github.com/ncruces/go-sqlite3/value.go b/vendor/github.com/ncruces/go-sqlite3/value.go new file mode 100644 index 0000000000..aed10561e5 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/value.go @@ -0,0 +1,125 @@ +package sqlite3 + +import ( + "math" + "time" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +// Value is any value that can be stored in a database table. +// +// https://www.sqlite.org/c3ref/value.html +type Value struct { + *sqlite + handle uint32 +} + +// Type returns the initial [Datatype] of the value. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Type() Datatype { + r := v.call(v.api.valueType, uint64(v.handle)) + return Datatype(r) +} + +// Bool returns the value as a bool. +// SQLite does not have a separate boolean storage class. +// Instead, boolean values are retrieved as integers, +// with 0 converted to false and any other value to true. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Bool() bool { + if i := v.Int64(); i != 0 { + return true + } + return false +} + +// Int returns the value as an int. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Int() int { + return int(v.Int64()) +} + +// Int64 returns the value as an int64. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Int64() int64 { + r := v.call(v.api.valueInteger, uint64(v.handle)) + return int64(r) +} + +// Float returns the value as a float64. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Float() float64 { + r := v.call(v.api.valueFloat, uint64(v.handle)) + return math.Float64frombits(r) +} + +// Time returns the value as a [time.Time]. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Time(format TimeFormat) time.Time { + var a any + switch v.Type() { + case INTEGER: + a = v.Int64() + case FLOAT: + a = v.Float() + case TEXT, BLOB: + a = v.Text() + case NULL: + return time.Time{} + default: + panic(util.AssertErr()) + } + t, _ := format.Decode(a) + return t +} + +// Text returns the value as a string. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Text() string { + return string(v.RawText()) +} + +// Blob appends to buf and returns +// the value as a []byte. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Blob(buf []byte) []byte { + return append(buf, v.RawBlob()...) +} + +// RawText returns the value as a []byte. +// The []byte is owned by SQLite and may be invalidated by +// subsequent calls to [Value] methods. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) RawText() []byte { + r := v.call(v.api.valueText, uint64(v.handle)) + return v.rawBytes(uint32(r)) +} + +// RawBlob returns the value as a []byte. +// The []byte is owned by SQLite and may be invalidated by +// subsequent calls to [Value] methods. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) RawBlob() []byte { + r := v.call(v.api.valueBlob, uint64(v.handle)) + return v.rawBytes(uint32(r)) +} + +func (v Value) rawBytes(ptr uint32) []byte { + if ptr == 0 { + return nil + } + + r := v.call(v.api.valueBytes, uint64(v.handle)) + return util.View(v.mod, ptr, r) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go index 7425096241..158f1731d2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go @@ -15,7 +15,7 @@ type VFS interface { FullPathname(name string) (string, error) } -// VFSParams extends VFS to with the ability to handle URI parameters +// VFSParams extends VFS with the ability to handle URI parameters // through the OpenParams method. // // https://www.sqlite.org/c3ref/uri_boolean.html diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/clear.go b/vendor/github.com/ncruces/go-sqlite3/vfs/clear.go new file mode 100644 index 0000000000..035458e687 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/clear.go @@ -0,0 +1,9 @@ +//go:build !go1.21 + +package vfs + +func clear(b []byte) { + for i := range b { + b[i] = 0 + } +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go index e50bacffc8..3114705b7b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go @@ -44,33 +44,6 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder return env } -type vfsKey struct{} -type vfsState struct { - files []File -} - -// NewContext is an internal API users need not call directly. -// -// NewContext creates a new context to hold [api.Module] specific VFS data. -// The context should be passed to any [api.Function] calls that might -// generate VFS host callbacks. -// The returned [io.Closer] should be closed after the [api.Module] is closed, -// to release any associated resources. -func NewContext(ctx context.Context) (context.Context, io.Closer) { - vfs := new(vfsState) - return context.WithValue(ctx, vfsKey{}, vfs), vfs -} - -func (vfs *vfsState) Close() error { - for _, f := range vfs.files { - if f != nil { - f.Close() - } - } - vfs.files = nil - return nil -} - func vfsFind(ctx context.Context, mod api.Module, zVfsName uint32) uint32 { name := util.ReadString(mod, zVfsName, _MAX_STRING) if vfs := Find(name); vfs != nil && vfs != (vfsOS{}) { @@ -183,6 +156,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla file, flags, err = vfs.Open(path, flags) } + if err != nil { + return vfsErrorCode(err, _CANTOPEN) + } + if file, ok := file.(FilePowersafeOverwrite); ok { if !parsed { params = vfsURIParameters(ctx, mod, zPath, flags) @@ -192,14 +169,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla } } - if err != nil { - return vfsErrorCode(err, _CANTOPEN) - } - - vfsFileRegister(ctx, mod, pFile, file) if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } + vfsFileRegister(ctx, mod, pFile, file) return _OK } @@ -431,40 +404,22 @@ func vfsGet(mod api.Module, pVfs uint32) VFS { panic(util.NoVFSErr + util.ErrorString(name)) } -func vfsFileNew(vfs *vfsState, file File) uint32 { - // Find an empty slot. - for id, f := range vfs.files { - if f == nil { - vfs.files[id] = file - return uint32(id) - } - } - - // Add a new slot. - vfs.files = append(vfs.files, file) - return uint32(len(vfs.files) - 1) -} - func vfsFileRegister(ctx context.Context, mod api.Module, pFile uint32, file File) { const fileHandleOffset = 4 - id := vfsFileNew(ctx.Value(vfsKey{}).(*vfsState), file) + id := util.AddHandle(ctx, file) util.WriteUint32(mod, pFile+fileHandleOffset, id) } func vfsFileGet(ctx context.Context, mod api.Module, pFile uint32) File { const fileHandleOffset = 4 - vfs := ctx.Value(vfsKey{}).(*vfsState) id := util.ReadUint32(mod, pFile+fileHandleOffset) - return vfs.files[id] + return util.GetHandle(ctx, id).(File) } func vfsFileClose(ctx context.Context, mod api.Module, pFile uint32) error { const fileHandleOffset = 4 - vfs := ctx.Value(vfsKey{}).(*vfsState) id := util.ReadUint32(mod, pFile+fileHandleOffset) - file := vfs.files[id] - vfs.files[id] = nil - return file.Close() + return util.DelHandle(ctx, id) } func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { @@ -477,9 +432,3 @@ func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { } return def } - -func clear(b []byte) { - for i := range b { - b[i] = 0 - } -} diff --git a/vendor/github.com/reeflective/team/LICENSE b/vendor/github.com/reeflective/team/LICENSE new file mode 100644 index 0000000000..f288702d2f --- /dev/null +++ b/vendor/github.com/reeflective/team/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/vendor/github.com/reeflective/team/README.md b/vendor/github.com/reeflective/team/README.md index d9e926c2e7..c3c5fcb160 100644 --- a/vendor/github.com/reeflective/team/README.md +++ b/vendor/github.com/reeflective/team/README.md @@ -1,25 +1,4 @@ - - - - - - - - - - - - - - - - - - - - -


    Team

    @@ -66,23 +45,276 @@ ----- - ## Summary ------ +The client-server paradigm is an ubiquitous concept in computer science. Equally large and common is +the problem of building software that _collaborates_ easily with other peer programs. Although +writing collaborative software seems to be the daily task of many engineers around the world, +succeedingly and easily doing so in big programs as well as in smaller ones is not more easily done +than said. Difficulty still increases -and keeping in mind that humans use software and not the +inverse- when programs must enhance the capacity of humans to collaborate while not restricting the +number of ways they can do so, for small tasks as well as for complex ones. + +The `reeflective/team` library provides a small toolset for arbitrary programs (and especially those +controlled in more or less interactive ways) to collaborate together by acting as clients and +servers of each others, as part of a team. Teams being made of players (humans _and_ their tools), +the library focuses on offering a toolset for "human teaming": that is, treating software tools that +are either _teamclients_ or _teamservers_ of others, within a defined -generally restricted- team of +users, which shall generally be strictly and securely authenticated. + +The project originates from the refactoring of a security-oriented tool that used this approach to +clearly segregate client and server binary code (the former's not needing most of the latter's). +Besides, the large exposure of the said-tool to the CLI prompted the author of the +`reeflective/team` library to rethink how the notion of "collaborative programs" could be approached +and explored from different viewpoints: distinguishing between the tools' developers, and their +users. After having to reuse this core code for other projects, the idea appeared to extract the +relevant parts and to restructure and repackage them behind coherent interfaces (API and CLI). -## CLI examples (users) ----- +## Components & Terms + +The result consists in 2 Go packages (`client` and `server`) for programs needing to act as: +- A **Team client**: a program, or one of its components, that needs to rely on a "remote" program peer + to serve some functionality that is available to a team of users' tools. The program acting as a + _teamclient_ may do so for things as simple as sending a message to the team, or as complicated as a + compiler backend with which multiple client programs can send data to process and build. +- A **Team server**: The remote, server-side counterpart of the software teamclient. Again, the + teamserver can be doing anything, from simply notifying users' teamclient connections to all the team + all the way to handling very complex and resource-hungry tasks that can only be ran on a server host. + +Throughout this library and its documentation, various words are repeatedly employed: +- _teamclient_ refers to either the client-specific toolset provided by this library + (`team/client.Client` core type) or the software making use of this teamclient code. +- _teamserver_ refers to either the server-specific toolset provided to make a program serve its + functionality remotely, or to the tools embedding this code in order to do so. +- _team tool/s_ might be used to refer to programs using either or all of the library components at + large. -## API examples (developers) +----- +## Principles, Constraints & Features + +The library rests on several principles, constraints and ideas to fulfill its intended purpose: +- The library's sole aim is to **make most programs able to collaborate together** under the + paradigm of team clients and team servers, and to do so while ensuring performance, coherence, + ease of use and security of all processes and workflows involved. This, under the _separate + viewpoints_ of tool development, enhancement and usage. +- Ensure a **working-by-default toolset**, assuming that the time spent on any tool's configuration + is inversely proportional to its usage. Emphasis on this aspect should apply equally well to team + tools' users and developers. +- Ensure the **full, secure and reliable authentication of all team clients and servers' + interactions**, by using certificate-based communication encryption and user authentication, _aka_ + "zero-trust" model. Related and equally important, ensure the various team toolset interfaces + provide for easy and secure usage of their host tools. +- **Accomodate for the needs of developers to use more specific components**, at times or at points, + while not hampering on the working-by-default aspects of the team client/server toolset. Examples + include replacing parts or all of the transport, RPC, loggers, database and filesystem + backends. +- To that effect, the library offers **different interfaces to its functionality**: an API (Go code) + provides developers a working-by-default, simple and powerful way to instruct their software how + to collaborate with peers, and a CLI, for users to operate their team tools, manage their related + team configurations with ease, with a featured command-line tree to embed anywhere. +- Ensure that team client/server functionality can be **easily integrated in automated workflows**: + this is done by offering clear code/execution paths and behaviors, for both users and developers, + and by providing commands and functions to ease deployment of said tools. + +----- +## CLI (Users) + +The following extracts assume a program binary named `teamserver`, which is simply the root command +of the server-side team code. In this case therefore, the binary program only purpose its to be a +teamserver, with no application-specific logic, (and is therefore quite useless on its own): +``` +$ teamserver +Manage the application server-side teamserver and users + +Usage: + teamserver [command] + +teamserver control + client Client-only teamserver commands (import configs, show users, etc) + close Close a listener and remove it from persistent ones if it's one + daemon Start the teamserver in daemon mode (blocking) + listen Start a teamserver listener (non-blocking) + status Show the status of the teamserver (listeners, configurations, health...) + systemd Print a systemd unit file for the application teamserver, with options + +user management + delete Remove a user from the teamserver, and revoke all its current tokens + export Export a Certificate Authority file containing the teamserver users + import Import a certificate Authority file containing teamserver users + user Create a user for this teamserver and generate its client configuration file +``` + +In this example, this program comes with a client-only binary counterpart, `teamclient`. The latter +does not include any team server-specific code, and has therefore a much smaller command set: +``` +$ teamclient +Client-only teamserver commands (import configs, show users, etc) + +Usage: + teamclient [command] + +Available Commands: + import Import a teamserver client configuration file for teamserver + users Display a table of teamserver users and their status + version Print teamserver client version +``` + +With these example binaries at hand, below are some examples of workflows. +Starting with the `teamserver` binary (which might be under access/control of a team admin): +``` bash +# 1 - Generate a user for a local teamserver, and import users from a file. +teamserver user --name Michael --host localhost +teamserver import ~/.other_app/teamserver/certs/other_app_user-ca-cert.teamserver.pem + +# 2 - Start some teamserver listeners, then start the teamserver daemon (blocking). +# Use the application-defined default port in the first call, and instruct the server +# to start the listeners automatically when used in daemon mode with --persistent. +teamserver listen --host localhost --persistent +teamserver listen --host 172.10.0.10 --port 32333 --persistent +teamserver status # Prints the saved listeners, configured loggers, databases, etc. +teamserver daemon --host localhost --port 31337 # Blocking: serves all persistent listeners and a main one at localhost:31337 + +# 3 - Export and enable a systemd service configuration for the teamserver. +teamserver systemd # Use default host, port and listener stacks. +teamserver systemd --host localhost --binpath /path/to/teamserver # Specify binary path. +teamserver systemd --user --save ~/teamserver.service # Print to file instead of stdout. + +# 4 - Import the "remote" administrator configuration for (1), and use it. +teamserver client import ~/Michael_localhost.teamclient.cfg +teamserver client version # Print the client and the server version information. +teamserver client users # Print all users registered to the teamserver and their status. + +# 5 - Quality of life +teamserver _carapace # Source detailed the completion engine for the teamserver. +``` + +Continuing the `teamclient` binary (which is available to all users' tool in the team): +```bash +# Example 1 - Import a remote teamserver configuration file given by a team administrator. +teamclient import ~/Michael_localhost.teamclient.cfg + +# Example 2 - Query the server for its information. +teamclient users +teamclient version +``` ----- +## API (Developers) + +The teamclient and teamserver APIs are designed with several things in mind as well: +- While users are free to use their tools teamclients/servers within the bounds of the provided + command-line interface tree (`teamserver` and `teamclient` commands), the developers using the + library have access to a slightly larger API, especially with regards to "selection strategies" + (grossly, the way tools' teamclients choose their remote teamservers before connecting to them). + This is equivalent of saying that tools developers should have identified 70% of all different + scenarios/valid operation mode for their tools, and program their teamclients accounting for this, + but let the users decide of the remaining 30% when using the tools teamclient/server CLI commands. +- The library makes it easy to embed a teamclient or a teamserver in existing codebases, or easy to + include it in the ones who will need it in the future. In any case, importing and using a default + teamclient/teamserver should fit into a couple of function calls at most. +- To provide a documented code base, with a concise naming and programming model which allows equally + well to use default teamclient backends or to partially/fully reimplement different layers. + +Below is the simplest, shortest example of the above's `teamserver` binary `main()` function: +```go +// Generate a teamserver, without any specific transport/RPC backend. +// Such backends are only needed when the teamserver serves remote clients. +teamserver, err := server.New("teamserver") + +// Generate a tree of server-side commands: this tree also has client-only +// commands as a subcommand "client" of the "teamserver" command root here. +serverCmds := commands.Generate(teamserver, teamserver.Self()) + +// Run the teamserver CLI. +serverCmds.Execute() +``` + +Another slightly more complex example, involving a gRPC transport/RPC backend: +```go +// The examples directory has a default teamserver listener backend. +gTeamserver := grpc.NewListener() + +// Create a new teamserver, register the gRPC backend with it. +// All gRPC teamclients will be able to connect to our teamserver. +teamserver, err := server.New("teamserver", server.WithListener(gTeamserver)) + +// Since our teamserver offers its functionality through a gRPC layer, +// our teamclients must have the corresponding client-side RPC client backend. +// Create an in-memory gRPC teamclient backend for the server to serve itself. +gTeamclient := grpc.NewClientFrom(gTeamserver) + +// Create a new teamclient, registering the gRPC backend to it. +teamclient := teamserver.Self(client.WithDialer(gTeamclient)) + +// Generate the commands for the teamserver. +serverCmds := commands.Generate(teamserver, teamclient) + +// Run any of the commands. +serverCmds.Execute() +``` + +Some additional and preliminary/example notes about the codebase: +- All errors returned by the API are always logged before return (with configured log behavior). +- Interactions with the filesystem restrained until they need to happen. +- The default database is a pure Go file-based sqlite db, which can be configured to run in memory. +- Unless absolutely needed or specified otherwise, return all critical errors instead of log + fatal/panicking (exception made of the certificate infrastructure which absolutely needs to work + for security reasons). +- Exception made of the `teamserver daemon` command related `server.ServeDaemon` function, all API + functions and interface methods are non-blocking. Mentions of this are found throughout the + code documentation when needed. +- Loggers offered by the teamclient/server cores are never nil, and will log to both stdout (above + warning level) and to default files (above info level) if no custom logger is passed to them. + If such a custom logger is given, team clients/servers won't log to stdout or their default files. + +Please see the [example](https://github.com/reeflective/team/tree/main/example) directory for all client/server entrypoint examples. +----- ## Documentation +- Go code documentation is available at the [Godoc website](https://pkg.go.dev/github.com/reeflective/team). +- Client and server documentation can be found in the [directories section](https://pkg.go.dev/github.com/reeflective/team#section-directories) of the Go documentation. +- The `example/` subdirectories also include documentation for their own code, and should provide +a good introduction to this library usage. + ----- +## Differences with the Hashicorp Go plugin system + +At first glance, different and not much related to our current topic is the equally large problem of +dynamic code loading and execution for arbitrary programs. In the spectrum of major programming +languages, various approaches have been taken to tackle the dynamic linking, loading and execution +problem, with interpreted languages offering the most common solutioning approach to this. + +The Go language (and many other compiled languages that do not encourage dynamic linking for that +matter) has to deal with the problem through other means, the first of which simply being the +adoption of different architectural designs in the first place (eg. "microservices"). Another path +has been the "plugin system" for emulating the dynamic workflows of interpreted languages, of which +the most widely used attempt being the [Hashicorp plugin +system](https://github.com/hashicorp/go-plugin), which entirely rests on an (g)RPC backend. + +Consequently, differences and similarities can be resumed as follows: +- The **Hashicorp plugins only support "remote" plugins** in that each plugin must be a different + binary. Although those plugins seem to be executed "in-memory", they are not. On the contrary, + the `reeflective/team` clients and servers can (should, and will) be used both in memory and + remotely (here remotely means as a distinct subprocess: actual network location is irrelevant). +- The purpose of the `reeflective/team` library is **not** to emulate dynamic code execution behavior. + Rather, its intent is to make programs that should or might be better used as servers to several + clients to act as such easily and securely in many different scenarios. +- The **Hashicorp plugins are by essence restrained to an API problem**, and while the `team` library + is equally (but not mandatorily or exclusively) about interactive usage of arbitrary programs. +- **The Hashicorp plugin relies mandatorily (since it's built on) a gRPC transport backend**. While + gRPC is a very sensible choice for many reasons (and is therefore used for the default example + backend in `example/transports/`), the `team` library does not force library users to use a given + transport/RPC backend, nor even to use one. Again, this would be beyond the library scope, but + what is in scope is the capacity of this library to interface with or use different transports. +- Finally, the Hashicorp plugins are not aware of any concept of users as they are considered by + the team library, although both use certificate-based connections. However, `team` promotes and + makes easy to use mutually authenticated (Mutual TLS) connections (see the default gRPC example + backend). Related to this, teamservers integrate loggers and a database to store working data. +----- ## Status The Command-Line and Application-Programming Interfaces of this library are unlikely to change @@ -99,7 +331,6 @@ to 9 minor releases (`0.1.0`, `0.2.0`, `0.3.0`, etc...), ending up in `v1.0.0`. - New features and/or PRs are welcome if they are likely to be useful to most users. ----- - ## Possible enhancements The list below is not an indication on the roadmap of this repository, but should be viewed as diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index 9c9e77632c..44be641d80 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -39,14 +39,14 @@ import ( // The client also DOES NOT include any teamserver-side code. // // This teamclient core job is to: -// - Fetch, configure and use teamserver endpoint configurations. -// - Drive the process of connecting to & disconnecting from a server. -// - Query a teamserver for its version and users information. +// - Fetch, configure and use teamserver endpoint configurations. +// - Drive the process of connecting to & disconnecting from a server. +// - Query a teamserver for its version and users information. // // Additionally, this client offers: -// - Pre-configured loggers for all client-side related events. -// - Various options to configure its backends and behaviors. -// - A builtin, abstracted and app-specific filesystem (in memory or on disk). +// - Pre-configured loggers for all client-side related events. +// - Various options to configure its backends and behaviors. +// - A builtin, abstracted and app-specific filesystem (in memory or on disk). // // Various combinations of teamclient/teamserver usage are possible. // Please see the Go module example/ directory for a list of them. @@ -79,14 +79,14 @@ type Client struct { // using this dialer, and this clientConn will be provided to these hooks. // // Examples of what this clientConn can be: -// - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). -// - A simple net.Conn over which anything can be done further. -// - Nothing: a dialer might not need to use or even create a client connection. +// - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). +// - A simple net.Conn over which anything can be done further. +// - Nothing: a dialer might not need to use or even create a client connection. type Dialer interface { // Init is used by any dialer to query the teamclient driving it about: - // - The remote teamserver address and transport credentials - // - The user registered in this remote teamserver configuration. - // - To make use of client-side loggers, filesystem and other utilities. + // - The remote teamserver address and transport credentials + // - The user registered in this remote teamserver configuration. + // - To make use of client-side loggers, filesystem and other utilities. Init(c *Client) error // Dial should connect to the endpoint available in any @@ -109,8 +109,8 @@ type Dialer interface { // - When being provided a specific dialer/client/RPC backend. // // The teamclient will only perform a few init things before being returned: -// - Setup its filesystem, either on-disk (default behavior) or in-memory. -// - Initialize loggers and the files they use, if any. +// - Setup its filesystem, either on-disk (default behavior) or in-memory. +// - Initialize loggers and the files they use, if any. // // This may return an error if the teamclient is unable to work with the provided // options (or lack thereof), which may happen if the teamclient cannot use and write diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 65651876d1..21923a225f 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -25,12 +25,13 @@ import ( "path/filepath" "strings" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) // Generate returns a command tree to embed in client applications connecting @@ -139,6 +140,46 @@ func clientCommands(cli *client.Client) *cobra.Command { return teamCmd } +// ConfigsAppCompleter completes file paths to the current application configs. +func ConfigsAppCompleter(cli *client.Client, tag string) carapace.Action { + return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { + var compErrors []carapace.Action + + configPath := cli.ConfigsDir() + + files, err := os.ReadDir(configPath) + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) + } + + var results []string + + for _, file := range files { + if !strings.HasSuffix(file.Name(), command.ClientConfigExt) { + continue + } + + filePath := filepath.Join(configPath, file.Name()) + + cfg, err := cli.ReadConfig(filePath) + if err != nil || cfg == nil { + continue + } + + results = append(results, filePath) + results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) + } + + configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(command.ClientConfigExt)) + + return carapace.Batch(append( + compErrors, + configsAction.Tag(tag), + carapace.ActionFiles())..., + ).ToA() + }) +} + // ConfigsCompleter completes file paths to other teamserver application configs (clients/users CA, etc) // The filepath is the directory between .app/ and the target directory where config files of a certain // type should be found, ext is the normal/default extension for those target files, and tag is used in comps. @@ -199,46 +240,6 @@ func ConfigsCompleter(cli *client.Client, filePath, ext, tag string, noSelf bool } } -// ConfigsAppCompleter completes file paths to the current application configs. -func ConfigsAppCompleter(cli *client.Client, tag string) carapace.Action { - return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { - var compErrors []carapace.Action - - configPath := cli.ConfigsDir() - - files, err := os.ReadDir(configPath) - if err != nil { - compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) - } - - var results []string - - for _, file := range files { - if !strings.HasSuffix(file.Name(), command.ClientConfigExt) { - continue - } - - filePath := filepath.Join(configPath, file.Name()) - - cfg, err := cli.ReadConfig(filePath) - if err != nil || cfg == nil { - continue - } - - results = append(results, filePath) - results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) - } - - configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(command.ClientConfigExt)) - - return carapace.Batch(append( - compErrors, - configsAction.Tag(tag), - carapace.ActionFiles())..., - ).ToA() - }) -} - func isConfigDir(cli *client.Client, dir fs.DirEntry, noSelf bool) bool { if !strings.HasPrefix(dir.Name(), ".") { return false diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go index 166a86c20a..ff470c2db5 100644 --- a/vendor/github.com/reeflective/team/client/commands/import.go +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -22,10 +22,11 @@ import ( "encoding/json" "fmt" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go index f3045c9794..3b7f1ca05d 100644 --- a/vendor/github.com/reeflective/team/client/commands/users.go +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -23,10 +23,11 @@ import ( "time" "github.com/jedib0t/go-pretty/v6/table" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index 975c0d96c2..2920bca8a4 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -22,10 +22,11 @@ import ( "fmt" "time" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go index e4eafee293..2e6791e0fa 100644 --- a/vendor/github.com/reeflective/team/client/config.go +++ b/vendor/github.com/reeflective/team/client/config.go @@ -29,10 +29,10 @@ import ( "path/filepath" "sort" + "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/certs" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/log" - "gopkg.in/AlecAivazis/survey.v1" ) const ( @@ -154,7 +154,7 @@ func (tc *Client) SaveConfig(config *Config) error { // If we are in-memory, still make the directory. if _, err := os.Stat(configDir); os.IsNotExist(err) { - if err = os.MkdirAll(configDir, log.DirPerm); err != nil { + if err = os.MkdirAll(configDir, assets.DirPerm); err != nil { return tc.errorf("%w: %w", ErrConfig, err) } } diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go index 96430bf471..8833282f70 100644 --- a/vendor/github.com/reeflective/team/client/directories.go +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -23,7 +23,6 @@ import ( "path/filepath" "github.com/reeflective/team/internal/assets" - "github.com/reeflective/team/internal/log" ) // HomeDir returns the root application directory (~/.app/ by default). @@ -45,7 +44,7 @@ func (tc *Client) HomeDir() string { dir = "." + tc.name } - err := tc.fs.MkdirAll(dir, log.DirPerm) + err := tc.fs.MkdirAll(dir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -59,7 +58,7 @@ func (tc *Client) HomeDir() string { func (tc *Client) TeamDir() string { dir := filepath.Join(tc.HomeDir(), tc.opts.teamDir) - err := tc.fs.MkdirAll(dir, log.DirPerm) + err := tc.fs.MkdirAll(dir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -72,7 +71,7 @@ func (tc *Client) TeamDir() string { func (tc *Client) LogsDir() string { logsDir := filepath.Join(tc.TeamDir(), assets.DirLogs) - err := tc.fs.MkdirAll(logsDir, log.DirPerm) + err := tc.fs.MkdirAll(logsDir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s root dir: %s", logsDir, err) } @@ -80,14 +79,14 @@ func (tc *Client) LogsDir() string { return logsDir } -// GetConfigDir returns the path to the remote teamserver configs directory +// ConfigsDir returns the path to the remote teamserver configs directory // for this application (~/.app/teamclient/configs), creating the directory // if needed, or logging a fatal event if failing to create it. func (tc *Client) ConfigsDir() string { rootDir, _ := filepath.Abs(tc.TeamDir()) dir := filepath.Join(rootDir, assets.DirConfigs) - err := tc.fs.MkdirAll(dir, log.DirPerm) + err := tc.fs.MkdirAll(dir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s configs dir: %s", dir, err) } diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index 864ca353c4..9a321e0d8e 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -112,6 +112,9 @@ func WithInMemory() Options { // WithConfig sets the client to use a given remote teamserver configuration which // to connect to, instead of using default on-disk user/application configurations. +// This function will be very useful to library users who wish to implement specific +// remote teamserver selection & connection strategies, depending on the domains and +// and use cases of these tools. func WithConfig(config *Config) Options { return func(opts *opts) { opts.config = config diff --git a/vendor/github.com/reeflective/team/internal/assets/fs.go b/vendor/github.com/reeflective/team/internal/assets/fs.go index d70442b832..8fec1db2ce 100644 --- a/vendor/github.com/reeflective/team/internal/assets/fs.go +++ b/vendor/github.com/reeflective/team/internal/assets/fs.go @@ -28,9 +28,12 @@ import ( ) const ( - FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. - DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. - FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. + // FileReadPerm is the permission bit given to the OS when reading files. + FileReadPerm = 0o600 + // DirPerm is the permission bit given to teamserver/client directories. + DirPerm = 0o700 + // FileWritePerm is the permission bit given to the OS when writing files. + FileWritePerm = 0o644 // FileWriteOpenMode is used when opening log files in append/create/write-only mode. FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY @@ -39,14 +42,19 @@ const ( const ( // Teamclient. - DirClient = "teamclient" // DirClient is the name of the teamclient subdirectory. - DirLogs = "logs" // DirLogs subdirectory name - DirConfigs = "configs" // DirConfigs subdirectory name + // DirClient is the name of the teamclient subdirectory. + DirClient = "teamclient" + // DirLogs subdirectory name. + DirLogs = "logs" + // DirConfigs subdirectory name. + DirConfigs = "configs" // Teamserver. - DirServer = "teamserver" // DirClient is the name of the teamserver subdirectory. - DirCerts = "certs" // DirCerts subdirectory name + // DirServer is the name of the teamserver subdirectory. + DirServer = "teamserver" + // DirCerts subdirectory name. + DirCerts = "certs" ) // FS is a filesystem abstraction for teamservers and teamclients. diff --git a/vendor/github.com/reeflective/team/internal/certs/ca.go b/vendor/github.com/reeflective/team/internal/certs/ca.go index 6550626dd0..7a0073866d 100644 --- a/vendor/github.com/reeflective/team/internal/certs/ca.go +++ b/vendor/github.com/reeflective/team/internal/certs/ca.go @@ -26,7 +26,7 @@ import ( "os" "path/filepath" - "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/internal/assets" ) // ----------------------- @@ -137,12 +137,12 @@ func (c *Manager) saveCA(caType string, cert []byte, key []byte) { certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) keyFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-key.%s", c.appName, caType, certFileExt)) - err := c.fs.WriteFile(certFilePath, cert, log.FileReadPerm) + err := c.fs.WriteFile(certFilePath, cert, assets.FileReadPerm) if err != nil { c.log.Fatalf("Failed write certificate data to %s, %s", certFilePath, err) } - err = c.fs.WriteFile(keyFilePath, key, log.FileReadPerm) + err = c.fs.WriteFile(keyFilePath, key, assets.FileReadPerm) if err != nil { c.log.Fatalf("Failed write certificate data to %s: %s", keyFilePath, err) } diff --git a/vendor/github.com/reeflective/team/internal/certs/certs.go b/vendor/github.com/reeflective/team/internal/certs/certs.go index 5af5a01fa9..d2377ea6ba 100644 --- a/vendor/github.com/reeflective/team/internal/certs/certs.go +++ b/vendor/github.com/reeflective/team/internal/certs/certs.go @@ -38,7 +38,6 @@ import ( "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/db" - "github.com/reeflective/team/internal/log" "github.com/sirupsen/logrus" "gorm.io/gorm" ) @@ -90,8 +89,8 @@ func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appNam return certs } -func (m *Manager) db() *gorm.DB { - return m.database.Session(&gorm.Session{ +func (c *Manager) db() *gorm.DB { + return c.database.Session(&gorm.Session{ FullSaveAssociations: true, }) } @@ -317,7 +316,7 @@ func (c *Manager) getCertDir() string { rootDir := c.appDir certDir := filepath.Join(rootDir, "certs") - err := c.fs.MkdirAll(certDir, log.DirPerm) + err := c.fs.MkdirAll(certDir, assets.DirPerm) if err != nil { c.log.Fatalf("Failed to create cert dir: %s", err) } diff --git a/vendor/github.com/reeflective/team/internal/certs/tls.go b/vendor/github.com/reeflective/team/internal/certs/tls.go index eb403be1ca..9064745ba2 100644 --- a/vendor/github.com/reeflective/team/internal/certs/tls.go +++ b/vendor/github.com/reeflective/team/internal/certs/tls.go @@ -24,10 +24,11 @@ import ( "log" "os" - teamlog "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/internal/assets" ) const ( + // DefaultPort is the default team.Server listening port. // Should be 31415, but... go to hell with your endless limits. DefaultPort = 31416 ) @@ -37,7 +38,7 @@ const ( func (c *Manager) OpenTLSKeyLogFile() *os.File { keyFilePath, present := os.LookupEnv("SSLKEYLOGFILE") if present { - keyFile, err := os.OpenFile(keyFilePath, teamlog.FileWriteOpenMode, teamlog.FileReadPerm) + keyFile, err := os.OpenFile(keyFilePath, assets.FileWriteOpenMode, assets.FileReadPerm) if err != nil { c.log.Errorf("Failed to open TLS key file %v", err) return nil diff --git a/vendor/github.com/reeflective/team/internal/command/command.go b/vendor/github.com/reeflective/team/internal/command/command.go index e763f8b0b1..9718ae7e41 100644 --- a/vendor/github.com/reeflective/team/internal/command/command.go +++ b/vendor/github.com/reeflective/team/internal/command/command.go @@ -25,18 +25,24 @@ import ( ) type ( + // CobraRunnerE is a cobra runner returning an error. CobraRunnerE func(*cobra.Command, []string) error - CobraRunner func(*cobra.Command, []string) + // CobraRunner is a cobra runner returning nothing. + CobraRunner func(*cobra.Command, []string) ) const ( - ClientConfigExt = "teamclient.cfg" // Client remote server config file extension. - ServerConfigExt = "teamserver.json" // Server backend config file extension. + // ClientConfigExt is the client remote server config file extension. + ClientConfigExt = "teamclient.cfg" + // ServerConfigExt is the server backend config file extension. + ServerConfigExt = "teamserver.json" ) const ( - TeamServerGroup = "teamserver control" // TeamServerGroup is the group of all server/client control commands. - UserManagementGroup = "user management" // UserManagementGroup is the group to manage teamserver users. + // TeamServerGroup is the group of all server/client control commands. + TeamServerGroup = "teamserver control" + // UserManagementGroup is the group to manage teamserver users. + UserManagementGroup = "user management" ) // Colors / effects. @@ -57,11 +63,11 @@ const ( DownN = "\033[%dB" Underline = "\033[4m" - // info - Display colorful information. + // Info - Display colorful information. Info = Cyan + "[*] " + Normal - // warn - warn a user. + // Warn - warn a user. Warn = Red + "[!] " + Normal - // debugl - Display debugl information. + // Debugl - Display debugl information. Debugl = Purple + "[-] " + Normal ) diff --git a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go index aaedce9e39..a5f279d300 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go @@ -21,7 +21,11 @@ package db */ import ( - _ "github.com/mattn/go-sqlite3" + // Embedded SQLite instance. + _ "github.com/ncruces/go-sqlite3/embed" + // C-code. + _ "github.com/ncruces/go-sqlite3" + "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" diff --git a/vendor/github.com/reeflective/team/internal/db/sql-go.go b/vendor/github.com/reeflective/team/internal/db/sql-go.go index 5b35246b4c..302aa0f9f2 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-go.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-go.go @@ -21,13 +21,15 @@ package db */ import ( - gosqlite "github.com/glebarez/sqlite" + // Embed the sqlite code into our teamserver. + _ "github.com/ncruces/go-sqlite3/embed" + "github.com/ncruces/go-sqlite3/gormlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { - return gorm.Open(gosqlite.Open(dsn), &gorm.Config{ + return gorm.Open(gormlite.Open(dsn), &gorm.Config{ PrepareStmt: true, Logger: log, }) diff --git a/vendor/github.com/reeflective/team/internal/db/sql-wasm.go b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go index 558d642d13..213b48d9fa 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-wasm.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go @@ -21,8 +21,11 @@ package db */ import ( + // Core code. _ "github.com/ncruces/go-sqlite3" + // Driver code. _ "github.com/ncruces/go-sqlite3/driver" + // Embedded SQLite instance. _ "github.com/ncruces/go-sqlite3/embed" "gorm.io/gorm" "gorm.io/gorm/logger" diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index 713862fb04..b8f86d3072 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -32,6 +32,8 @@ import ( ) const ( + // SQLiteInMemoryHost is the default string used by SQLite + // as a host when ran in memory (string value is ":memory:"). SQLiteInMemoryHost = ":memory:" ) @@ -54,10 +56,11 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { // Logging middleware (queries) dbLog := log.NewDatabase(dbLogger, dbConfig.LogLevel) + logDbDsn := fmt.Sprintf("%s (%s:%d)", dbConfig.Database, dbConfig.Host, dbConfig.Port) switch dbConfig.Dialect { case Sqlite: - dbLogger.Infof("Connecting to SQLite database %s", dsn) + dbLogger.Infof("Connecting to SQLite database %s", logDbDsn) dbClient, err = sqliteClient(dsn, dbLog) if err != nil { @@ -65,7 +68,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { } case Postgres: - dbLogger.Infof("Connecting to PostgreSQL database %s", dsn) + dbLogger.Infof("Connecting to PostgreSQL database %s", logDbDsn) dbClient, err = postgresClient(dsn, dbLog) if err != nil { @@ -73,7 +76,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { } case MySQL: - dbLogger.Infof("Connecting to MySQL database %s", dsn) + dbLogger.Infof("Connecting to MySQL database %s", logDbDsn) dbClient, err = mySQLClient(dsn, dbLog) if err != nil { @@ -83,7 +86,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { return nil, fmt.Errorf("%w: '%s'", ErrUnsupportedDialect, dbConfig.Dialect) } - err = dbClient.AutoMigrate(Schema()) + err = dbClient.AutoMigrate(Schema()...) if err != nil { dbLogger.Error(err) } diff --git a/vendor/github.com/reeflective/team/internal/log/cli.go b/vendor/github.com/reeflective/team/internal/log/cli.go index 98aaf6a633..5c6963fe4d 100644 --- a/vendor/github.com/reeflective/team/internal/log/cli.go +++ b/vendor/github.com/reeflective/team/internal/log/cli.go @@ -30,22 +30,24 @@ import ( // Text effects. const ( - SGRStart = "\x1b[" - Fg = "38;05;" - Bg = "48;05;" - SGREnd = "m" + sgrStart = "\x1b[" + fg = "38;05;" + bg = "48;05;" + sgrEnd = "m" ) const ( - FieldTimestamp = "timestamp" - FieldPackage = "logger" - FieldMessage = "message" + fieldTimestamp = "timestamp" + fieldPackage = "logger" + fieldMessage = "message" - PackageFieldKey = "teamserver_pkg" - - MinimumPackagePad = 11 + minimumPackagePad = 11 ) +// PackageFieldKey is used to identify the name of the package +// specified by teamclients and teamservers named loggers. +const PackageFieldKey = "teamserver_pkg" + // stdioHook combines a stdout hook (info/debug/trace), // and a stderr hook (warn/error/fatal/panic). type stdioHook struct { @@ -152,15 +154,15 @@ func (hook *stdoutHook) Format(entry *logrus.Entry) ([]byte, error) { levelLog := fmt.Sprintf("%s%s%s", color(signColor), sign, color(style.Default)) timestamp := entry.Time.Format(hook.TimestampFormat) - timestampLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldTimestamp]), timestamp, color(style.Default)) + timestampLog := fmt.Sprintf("%s%s%s", color(hook.Colors[fieldTimestamp]), timestamp, color(style.Default)) var pkgLogF string pkg := entry.Data[PackageFieldKey] if pkg != nil { pkgLog := fmt.Sprintf(" %v ", pkg) - pkgLog = fmt.Sprintf("%-*s", MinimumPackagePad, pkgLog) - pkgLogF = strings.ReplaceAll(pkgLog, fmt.Sprintf("%s", pkg), fmt.Sprintf("%s%s%s", color(hook.Colors[FieldPackage]), pkg, color(style.Default))) + pkgLog = fmt.Sprintf("%-*s", minimumPackagePad, pkgLog) + pkgLogF = strings.ReplaceAll(pkgLog, fmt.Sprintf("%s", pkg), fmt.Sprintf("%s%s%s", color(hook.Colors[fieldPackage]), pkg, color(style.Default))) } // Always try to unwrap the error at least once, and colorize it. @@ -171,7 +173,7 @@ func (hook *stdoutHook) Format(entry *logrus.Entry) ([]byte, error) { } } - messageLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldMessage]), message, color(style.Default)) + messageLog := fmt.Sprintf("%s%s%s", color(hook.Colors[fieldMessage]), message, color(style.Default)) // Assemble the log message var logMessage string @@ -265,9 +267,9 @@ func (hook *stderrHook) Levels() []logrus.Level { func defaultFieldsFormat() map[string]string { return map[string]string{ - FieldTimestamp: style.BrightBlack, - FieldPackage: style.Dim, - FieldMessage: style.BrightWhite, + fieldTimestamp: style.BrightBlack, + fieldPackage: style.Dim, + fieldMessage: style.BrightWhite, } } @@ -296,5 +298,5 @@ func defaultLevelFieldsColored() map[string]string { } func color(color string) string { - return SGRStart + style.SGR(color) + SGREnd + return sgrStart + style.SGR(color) + sgrEnd } diff --git a/vendor/github.com/reeflective/team/internal/log/log.go b/vendor/github.com/reeflective/team/internal/log/log.go index fdf5f1a298..b31cccf587 100644 --- a/vendor/github.com/reeflective/team/internal/log/log.go +++ b/vendor/github.com/reeflective/team/internal/log/log.go @@ -21,7 +21,6 @@ package log import ( "fmt" "io" - "os" "path/filepath" "github.com/reeflective/team/internal/assets" @@ -29,21 +28,17 @@ import ( ) const ( - FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. - DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. - FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. - - FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY // Opening log files in append/create/write-only mode. - - ClientLogFileExt = "teamclient.log" // Log files of all teamclients have this extension by default. - ServerLogFileExt = "teamserver.log" // Log files of all teamserver have this extension by default. + // ClientLogFileExt is used as extension by all main teamclients log files by default. + ClientLogFileExt = "teamclient.log" + // ServerLogFileExt is used as extension by all teamservers core log files by default. + ServerLogFileExt = "teamserver.log" ) // Init is the main constructor that is (and should be) used for teamserver and teamclient logging. // It hooks a normal logger with a sublogger writing to a file in text version, and another logger // writing to stdout/stderr with enhanced formatting/coloring support. func Init(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, *logrus.Logger, error) { - logFile, err := fs.OpenFile(file, FileWriteOpenMode, FileWritePerm) + logFile, err := fs.OpenFile(file, assets.FileWriteOpenMode, assets.FileWritePerm) if err != nil { return nil, nil, fmt.Errorf("Failed to open log file %w", err) } @@ -102,7 +97,7 @@ func NewJSON(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, er rootLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := fmt.Sprintf("%s.json", file) - logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + logFile, err := fs.OpenFile(jsonFilePath, assets.FileWriteOpenMode, assets.FileWritePerm) if err != nil { return nil, fmt.Errorf("Failed to open log file %w", err) } @@ -121,7 +116,7 @@ func NewAudit(fs *assets.FS, logDir string) (*logrus.Logger, error) { auditLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := filepath.Join(logDir, "audit.json") - logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + logFile, err := fs.OpenFile(jsonFilePath, assets.FileWriteOpenMode, assets.FileWritePerm) if err != nil { return nil, fmt.Errorf("Failed to open log file %w", err) } diff --git a/vendor/github.com/reeflective/team/internal/log/perms.go b/vendor/github.com/reeflective/team/internal/log/perms.go index b56f909eb7..2eea129c26 100644 --- a/vendor/github.com/reeflective/team/internal/log/perms.go +++ b/vendor/github.com/reeflective/team/internal/log/perms.go @@ -35,7 +35,6 @@ func IsWritable(path string) (isWritable bool, err error) { return } - err = nil if !info.IsDir() { return false, fmt.Errorf("Path isn't a directory") } @@ -56,5 +55,6 @@ func IsWritable(path string) (isWritable bool, err error) { } isWritable = true + return } diff --git a/vendor/github.com/reeflective/team/internal/systemd/config.go b/vendor/github.com/reeflective/team/internal/systemd/config.go index 705acf0da1..585f6e3270 100644 --- a/vendor/github.com/reeflective/team/internal/systemd/config.go +++ b/vendor/github.com/reeflective/team/internal/systemd/config.go @@ -20,6 +20,7 @@ package systemd import ( "bytes" + // Embed our example teamserver.service file. _ "embed" "fmt" "log" @@ -41,6 +42,7 @@ type Config struct { //go:embed teamserver.service var systemdServiceTemplate string +// NewFrom returns a new templated systemd configuration file. func NewFrom(name string, userCfg *Config) string { cfg := NewDefaultConfig() diff --git a/vendor/github.com/reeflective/team/internal/version/.gitignore b/vendor/github.com/reeflective/team/internal/version/.gitignore deleted file mode 100644 index 1d65b47378..0000000000 --- a/vendor/github.com/reeflective/team/internal/version/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.compiled diff --git a/vendor/github.com/reeflective/team/internal/version/teamserver_version_info b/vendor/github.com/reeflective/team/internal/version/teamserver_version_info deleted file mode 100644 index 25a898d32b..0000000000 --- a/vendor/github.com/reeflective/team/internal/version/teamserver_version_info +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -outfile="_version.compiled" - -git describe --abbrev=0 --always > "client${outfile}" -go version > "go${outfile}" -git rev-parse HEAD > "commit${outfile}" - -# Dirty (ensure file exists for github actions) -touch "dirty${outfile}" -git diff --quiet || echo 'Dirty' > "dirty${outfile}" - -# Compilation time -date +%s > "compiled${outfile}" diff --git a/vendor/github.com/reeflective/team/internal/version/version.go b/vendor/github.com/reeflective/team/internal/version/version.go index 113acd9f46..a6a83ae3c3 100644 --- a/vendor/github.com/reeflective/team/internal/version/version.go +++ b/vendor/github.com/reeflective/team/internal/version/version.go @@ -19,7 +19,6 @@ package version */ import ( - _ "embed" "errors" "runtime/debug" "strconv" @@ -31,6 +30,7 @@ const ( semVerLen = 3 ) +// ErrNoBuildInfo is an error indicating that we could not fetch any binary build info. var ErrNoBuildInfo = errors.New("No binary build info") // Semantic - Get the structured semantic diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index ba1030f4d3..1e0c766126 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -21,13 +21,14 @@ package commands import ( "fmt" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go index 40c2d12af3..1b336cebbf 100644 --- a/vendor/github.com/reeflective/team/server/commands/completers.go +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -23,9 +23,10 @@ import ( "net" "strings" + "github.com/rsteube/carapace" + "github.com/reeflective/team/client" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" ) // interfacesCompleter completes interface addresses on the client host. diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index 4a3fff0b76..6b16e42432 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -28,12 +28,13 @@ import ( "strings" "github.com/jedib0t/go-pretty/v6/table" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/log" "github.com/reeflective/team/internal/systemd" "github.com/reeflective/team/server" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go index 07eae7200f..92b6f895a2 100644 --- a/vendor/github.com/reeflective/team/server/commands/user.go +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -3,18 +3,18 @@ package commands import ( "encoding/json" "fmt" - "io/ioutil" "os" "os/user" "path/filepath" "strings" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/log" "github.com/reeflective/team/server" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { @@ -50,7 +50,7 @@ func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Comm filename = fmt.Sprintf("%s_%s_default", serv.Name(), user.Username) saveTo = cli.ConfigsDir() - err = os.MkdirAll(saveTo, log.DirPerm) + err = os.MkdirAll(saveTo, assets.DirPerm) if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"cannot write to %s root dir: %s\n", saveTo, err) return @@ -84,7 +84,7 @@ func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Comm saveTo = filepath.Join(saveTo, filename+".teamclient.cfg") - err = ioutil.WriteFile(saveTo, configJSON, log.FileReadPerm) + err = os.WriteFile(saveTo, configJSON, assets.FileReadPerm) if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to write config to %s: %s\n", saveTo, err) return @@ -207,7 +207,7 @@ func exportCACmd(serv *server.Server) func(cmd *cobra.Command, args []string) { data, _ := json.Marshal(exportedCA) - err = os.WriteFile(saveTo, data, log.FileWritePerm) + err = os.WriteFile(saveTo, data, assets.FileWritePerm) if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Write failed: %s (%s)\n", saveTo, err) return diff --git a/vendor/github.com/reeflective/team/server/config.go b/vendor/github.com/reeflective/team/server/config.go index a1553844ca..28a5ffbc23 100644 --- a/vendor/github.com/reeflective/team/server/config.go +++ b/vendor/github.com/reeflective/team/server/config.go @@ -27,8 +27,8 @@ import ( "path/filepath" "time" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/log" "github.com/sirupsen/logrus" ) @@ -45,9 +45,9 @@ const ( // // Its default path is ~/.app/teamserver/configs/app.teamserver.cfg. // It uses the following default values: -// - Daemon host: "" -// - Daemon port: 31416 -// - logging file level: Info. +// - Daemon host: "" +// - Daemon port: 31416 +// - logging file level: Info. type Config struct { // When the teamserver command `app teamserver daemon` is executed // without --host/--port flags, the teamserver will use the config. @@ -77,15 +77,14 @@ type Config struct { // ConfigPath returns the path to the server config.json file, on disk or in-memory. func (ts *Server) ConfigPath() string { - appDir := ts.TeamDir() - configDir := filepath.Join(appDir, "configs") + appDir := ts.ConfigsDir() - err := ts.fs.MkdirAll(configDir, log.DirPerm) + err := ts.fs.MkdirAll(appDir, assets.DirPerm) if err != nil { - ts.log().Errorf("cannot write to %s config dir: %s", configDir, err) + ts.log().Errorf("cannot write to %s config dir: %s", appDir, err) } - serverConfigPath := filepath.Join(configDir, fmt.Sprintf("%s.%s", ts.Name(), command.ServerConfigExt)) + serverConfigPath := filepath.Join(appDir, fmt.Sprintf("%s.%s", ts.Name(), command.ServerConfigExt)) return serverConfigPath } @@ -135,7 +134,7 @@ func (ts *Server) GetConfig() *Config { return ts.opts.config } -// Save saves config file to disk. +// SaveConfig saves config file to disk. // This uses the on-disk filesystem even if the teamclient is in memory mode. func (ts *Server) SaveConfig(cfg *Config) error { cfgLog := ts.NamedLogger("config", "server") @@ -150,7 +149,7 @@ func (ts *Server) SaveConfig(cfg *Config) error { if _, err := os.Stat(configDir); os.IsNotExist(err) { cfgLog.Debugf("Creating config dir %s", configDir) - err := os.MkdirAll(configDir, log.DirPerm) + err := os.MkdirAll(configDir, assets.DirPerm) if err != nil { return ts.errorf("%w: %w", ErrConfig, err) } @@ -163,7 +162,7 @@ func (ts *Server) SaveConfig(cfg *Config) error { cfgLog.Debugf("Saving config to %s", configPath) - err = os.WriteFile(configPath, data, log.FileReadPerm) + err = os.WriteFile(configPath, data, assets.FileReadPerm) if err != nil { return ts.errorf("%w: failed to write config: %s", ErrConfig, err) } diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 6f562c4f30..ea9f9a745e 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -159,14 +159,14 @@ func (ts *Server) Self(opts ...client.Options) *client.Client { return teamclient } -// Version implements team.Client.VersionClient() interface +// VersionClient implements team.Client.VersionClient() interface // method, so that the teamserver can be a teamclient of itself. // This simply returns the server.VersionServer() output. func (ts *Server) VersionClient() (team.Version, error) { return ts.VersionServer() } -// Version returns the teamserver binary version information. +// VersionServe returns the teamserver binary version information. func (ts *Server) VersionServer() (team.Version, error) { semVer := version.Semantic() compiled, _ := version.Compiled() diff --git a/vendor/github.com/reeflective/team/server/db.go b/vendor/github.com/reeflective/team/server/db.go index 31bc97ca6a..7886e776fd 100644 --- a/vendor/github.com/reeflective/team/server/db.go +++ b/vendor/github.com/reeflective/team/server/db.go @@ -25,9 +25,9 @@ import ( "path" "path/filepath" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/db" - "github.com/reeflective/team/internal/log" "gorm.io/gorm" ) @@ -37,9 +37,10 @@ const ( ) // Database returns a new teamserver database session, which may not be nil: -// at worst, this database will be an in-memory one. The default is a file- -// based Sqlite database in the teamserver directory, but it might be a -// specific database passed through options. +// if no custom database backend was passed to the server at creation time, +// this database will be an in-memory one. The default is a file-based Sqlite +// database in the teamserver directory, but it might be a specific database +// passed through options. func (ts *Server) Database() *gorm.DB { return ts.db.Session(&gorm.Session{ FullSaveAssociations: true, @@ -47,7 +48,7 @@ func (ts *Server) Database() *gorm.DB { } // DatabaseConfig returns the server database backend configuration struct. -// If configuration could be found on disk, the default Sqlite file-based +// If no configuration could be found on disk, the default Sqlite file-based // database is returned, with app-corresponding file paths. func (ts *Server) DatabaseConfig() *db.Config { cfg, err := ts.getDatabaseConfig() @@ -60,9 +61,10 @@ func (ts *Server) DatabaseConfig() *db.Config { // GetDatabaseConfigPath - File path to config.json. func (ts *Server) dbConfigPath() string { - appDir := ts.TeamDir() + appDir := ts.ConfigsDir() log := ts.NamedLogger("config", "database") - databaseConfigPath := filepath.Join(appDir, "configs", fmt.Sprintf("%s.%s", ts.Name()+"_database", command.ServerConfigExt)) + dbFileName := fmt.Sprintf("%s.%s", ts.Name()+"_database", command.ServerConfigExt) + databaseConfigPath := filepath.Join(appDir, dbFileName) log.Debugf("Loading config from %s", databaseConfigPath) return databaseConfigPath @@ -83,7 +85,7 @@ func (ts *Server) saveDatabaseConfig(cfg *db.Config) error { if _, err := os.Stat(configDir); os.IsNotExist(err) { dblog.Debugf("Creating config dir %s", configDir) - err := os.MkdirAll(configDir, log.DirPerm) + err := os.MkdirAll(configDir, assets.DirPerm) if err != nil { return err } @@ -96,7 +98,7 @@ func (ts *Server) saveDatabaseConfig(cfg *db.Config) error { dblog.Debugf("Saving config to %s", configPath) - return os.WriteFile(configPath, data, log.FileReadPerm) + return os.WriteFile(configPath, data, assets.FileReadPerm) } // getDatabaseConfig returns a working database configuration, diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go index 4c96c2a79a..af75c7b4bf 100644 --- a/vendor/github.com/reeflective/team/server/directories.go +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -24,7 +24,6 @@ import ( "path/filepath" "github.com/reeflective/team/internal/assets" - "github.com/reeflective/team/internal/log" ) // HomeDir returns the root application directory (~/.app/ by default). @@ -46,7 +45,7 @@ func (ts *Server) HomeDir() string { dir = "." + ts.name } - err := ts.fs.MkdirAll(dir, log.DirPerm) + err := ts.fs.MkdirAll(dir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -60,7 +59,7 @@ func (ts *Server) HomeDir() string { func (ts *Server) TeamDir() string { dir := path.Join(ts.HomeDir(), ts.opts.teamDir) - err := ts.fs.MkdirAll(dir, log.DirPerm) + err := ts.fs.MkdirAll(dir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -68,12 +67,25 @@ func (ts *Server) TeamDir() string { return dir } -// LogsDir returns the directory of the client (~/.app-server/logs), creating +// LogsDir returns the log directory of the server (~/.app-server/logs), creating // the directory if needed, or logging a fatal event if failing to create it. func (ts *Server) LogsDir() string { logDir := path.Join(ts.TeamDir(), assets.DirLogs) - err := ts.fs.MkdirAll(logDir, log.DirPerm) + err := ts.fs.MkdirAll(logDir, assets.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", logDir, err) + } + + return logDir +} + +// Configs returns the configs directory of the server (~/.app-server/logs), creating +// the directory if needed, or logging a fatal event if failing to create it. +func (ts *Server) ConfigsDir() string { + logDir := path.Join(ts.TeamDir(), assets.DirConfigs) + + err := ts.fs.MkdirAll(logDir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", logDir, err) } @@ -86,7 +98,7 @@ func (ts *Server) LogsDir() string { func (ts *Server) CertificatesDir() string { certDir := path.Join(ts.TeamDir(), assets.DirCerts) - err := ts.fs.MkdirAll(certDir, log.DirPerm) + err := ts.fs.MkdirAll(certDir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", certDir, err) } diff --git a/vendor/github.com/reeflective/team/server/jobs.go b/vendor/github.com/reeflective/team/server/jobs.go index 3841dec05d..c2004fef6d 100644 --- a/vendor/github.com/reeflective/team/server/jobs.go +++ b/vendor/github.com/reeflective/team/server/jobs.go @@ -79,7 +79,7 @@ func (ts *Server) Listeners() []*job { return all } -// AddListenerJob adds a teamserver listener job to the teamserver configuration. +// ListenerAdd adds a teamserver listener job to the teamserver configuration. // This function does not start the given listener, and you must call the server // ServeAddr(name, host, port) function for this. func (ts *Server) ListenerAdd(name, host string, port uint16) error { @@ -104,7 +104,7 @@ func (ts *Server) ListenerAdd(name, host string, port uint16) error { return ts.SaveConfig(ts.opts.config) } -// RemoveListenerJob removes a server listener job from the configuration. +// ListenerRemove removes a server listener job from the configuration. // This function does not stop any running listener for the given ID: you // must call server.CloseListener(id) for this. func (ts *Server) ListenerRemove(listenerID string) { diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index ad8cb3351a..f6e47d0ea0 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -50,9 +50,9 @@ type Listener interface { Name() string // Init is used by the listener to access the core teamserver, needed for: - // - Fetching server-side transport/session-level credentials. - // - Authenticating users connections/requests. - // - Using the builtin teamserver loggers, filesystem and other utilities. + // - Fetching server-side transport/session-level credentials. + // - Authenticating users connections/requests. + // - Using the builtin teamserver loggers, filesystem and other utilities. // Any non-nil error returned will abort the listener starting process. Init(s *Server) error @@ -68,8 +68,8 @@ type Listener interface { // Close should close the listener stack. // This can mean different things depending on use case, but some are not recommended. - // - It can simply close the "listener" layer without shutting down the "server/RPC" layer. - // - It can shutdown anything, thus in effect disconnecting all of its clients from server. + // - It can simply close the "listener" layer without shutting down the "server/RPC" layer. + // - It can shutdown anything, thus in effect disconnecting all of its clients from server. Close() error } @@ -167,6 +167,7 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er // ServeAddr attempts to serve a listener stack identified by "name" (the listener should be registered // with the teamserver with WithListener() option), on a given host:port address, with any provided option. // If returns either a critical error raised by the listener, or the ID of the listener job, for control. +// The call is non-blocking, contrarily to the server.ServeDaemon() method. func (ts *Server) ServeAddr(name string, host string, port uint16, opts ...Options) (id string, err error) { // If server was not initialized yet, do it. // This at least will update any listener/server-specific options. diff --git a/vendor/github.com/reeflective/team/server/users.go b/vendor/github.com/reeflective/team/server/users.go index 526dd72381..d94ac9d0f6 100644 --- a/vendor/github.com/reeflective/team/server/users.go +++ b/vendor/github.com/reeflective/team/server/users.go @@ -136,9 +136,9 @@ func (ts *Server) UserDelete(name string) error { // user of a connected/connecting teamclient. The token is hashed and checked against the // teamserver users database for the matching user. // This function shall alternatively return: -// - The name of the authenticated user, true for authenticated and no error. -// - No name, false for authenticated, and an ErrUnauthenticated error. -// - No name, false for authenticated, and a database error, if was ignited now. +// - The name of the authenticated user, true for authenticated and no error. +// - No name, false for authenticated, and an ErrUnauthenticated error. +// - No name, false for authenticated, and a database error, if was ignited now. // // This call updates the last time the user has been seen by the server. func (ts *Server) UserAuthenticate(rawToken string) (name string, authorized bool, err error) { diff --git a/vendor/github.com/tetratelabs/wazero/Makefile b/vendor/github.com/tetratelabs/wazero/Makefile index 0567942880..4ed46536ee 100644 --- a/vendor/github.com/tetratelabs/wazero/Makefile +++ b/vendor/github.com/tetratelabs/wazero/Makefile @@ -1,10 +1,10 @@ gofumpt := mvdan.cc/gofumpt@v0.5.0 gosimports := github.com/rinchsan/gosimports/cmd/gosimports@v0.3.8 -golangci_lint := github.com/golangci/golangci-lint/cmd/golangci-lint@v1.52.2 +golangci_lint := github.com/golangci/golangci-lint/cmd/golangci-lint@v1.53.3 asmfmt := github.com/klauspost/asmfmt/cmd/asmfmt@v1.3.2 # sync this with netlify.toml! -hugo := github.com/gohugoio/hugo@v0.112.5 +hugo := github.com/gohugoio/hugo@v0.115.2 # Make 3.81 doesn't support '**' globbing: Set explicitly instead of recursion. all_sources := $(wildcard *.go */*.go */*/*.go */*/*/*.go */*/*/*.go */*/*/*/*.go) @@ -53,7 +53,7 @@ build.examples.as: build.examples.zig: examples/allocation/zig/testdata/greet.wasm imports/wasi_snapshot_preview1/example/testdata/zig/cat.wasm imports/wasi_snapshot_preview1/testdata/zig/wasi.wasm @cd internal/testing/dwarftestdata/testdata/zig; zig build; mv zig-out/*/main.wasm ./ # Need DWARF custom sections. -tinygo_sources := examples/basic/testdata/add.go examples/allocation/tinygo/testdata/greet.go examples/cli/testdata/cli.go imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go +tinygo_sources := examples/basic/testdata/add.go examples/allocation/tinygo/testdata/greet.go examples/cli/testdata/cli.go imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go .PHONY: build.examples.tinygo build.examples.tinygo: $(tinygo_sources) @for f in $^; do \ @@ -62,7 +62,7 @@ build.examples.tinygo: $(tinygo_sources) # We use zig to build C as it is easy to install and embeds a copy of zig-cc. # Note: Don't use "-Oz" as that breaks our wasi sock example. -c_sources := imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c +c_sources := imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c internal/testing/dwarftestdata/testdata/zig-cc/main.c .PHONY: build.examples.zig-cc build.examples.zig-cc: $(c_sources) @for f in $^; do \ @@ -212,6 +212,10 @@ check: # This makes sure the intepreter can be used. Most often the package that can # drift here is "platform" or "sysfs": # +# Ensure we build on plan9. See #1578 + @GOARCH=amd64 GOOS=plan9 go build ./... +# Ensure we build on gojs. See #1526. TODO: add GOOS=wasi as well. + @GOARCH=wasm GOOS=js go build ./... # Ensure we build on windows: @GOARCH=amd64 GOOS=windows go build ./... # Ensure we build on an arbitrary operating system: @@ -250,9 +254,9 @@ clean: ## Ensure a clean build fuzz_timeout_seconds ?= 10 .PHONY: fuzz fuzz: - @cd internal/integration_test/fuzz && cargo fuzz run basic -- -max_total_time=$(fuzz_timeout_seconds) - @cd internal/integration_test/fuzz && cargo fuzz run memory_no_diff -- -max_total_time=$(fuzz_timeout_seconds) - @cd internal/integration_test/fuzz && cargo fuzz run validation -- -max_total_time=$(fuzz_timeout_seconds) + @cd internal/integration_test/fuzz && cargo fuzz run basic -- -rss_limit_mb=8192 -max_total_time=$(fuzz_timeout_seconds) + @cd internal/integration_test/fuzz && cargo fuzz run memory_no_diff -- -rss_limit_mb=8192 -max_total_time=$(fuzz_timeout_seconds) + @cd internal/integration_test/fuzz && cargo fuzz run validation -- -rss_limit_mb=8192 -max_total_time=$(fuzz_timeout_seconds) #### CLI release related #### diff --git a/vendor/github.com/tetratelabs/wazero/RATIONALE.md b/vendor/github.com/tetratelabs/wazero/RATIONALE.md index e5dff05db1..d8a1d12e2b 100644 --- a/vendor/github.com/tetratelabs/wazero/RATIONALE.md +++ b/vendor/github.com/tetratelabs/wazero/RATIONALE.md @@ -414,12 +414,49 @@ In reflection, this approach worked well for the nearly 1.5 year period leading to version 1.0. We've only had to create a single sub-configuration, `FSConfig`, and it was well understood why when it occurred. -## Why does InstantiateModule call "_start" by default? -We formerly had functions like `StartWASICommand` that would verify preconditions and start WASI's "_start" command. -However, this caused confusion because both many languages compiled a WASI dependency, and many did so inconsistently. - -That said, if "_start" isn't called, it causes issues in TinyGo, as it needs this in order to implement panic. To deal -with this a different way, we have a configuration to call any start functions that exist, which defaults to "_start". +## Why does `ModuleConfig.WithStartFunctions` default to `_start`? + +We formerly had functions like `StartWASICommand` that would verify +preconditions and start WASI's `_start` command. However, this caused confusion +because both many languages compiled a WASI dependency, and many did so +inconsistently. + +The conflict is that exported functions need to use features the language +runtime provides, such as garbage collection. There's a "chicken-egg problem" +where `_start` needs to complete in order for exported behavior to work. + +For example, unlike `GOOS=wasip1` in Go 1.21, TinyGo's "wasi" target supports +function exports. So, the only way to use FFI style is via the "wasi" target. +Not explicitly calling `_start` before an ABI such as wapc-go, would crash, due +to setup not happening (e.g. to implement `panic`). Other embedders such as +Envoy also called `_start` for the same reason. To avoid a common problem for +users unaware of WASI, and also to simplify normal use of WASI (e.g. `main`), +we added `_start` to `ModuleConfig.WithStartFunctions`. + +In cases of multiple initializers, such as in wapc-go, users can override this +to add the others *after* `_start`. Users who want to explicitly control +`_start`, such as some of our unit tests, can clear the start functions and +remove it. + +This decision was made in 2022, and holds true in 2023, even with the +introduction of "wasix". It holds because "wasix" is backwards compatible with +"wasip1". In the future, there will be other ways to start applications, and +may not be backwards compatible with "wasip1". + +Most notably WASI "Preview 2" is not implemented in a way compatible with +wasip1. Its start function is likely to be different, and defined in the +wasi-cli "world". When the design settles, and it is implemented by compilers, +wazero will attempt to support "wasip2". However, it won't do so in a way that +breaks existing compilers. + +In other words, we won't remove `_start` if "wasip2" continues a path of an +alternate function name. If we did, we'd break existing users despite our +compatibility promise saying we don't. The most likely case is that when we +build-in something incompatible with "wasip1", that start function will be +added to the start functions list in addition to `_start`. + +See http://wasix.org +See https://github.com/WebAssembly/wasi-cli ## Runtime == Engine+Store wazero defines a single user-type which combines the specification concept of `Store` with the unspecified `Engine` @@ -447,26 +484,26 @@ https://github.com/bytecodealliance/wasmtime/blob/v0.29.0/crates/lightbeam/src/m ## Exit -### Why do we return a `sys.ExitError` on exit code zero? +### Why do we only return a `sys.ExitError` on a non-zero exit code? -It may be surprising to find an error returned on success (exit code zero). -This can be explained easier when you think of function returns: When results -aren't empty, then you must return an error. This is trickier to explain when -results are empty, such as the case in the "_start" function in WASI. +It is reasonable to think an exit error should be returned, even if the code is +success (zero). Even on success, the module is no longer functional. For +example, function exports would error later. However, wazero does not. The only +time `sys.ExitError` is on error (non-zero). -The main rationale for returning an exit error even if the code is success is -that the module is no longer functional. For example, function exports would -error later. In cases like these, it is better to handle errors where they -occur. +This decision was to improve performance and ergonomics for guests that both +use WASI (have a `_start` function), and also allow custom exports. +Specifically, Rust, TinyGo and normal wasi-libc, don't exit the module during +`_start`. If they did, it would invalidate their function exports. This means +it is unlikely most compilers will change this behavior. -Luckily, it is not common to exit a module during the "_start" function. For -example, the only known compilation target that does this is Emscripten. Most, -such as Rust, TinyGo, or normal wasi-libc, don't. If they did, it would -invalidate their function exports. This means it is unlikely most compilers -will change this behavior. +`GOOS=waspi1` from Go 1.21 does exit during `_start`. However, it doesn't +support other exports besides `_start`, and `_start` is not defined to be +called multiple times anyway. -In summary, we return a `sys.ExitError` to the caller whenever we get it, as it -properly reflects the state of the module, which would be closed on this error. +Since `sys.ExitError` is not always returned, we added `Module.IsClosed` for +defensive checks. This helps integrators avoid calling functions which will +always fail. ### Why panic with `sys.ExitError` after a host function exits? @@ -531,7 +568,7 @@ In short, wazero defined system configuration in `ModuleConfig`, not a WASI type one spec to another with minimal impact. This has other helpful benefits, as centralized resources are simpler to close coherently (ex via `Module.Close`). -In reflection, this worked well as more ABI became usable in wazero. For example, `GOARCH=wasm GOOS=js` code uses the +In reflection, this worked well as more ABI became usable in wazero. For example, `GOOS=js GOARCH=wasm` code uses the same `ModuleConfig` (and `FSConfig`) WASI uses, and in compatible ways. ### Background on `ModuleConfig` design @@ -579,6 +616,135 @@ act differently and document `ModuleConfig` is more about emulating, not necessa ## File systems +### Motivation on `sys.FS` + +The `sys.FS` abstraction in wazero was created because of limitations in +`fs.FS`, and `fs.File` in Go. Compilers targeting `wasip1` may access +functionality that writes new files. The ability to overcome this was requested +even before wazero was named this, via issue #21 in March 2021. + +A month later, golang/go#45757 was raised by someone else on the same topic. As +of July 2023, this has not resolved to a writeable file system abstraction. + +Over the next year more use cases accumulated, consolidated in March 2022 into +#390. This closed in January 2023 with a milestone of providing more +functionality, limited to users giving a real directory. This didn't yet expose +a file abstraction for general purpose use. Internally, this used `os.File`. +However, a wasm module instance is a virtual machine. Only supporting `os.File` +breaks sand-boxing use cases. Moreover, `os.File` is not an interface. Even +though this abstracts functionality, it does allow interception use cases. + +Hence, a few days later in January 2023, we had more issues asking to expose an +abstraction, #1013 and later #1532, on use cases like masking access to files. +In other words, the use case requests never stopped, and aren't solved by +exposing only real files. + +In summary, the primary motivation for exposing a replacement for `fs.FS` and +`fs.File` was around repetitive use case requests for years, around +interception and the ability to create new files, both virtual and real files. +While some use cases are solved with real files, not all are. Regardless, an +interface approach is necessary to ensure users can intercept I/O operations. + +### Why doesn't `sys.File` have a `Fd()` method? + +There are many features we could expose. We could make File expose underlying +file descriptors in case they are supported, for integration of system calls +that accept multiple ones, namely `poll` for multiplexing. This special case is +described in a subsequent section. + +As noted above, users have been asking for a file abstraction for over two +years, and a common answer was to wait. Making users wait is a problem, +especially so long. Good reasons to make people wait are stabilization. Edge +case features are not a great reason to hold abstractions from users. + +Another reason is implementation difficulty. Go did not attempt to abstract +file descriptors. For example, unlike `fs.ReadFile` there is no `fs.FdFile` +interface. Most likely, this is because file descriptors are an implementation +detail of common features. Programming languages, including Go, do not require +end users to know about file descriptors. Types such as `fs.File` can be used +without any knowledge of them. Implementations may or may not have file +descriptors. For example, in Go, `os.DirFS` has underlying file descriptors +while `embed.FS` does not. + +Despite this, some may want to expose a non-standard interface because +`os.File` has `Fd() uintptr` to return a file descriptor. Mainly, this is +handy to integrate with `syscall` package functions (on `GOOS` values that +declare them). Notice, though that `uintptr` is unsafe and not an abstraction. +Close inspection will find some `os.File` types internally use `poll.FD` +instead, yet this is not possible to use abstractly because that type is not +exposed. For example, `plan9` uses a different type than `poll.FD`. In other +words, even in real files, `Fd()` is not wholly portable, despite it being +useful on many operating systems with the `syscall` package. + +The reasons above, why Go doesn't abstract `FdFile` interface are a subset of +reasons why `sys.File` does not. If we exposed `File.Fd()` we not only would +have to declare all the edge cases that Go describes including impact of +finalizers, we would have to describe these in terms of virtualized files. +Then, we would have to reason with this value vs our existing virtualized +`sys.FileTable`, mapping whatever type we return to keys in that table, also +in consideration of garbage collection impact. The combination of issues like +this could lead down a path of not implementing a file system abstraction at +all, and instead a weak key mapped abstraction of the `syscall` package. Once +we finished with all the edge cases, we would have lost context of the original +reason why we started.. simply to allow file write access! + +When wazero attempts to do more than what the Go programming language team, it +has to be carefully evaluated, to: +* Be possible to implement at least for `os.File` backed files +* Not be confusing or cognitively hard for virtual file systems and normal use. +* Affordable: custom code is solely the responsible by the core team, a much + smaller group of individuals than who maintain the Go programming language. + +Due to problems well known in Go, consideration of the end users who constantly +ask for basic file system functionality, and the difficulty virtualizing file +descriptors at multiple levels, we don't expose `Fd()` and likely won't ever +expose `Fd()` on `sys.File`. + +### Why does `sys.File` have a `Poll()` method, while `sys.FS` does not? + +wazero exposes `File.Poll` which allows one-at-a-time poll use cases, +requested by multiple users. This not only includes abstract tests such as +Go 1.21 `GOOS=wasip1`, but real use cases including python and container2wasm +repls, as well listen sockets. The main use cases is non-blocking poll on a +single file. Being a single file, this has no risk of problems such as +head-of-line blocking, even when emulated. + +The main use case of multi-poll are bidirectional network services, something +not used in `GOOS=wasip1` standard libraries, but could be in the future. +Moving forward without a multi-poller allows wazero to expose its file system +abstraction instead of continuing to hold back it back for edge cases. We'll +continue discussion below regardless, as rationale was requested. + +You can loop through multiple `sys.File`, using `File.Poll` to see if an event +is ready, but there is a head-of-line blocking problem. If a long timeout is +used, bad luck could have a file that has nothing to read or write before one +that does. This could cause more blocking than necessary, even if you could +poll the others just after with a zero timeout. What's worse than this is if +unlimited blocking was used (`timeout=-1`). The host implementations could use +goroutines to avoid this, but interrupting a "forever" poll is problematic. All +of these are reasons to consider a multi-poll API, but do not require exporting +`File.Fd()`. + +Should multi-poll becomes critical, `sys.FS` could expose a `Poll` function +like below, despite it being the non-portable, complicated if possible to +implement on all platforms and virtual file systems. +```go +ready, errno := fs.Poll([]sys.PollFile{{f1, sys.POLLIN}, {f2, sys.POLLOUT}}, timeoutMillis) +``` + +A real filesystem could handle this by using an approach like the internal +`unix.Poll` function in Go, passing file descriptors on unix platforms, or +returning `sys.ENOSYS` for unsupported operating systems. Implementation for +virtual files could have a strategy around timeout to avoid the worst case of +head-of-line blocking (unlimited timeout). + +Let's remember that when designing abstractions, it is not best to add an +interface for everything. Certainly, Go doesn't, as evidenced by them not +exposing `poll.FD` in `os.File`! Such a multi-poll could be limited to +built-in filesystems in the wazero repository, avoiding complexity of trying to +support and test this abstractly. This would still permit multiplexing for CLI +users, and also permit single file polling as exists now. + ### Why doesn't wazero implement the working directory? An early design of wazero's API included a `WithWorkDirFS` which allowed @@ -664,7 +830,7 @@ WASI is an abstraction over syscalls. For example, the signature of `fs.Open` does not permit use of flags. This creates conflict on what default behaviors to take when Go implemented `os.DirFS`. On the other hand, `path_open` can pass flags, and in fact tests require them to be honored in specific ways. This -extends beyond WASI as even `GOARCH=wasm GOOS=js` compiled code requires +extends beyond WASI as even `GOOS=js GOARCH=wasm` compiled code requires certain flags passed to `os.OpenFile` which are impossible to pass due to the signature of `fs.FS`. @@ -681,7 +847,61 @@ these to be easier to close. See https://github.com/WebAssembly/wasi-testsuite See https://github.com/golang/go/issues/58141 -### fd_pread: io.Seeker fallback when io.ReaderAt is not supported +## Why is our `Readdir` function more like Go's `os.File` than POSIX `readdir`? + +At one point we attempted to move from a bulk `Readdir` function to something +more like the POSIX `DIR` struct, exposing functions like `telldir`, `seekdir` +and `readdir`. However, we chose the design more like `os.File.Readdir`, +because it performs and fits wasip1 better. + +### wasip1/wasix + +`fd_readdir` in wasip1 (and so also wasix) is like `getdents` in Linux, not +`readdir` in POSIX. `getdents` is more like Go's `os.File.Readdir`. + +We currently have an internal type `sys.DirentCache` which only is used by +wasip1 or wasix. When `HostModuleBuilder` adds support for instantiation state, +we could move this to the `wasi_snapshot_preview1` package. Meanwhile, all +filesystem code is internal anyway, so this special-case is acceptable. + +### wasip2 + +`directory-entry-stream` in wasi-filesystem preview2 is defined in component +model, not an ABI, but in wasmtime it is a consuming iterator. A consuming +iterator is easy to support with anything (like `Readdir(1)`), even if it is +inefficient as you can neither bulk read nor skip. The implementation of the +preview1 adapter (uses preview2) confirms this. They use a dirent cache similar +in some ways to our `sysfs.DirentCache`. As there is no seek concept in +preview2, they interpret the cookie as numeric and read on repeat entries when +a cache wasn't available. Note: we currently do not skip-read like this as it +risks buffering large directories, and no user has requested entries before the +cache, yet. + +Regardless, wasip2 is not complete until the end of 2023. We can defer design +discussion until after it is stable and after the reference impl wasmtime +implements it. + +See + * https://github.com/WebAssembly/wasi-filesystem/blob/ef9fc87c07323a6827632edeb6a7388b31266c8e/example-world.md#directory_entry_stream + * https://github.com/bytecodealliance/wasmtime/blob/b741f7c79d72492d17ab8a29c8ffe4687715938e/crates/wasi/src/preview2/preview2/filesystem.rs#L286-L296 + * https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L2131-L2137 + * https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L936 + +### wasip3 + +`directory-entry-stream` is documented to change significantly in wasip3 moving +from synchronous to synchronous streams. This is dramatically different than +POSIX `readdir` which is synchronous. + +Regardless, wasip3 is not complete until after wasip2, which means 2024 or +later. We can defer design discussion until after it is stable and after the +reference impl wasmtime implements it. + +See + * https://github.com/WebAssembly/WASI/blob/ddfe3d1dda5d1473f37ecebc552ae20ce5fd319a/docs/WitInWasi.md#Streams + * https://docs.google.com/presentation/d/1MNVOZ8hdofO3tI0szg_i-Yoy0N2QPU2C--LzVuoGSlE/edit#slide=id.g1270ef7d5b6_0_662 + +### How do we implement `Pread` with an `fs.File`? `ReadAt` is the Go equivalent to `pread`: it does not affect, and is not affected by, the underlying file offset. Unfortunately, `io.ReaderAt` is not @@ -729,7 +949,7 @@ third `path_len` has ambiguous semantics. `path` offset for the exact length of `path_len`. Wasmer considers `path_len` to be the maximum length instead of the exact -length that should be written. +length that should be written. See https://github.com/wasmerio/wasmer/blob/3463c51268ed551933392a4063bd4f8e7498b0f6/lib/wasi/src/syscalls/mod.rs#L764 The semantics in wazero follows that of wasmtime. @@ -738,11 +958,84 @@ See https://github.com/bytecodealliance/wasmtime/blob/2ca01ae9478f199337cf743a6a Their semantics match when `path_len` == the length of `path`, so in practice this difference won't matter match. -## Why does fd_readdir not include dot (".") and dot-dot ("..") entries? - -When reading a directory, wazero code does not return dot (".") and dot-dot -("..") entries. The main reason is that Go does not return them from -`os.ReadDir`, and materializing them is complicated (at least dot-dot is). +## fd_readdir + +### Why does "wasi_snapshot_preview1" require dot entries when POSIX does not? + +In October 2019, WASI project knew requiring dot entries ("." and "..") was not +documented in preview1, not required by POSIX and problematic to synthesize. +For example, Windows runtimes backed by `FindNextFileW` could not return these. +A year later, the tag representing WASI preview 1 (`snapshot-01`) was made. +This did not include the requested change of making dot entries optional. + +The `phases/snapshot/docs.md` document was altered in subsequent years in +significant ways, often in lock-step with wasmtime or wasi-libc. In January +2022, `sock_accept` was added to `phases/snapshot/docs.md`, a document later +renamed to later renamed to `legacy/preview1/docs.md`. + +As a result, the ABI and behavior remained unstable: The `snapshot-01` tag was +not an effective basis of portability. A test suite was requested well before +this tag, in April 2019. Meanwhile, compliance had no meaning. Developers had +to track changes to the latest doc, while clarifying with wasi-libc or wasmtime +behavior. This lack of stability could have permitted a fix to the dot entries +problem, just as it permitted changes desired by other users. + +In November 2022, the wasi-testsuite project began and started solidifying +expectations. This quickly led to changes in runtimes and the spec doc. WASI +began importing tests from wasmtime as required behaviors for all runtimes. +Some changes implied changes to wasi-libc. For example, `readdir` began to +imply inode fan-outs, which caused performance regressions. Most notably a +test merged in January required dot entries. Tests were merged without running +against any runtime, and even when run ad-hoc only against Linux. Hence, +portability issues mentioned over three years earlier did not trigger any +failure until wazero (which tests Windows) noticed. + +In the same month, wazero requested to revert this change primarily because +Go does not return them from `os.ReadDir`, and materializing them is +complicated due to tests also requiring inodes. Moreover, they are discarded by +not just Go, but other common programming languages. This was rejected by the +WASI lead for preview1, but considered for the completely different ABI named +preview2. + +In February 2023, the WASI chair declared that new rule requiring preview1 to +return dot entries "was decided by the subgroup as a whole", citing meeting +notes. According to these notes, the WASI lead stated incorrectly that POSIX +conformance required returning dot entries, something it explicitly says are +optional. In other words, he said filtering them out would make Preview1 +non-conforming, and asked if anyone objects to this. The co-chair was noted to +say "Because there are existing P1 programs, we shouldn’t make changes like +this." No other were recorded to say anything. + +In summary, preview1 was changed retrospectively to require dot entries and +preview2 was changed to require their absence. This rule was reverse engineered +from wasmtime tests, and affirmed on two false premises: + +* POSIX compliance requires dot entries + * POSIX literally says these are optional +* WASI cannot make changes because there are existing P1 programs. + * Changes to Preview 1 happened before and after this topic. + +As of June 2023, wasi-testsuite still only runs on Linux, so compliance of this +rule on Windows is left to runtimes to decide to validate. The preview2 adapter +uses fake cookies zero and one to refer to dot dirents, uses a real inode for +the dot(".") entry and zero inode for dot-dot(".."). + +See https://github.com/WebAssembly/wasi-filesystem/issues/3 +See https://github.com/WebAssembly/WASI/tree/snapshot-01 +See https://github.com/WebAssembly/WASI/issues/9 +See https://github.com/WebAssembly/WASI/pull/458 +See https://github.com/WebAssembly/wasi-testsuite/pull/32 +See https://github.com/WebAssembly/wasi-libc/pull/345 +See https://github.com/WebAssembly/wasi-testsuite/issues/52 +See https://github.com/WebAssembly/WASI/pull/516 +See https://github.com/WebAssembly/meetings/blob/main/wasi/2023/WASI-02-09.md#should-preview1-fd_readdir-filter-out--and- +See https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L1026-L1041 + +### Why are dot (".") and dot-dot ("..") entries problematic? + +When reading a directory, dot (".") and dot-dot ("..") entries are problematic. +For example, Go does not return them from `os.ReadDir`, and materializing them +is complicated (at least dot-dot is). A directory entry has stat information in it. The stat information includes inode which is used for comparing file equivalence. In the simple case of dot, @@ -758,7 +1051,19 @@ well, such as the decision to not return ".." from a root path. In any case, this should start to explain that faking entries when underlying stdlib doesn't return them is tricky and requires quite a lot of state. -Even if we did that, it would cause expense to all users of wazero, so we'd +Another issue is around the `Dirent.Off` value of a directory entry, sometimes +called a "cookie" in Linux man pagers. When the host operating system or +library function does not return dot entries, to support functions such as +`seekdir`, you still need a value for `Dirent.Off`. Naively, you can synthesize +these by choosing sequential offsets zero and one. However, POSIX strictly says +offsets should be treated opaquely. The backing filesystem could use these to +represent real entries. For example, a directory with one entry could use zero +as the `Dirent.Off` value. If you also used zero for the "." dirent, there +would be a clash. This means if you synthesize `Dirent.Off` for any entry, you +need to synthesize this value for all entries. In practice, the simplest way is +using an incrementing number, such as done in the WASI preview2 adapter. + +Working around these issues causes expense to all users of wazero, so we'd then look to see if that would be justified or not. However, the most common compilers involved in end user questions, as of early 2023 are TinyGo, Rust and Zig. All of these compile code which ignores dot and dot-dot entries. In other @@ -773,12 +1078,100 @@ which summarizes to "these are optional" > The readdir() function shall not return directory entries containing empty names. If entries for dot or dot-dot exist, one entry shall be returned for dot and one entry shall be returned for dot-dot; otherwise, they shall not be returned. -In summary, wazero not only doesn't return dot and dot-dot entries because Go -doesn't and emulating them in spite of that would result in no difference -except hire overhead to the majority of our users. +Unfortunately, as described above, the WASI project decided in early 2023 to +require dot entries in both the spec and the wasi-testsuite. For only this +reason, wazero adds overhead to synthesize dot entries despite it being +unnecessary for most users. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html See https://github.com/golang/go/blob/go1.20/src/os/dir_unix.go#L108-L110 +See https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L1026-L1041 + +### Why don't we pre-populate an inode for the dot-dot ("..") entry? + +We only populate an inode for dot (".") because wasi-testsuite requires it, and +we likely already have it (because we cache it). We could attempt to populate +one for dot-dot (".."), but chose not to. + +Firstly, wasi-testsuite does not require the inode of dot-dot, possibly because +the wasip2 adapter doesn't populate it (but we don't really know why). + +The only other reason to populate it would be to avoid wasi-libc's stat fanout +when it is missing. However, wasi-libc explicitly doesn't fan-out to lstat on +the ".." entry on a zero ino. + +Fetching dot-dot's inode despite the above not only doesn't help wasi-libc, but +it also hurts languages that don't use it, such as Go. These languages would +pay a stat syscall penalty even if they don't need the inode. In fact, Go +discards both dot entries! + +In summary, there are no significant upsides in attempting to pre-fetch +dot-dot's inode, and there are downsides to doing it anyway. + +See + * https://github.com/WebAssembly/wasi-libc/blob/bd950eb128bff337153de217b11270f948d04bb4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L87-L94 + * https://github.com/WebAssembly/wasi-testsuite/blob/main/tests/rust/src/bin/fd_readdir.rs#L108 + * https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L1037 + +### Why don't we require inodes to be non-zero? + +We don't require a non-zero value for `Dirent.Ino` because doing so can prevent +a real one from resolving later via `Stat_t.Ino`. + +We define `Ino` like `d_ino` in POSIX which doesn't special-case zero. It can +be zero for a few reasons: + +* The file is not a regular file or directory. +* The underlying filesystem does not support inodes. e.g. embed:fs +* A directory doesn't include inodes, but a later stat can. e.g. Windows +* The backend is based on wasi-filesystem (a.k.a wasip2), which has + `directory_entry.inode` optional, and might remove it entirely. + +There are other downsides to returning a zero inode in widely used compilers: + +* File equivalence utilities, like `os.SameFile` will not work. +* wasi-libc's `wasip1` mode will call `lstat` and attempt to retrieve a + non-zero value (unless the entry is named ".."). + +A new compiler may accidentally skip a `Dirent` with a zero `Ino` if emulating +a non-POSIX function and re-using `Dirent.Ino` for `d_fileno`. + +* Linux `getdents` doesn't define `d_fileno` must be non-zero +* BSD `getdirentries` is implementation specific. For example, OpenBSD will + return dirents with a zero `d_fileno`, but Darwin will skip them. + +The above shouldn't be a problem, even in the case of BSD, because `wasip1` is +defined more in terms of `getdents` than `getdirentries`. The bottom half of +either should treat `wasip1` (or any similar ABI such as wasix or wasip2) as a +different operating system and either use different logic that doesn't skip, or +synthesize a fake non-zero `d_fileno` when `d_ino` is zero. + +However, this has been a problem. Go's `syscall.ParseDirent` utility is shared +for all `GOOS=unix`. For simplicity, this abstracts `direntIno` with data from +`d_fileno` or `d_ino`, and drops if either are zero, even if `d_fileno` is the +only field with zero explicitly defined. This led to a change to special case +`GOOS=wasip1` as otherwise virtual files would be unconditionally skipped. + +In practice, this problem is rather unique due to so many compilers relying on +wasi-libc, which tolerates a zero inode. For example, while issues were +reported about the performance regression when wasi-libc began doing a fan-out +on zero `Dirent.Ino`, no issues were reported about dirents being dropped as a +result. + +In summary, rather than complicating implementation and forcing non-zero inodes +for a rare case, we permit zero. We instead document this topic thoroughly, so +that emerging compilers can re-use the research and reference it on conflict. +We also document that `Ino` should be non-zero, so that users implementing that +field will attempt to get it. + +See + * https://github.com/WebAssembly/wasi-filesystem/pull/81 + * https://github.com/WebAssembly/wasi-libc/blob/bd950eb128bff337153de217b11270f948d04bb4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L87-L94 + * https://linux.die.net/man/3/getdents + * https://www.unix.com/man-page/osx/2/getdirentries/ + * https://man.openbsd.org/OpenBSD-5.4/getdirentries.2 + * https://github.com/golang/go/blob/go1.20/src/syscall/dirent.go#L60-L102 + * https://go-review.googlesource.com/c/go/+/507915 ## sys.Walltime and Nanotime @@ -907,6 +1300,68 @@ See https://github.com/WebAssembly/stack-switching/discussions/38 See https://github.com/WebAssembly/wasi-threads#what-can-be-skipped See https://slinkydeveloper.com/Kubernetes-controllers-A-New-Hope/ +## sys.Stat_t + +We expose `stat` information as `sys.Stat_t`, like `syscall.Stat_t` except +defined without build constraints. For example, you can use `sys.Stat_t` on +`GOOS=windows` which doesn't define `syscall.Stat_t`. + +The first use case of this is to return inodes from `fs.FileInfo` without +relying on platform-specifics. For example, a user could return `*sys.Stat_t` +from `info.Sys()` and define a non-zero inode for a virtual file, or map a +real inode to a virtual one. + +Notable choices per field are listed below, where `sys.Stat_t` is unlike +`syscall.Stat_t` on `GOOS=linux`, or needs clarification. One common issue +not repeated below is that numeric fields are 64-bit when at least one platform +defines it that large. Also, zero values are equivalent to nil or absent. + +* `Dev` and `Ino` (`Inode`) are both defined unsigned as they are defined + opaque, and most `syscall.Stat_t` also defined them unsigned. There are + separate sections in this document discussing the impact of zero in `Ino`. +* `Mode` is defined as a `fs.FileMode` even though that is not defined in POSIX + and will not map to all possible values. This is because the current use is + WASI, which doesn't define any types or features not already supported. By + using `fs.FileMode`, we can re-use routine experience in Go. +* `NLink` is unsigned because it is defined that way in `syscall.Stat_t`: there + can never be less than zero links to a file. We suggest defaulting to 1 in + conversions when information is not knowable because at least that many links + exist. +* `Size` is signed because it is defined that way in `syscall.Stat_t`: while + regular files and directories will always be non-negative, irregular files + are possibly negative or not defined. Notably sparse files are known to + return negative values. +* `Atim`, `Mtim` and `Ctim` are signed because they are defined that way in + `syscall.Stat_t`: Negative values are time before 1970. The resolution is + nanosecond because that's the maximum resolution currently supported in Go. + +### Why do we use `sys.EpochNanos` instead of `time.Time` or similar? + +To simplify documentation, we defined a type alias `sys.EpochNanos` for int64. +`time.Time` is a data structure, and we could have used this for +`syscall.Stat_t` time values. The most important reason we do not is conversion +penalty deriving time from common types. + +The most common ABI used in `wasip2`. This, and compatible ABI such as `wasix`, +encode timestamps in memory as a 64-bit number. If we used `time.Time`, we +would have to convert an underlying type like `syscall.Timespec` to `time.Time` +only to later have to call `.UnixNano()` to convert it back to a 64-bit number. + +In the future, the component model module "wasi-filesystem" may represent stat +timestamps with a type shared with "wasi-clocks", abstractly structured similar +to `time.Time`. However, component model intentionally does not define an ABI. +It is likely that the canonical ABI for timestamp will be in two parts, but it +is not required for it to be intermediately represented this way. A utility +like `syscall.NsecToTimespec` could split an int64 so that it could be written +to memory as 96 bytes (int64, int32), without allocating a struct. + +Finally, some may confuse epoch nanoseconds with 32-bit epoch seconds. While +32-bit epoch seconds has "The year 2038" problem, epoch nanoseconds has +"The Year 2262" problem, which is even less concerning for this library. If +the Go programming language and wazero exist in the 2200's, we can make a major +version increment to adjust the `sys.EpochNanos` approach. Meanwhile, we have +faster code. + ## poll_oneoff `poll_oneoff` is a WASI API for waiting for I/O events on multiple handles. @@ -944,19 +1399,18 @@ as for regular file descriptors: data is assumed to be present and a success is written back to the result buffer. However, if the reader is detected to read from `os.Stdin`, -a special code path is followed, invoking `platform.Select()`. +a special code path is followed, invoking `sysfs.poll()`. -`platform.Select()` is a wrapper for `select(2)` on POSIX systems, -and it is mocked for a handful of cases also on Windows. +`sysfs.poll()` is a wrapper for `poll(2)` on POSIX systems, +and it is emulated on Windows. -### Select on POSIX +### Poll on POSIX -On POSIX systems,`select(2)` allows to wait for incoming data on a file +On POSIX systems, `poll(2)` allows to wait for incoming data on a file descriptor, and block until either data becomes available or the timeout -expires. It is not surprising that `select(2)` and `poll(2)` have lot in common: -the main difference is how the file descriptor parameters are passed. +expires. -Usage of `platform.Select()` is only reserved for the standard input case, because +Usage of `syfs.poll()` is currently only reserved for standard input, because 1. it is really only necessary to handle interactive input: otherwise, there is no way in Go to peek from Standard Input without actually @@ -965,11 +1419,11 @@ Usage of `platform.Select()` is only reserved for the standard input case, becau 2. if `Stdin` is connected to a pipe, it is ok in most cases to return with success immediately; -3. `platform.Select()` is currently a blocking call, irrespective of goroutines, +3. `syfs.poll()` is currently a blocking call, irrespective of goroutines, because the underlying syscall is; thus, it is better to limit its usage. So, if the subscription is for `os.Stdin` and the handle is detected -to correspond to an interactive session, then `platform.Select()` will be +to correspond to an interactive session, then `sysfs.poll()` will be invoked with a the `Stdin` handle *and* the timeout. This also means that in this specific case, the timeout is uninterruptible, @@ -977,25 +1431,46 @@ unless data becomes available on `Stdin` itself. ### Select on Windows -On Windows the `platform.Select()` is much more straightforward, -and it really just replicates the behavior found in the general cases -for `FdRead` subscriptions: in other words, the subscription to `Stdin` -is immediately acknowledged. +On Windows `sysfs.poll()` cannot be delegated to a single +syscall, because there is no single syscall to handle sockets, +pipes and regular files. + +Instead, we emulate its behavior for the cases that are currently +of interest. + +- For regular files, we _always_ report them as ready, as +[most operating systems do anyway][async-io-windows]. + +- For pipes, we invoke [`PeekNamedPipe`][peeknamedpipe] +for each file handle we detect is a pipe open for reading. +We currently ignore pipes open for writing. + +- Notably, we include also support for sockets using the [WinSock +implementation of `poll`][wsapoll], but instead +of relying on the timeout argument of the `WSAPoll` function, +we set a 0-duration timeout so that it behaves like a peek. + +This way, we can check for regular files all at once, +at the beginning of the function, then we poll pipes and +sockets periodically using a cancellable `time.Tick`, +which plays nicely with the rest of the Go runtime. -The implementation also support a timeout, but in this case -it relies on `time.Sleep()`, which notably, as compared to the POSIX -case, interruptible and compatible with goroutines. +### Impact of blocking -However, because `Stdin` subscriptions are always acknowledged -without wait and because this code path is always followed only -when at least one `Stdin` subscription is present, then the -timeout is effectively always handled externally. +Because this is a blocking syscall, it will also block the carrier thread of +the goroutine, preventing any means to support context cancellation directly. -In any case, the behavior of `platform.Select` on Windows -is sensibly different from the behavior on POSIX platforms; -we plan to refine and further align it in semantics in the future. +There are ways to obviate this issue. We outline here one idea, that is however +not currently implemented. A common approach to support context cancellation is +to add a signal file descriptor to the set, e.g. the read-end of a pipe or an +eventfd on Linux. When the context is canceled, we may unblock a Select call by +writing to the fd, causing it to return immediately. This however requires to +do a bit of housekeeping to hide the "special" FD from the end-user. [poll_oneoff]: https://github.com/WebAssembly/wasi-poll#why-is-the-function-called-poll_oneoff +[async-io-windows]: https://tinyclouds.org/iocp_links +[peeknamedpipe]: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe +[wsapoll]: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll ## Signed encoding of integer global constant initializers diff --git a/vendor/github.com/tetratelabs/wazero/api/wasm.go b/vendor/github.com/tetratelabs/wazero/api/wasm.go index 38728b4273..f611d3eac2 100644 --- a/vendor/github.com/tetratelabs/wazero/api/wasm.go +++ b/vendor/github.com/tetratelabs/wazero/api/wasm.go @@ -150,6 +150,10 @@ type Module interface { Memory() Memory // ExportedFunction returns a function exported from this module or nil if it wasn't. + // + // Note: The default wazero.ModuleConfig attempts to invoke `_start`, which + // in rare cases can close the module. When in doubt, check IsClosed prior + // to invoking a function export after instantiation. ExportedFunction(name string) Function // ExportedFunctionDefinitions returns all the exported function @@ -190,6 +194,21 @@ type Module interface { // Closer closes this module by delegating to CloseWithExitCode with an exit code of zero. Closer + // IsClosed returns true if the module is closed, so no longer usable. + // + // This can happen for the following reasons: + // - Closer was called directly. + // - A guest function called Closer indirectly, such as `_start` calling + // `proc_exit`, which internally closed the module. + // - wazero.RuntimeConfig `WithCloseOnContextDone` was enabled and a + // context completion closed the module. + // + // Where any of the above are possible, check this value before calling an + // ExportedFunction, even if you didn't formerly receive a sys.ExitError. + // sys.ExitError is only returned on non-zero code, something that closes + // the module successfully will not result it one. + IsClosed() bool + internalapi.WazeroOnly } diff --git a/vendor/github.com/tetratelabs/wazero/config.go b/vendor/github.com/tetratelabs/wazero/config.go index 56a32fcf5b..70219b055f 100644 --- a/vendor/github.com/tetratelabs/wazero/config.go +++ b/vendor/github.com/tetratelabs/wazero/config.go @@ -11,10 +11,10 @@ import ( "time" "github.com/tetratelabs/wazero/api" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/engine/compiler" "github.com/tetratelabs/wazero/internal/engine/interpreter" "github.com/tetratelabs/wazero/internal/filecache" - "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/internalapi" "github.com/tetratelabs/wazero/internal/platform" internalsock "github.com/tetratelabs/wazero/internal/sock" @@ -490,12 +490,19 @@ type ModuleConfig interface { // WithStartFunctions configures the functions to call after the module is // instantiated. Defaults to "_start". // + // Clearing the default is supported, via `WithStartFunctions()`. + // // # Notes // - // - If any function doesn't exist, it is skipped. However, all functions - // that do exist are called in order. - // - Some start functions may exit the module during instantiate with a - // sys.ExitError (e.g. emscripten), preventing use of exported functions. + // - If a start function doesn't exist, it is skipped. However, any that + // do exist are called in order. + // - Start functions are not intended to be called multiple times. + // Functions that should be called multiple times should be invoked + // manually via api.Module's `ExportedFunction` method. + // - Start functions commonly exit the module during instantiation, + // preventing use of any functions later. This is the case in "wasip1", + // which defines the default value "_start". + // - See /RATIONALE.md for motivation of this feature. WithStartFunctions(...string) ModuleConfig // WithStderr configures where standard error (file descriptor 2) is written. Defaults to io.Discard. @@ -839,11 +846,10 @@ func (c *moduleConfig) toSysContext() (sysCtx *internalsys.Context, err error) { environ = append(environ, result) } - var fs fsapi.FS + var fs []experimentalsys.FS + var guestPaths []string if f, ok := c.fsConfig.(*fsConfig); ok { - if fs, err = f.toFS(); err != nil { - return - } + fs, guestPaths = f.preopens() } var listeners []*net.TCPListener @@ -864,7 +870,7 @@ func (c *moduleConfig) toSysContext() (sysCtx *internalsys.Context, err error) { c.walltime, c.walltimeResolution, c.nanotime, c.nanotimeResolution, c.nanosleep, c.osyield, - fs, + fs, guestPaths, listeners, ) } diff --git a/vendor/github.com/tetratelabs/wazero/experimental/close.go b/vendor/github.com/tetratelabs/wazero/experimental/close.go new file mode 100644 index 0000000000..1c37e8c030 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/close.go @@ -0,0 +1,63 @@ +package experimental + +import ( + "context" + + "github.com/tetratelabs/wazero/internal/close" +) + +// CloseNotifier is a notification hook, invoked when a module is closed. +// +// Note: This is experimental progress towards #1197, and likely to change. Do +// not expose this in shared libraries as it can cause version locks. +type CloseNotifier interface { + // CloseNotify is a notification that occurs *before* an api.Module is + // closed. `exitCode` is zero on success or in the case there was no exit + // code. + // + // Notes: + // - This does not return an error because the module will be closed + // unconditionally. + // - Do not panic from this function as it doing so could cause resource + // leaks. + // - While this is only called once per module, if configured for + // multiple modules, it will be called for each, e.g. on runtime close. + CloseNotify(ctx context.Context, exitCode uint32) +} + +// ^-- Note: This might need to be a part of the listener or become a part of +// host state implementation. For example, if this is used to implement state +// cleanup for host modules, possibly something like below would be better, as +// it could be implemented in a way that allows concurrent module use. +// +// // key is like a context key, stateFactory is invoked per instantiate and +// // is associated with the key (exposed as `Module.State` similar to go +// // context). Using a key is better than the module name because we can +// // de-dupe it for host modules that can be instantiated into different +// // names. Also, you can make the key package private. +// HostModuleBuilder.WithState(key any, stateFactory func() Cleanup)` +// +// Such a design could work to isolate state only needed for wasip1, for +// example the dirent cache. However, if end users use this for different +// things, we may need separate designs. +// +// In summary, the purpose of this iteration is to identify projects that +// would use something like this, and then we can figure out which way it +// should go. + +// CloseNotifyFunc is a convenience for defining inlining a CloseNotifier. +type CloseNotifyFunc func(ctx context.Context, exitCode uint32) + +// CloseNotify implements CloseNotifier.CloseNotify. +func (f CloseNotifyFunc) CloseNotify(ctx context.Context, exitCode uint32) { + f(ctx, exitCode) +} + +// WithCloseNotifier registers the given CloseNotifier into the given +// context.Context. +func WithCloseNotifier(ctx context.Context, notifier CloseNotifier) context.Context { + if notifier != nil { + return context.WithValue(ctx, close.NotifierKey{}, notifier) + } + return ctx +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go new file mode 100644 index 0000000000..0b997cb8fc --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go @@ -0,0 +1,92 @@ +package sys + +import ( + "fmt" + "io/fs" + + "github.com/tetratelabs/wazero/sys" +) + +// FileType is fs.FileMode masked on fs.ModeType. For example, zero is a +// regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. +// +// Note: This is defined by Linux, not POSIX. +type FileType = fs.FileMode + +// Dirent is an entry read from a directory via File.Readdir. +// +// # Notes +// +// - This extends `dirent` defined in POSIX with some fields defined by +// Linux. See https://man7.org/linux/man-pages/man3/readdir.3.html and +// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html +// - This has a subset of fields defined in sys.Stat_t. Notably, there is no +// field corresponding to Stat_t.Dev because that value will be constant +// for all files in a directory. To get the Dev value, call File.Stat on +// the directory File.Readdir was called on. +type Dirent struct { + // Ino is the file serial number, or zero if not available. See Ino for + // more details including impact returning a zero value. + Ino sys.Inode + + // Name is the base name of the directory entry. Empty is invalid. + Name string + + // Type is fs.FileMode masked on fs.ModeType. For example, zero is a + // regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. + // + // Note: This is defined by Linux, not POSIX. + Type fs.FileMode +} + +func (d *Dirent) String() string { + return fmt.Sprintf("name=%s, type=%v, ino=%d", d.Name, d.Type, d.Ino) +} + +// IsDir returns true if the Type is fs.ModeDir. +func (d *Dirent) IsDir() bool { + return d.Type == fs.ModeDir +} + +// DirFile is embeddable to reduce the amount of functions to implement a file. +type DirFile struct{} + +// IsAppend implements File.IsAppend +func (DirFile) IsAppend() bool { + return false +} + +// SetAppend implements File.SetAppend +func (DirFile) SetAppend(bool) Errno { + return EISDIR +} + +// IsDir implements File.IsDir +func (DirFile) IsDir() (bool, Errno) { + return true, 0 +} + +// Read implements File.Read +func (DirFile) Read([]byte) (int, Errno) { + return 0, EISDIR +} + +// Pread implements File.Pread +func (DirFile) Pread([]byte, int64) (int, Errno) { + return 0, EISDIR +} + +// Write implements File.Write +func (DirFile) Write([]byte) (int, Errno) { + return 0, EISDIR +} + +// Pwrite implements File.Pwrite +func (DirFile) Pwrite([]byte, int64) (int, Errno) { + return 0, EISDIR +} + +// Truncate implements File.Truncate +func (DirFile) Truncate(int64) Errno { + return EISDIR +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go new file mode 100644 index 0000000000..81baadd0d9 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go @@ -0,0 +1,95 @@ +package sys + +import "strconv" + +// Errno is a subset of POSIX errno used by wazero interfaces. Zero is not an +// error. Other values should not be interpreted numerically, rather by constants +// prefixed with 'E'. +// +// See https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html +type Errno uint16 + +// ^-- Note: This will eventually move to the public /sys package. It is +// experimental until we audit the socket related APIs to ensure we have all +// the Errno it returns, and we export fs.FS. This is not in /internal/sys as +// that would introduce a package cycle. + +// This is a subset of errors to reduce implementation burden. `wasip1` defines +// almost all POSIX error numbers, but not all are used in practice. wazero +// will add ones needed in POSIX order, as needed by functions that explicitly +// document returning them. +// +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-errno-enumu16 +const ( + EACCES Errno = iota + 1 + EAGAIN + EBADF + EEXIST + EFAULT + EINTR + EINVAL + EIO + EISDIR + ELOOP + ENAMETOOLONG + ENOENT + ENOSYS + ENOTDIR + ENOTEMPTY + ENOTSOCK + ENOTSUP + EPERM + EROFS + + // NOTE ENOTCAPABLE is defined in wasip1, but not in POSIX. wasi-libc + // converts it to EBADF, ESPIPE or EINVAL depending on the call site. + // It isn't known if compilers who don't use ENOTCAPABLE would crash on it. +) + +// Error implements error +func (e Errno) Error() string { + switch e { + case 0: // not an error + return "success" + case EACCES: + return "permission denied" + case EAGAIN: + return "resource unavailable, try again" + case EBADF: + return "bad file descriptor" + case EEXIST: + return "file exists" + case EFAULT: + return "bad address" + case EINTR: + return "interrupted function" + case EINVAL: + return "invalid argument" + case EIO: + return "input/output error" + case EISDIR: + return "is a directory" + case ELOOP: + return "too many levels of symbolic links" + case ENAMETOOLONG: + return "filename too long" + case ENOENT: + return "no such file or directory" + case ENOSYS: + return "functionality not supported" + case ENOTDIR: + return "not a directory or a symbolic link to a directory" + case ENOTEMPTY: + return "directory not empty" + case ENOTSOCK: + return "not a socket" + case ENOTSUP: + return "not supported (may be the same value as [EOPNOTSUPP])" + case EPERM: + return "operation not permitted" + case EROFS: + return "read-only file system" + default: + return "Errno(" + strconv.Itoa(int(e)) + ")" + } +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/error.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/error.go similarity index 54% rename from vendor/github.com/tetratelabs/wazero/internal/platform/error.go rename to vendor/github.com/tetratelabs/wazero/experimental/sys/error.go index 3219e5265e..a0c76019aa 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/error.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/error.go @@ -1,39 +1,32 @@ -package platform +package sys import ( "io" "io/fs" "os" - "syscall" ) -// UnwrapOSError returns a syscall.Errno or zero if the input is nil. -func UnwrapOSError(err error) syscall.Errno { +// UnwrapOSError returns an Errno or zero if the input is nil. +func UnwrapOSError(err error) Errno { if err == nil { return 0 } err = underlyingError(err) - if se, ok := err.(syscall.Errno); ok { - return adjustErrno(se) - } - // Below are all the fs.ErrXXX in fs.go. - // - // Note: Once we have our own file type, we should never see these. switch err { case nil, io.EOF: - return 0 // EOF is not a syscall.Errno + return 0 // EOF is not a Errno case fs.ErrInvalid: - return syscall.EINVAL + return EINVAL case fs.ErrPermission: - return syscall.EPERM + return EPERM case fs.ErrExist: - return syscall.EEXIST + return EEXIST case fs.ErrNotExist: - return syscall.ENOENT + return ENOENT case fs.ErrClosed: - return syscall.EBADF + return EBADF } - return syscall.EIO + return errorToErrno(err) } // underlyingError returns the underlying error if a well-known OS error type. diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/file.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/file.go new file mode 100644 index 0000000000..f8f2e5b128 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/file.go @@ -0,0 +1,317 @@ +package sys + +import "github.com/tetratelabs/wazero/sys" + +// File is a writeable fs.File bridge backed by syscall functions needed for ABI +// including WASI and runtime.GOOS=js. +// +// Implementations should embed UnimplementedFile for forward compatability. Any +// unsupported method or parameter should return ENOSYS. +// +// # Errors +// +// All methods that can return an error return a Errno, which is zero +// on success. +// +// Restricting to Errno matches current WebAssembly host functions, +// which are constrained to well-known error codes. For example, `GOOS=js` maps +// hard coded values and panics otherwise. More commonly, WASI maps syscall +// errors to u32 numeric values. +// +// # Notes +// +// - You must call Close to avoid file resource conflicts. For example, +// Windows cannot delete the underlying directory while a handle to it +// remains open. +// - A writable filesystem abstraction is not yet implemented as of Go 1.20. +// See https://github.com/golang/go/issues/45757 +type File interface { + // Dev returns the device ID (Stat_t.Dev) of this file, zero if unknown or + // an error retrieving it. + // + // # Errors + // + // Possible errors are those from Stat, except ENOSYS should not + // be returned. Zero should be returned if there is no implementation. + // + // # Notes + // + // - Implementations should cache this result. + // - This combined with Ino can implement os.SameFile. + Dev() (uint64, Errno) + + // Ino returns the serial number (Stat_t.Ino) of this file, zero if unknown + // or an error retrieving it. + // + // # Errors + // + // Possible errors are those from Stat, except ENOSYS should not + // be returned. Zero should be returned if there is no implementation. + // + // # Notes + // + // - Implementations should cache this result. + // - This combined with Dev can implement os.SameFile. + Ino() (sys.Inode, Errno) + + // IsDir returns true if this file is a directory or an error there was an + // error retrieving this information. + // + // # Errors + // + // Possible errors are those from Stat, except ENOSYS should not + // be returned. false should be returned if there is no implementation. + // + // # Notes + // + // - Implementations should cache this result. + IsDir() (bool, Errno) + + // IsAppend returns true if the file was opened with O_APPEND, or + // SetAppend was successfully enabled on this file. + // + // # Notes + // + // - This might not match the underlying state of the file descriptor if + // the file was not opened via OpenFile. + IsAppend() bool + + // SetAppend toggles the append mode (O_APPEND) of this file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - There is no `O_APPEND` for `fcntl` in POSIX, so implementations may + // have to re-open the underlying file to apply this. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html + SetAppend(enable bool) Errno + + // Stat is similar to syscall.Fstat. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.Fstat and `fstatat` with `AT_FDCWD` in POSIX. + // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html + // - A fs.FileInfo backed implementation sets atim, mtim and ctim to the + // same value. + // - Windows allows you to stat a closed directory. + Stat() (sys.Stat_t, Errno) + + // Read attempts to read all bytes in the file into `buf`, and returns the + // count read even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not readable. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like io.Reader and `read` in POSIX, preferring semantics of + // io.Reader. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html + // - Unlike io.Reader, there is no io.EOF returned on end-of-file. To + // read the file completely, the caller must repeat until `n` is zero. + Read(buf []byte) (n int, errno Errno) + + // Pread attempts to read all bytes in the file into `p`, starting at the + // offset `off`, and returns the count read even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not readable. + // - EINVAL: the offset was negative. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like io.ReaderAt and `pread` in POSIX, preferring semantics + // of io.ReaderAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html + // - Unlike io.ReaderAt, there is no io.EOF returned on end-of-file. To + // read the file completely, the caller must repeat until `n` is zero. + Pread(buf []byte, off int64) (n int, errno Errno) + + // Seek attempts to set the next offset for Read or Write and returns the + // resulting absolute offset or an error. + // + // # Parameters + // + // The `offset` parameters is interpreted in terms of `whence`: + // - io.SeekStart: relative to the start of the file, e.g. offset=0 sets + // the next Read or Write to the beginning of the file. + // - io.SeekCurrent: relative to the current offset, e.g. offset=16 sets + // the next Read or Write 16 bytes past the prior. + // - io.SeekEnd: relative to the end of the file, e.g. offset=-1 sets the + // next Read or Write to the last byte in the file. + // + // # Behavior when a directory + // + // The only supported use case for a directory is seeking to `offset` zero + // (`whence` = io.SeekStart). This should have the same behavior as + // os.File, which resets any internal state used by Readdir. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not readable. + // - EINVAL: the offset was negative. + // + // # Notes + // + // - This is like io.Seeker and `fseek` in POSIX, preferring semantics + // of io.Seeker. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html + Seek(offset int64, whence int) (newOffset int64, errno Errno) + + // Readdir reads the contents of the directory associated with file and + // returns a slice of up to n Dirent values in an arbitrary order. This is + // a stateful function, so subsequent calls return any next values. + // + // If n > 0, Readdir returns at most n entries or an error. + // If n <= 0, Readdir returns all remaining entries or an error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file was closed or not a directory. + // - ENOENT: the directory could not be read (e.g. deleted). + // + // # Notes + // + // - This is like `Readdir` on os.File, but unlike `readdir` in POSIX. + // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html + // - Unlike os.File, there is no io.EOF returned on end-of-directory. To + // read the directory completely, the caller must repeat until the + // count read (`len(dirents)`) is less than `n`. + // - See /RATIONALE.md for design notes. + Readdir(n int) (dirents []Dirent, errno Errno) + + // Write attempts to write all bytes in `p` to the file, and returns the + // count written even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file was closed, not writeable, or a directory. + // + // # Notes + // + // - This is like io.Writer and `write` in POSIX, preferring semantics of + // io.Writer. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html + Write(buf []byte) (n int, errno Errno) + + // Pwrite attempts to write all bytes in `p` to the file at the given + // offset `off`, and returns the count written even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not writeable. + // - EINVAL: the offset was negative. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like io.WriterAt and `pwrite` in POSIX, preferring semantics + // of io.WriterAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html + Pwrite(buf []byte, off int64) (n int, errno Errno) + + // Truncate truncates a file to a specified length. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // - EINVAL: the `size` is negative. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like syscall.Ftruncate and `ftruncate` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html + // - Windows does not error when calling Truncate on a closed file. + Truncate(size int64) Errno + + // Sync synchronizes changes to the file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.Fsync and `fsync` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html + // - This returns with no error instead of ENOSYS when + // unimplemented. This prevents fake filesystems from erring. + // - Windows does not error when calling Sync on a closed file. + Sync() Errno + + // Datasync synchronizes the data of a file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.Fdatasync and `fdatasync` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html + // - This returns with no error instead of ENOSYS when + // unimplemented. This prevents fake filesystems from erring. + // - As this is commonly missing, some implementations dispatch to Sync. + Datasync() Errno + + // Utimens set file access and modification times of this file, at + // nanosecond precision. + // + // # Parameters + // + // The `atim` and `mtim` parameters refer to access and modification time + // stamps as defined in sys.Stat_t. To retain one or the other, substitute + // it with the pseudo-timestamp UTIME_OMIT. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.UtimesNano and `futimens` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html + // - Windows requires files to be open with O_RDWR, which means you + // cannot use this to update timestamps on a directory (EPERM). + Utimens(atim, mtim int64) Errno + + // Close closes the underlying file. + // + // A zero Errno is returned if unimplemented or success. + // + // # Notes + // + // - This is like syscall.Close and `close` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html + Close() Errno +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go new file mode 100644 index 0000000000..1ce99cef18 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go @@ -0,0 +1,293 @@ +package sys + +import ( + "io/fs" + + "github.com/tetratelabs/wazero/sys" +) + +// FS is a writeable fs.FS bridge backed by syscall functions needed for ABI +// including WASI and runtime.GOOS=js. +// +// Implementations should embed UnimplementedFS for forward compatability. Any +// unsupported method or parameter should return ENO +// +// # Errors +// +// All methods that can return an error return a Errno, which is zero +// on success. +// +// Restricting to Errno matches current WebAssembly host functions, +// which are constrained to well-known error codes. For example, `GOOS=js` maps +// hard coded values and panics otherwise. More commonly, WASI maps syscall +// errors to u32 numeric values. +// +// # Notes +// +// A writable filesystem abstraction is not yet implemented as of Go 1.20. See +// https://github.com/golang/go/issues/45757 +type FS interface { + // OpenFile opens a file. It should be closed via Close on File. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` or `flag` is invalid. + // - EISDIR: the path was a directory, but flag included O_RDWR or + // O_WRONLY + // - ENOENT: `path` doesn't exist and `flag` doesn't contain O_CREAT. + // + // # Constraints on the returned file + // + // Implementations that can read flags should enforce them regardless of + // the type returned. For example, while os.File implements io.Writer, + // attempts to write to a directory or a file opened with O_RDONLY fail + // with a EBADF. + // + // Some implementations choose whether to enforce read-only opens, namely + // fs.FS. While fs.FS is supported (Adapt), wazero cannot runtime enforce + // open flags. Instead, we encourage good behavior and test our built-in + // implementations. + // + // # Notes + // + // - This is like os.OpenFile, except the path is relative to this file + // system, and Errno is returned instead of os.PathError. + // - Implications of permissions when O_CREAT are described in Chmod notes. + // - This is like `open` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html + OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno) + + // Lstat gets file status without following symbolic links. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - ENOENT: `path` doesn't exist. + // + // # Notes + // + // - This is like syscall.Lstat, except the `path` is relative to this + // file system. + // - This is like `lstat` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html + // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the + // same value. + // - When the path is a symbolic link, the stat returned is for the link, + // not the file it refers to. + Lstat(path string) (sys.Stat_t, Errno) + + // Stat gets file status. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - ENOENT: `path` doesn't exist. + // + // # Notes + // + // - This is like syscall.Stat, except the `path` is relative to this + // file system. + // - This is like `stat` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html + // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the + // same value. + // - When the path is a symbolic link, the stat returned is for the file + // it refers to. + Stat(path string) (sys.Stat_t, Errno) + + // Mkdir makes a directory. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - EEXIST: `path` exists and is a directory. + // - ENOTDIR: `path` exists and is a file. + // + // # Notes + // + // - This is like syscall.Mkdir, except the `path` is relative to this + // file system. + // - This is like `mkdir` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html + // - Implications of permissions are described in Chmod notes. + Mkdir(path string, perm fs.FileMode) Errno + + // Chmod changes the mode of the file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - ENOENT: `path` does not exist. + // + // # Notes + // + // - This is like syscall.Chmod, except the `path` is relative to this + // file system. + // - This is like `chmod` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html + // - Windows ignores the execute bit, and any permissions come back as + // group and world. For example, chmod of 0400 reads back as 0444, and + // 0700 0666. Also, permissions on directories aren't supported at all. + Chmod(path string, perm fs.FileMode) Errno + + // Rename renames file or directory. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `from` or `to` is invalid. + // - ENOENT: `from` or `to` don't exist. + // - ENOTDIR: `from` is a directory and `to` exists as a file. + // - EISDIR: `from` is a file and `to` exists as a directory. + // - ENOTEMPTY: `both from` and `to` are existing directory, but + // `to` is not empty. + // + // # Notes + // + // - This is like syscall.Rename, except the paths are relative to this + // file system. + // - This is like `rename` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html + // - Windows doesn't let you overwrite an existing directory. + Rename(from, to string) Errno + + // Rmdir removes a directory. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - ENOENT: `path` doesn't exist. + // - ENOTDIR: `path` exists, but isn't a directory. + // - ENOTEMPTY: `path` exists, but isn't empty. + // + // # Notes + // + // - This is like syscall.Rmdir, except the `path` is relative to this + // file system. + // - This is like `rmdir` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html + // - As of Go 1.19, Windows maps ENOTDIR to ENOENT. + Rmdir(path string) Errno + + // Unlink removes a directory entry. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - ENOENT: `path` doesn't exist. + // - EISDIR: `path` exists, but is a directory. + // + // # Notes + // + // - This is like syscall.Unlink, except the `path` is relative to this + // file system. + // - This is like `unlink` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html + // - On Windows, syscall.Unlink doesn't delete symlink to directory unlike other platforms. Implementations might + // want to combine syscall.RemoveDirectory with syscall.Unlink in order to delete such links on Windows. + // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya + Unlink(path string) Errno + + // Link creates a "hard" link from oldPath to newPath, in contrast to a + // soft link (via Symlink). + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EPERM: `oldPath` is invalid. + // - ENOENT: `oldPath` doesn't exist. + // - EISDIR: `newPath` exists, but is a directory. + // + // # Notes + // + // - This is like syscall.Link, except the `oldPath` is relative to this + // file system. + // - This is like `link` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html + Link(oldPath, newPath string) Errno + + // Symlink creates a "soft" link from oldPath to newPath, in contrast to a + // hard link (via Link). + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EPERM: `oldPath` or `newPath` is invalid. + // - EEXIST: `newPath` exists. + // + // # Notes + // + // - This is like syscall.Symlink, except the `oldPath` is relative to + // this file system. + // - This is like `symlink` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html + // - Only `newPath` is relative to this file system and `oldPath` is kept + // as-is. That is because the link is only resolved relative to the + // directory when dereferencing it (e.g. ReadLink). + // See https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 + // for how others implement this. + // - Symlinks in Windows requires `SeCreateSymbolicLinkPrivilege`. + // Otherwise, EPERM results. + // See https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links + Symlink(oldPath, linkName string) Errno + + // Readlink reads the contents of a symbolic link. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // + // # Notes + // + // - This is like syscall.Readlink, except the path is relative to this + // filesystem. + // - This is like `readlink` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html + // - On Windows, the path separator is different from other platforms, + // but to provide consistent results to Wasm, this normalizes to a "/" + // separator. + Readlink(path string) (string, Errno) + + // Utimens set file access and modification times on a path relative to + // this file system, at nanosecond precision. + // + // # Parameters + // + // If the path is a symbolic link, the target of expanding that link is + // updated. + // + // The `atim` and `mtim` parameters refer to access and modification time + // stamps as defined in sys.Stat_t. To retain one or the other, substitute + // it with the pseudo-timestamp UTIME_OMIT. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - EEXIST: `path` exists and is a directory. + // - ENOTDIR: `path` exists and is a file. + // + // # Notes + // + // - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in + // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html + Utimens(path string, atim, mtim int64) Errno +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go new file mode 100644 index 0000000000..39ebd378f6 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go @@ -0,0 +1,70 @@ +package sys + +// Oflag are flags used for FS.OpenFile. Values, including zero, should not be +// interpreted numerically. Instead, use by constants prefixed with 'O_' with +// special casing noted below. +// +// # Notes +// +// - O_RDONLY, O_RDWR and O_WRONLY are mutually exclusive, while the other +// flags can coexist bitwise. +// - This is like `flag` in os.OpenFile and `oflag` in POSIX. See +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html +type Oflag uint32 + +// This is a subset of oflags to reduce implementation burden. `wasip1` splits +// these across `oflags` and `fdflags`. We can't rely on the Go `os` package, +// as it is missing some values. Any flags added will be defined in POSIX +// order, as needed by functions that explicitly document accepting them. +// +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-oflags-flagsu16 +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fdflags-flagsu16 +const ( + // O_RDONLY is like os.O_RDONLY + O_RDONLY Oflag = iota + + // O_RDWR is like os.O_RDWR + O_RDWR + + // O_WRONLY is like os.O_WRONLY + O_WRONLY + + // Define bitflags as they are in POSIX `open`: alphabetically + + // O_APPEND is like os.O_APPEND + O_APPEND Oflag = 1 << iota + + // O_CREAT is link os.O_CREATE + O_CREAT + + // O_DIRECTORY is defined on some platforms as syscall.O_DIRECTORY. + // + // Note: This ensures that the opened file is a directory. Those emulating + // on platforms that don't support the O_DIRECTORY, can double-check the + // result with File.IsDir (or stat) and err if not a directory. + O_DIRECTORY + + // O_DSYNC is defined on some platforms as syscall.O_DSYNC. + O_DSYNC + + // O_EXCL is defined on some platforms as syscall.O_EXCL. + O_EXCL + + // O_NOFOLLOW is defined on some platforms as syscall.O_NOFOLLOW. + // + // Note: This allows programs to ensure that if the opened file is a + // symbolic link, the link itself is opened instead of its target. + O_NOFOLLOW + + // O_NONBLOCK is defined on some platforms as syscall.O_NONBLOCK. + O_NONBLOCK + + // O_RSYNC is defined on some platforms as syscall.O_RSYNC. + O_RSYNC + + // O_SYNC is defined on some platforms as syscall.O_SYNC. + O_SYNC + + // O_TRUNC is defined on some platforms as syscall.O_TRUNC. + O_TRUNC +) diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go new file mode 100644 index 0000000000..23c4be9283 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go @@ -0,0 +1,104 @@ +//go:build !plan9 + +package sys + +import "syscall" + +func syscallToErrno(err error) (Errno, bool) { + errno, ok := err.(syscall.Errno) + if !ok { + return 0, false + } + switch errno { + case 0: + return 0, true + case syscall.EACCES: + return EACCES, true + case syscall.EAGAIN: + return EAGAIN, true + case syscall.EBADF: + return EBADF, true + case syscall.EEXIST: + return EEXIST, true + case syscall.EFAULT: + return EFAULT, true + case syscall.EINTR: + return EINTR, true + case syscall.EINVAL: + return EINVAL, true + case syscall.EIO: + return EIO, true + case syscall.EISDIR: + return EISDIR, true + case syscall.ELOOP: + return ELOOP, true + case syscall.ENAMETOOLONG: + return ENAMETOOLONG, true + case syscall.ENOENT: + return ENOENT, true + case syscall.ENOSYS: + return ENOSYS, true + case syscall.ENOTDIR: + return ENOTDIR, true + case syscall.ENOTEMPTY: + return ENOTEMPTY, true + case syscall.ENOTSOCK: + return ENOTSOCK, true + case syscall.ENOTSUP: + return ENOTSUP, true + case syscall.EPERM: + return EPERM, true + case syscall.EROFS: + return EROFS, true + default: + return EIO, true + } +} + +// Unwrap is a convenience for runtime.GOOS which define syscall.Errno. +func (e Errno) Unwrap() error { + switch e { + case 0: + return nil + case EACCES: + return syscall.EACCES + case EAGAIN: + return syscall.EAGAIN + case EBADF: + return syscall.EBADF + case EEXIST: + return syscall.EEXIST + case EFAULT: + return syscall.EFAULT + case EINTR: + return syscall.EINTR + case EINVAL: + return syscall.EINVAL + case EIO: + return syscall.EIO + case EISDIR: + return syscall.EISDIR + case ELOOP: + return syscall.ELOOP + case ENAMETOOLONG: + return syscall.ENAMETOOLONG + case ENOENT: + return syscall.ENOENT + case ENOSYS: + return syscall.ENOSYS + case ENOTDIR: + return syscall.ENOTDIR + case ENOTEMPTY: + return syscall.ENOTEMPTY + case ENOTSOCK: + return syscall.ENOTSOCK + case ENOTSUP: + return syscall.ENOTSUP + case EPERM: + return syscall.EPERM + case EROFS: + return syscall.EROFS + default: + return syscall.EIO + } +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go new file mode 100644 index 0000000000..8a88ed7658 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go @@ -0,0 +1,13 @@ +//go:build !windows + +package sys + +func errorToErrno(err error) Errno { + if errno, ok := err.(Errno); ok { + return errno + } + if errno, ok := syscallToErrno(err); ok { + return errno + } + return EIO +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go new file mode 100644 index 0000000000..0e454f0acb --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go @@ -0,0 +1,5 @@ +package sys + +func syscallToErrno(err error) (Errno, bool) { + return 0, false +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go new file mode 100644 index 0000000000..761a1f9dc2 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go @@ -0,0 +1,62 @@ +package sys + +import "syscall" + +// These are errors not defined in the syscall package. They are prefixed with +// underscore to avoid exporting them. +// +// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- +const ( + // _ERROR_INVALID_HANDLE is a Windows error returned by syscall.Write + // instead of syscall.EBADF + _ERROR_INVALID_HANDLE = syscall.Errno(6) + + // _ERROR_INVALID_NAME is a Windows error returned by open when a file + // path has a trailing slash + _ERROR_INVALID_NAME = syscall.Errno(0x7B) + + // _ERROR_NEGATIVE_SEEK is a Windows error returned by os.Truncate + // instead of syscall.EINVAL + _ERROR_NEGATIVE_SEEK = syscall.Errno(0x83) + + // _ERROR_DIRECTORY is a Windows error returned by syscall.Rmdir + // instead of syscall.ENOTDIR + _ERROR_DIRECTORY = syscall.Errno(0x10B) + + // _ERROR_INVALID_SOCKET is a Windows error returned by winsock_select + // when a given handle is not a socket. + _ERROR_INVALID_SOCKET = syscall.Errno(0x2736) +) + +func errorToErrno(err error) Errno { + switch err := err.(type) { + case Errno: + return err + case syscall.Errno: + // Note: In windows, _ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR + switch err { + case syscall.ERROR_ALREADY_EXISTS: + return EEXIST + case _ERROR_DIRECTORY: + return ENOTDIR + case syscall.ERROR_DIR_NOT_EMPTY: + return ENOTEMPTY + case syscall.ERROR_FILE_EXISTS: + return EEXIST + case _ERROR_INVALID_HANDLE, _ERROR_INVALID_SOCKET: + return EBADF + case syscall.ERROR_ACCESS_DENIED: + // POSIX read and write functions expect EBADF, not EACCES when not + // open for reading or writing. + return EBADF + case syscall.ERROR_PRIVILEGE_NOT_HELD: + return EPERM + case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME: + return EINVAL + } + errno, _ := syscallToErrno(err) + return errno + default: + return EIO + } +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/time.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/time.go new file mode 100644 index 0000000000..4f3e01fefb --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/time.go @@ -0,0 +1,10 @@ +package sys + +import "math" + +// UTIME_OMIT is a special constant for use in updating times via FS.Utimens +// or File.Utimens. When used for atim or mtim, the value is retained. +// +// Note: This may be implemented via a stat when the underlying filesystem +// does not support this value. +const UTIME_OMIT int64 = math.MinInt64 diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go new file mode 100644 index 0000000000..d853d9e8f4 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go @@ -0,0 +1,160 @@ +package sys + +import ( + "io/fs" + + "github.com/tetratelabs/wazero/sys" +) + +// UnimplementedFS is an FS that returns ENOSYS for all functions, +// This should be embedded to have forward compatible implementations. +type UnimplementedFS struct{} + +// OpenFile implements FS.OpenFile +func (UnimplementedFS) OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno) { + return nil, ENOSYS +} + +// Lstat implements FS.Lstat +func (UnimplementedFS) Lstat(path string) (sys.Stat_t, Errno) { + return sys.Stat_t{}, ENOSYS +} + +// Stat implements FS.Stat +func (UnimplementedFS) Stat(path string) (sys.Stat_t, Errno) { + return sys.Stat_t{}, ENOSYS +} + +// Readlink implements FS.Readlink +func (UnimplementedFS) Readlink(path string) (string, Errno) { + return "", ENOSYS +} + +// Mkdir implements FS.Mkdir +func (UnimplementedFS) Mkdir(path string, perm fs.FileMode) Errno { + return ENOSYS +} + +// Chmod implements FS.Chmod +func (UnimplementedFS) Chmod(path string, perm fs.FileMode) Errno { + return ENOSYS +} + +// Rename implements FS.Rename +func (UnimplementedFS) Rename(from, to string) Errno { + return ENOSYS +} + +// Rmdir implements FS.Rmdir +func (UnimplementedFS) Rmdir(path string) Errno { + return ENOSYS +} + +// Link implements FS.Link +func (UnimplementedFS) Link(_, _ string) Errno { + return ENOSYS +} + +// Symlink implements FS.Symlink +func (UnimplementedFS) Symlink(_, _ string) Errno { + return ENOSYS +} + +// Unlink implements FS.Unlink +func (UnimplementedFS) Unlink(path string) Errno { + return ENOSYS +} + +// Utimens implements FS.Utimens +func (UnimplementedFS) Utimens(path string, atim, mtim int64) Errno { + return ENOSYS +} + +// UnimplementedFile is a File that returns ENOSYS for all functions, +// except where no-op are otherwise documented. +// +// This should be embedded to have forward compatible implementations. +type UnimplementedFile struct{} + +// Dev implements File.Dev +func (UnimplementedFile) Dev() (uint64, Errno) { + return 0, 0 +} + +// Ino implements File.Ino +func (UnimplementedFile) Ino() (sys.Inode, Errno) { + return 0, 0 +} + +// IsDir implements File.IsDir +func (UnimplementedFile) IsDir() (bool, Errno) { + return false, 0 +} + +// IsAppend implements File.IsAppend +func (UnimplementedFile) IsAppend() bool { + return false +} + +// SetAppend implements File.SetAppend +func (UnimplementedFile) SetAppend(bool) Errno { + return ENOSYS +} + +// Stat implements File.Stat +func (UnimplementedFile) Stat() (sys.Stat_t, Errno) { + return sys.Stat_t{}, ENOSYS +} + +// Read implements File.Read +func (UnimplementedFile) Read([]byte) (int, Errno) { + return 0, ENOSYS +} + +// Pread implements File.Pread +func (UnimplementedFile) Pread([]byte, int64) (int, Errno) { + return 0, ENOSYS +} + +// Seek implements File.Seek +func (UnimplementedFile) Seek(int64, int) (int64, Errno) { + return 0, ENOSYS +} + +// Readdir implements File.Readdir +func (UnimplementedFile) Readdir(int) (dirents []Dirent, errno Errno) { + return nil, ENOSYS +} + +// Write implements File.Write +func (UnimplementedFile) Write([]byte) (int, Errno) { + return 0, ENOSYS +} + +// Pwrite implements File.Pwrite +func (UnimplementedFile) Pwrite([]byte, int64) (int, Errno) { + return 0, ENOSYS +} + +// Truncate implements File.Truncate +func (UnimplementedFile) Truncate(int64) Errno { + return ENOSYS +} + +// Sync implements File.Sync +func (UnimplementedFile) Sync() Errno { + return 0 // not ENOSYS +} + +// Datasync implements File.Datasync +func (UnimplementedFile) Datasync() Errno { + return 0 // not ENOSYS +} + +// Utimens implements File.Utimens +func (UnimplementedFile) Utimens(int64, int64) Errno { + return ENOSYS +} + +// Close implements File.Close +func (UnimplementedFile) Close() (errno Errno) { return } diff --git a/vendor/github.com/tetratelabs/wazero/fsconfig.go b/vendor/github.com/tetratelabs/wazero/fsconfig.go index 099a79173d..c28909e19e 100644 --- a/vendor/github.com/tetratelabs/wazero/fsconfig.go +++ b/vendor/github.com/tetratelabs/wazero/fsconfig.go @@ -3,7 +3,8 @@ package wazero import ( "io/fs" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/sysfs" ) @@ -30,8 +31,7 @@ import ( // // More notes on `guestPath` // - Go compiled with runtime.GOOS=js do not pay attention to this value. -// Hence, you need to normalize the filesystem with NewRootFS to ensure -// paths requested resolve as expected. +// It only works with root mounts (""). // - Working directories are typically tracked in wasm, though possible some // relative paths are requested. For example, TinyGo may attempt to resolve // a path "../.." in unit tests. @@ -118,12 +118,24 @@ type FSConfig interface { // advise using WithDirMount instead. There will be behavior differences // between os.DirFS and WithDirMount, as the latter biases towards what's // expected from WASI implementations. + // + // # Custom fs.FileInfo + // + // The underlying implementation supports data not usually in fs.FileInfo + // when `info.Sys` returns *sys.Stat_t. For example, a custom fs.FS can use + // this approach to generate or mask sys.Inode data. Such a filesystem + // needs to decorate any functions that can return fs.FileInfo: + // + // - `Stat` as defined on `fs.File` (always) + // - `Readdir` as defined on `os.File` (if defined) + // + // See sys.NewStat_t for examples. WithFSMount(fs fs.FS, guestPath string) FSConfig } type fsConfig struct { // fs are the currently configured filesystems. - fs []fsapi.FS + fs []experimentalsys.FS // guestPaths are the user-supplied names of the filesystems, retained for // error messages and fmt.Stringer. guestPaths []string @@ -140,7 +152,7 @@ func NewFSConfig() FSConfig { // clone makes a deep copy of this module config. func (c *fsConfig) clone() *fsConfig { ret := *c // copy except slice and maps which share a ref - ret.fs = make([]fsapi.FS, 0, len(c.fs)) + ret.fs = make([]experimentalsys.FS, 0, len(c.fs)) ret.fs = append(ret.fs, c.fs...) ret.guestPaths = make([]string, 0, len(c.guestPaths)) ret.guestPaths = append(ret.guestPaths, c.guestPaths...) @@ -153,26 +165,34 @@ func (c *fsConfig) clone() *fsConfig { // WithDirMount implements FSConfig.WithDirMount func (c *fsConfig) WithDirMount(dir, guestPath string) FSConfig { - return c.withMount(sysfs.NewDirFS(dir), guestPath) + return c.WithSysFSMount(sysfs.DirFS(dir), guestPath) } // WithReadOnlyDirMount implements FSConfig.WithReadOnlyDirMount func (c *fsConfig) WithReadOnlyDirMount(dir, guestPath string) FSConfig { - return c.withMount(sysfs.NewReadFS(sysfs.NewDirFS(dir)), guestPath) + return c.WithSysFSMount(&sysfs.ReadFS{FS: sysfs.DirFS(dir)}, guestPath) } // WithFSMount implements FSConfig.WithFSMount func (c *fsConfig) WithFSMount(fs fs.FS, guestPath string) FSConfig { - return c.withMount(sysfs.Adapt(fs), guestPath) + var adapted experimentalsys.FS + if fs != nil { + adapted = &sysfs.AdaptFS{FS: fs} + } + return c.WithSysFSMount(adapted, guestPath) } -func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { - cleaned := sysfs.StripPrefixesAndTrailingSlash(guestPath) +// WithSysFSMount implements sysfs.FSConfig +func (c *fsConfig) WithSysFSMount(fs experimentalsys.FS, guestPath string) FSConfig { + if _, ok := fs.(experimentalsys.UnimplementedFS); ok { + return c // don't add fake paths. + } + cleaned := sys.StripPrefixesAndTrailingSlash(guestPath) ret := c.clone() if i, ok := ret.guestPathToFS[cleaned]; ok { ret.fs[i] = fs ret.guestPaths[i] = guestPath - } else { + } else if fs != nil { ret.guestPathToFS[cleaned] = len(ret.fs) ret.fs = append(ret.fs, fs) ret.guestPaths = append(ret.guestPaths, guestPath) @@ -180,6 +200,16 @@ func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { return ret } -func (c *fsConfig) toFS() (fsapi.FS, error) { - return sysfs.NewRootFS(c.fs, c.guestPaths) +// preopens returns the possible nil index-correlated preopened filesystems +// with guest paths. +func (c *fsConfig) preopens() ([]experimentalsys.FS, []string) { + preopenCount := len(c.fs) + if preopenCount == 0 { + return nil, nil + } + fs := make([]experimentalsys.FS, len(c.fs)) + copy(fs, c.fs) + guestPaths := make([]string, len(c.guestPaths)) + copy(guestPaths, c.guestPaths) + return fs, guestPaths } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go index 71b2c41181..4c82e95e24 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -23,7 +23,7 @@ import ( // Result (Errno) // // The return value is ErrnoSuccess except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if argsSizesGet wrote argc=2 and argvLen=5 for arguments: // "a" and "bc" parameters argv=7 and argvBuf=1, this function writes the below @@ -43,7 +43,7 @@ import ( // See https://en.wikipedia.org/wiki/Null-terminated_string var argsGet = newHostFunc(wasip1.ArgsGetName, argsGetFn, []api.ValueType{i32, i32}, "argv", "argv_buf") -func argsGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func argsGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys argv, argvBuf := uint32(params[0]), uint32(params[1]) return writeOffsetsAndNullTerminatedValues(mod.Memory(), sysCtx.Args(), argv, argvBuf, sysCtx.ArgsSize()) @@ -61,7 +61,7 @@ func argsGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // Result (Errno) // // The return value is ErrnoSuccess except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if args are "a", "bc" and parameters resultArgc=1 and // resultArgvLen=6, this function writes the below to api.Memory: @@ -80,7 +80,7 @@ func argsGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://en.wikipedia.org/wiki/Null-terminated_string var argsSizesGet = newHostFunc(wasip1.ArgsSizesGetName, argsSizesGetFn, []api.ValueType{i32, i32}, "result.argc", "result.argv_len") -func argsSizesGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func argsSizesGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys mem := mod.Memory() resultArgc, resultArgvLen := uint32(params[0]), uint32(params[1]) @@ -88,10 +88,10 @@ func argsSizesGetFn(_ context.Context, mod api.Module, params []uint64) syscall. // argc and argv_len offsets are not necessarily sequential, so we have to // write them independently. if !mem.WriteUint32Le(resultArgc, uint32(len(sysCtx.Args()))) { - return syscall.EFAULT + return sys.EFAULT } if !mem.WriteUint32Le(resultArgvLen, sysCtx.ArgsSize()) { - return syscall.EFAULT + return sys.EFAULT } return 0 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go index 6e732a06c7..31af910718 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -21,9 +21,9 @@ import ( // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.ENOTSUP: the clock ID is not supported. -// - syscall.EINVAL: the clock ID is invalid. -// - syscall.EFAULT: there is not enough memory to write results +// - sys.ENOTSUP: the clock ID is not supported. +// - sys.EINVAL: the clock ID is invalid. +// - sys.EFAULT: there is not enough memory to write results // // For example, if the resolution is 100ns, this function writes the below to // api.Memory: @@ -39,7 +39,7 @@ import ( // See https://linux.die.net/man/3/clock_getres var clockResGet = newHostFunc(wasip1.ClockResGetName, clockResGetFn, []api.ValueType{i32, i32}, "id", "result.resolution") -func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func clockResGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys id, resultResolution := uint32(params[0]), uint32(params[1]) @@ -50,11 +50,11 @@ func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E case wasip1.ClockIDMonotonic: resolution = uint64(sysCtx.NanotimeResolution()) default: - return syscall.EINVAL + return sys.EINVAL } if !mod.Memory().WriteUint64Le(resultResolution, resolution) { - return syscall.EFAULT + return sys.EFAULT } return 0 } @@ -73,9 +73,9 @@ func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.ENOTSUP: the clock ID is not supported. -// - syscall.EINVAL: the clock ID is invalid. -// - syscall.EFAULT: there is not enough memory to write results +// - sys.ENOTSUP: the clock ID is not supported. +// - sys.EINVAL: the clock ID is invalid. +// - sys.EFAULT: there is not enough memory to write results // // For example, if time.Now returned exactly midnight UTC 2022-01-01 // (1640995200000000000), and parameters resultTimestamp=1, this function @@ -92,7 +92,7 @@ func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E // See https://linux.die.net/man/3/clock_gettime var clockTimeGet = newHostFunc(wasip1.ClockTimeGetName, clockTimeGetFn, []api.ValueType{i32, i64, i32}, "id", "precision", "result.timestamp") -func clockTimeGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func clockTimeGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys id := uint32(params[0]) // TODO: precision is currently ignored. @@ -106,11 +106,11 @@ func clockTimeGetFn(_ context.Context, mod api.Module, params []uint64) syscall. case wasip1.ClockIDMonotonic: val = sysCtx.Nanotime() default: - return syscall.EINVAL + return sys.EINVAL } if !mod.Memory().WriteUint64Le(resultTimestamp, uint64(val)) { - return syscall.EFAULT + return sys.EFAULT } return 0 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go index 995f82f2a8..ec8df708a8 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -24,7 +24,7 @@ import ( // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if environSizesGet wrote environc=2 and environLen=9 for // environment variables: "a=b", "b=cd" and parameters environ=11 and @@ -43,7 +43,7 @@ import ( // See https://en.wikipedia.org/wiki/Null-terminated_string var environGet = newHostFunc(wasip1.EnvironGetName, environGetFn, []api.ValueType{i32, i32}, "environ", "environ_buf") -func environGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func environGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys environ, environBuf := uint32(params[0]), uint32(params[1]) @@ -63,7 +63,7 @@ func environGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if environ are "a=b","b=cd" and parameters resultEnvironc=1 and // resultEnvironvLen=6, this function writes the below to api.Memory: @@ -83,7 +83,7 @@ func environGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // and https://en.wikipedia.org/wiki/Null-terminated_string var environSizesGet = newHostFunc(wasip1.EnvironSizesGetName, environSizesGetFn, []api.ValueType{i32, i32}, "result.environc", "result.environv_len") -func environSizesGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func environSizesGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys mem := mod.Memory() resultEnvironc, resultEnvironvLen := uint32(params[0]), uint32(params[1]) @@ -91,10 +91,10 @@ func environSizesGetFn(_ context.Context, mod api.Module, params []uint64) sysca // environc and environv_len offsets are not necessarily sequential, so we // have to write them independently. if !mem.WriteUint32Le(resultEnvironc, uint32(len(sysCtx.Environ()))) { - return syscall.EFAULT + return sys.EFAULT } if !mem.WriteUint32Le(resultEnvironvLen, sysCtx.EnvironSize()) { - return syscall.EFAULT + return sys.EFAULT } return 0 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go index c87d7699f3..b80c14d7d5 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go @@ -11,12 +11,12 @@ import ( "unsafe" "github.com/tetratelabs/wazero/api" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sys" - "github.com/tetratelabs/wazero/internal/sysfs" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" + sysapi "github.com/tetratelabs/wazero/sys" ) // fdAdvise is the WASI function named FdAdviseName which provides file @@ -29,7 +29,7 @@ var fdAdvise = newHostFunc( "fd", "offset", "len", "advice", ) -func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) _ = params[1] _ = params[2] @@ -38,7 +38,7 @@ func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn _, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } switch advice { @@ -49,7 +49,7 @@ func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn wasip1.FdAdviceDontNeed, wasip1.FdAdviceNoReuse: default: - return syscall.EINVAL + return experimentalsys.EINVAL } // FdAdvice corresponds to posix_fadvise, but it can only be supported on linux. @@ -72,7 +72,7 @@ var fdAllocate = newHostFunc( "fd", "offset", "len", ) -func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) offset := params[1] length := params[2] @@ -80,12 +80,12 @@ func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) syscall.Er fsc := mod.(*wasm.ModuleInstance).Sys.FS() f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } tail := int64(offset + length) if tail < 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } st, errno := f.File.Stat() @@ -110,15 +110,15 @@ func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: the fd was not open. -// - syscall.ENOTSUP: the fs was a pre-open +// - sys.EBADF: the fd was not open. +// - sys.ENOTSUP: the fs was a pre-open // // Note: This is similar to `close` in POSIX. // See https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_close // and https://linux.die.net/man/3/close var fdClose = newHostFunc(wasip1.FdCloseName, fdCloseFn, []api.ValueType{i32}, "fd") -func fdCloseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdCloseFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -131,13 +131,13 @@ func fdCloseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_datasyncfd-fd---errno var fdDatasync = newHostFunc(wasip1.FdDatasyncName, fdDatasyncFn, []api.ValueType{i32}, "fd") -func fdDatasyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdDatasyncFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) // Check to see if the file descriptor is available if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { return f.File.Datasync() } @@ -154,8 +154,8 @@ func fdDatasyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `resultFdstat` points to an offset out of memory +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `resultFdstat` points to an offset out of memory // // fdstat byte layout is 24-byte size, with the following fields: // - fs_filetype 1 byte: the file type @@ -184,7 +184,7 @@ var fdFdstatGet = newHostFunc(wasip1.FdFdstatGetName, fdFdstatGetFn, []api.Value // fdFdstatGetFn cannot currently use proxyResultParams because fdstat is larger // than api.ValueTypeI64 (i64 == 8 bytes, but fdstat is 24). -func fdFdstatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFdstatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd, resultFdstat := int32(params[0]), uint32(params[1]) @@ -192,15 +192,15 @@ func fdFdstatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E // Ensure we can write the fdstat buf, ok := mod.Memory().Read(resultFdstat, 24) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } var fdflags uint16 - var st fsapi.Stat_t - var errno syscall.Errno + var st sysapi.Stat_t + var errno experimentalsys.Errno f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if st, errno = f.File.Stat(); errno != 0 { return errno } else if f.File.IsAppend() { @@ -299,17 +299,17 @@ func writeFdstat(buf []byte, fileType uint8, fdflags uint16, fsRightsBase, fsRig // adjusts the flags associated with a file descriptor. var fdFdstatSetFlags = newHostFunc(wasip1.FdFdstatSetFlagsName, fdFdstatSetFlagsFn, []wasm.ValueType{i32, i32}, "fd", "flags") -func fdFdstatSetFlagsFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFdstatSetFlagsFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd, wasiFlag := int32(params[0]), uint16(params[1]) fsc := mod.(*wasm.ModuleInstance).Sys.FS() // Currently we only support APPEND and NONBLOCK. if wasip1.FD_DSYNC&wasiFlag != 0 || wasip1.FD_RSYNC&wasiFlag != 0 || wasip1.FD_SYNC&wasiFlag != 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { nonblock := wasip1.FD_NONBLOCK&wasiFlag != 0 errno := f.File.SetNonblock(nonblock) @@ -346,9 +346,9 @@ var fdFdstatSetRights = stubFunction( // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EIO: could not stat `fd` on filesystem -// - syscall.EFAULT: `resultFilestat` points to an offset out of memory +// - sys.EBADF: `fd` is invalid +// - sys.EIO: could not stat `fd` on filesystem +// - sys.EFAULT: `resultFilestat` points to an offset out of memory // // filestat byte layout is 64-byte size, with the following fields: // - dev 8 bytes: the device ID of device containing the file @@ -386,22 +386,22 @@ var fdFilestatGet = newHostFunc(wasip1.FdFilestatGetName, fdFilestatGetFn, []api // fdFilestatGetFn cannot currently use proxyResultParams because filestat is // larger than api.ValueTypeI64 (i64 == 8 bytes, but filestat is 64). -func fdFilestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFilestatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdFilestatGetFunc(mod, int32(params[0]), uint32(params[1])) } -func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) syscall.Errno { +func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() // Ensure we can write the filestat buf, ok := mod.Memory().Read(resultBuf, 64) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } st, errno := f.File.Stat() @@ -413,7 +413,7 @@ func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) syscall.Errno return writeFilestat(buf, &st, filetype) } -func getExtendedWasiFiletype(file fsapi.File, fm fs.FileMode) (ftype uint8) { +func getExtendedWasiFiletype(file experimentalsys.File, fm fs.FileMode) (ftype uint8) { ftype = getWasiFiletype(fm) if ftype == wasip1.FILETYPE_UNKNOWN { if _, ok := file.(socketapi.TCPSock); ok { @@ -445,7 +445,7 @@ func getWasiFiletype(fm fs.FileMode) uint8 { } } -func writeFilestat(buf []byte, st *fsapi.Stat_t, ftype uint8) (errno syscall.Errno) { +func writeFilestat(buf []byte, st *sysapi.Stat_t, ftype uint8) (errno experimentalsys.Errno) { le.PutUint64(buf, st.Dev) le.PutUint64(buf[8:], st.Ino) le.PutUint64(buf[16:], uint64(ftype)) @@ -463,7 +463,7 @@ func writeFilestat(buf []byte, st *fsapi.Stat_t, ftype uint8) (errno syscall.Err // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_filestat_set_sizefd-fd-size-filesize---errno var fdFilestatSetSize = newHostFunc(wasip1.FdFilestatSetSizeName, fdFilestatSetSizeFn, []wasm.ValueType{i32, i64}, "fd", "size") -func fdFilestatSetSizeFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFilestatSetSizeFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) size := uint32(params[1]) @@ -471,7 +471,7 @@ func fdFilestatSetSizeFn(_ context.Context, mod api.Module, params []uint64) sys // Check to see if the file descriptor is available if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { return f.File.Truncate(int64(size)) } @@ -487,7 +487,7 @@ var fdFilestatSetTimes = newHostFunc( "fd", "atim", "mtim", "fst_flags", ) -func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) atim := int64(params[1]) mtim := int64(params[2]) @@ -498,53 +498,58 @@ func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) sy f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } - times, errno := toTimes(atim, mtim, fstFlags) + atim, mtim, errno := toTimes(sys.WalltimeNanos, atim, mtim, fstFlags) if errno != 0 { return errno } // Try to update the file timestamps by file-descriptor. - errno = f.File.Utimens(×) + errno = f.File.Utimens(atim, mtim) // Fall back to path based, despite it being less precise. switch errno { - case syscall.EPERM, syscall.ENOSYS: - errno = f.FS.Utimens(f.Name, ×, true) + case experimentalsys.EPERM, experimentalsys.ENOSYS: + errno = f.FS.Utimens(f.Name, atim, mtim) } return errno } -func toTimes(atim, mtime int64, fstFlags uint16) (times [2]syscall.Timespec, errno syscall.Errno) { +func toTimes(walltime func() int64, atim, mtim int64, fstFlags uint16) (int64, int64, experimentalsys.Errno) { // times[0] == atim, times[1] == mtim + var nowTim int64 + // coerce atim into a timespec if set, now := fstFlags&wasip1.FstflagsAtim != 0, fstFlags&wasip1.FstflagsAtimNow != 0; set && now { - errno = syscall.EINVAL - return + return 0, 0, experimentalsys.EINVAL } else if set { - times[0] = syscall.NsecToTimespec(atim) + // atim is already correct } else if now { - times[0].Nsec = sysfs.UTIME_NOW + nowTim = walltime() + atim = nowTim } else { - times[0].Nsec = sysfs.UTIME_OMIT + atim = experimentalsys.UTIME_OMIT } // coerce mtim into a timespec if set, now := fstFlags&wasip1.FstflagsMtim != 0, fstFlags&wasip1.FstflagsMtimNow != 0; set && now { - errno = syscall.EINVAL - return + return 0, 0, experimentalsys.EINVAL } else if set { - times[1] = syscall.NsecToTimespec(mtime) + // mtim is already correct } else if now { - times[1].Nsec = sysfs.UTIME_NOW + if nowTim != 0 { + mtim = nowTim + } else { + mtim = walltime() + } } else { - times[1].Nsec = sysfs.UTIME_OMIT + mtim = experimentalsys.UTIME_OMIT } - return + return atim, mtim, 0 } // fdPread is the WASI function named FdPreadName which reads from a file @@ -559,7 +564,7 @@ var fdPread = newHostFunc( "fd", "iovs", "iovs_len", "offset", "result.nread", ) -func fdPreadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPreadFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdReadOrPread(mod, params, true) } @@ -574,8 +579,8 @@ func fdPreadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid or the `fd` is not a pre-opened directory -// - syscall.EFAULT: `resultPrestat` points to an offset out of memory +// - sys.EBADF: `fd` is invalid or the `fd` is not a pre-opened directory +// - sys.EFAULT: `resultPrestat` points to an offset out of memory // // prestat byte layout is 8 bytes, beginning with an 8-bit tag and 3 pad bytes. // The only valid tag is `prestat_dir`, which is tag zero. This simplifies the @@ -596,7 +601,7 @@ func fdPreadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#prestat var fdPrestatGet = newHostFunc(wasip1.FdPrestatGetName, fdPrestatGetFn, []api.ValueType{i32, i32}, "fd", "result.prestat") -func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd, resultPrestat := int32(params[0]), uint32(params[1]) @@ -609,7 +614,7 @@ func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall. // * Zero-value 8-bit tag, and 3-byte zero-value padding prestat := uint64(len(name) << 32) if !mod.Memory().WriteUint64Le(resultPrestat, prestat) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -628,9 +633,9 @@ func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall. // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `path` points to an offset out of memory -// - syscall.ENAMETOOLONG: `pathLen` is longer than the actual length of the result +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `path` points to an offset out of memory +// - sys.ENAMETOOLONG: `pathLen` is longer than the actual length of the result // // For example, the directory name corresponding with `fd` was "/tmp" and // # Parameters path=1 pathLen=4 (correct), this function will write the below to @@ -650,7 +655,7 @@ var fdPrestatDirName = newHostFunc( "fd", "result.path", "result.path_len", ) -func fdPrestatDirNameFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPrestatDirNameFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd, path, pathLen := int32(params[0]), uint32(params[1]), uint32(params[2]) @@ -661,11 +666,11 @@ func fdPrestatDirNameFn(_ context.Context, mod api.Module, params []uint64) sysc // Some runtimes may have another semantics. See /RATIONALE.md if uint32(len(name)) < pathLen { - return syscall.ENAMETOOLONG + return experimentalsys.ENAMETOOLONG } if !mod.Memory().Write(path, []byte(name)[:pathLen]) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -682,7 +687,7 @@ var fdPwrite = newHostFunc( "fd", "iovs", "iovs_len", "offset", "result.nwritten", ) -func fdPwriteFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPwriteFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdWriteOrPwrite(mod, params, true) } @@ -702,9 +707,9 @@ func fdPwriteFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `iovs` or `resultNread` point to an offset out of memory -// - syscall.EIO: a file system error +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `iovs` or `resultNread` point to an offset out of memory +// - sys.EIO: a file system error // // For example, this function needs to first read `iovs` to determine where // to write contents. If parameters iovs=1 iovsCount=2, this function reads two @@ -743,12 +748,12 @@ var fdRead = newHostFunc( // preader tracks an offset across multiple reads. type preader struct { - f fsapi.File + f experimentalsys.File offset int64 } -// Read implements the same function as documented on internalapi.File. -func (w *preader) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same function as documented on sys.File. +func (w *preader) Read(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. } @@ -758,11 +763,11 @@ func (w *preader) Read(buf []byte) (n int, errno syscall.Errno) { return n, err } -func fdReadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdReadFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdReadOrPread(mod, params, false) } -func fdReadOrPread(mod api.Module, params []uint64, isPread bool) syscall.Errno { +func fdReadOrPread(mod api.Module, params []uint64, isPread bool) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -771,9 +776,9 @@ func fdReadOrPread(mod api.Module, params []uint64, isPread bool) syscall.Errno iovsCount := uint32(params[2]) var resultNread uint32 - var reader func(buf []byte) (n int, errno syscall.Errno) + var reader func(buf []byte) (n int, errno experimentalsys.Errno) if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if isPread { offset := int64(params[3]) reader = (&preader{f: f.File, offset: offset}).Read @@ -788,18 +793,18 @@ func fdReadOrPread(mod api.Module, params []uint64, isPread bool) syscall.Errno return errno } if !mem.WriteUint32Le(resultNread, nread) { - return syscall.EFAULT + return experimentalsys.EFAULT } else { return 0 } } -func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte) (nread int, errno syscall.Errno)) (uint32, syscall.Errno) { +func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte) (nread int, errno experimentalsys.Errno)) (uint32, experimentalsys.Errno) { var nread uint32 iovsStop := iovsCount << 3 // iovsCount * 8 iovsBuf, ok := mem.Read(iovs, iovsStop) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } for iovsPos := uint32(0); iovsPos < iovsStop; iovsPos += 8 { @@ -812,14 +817,14 @@ func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte b, ok := mem.Read(offset, l) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } n, errno := reader(b) nread += uint32(n) - if errno == syscall.ENOSYS { - return 0, syscall.EBADF // e.g. unimplemented for read + if errno == experimentalsys.ENOSYS { + return 0, experimentalsys.EBADF // e.g. unimplemented for read } else if errno != 0 { return 0, errno } else if n < int(l) { @@ -829,100 +834,125 @@ func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte return nread, 0 } -// fdReaddir is the WASI function named FdReaddirName which reads directory -// entries from a directory. +// fdReaddir is the WASI function named wasip1.FdReaddirName which reads +// directory entries from a directory. Special behaviors required by this +// function are implemented in sys.DirentCache. // // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_readdirfd-fd-buf-pointeru8-buf_len-size-cookie-dircookie---errno-size +// +// # Result (Errno) +// +// The return value is 0 except the following known error conditions: +// - sys.ENOSYS: the implementation does not support this function. +// - sys.EBADF: the file was closed or not a directory. +// - sys.EFAULT: `buf` or `buf_len` point to an offset out of memory. +// - sys.ENOENT: `cookie` was invalid. +// - sys.EINVAL: `buf_len` was not large enough to write a dirent header. +// +// # End of Directory (EOF) +// +// More entries are available when `result.bufused` == `buf_len`. See +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_readdir +// https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L44 var fdReaddir = newHostFunc( wasip1.FdReaddirName, fdReaddirFn, []wasm.ValueType{i32, i32, i32, i64, i32}, "fd", "buf", "buf_len", "cookie", "result.bufused", ) -func fdReaddirFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdReaddirFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) buf := uint32(params[1]) bufLen := uint32(params[2]) - // We control the value of the cookie, and it should never be negative. - // However, we coerce it to signed to ensure the caller doesn't manipulate - // it in such a way that becomes negative. - cookie := int64(params[3]) + cookie := params[3] resultBufused := uint32(params[4]) - // The bufLen must be enough to write a dirent. Otherwise, the caller can't - // read what the next cookie is. + // The bufLen must be enough to write a dirent header. if bufLen < wasip1.DirentSize { - return syscall.EINVAL + // This is a bug in the caller, as unless `buf_len` is large enough to + // write a dirent, it can't read the `d_namlen` from it. + return experimentalsys.EINVAL } - // Validate the FD is a directory - f, errno := openedDir(fsc, fd) + // Get or open a dirent cache for this file descriptor. + dir, errno := direntCache(fsc, fd) if errno != 0 { return errno } - // Discard the bool value because we validated the fd already. - dir, errno := fsc.LookupReaddir(fd, f) + + // First, determine the maximum directory entries that can be encoded as + // dirents. The total size is DirentSize(24) + nameSize, for each file. + // Since a zero-length file name is invalid, the minimum size entry is + // 25 (DirentSize + 1 character). + maxDirEntries := bufLen/wasip1.DirentSize + 1 + + // While unlikely maxDirEntries will fit into bufLen, add one more just in + // case, as we need to know if we hit the end of the directory or not to + // write the correct bufused (e.g. == bufLen unless EOF). + // >> If less than the size of the read buffer, the end of the + // >> directory has been reached. + maxDirEntries += 1 + + // Read up to max entries. The underlying implementation will cache these, + // starting at the current location, so that they can be re-read. This is + // important because even the first could end up larger than bufLen due to + // the size of its name. + dirents, errno := dir.Read(cookie, maxDirEntries) if errno != 0 { return errno } - // Validate the cookie and possibly sync the internal state to the one the cookie represents. - if errno = dir.Rewind(cookie); errno != 0 { - return errno - } - // Determine how many dirents we can write, excluding a potentially - // truncated entry. - dirents, bufused, direntCount, writeTruncatedEntry := maxDirents(dir, bufLen) + // Determine how many dirents we can write, including a potentially + // truncated last entry. + bufToWrite, direntCount, truncatedLen := maxDirents(dirents, bufLen) // Now, write entries to the underlying buffer. - if bufused > 0 { - buf, ok := mem.Read(buf, bufused) + if bufToWrite > 0 { + + // d_next is the index of the next file in the list, so it should + // always be one higher than the requested cookie. + d_next := cookie + 1 + // ^^ yes this can overflow to negative, which means our implementation + // doesn't support writing greater than max int64 entries. + + buf, ok := mem.Read(buf, bufToWrite) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } - // Iterate again on dir, this time writing the entries. - writeDirents(dirents, direntCount, writeTruncatedEntry, buf, uint64(cookie+1)) + writeDirents(buf, dirents, d_next, direntCount, truncatedLen) + } + + // bufused == bufLen means more dirents exist, which is the case when one + // is truncated. + bufused := bufToWrite + if truncatedLen > 0 { + bufused = bufLen } if !mem.WriteUint32Le(resultBufused, bufused) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } const largestDirent = int64(math.MaxUint32 - wasip1.DirentSize) -// maxDirents returns the maximum count and total entries that can fit in -// maxLen bytes. +// maxDirents returns the dirents to write. // -// truncatedEntryLen is the amount of bytes past bufLen needed to write the -// next entry. We have to return bufused == bufLen unless the directory is -// exhausted. -// -// See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_readdir -// See https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L44 -func maxDirents(dir *sys.Readdir, bufLen uint32) (dirents []fsapi.Dirent, bufused, direntCount uint32, writeTruncatedEntry bool) { +// `bufToWrite` is the amount of memory needed to write direntCount, which +// includes up to wasip1.DirentSize of a last truncated entry. +func maxDirents(dirents []experimentalsys.Dirent, bufLen uint32) (bufToWrite uint32, direntCount int, truncatedLen uint32) { lenRemaining := bufLen - for { - d, errno := dir.Peek() - if errno != 0 { - return - } - dirents = append(dirents, *d) - - if lenRemaining < wasip1.DirentSize { - // We don't have enough space in bufLen for another struct, - // entry. A caller who wants more will retry. - - // bufused == bufLen means more dirents exist, which is the case - // when the dirent is larger than bytes remaining. - bufused = bufLen + for i := range dirents { + if lenRemaining == 0 { break } + d := dirents[i] + direntCount++ // use int64 to guard against huge filenames nameLen := int64(len(d.Name)) @@ -945,64 +975,55 @@ func maxDirents(dir *sys.Readdir, bufLen uint32) (dirents []fsapi.Dirent, bufuse // we need to write DirentSize(24) + 4096 bytes to write the entry. // In this case, we only write up to DirentSize(24) to allow the // caller to resize. - - // bufused == bufLen means more dirents exist, which is the case - // when the next entry is larger than bytes remaining. - bufused = bufLen - - // We do have enough space to write the header, this value will be - // passed on to writeDirents to only write the header for this entry. - writeTruncatedEntry = true + if lenRemaining >= wasip1.DirentSize { + truncatedLen = wasip1.DirentSize + } else { + truncatedLen = lenRemaining + } + bufToWrite += truncatedLen break } // This won't go negative because we checked entryLen <= lenRemaining. lenRemaining -= entryLen - bufused += entryLen - direntCount++ - _ = dir.Advance() + bufToWrite += entryLen } return } // writeDirents writes the directory entries to the buffer, which is pre-sized -// based on maxDirents. truncatedEntryLen means write one past entryCount, -// without its name. See maxDirents for why -func writeDirents( - dirents []fsapi.Dirent, - direntCount uint32, - writeTruncatedEntry bool, - buf []byte, - d_next uint64, -) { - pos, i := uint32(0), uint32(0) - for ; i < direntCount; i++ { +// based on maxDirents. truncatedEntryLen means the last is written without its +// name. +func writeDirents(buf []byte, dirents []experimentalsys.Dirent, d_next uint64, direntCount int, truncatedLen uint32) { + pos := uint32(0) + skipNameI := -1 + + // If the last entry was truncated, we either skip it or write it without + // its name, depending on the length. + if truncatedLen > 0 { + if truncatedLen < wasip1.DirentSize { + direntCount-- // skip as too small to write the header. + } else { + skipNameI = direntCount - 1 // write the header, but not the name. + } + } + + for i := 0; i < direntCount; i++ { e := dirents[i] nameLen := uint32(len(e.Name)) - writeDirent(buf[pos:], d_next, e.Ino, nameLen, e.Type) - pos += wasip1.DirentSize - - copy(buf[pos:], e.Name) - pos += nameLen d_next++ - } + pos += wasip1.DirentSize - if !writeTruncatedEntry { - return + if i != skipNameI { + copy(buf[pos:], e.Name) + pos += nameLen + } } - - // Write a dirent without its name - dirent := make([]byte, wasip1.DirentSize) - e := dirents[i] - writeDirent(dirent, d_next, e.Ino, uint32(len(e.Name)), e.Type) - - // Potentially truncate it - copy(buf[pos:], dirent) } // writeDirent writes DirentSize bytes -func writeDirent(buf []byte, dNext uint64, ino uint64, dNamlen uint32, dType fs.FileMode) { +func writeDirent(buf []byte, dNext uint64, ino sysapi.Inode, dNamlen uint32, dType fs.FileMode) { le.PutUint64(buf, dNext) // d_next le.PutUint64(buf[8:], ino) // d_ino le.PutUint32(buf[16:], dNamlen) // d_namlen @@ -1010,22 +1031,23 @@ func writeDirent(buf []byte, dNext uint64, ino uint64, dNamlen uint32, dType fs. le.PutUint32(buf[20:], uint32(filetype)) // d_type } -// openedDir returns the sys.FileEntry for the directory and 0 if the fd points to a readable directory. -func openedDir(fsc *sys.FSContext, fd int32) (*sys.FileEntry, syscall.Errno) { +// direntCache lazy opens a sys.DirentCache for this directory or returns an +// error. +func direntCache(fsc *sys.FSContext, fd int32) (*sys.DirentCache, experimentalsys.Errno) { if f, ok := fsc.LookupFile(fd); !ok { - return nil, syscall.EBADF - } else if isDir, errno := f.File.IsDir(); errno != 0 { - return nil, errno - } else if !isDir { - // fd_readdir docs don't indicate whether to return syscall.ENOTDIR or - // syscall.EBADF. It has been noticed that rust will crash on syscall.ENOTDIR, + return nil, experimentalsys.EBADF + } else if dir, errno := f.DirentCache(); errno == 0 { + return dir, 0 + } else if errno == experimentalsys.ENOTDIR { + // fd_readdir docs don't indicate whether to return sys.ENOTDIR or + // sys.EBADF. It has been noticed that rust will crash on sys.ENOTDIR, // and POSIX C ref seems to not return this, so we don't either. // // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_readdir // and https://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/dirent.h - return nil, syscall.EBADF + return nil, experimentalsys.EBADF } else { - return f, 0 + return nil, errno } } @@ -1035,7 +1057,7 @@ func openedDir(fsc *sys.FSContext, fd int32) (*sys.FileEntry, syscall.Errno) { // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_renumberfd-fd-to-fd---errno var fdRenumber = newHostFunc(wasip1.FdRenumberName, fdRenumberFn, []wasm.ValueType{i32, i32}, "fd", "to") -func fdRenumberFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdRenumberFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() from := int32(params[0]) @@ -1065,11 +1087,11 @@ func fdRenumberFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `resultNewoffset` points to an offset out of memory -// - syscall.EINVAL: `whence` is an invalid value -// - syscall.EIO: a file system error -// - syscall.EISDIR: the file was a directory. +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `resultNewoffset` points to an offset out of memory +// - sys.EINVAL: `whence` is an invalid value +// - sys.EIO: a file system error +// - sys.EISDIR: the file was a directory. // // For example, if fd 3 is a file with offset 0, and parameters fd=3, offset=4, // whence=0 (=io.SeekStart), resultNewOffset=1, this function writes the below @@ -1091,7 +1113,7 @@ var fdSeek = newHostFunc( "fd", "offset", "whence", "result.newoffset", ) -func fdSeekFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdSeekFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) offset := params[1] @@ -1099,13 +1121,13 @@ func fdSeekFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno resultNewoffset := uint32(params[3]) if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if isDir, _ := f.File.IsDir(); isDir { - return syscall.EISDIR // POSIX doesn't forbid seeking a directory, but wasi-testsuite does. + return experimentalsys.EISDIR // POSIX doesn't forbid seeking a directory, but wasi-testsuite does. } else if newOffset, errno := f.File.Seek(int64(offset), int(whence)); errno != 0 { return errno } else if !mod.Memory().WriteUint64Le(resultNewoffset, uint64(newOffset)) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -1116,13 +1138,13 @@ func fdSeekFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_syncfd-fd---errno var fdSync = newHostFunc(wasip1.FdSyncName, fdSyncFn, []api.ValueType{i32}, "fd") -func fdSyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdSyncFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) // Check to see if the file descriptor is available if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { return f.File.Sync() } @@ -1134,7 +1156,7 @@ func fdSyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_tellfd-fd---errno-filesize var fdTell = newHostFunc(wasip1.FdTellName, fdTellFn, []api.ValueType{i32, i32}, "fd", "result.offset") -func fdTellFn(ctx context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdTellFn(ctx context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := params[0] offset := uint64(0) whence := uint64(io.SeekCurrent) @@ -1161,9 +1183,9 @@ func fdTellFn(ctx context.Context, mod api.Module, params []uint64) syscall.Errn // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `iovs` or `resultNwritten` point to an offset out of memory -// - syscall.EIO: a file system error +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `iovs` or `resultNwritten` point to an offset out of memory +// - sys.EIO: a file system error // // For example, this function needs to first read `iovs` to determine what to // write to `fd`. If parameters iovs=1 iovsCount=2, this function reads two @@ -1208,18 +1230,18 @@ var fdWrite = newHostFunc( "fd", "iovs", "iovs_len", "result.nwritten", ) -func fdWriteFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdWriteFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdWriteOrPwrite(mod, params, false) } // pwriter tracks an offset across multiple writes. type pwriter struct { - f fsapi.File + f experimentalsys.File offset int64 } -// Write implements the same function as documented on internalapi.File. -func (w *pwriter) Write(buf []byte) (n int, errno syscall.Errno) { +// Write implements the same function as documented on sys.File. +func (w *pwriter) Write(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. } @@ -1229,7 +1251,7 @@ func (w *pwriter) Write(buf []byte) (n int, errno syscall.Errno) { return n, err } -func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) syscall.Errno { +func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -1238,9 +1260,9 @@ func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) syscall.Err iovsCount := uint32(params[2]) var resultNwritten uint32 - var writer func(buf []byte) (n int, errno syscall.Errno) + var writer func(buf []byte) (n int, errno experimentalsys.Errno) if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if isPwrite { offset := int64(params[3]) writer = (&pwriter{f: f.File, offset: offset}).Write @@ -1256,17 +1278,17 @@ func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) syscall.Err } if !mod.Memory().WriteUint32Le(resultNwritten, nwritten) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } -func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byte) (n int, errno syscall.Errno)) (uint32, syscall.Errno) { +func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byte) (n int, errno experimentalsys.Errno)) (uint32, experimentalsys.Errno) { var nwritten uint32 iovsStop := iovsCount << 3 // iovsCount * 8 iovsBuf, ok := mem.Read(iovs, iovsStop) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } for iovsPos := uint32(0); iovsPos < iovsStop; iovsPos += 8 { @@ -1275,12 +1297,12 @@ func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byt b, ok := mem.Read(offset, l) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } n, errno := writer(b) nwritten += uint32(n) - if errno == syscall.ENOSYS { - return 0, syscall.EBADF // e.g. unimplemented for write + if errno == experimentalsys.ENOSYS { + return 0, experimentalsys.EBADF // e.g. unimplemented for write } else if errno != 0 { return 0, errno } @@ -1300,9 +1322,9 @@ func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byt // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOENT: `path` does not exist. -// - syscall.ENOTDIR: `path` is a file +// - sys.EBADF: `fd` is invalid +// - sys.ENOENT: `path` does not exist. +// - sys.ENOTDIR: `path` is a file // // # Notes // - This is similar to mkdirat in POSIX. @@ -1315,7 +1337,7 @@ var pathCreateDirectory = newHostFunc( "fd", "path", "path_len", ) -func pathCreateDirectoryFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathCreateDirectoryFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1348,13 +1370,13 @@ func pathCreateDirectoryFn(_ context.Context, mod api.Module, params []uint64) s // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOTDIR: `fd` points to a file not a directory -// - syscall.EIO: could not stat `fd` on filesystem -// - syscall.EINVAL: the path contained "../" -// - syscall.ENAMETOOLONG: `path` + `path_len` is out of memory -// - syscall.EFAULT: `resultFilestat` points to an offset out of memory -// - syscall.ENOENT: could not find the path +// - sys.EBADF: `fd` is invalid +// - sys.ENOTDIR: `fd` points to a file not a directory +// - sys.EIO: could not stat `fd` on filesystem +// - sys.EINVAL: the path contained "../" +// - sys.ENAMETOOLONG: `path` + `path_len` is out of memory +// - sys.EFAULT: `resultFilestat` points to an offset out of memory +// - sys.ENOENT: could not find the path // // The rest of this implementation matches that of fdFilestatGet, so is not // repeated here. @@ -1368,7 +1390,7 @@ var pathFilestatGet = newHostFunc( "fd", "flags", "path", "path_len", "result.filestat", ) -func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1382,7 +1404,7 @@ func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) sysca } // Stat the file without allocating a file descriptor. - var st fsapi.Stat_t + var st sysapi.Stat_t if (flags & wasip1.LOOKUP_SYMLINK_FOLLOW) == 0 { st, errno = preopen.Lstat(pathName) @@ -1397,7 +1419,7 @@ func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) sysca resultBuf := uint32(params[4]) buf, ok := mod.Memory().Read(resultBuf, 64) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } filetype := getWasiFiletype(st.Mode) @@ -1414,7 +1436,7 @@ var pathFilestatSetTimes = newHostFunc( "fd", "flags", "path", "path_len", "atim", "mtim", "fst_flags", ) -func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) flags := uint16(params[1]) path := uint32(params[2]) @@ -1426,7 +1448,7 @@ func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) sys := mod.(*wasm.ModuleInstance).Sys fsc := sys.FS() - times, errno := toTimes(atim, mtim, fstFlags) + atim, mtim, errno := toTimes(sys.WalltimeNanos, atim, mtim, fstFlags) if errno != 0 { return errno } @@ -1437,7 +1459,16 @@ func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) } symlinkFollow := flags&wasip1.LOOKUP_SYMLINK_FOLLOW != 0 - return preopen.Utimens(pathName, ×, symlinkFollow) + if symlinkFollow { + return preopen.Utimens(pathName, atim, mtim) + } + // Otherwise, we need to emulate don't follow by opening the file by path. + if f, errno := preopen.OpenFile(pathName, syscall.O_WRONLY, 0); errno != 0 { + return errno + } else { + defer f.Close() + return f.Utimens(atim, mtim) + } } // pathLink is the WASI function named PathLinkName which adjusts the @@ -1450,7 +1481,7 @@ var pathLink = newHostFunc( "old_fd", "old_flags", "old_path", "old_path_len", "new_fd", "new_path", "new_path_len", ) -func pathLinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathLinkFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -1475,14 +1506,14 @@ func pathLinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn } if oldFS != newFS { // TODO: handle link across filesystems - return syscall.ENOSYS + return experimentalsys.ENOSYS } return oldFS.Link(oldName, newName) } // pathOpen is the WASI function named PathOpenName which opens a file or -// directory. This returns syscall.EBADF if the fd is invalid. +// directory. This returns sys.EBADF if the fd is invalid. // // # Parameters // @@ -1502,12 +1533,12 @@ func pathLinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `resultOpenedFD` points to an offset out of memory -// - syscall.ENOENT: `path` does not exist. -// - syscall.EEXIST: `path` exists, while `oFlags` requires that it must not. -// - syscall.ENOTDIR: `path` is not a directory, while `oFlags` requires it. -// - syscall.EIO: a file system error +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `resultOpenedFD` points to an offset out of memory +// - sys.ENOENT: `path` does not exist. +// - sys.EEXIST: `path` exists, while `oFlags` requires that it must not. +// - sys.ENOTDIR: `path` is not a directory, while `oFlags` requires it. +// - sys.EIO: a file system error // // For example, this function needs to first read `path` to determine the file // to open. If parameters `path` = 1, `pathLen` = 6, and the path is "wazero", @@ -1540,7 +1571,7 @@ var pathOpen = newHostFunc( "fd", "dirflags", "path", "path_len", "oflags", "fs_rights_base", "fs_rights_inheriting", "fdflags", "result.opened_fd", ) -func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathOpenFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() preopenFD := int32(params[0]) @@ -1567,10 +1598,10 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn } fileOpenFlags := openFlags(dirflags, oflags, fdflags, rights) - isDir := fileOpenFlags&fsapi.O_DIRECTORY != 0 + isDir := fileOpenFlags&experimentalsys.O_DIRECTORY != 0 if isDir && oflags&wasip1.O_CREAT != 0 { - return syscall.EINVAL // use pathCreateDirectory! + return experimentalsys.EINVAL // use pathCreateDirectory! } newFD, errno := fsc.OpenFile(preopen, pathName, fileOpenFlags, 0o600) @@ -1581,19 +1612,19 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // Check any flags that require the file to evaluate. if isDir { if f, ok := fsc.LookupFile(newFD); !ok { - return syscall.EBADF // unexpected + return experimentalsys.EBADF // unexpected } else if isDir, errno := f.File.IsDir(); errno != 0 { _ = fsc.CloseFile(newFD) return errno } else if !isDir { _ = fsc.CloseFile(newFD) - return syscall.ENOTDIR + return experimentalsys.ENOTDIR } } if !mod.Memory().WriteUint32Le(resultOpenedFD, uint32(newFD)) { _ = fsc.CloseFile(newFD) - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -1614,10 +1645,10 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // // See https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/sources/at_fdcwd.c // See https://linux.die.net/man/2/openat -func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fsapi.FS, string, syscall.Errno) { +func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (experimentalsys.FS, string, experimentalsys.Errno) { b, ok := mem.Read(p, pathLen) if !ok { - return nil, "", syscall.EFAULT + return nil, "", experimentalsys.EFAULT } pathName := string(b) @@ -1632,7 +1663,7 @@ func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fs // interesting_paths wants to break on root paths or anything that escapes. // This part is the same as fs.FS.Open() if !fs.ValidPath(pathName) { - return nil, "", syscall.EPERM + return nil, "", experimentalsys.EPERM } // add the trailing slash back @@ -1641,11 +1672,11 @@ func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fs } if f, ok := fsc.LookupFile(fd); !ok { - return nil, "", syscall.EBADF // closed or invalid + return nil, "", experimentalsys.EBADF // closed or invalid } else if isDir, errno := f.File.IsDir(); errno != 0 { return nil, "", errno } else if !isDir { - return nil, "", syscall.ENOTDIR + return nil, "", experimentalsys.ENOTDIR } else if f.IsPreopen { // don't append the pre-open name return f.FS, pathName, 0 } else { @@ -1654,11 +1685,11 @@ func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fs } } -func preopenPath(fsc *sys.FSContext, fd int32) (string, syscall.Errno) { +func preopenPath(fsc *sys.FSContext, fd int32) (string, experimentalsys.Errno) { if f, ok := fsc.LookupFile(fd); !ok { - return "", syscall.EBADF // closed + return "", experimentalsys.EBADF // closed } else if !f.IsPreopen { - return "", syscall.EBADF + return "", experimentalsys.EBADF } else if isDir, errno := f.File.IsDir(); errno != 0 || !isDir { // In wasip1, only directories can be returned by fd_prestat_get as // there are no prestat types defined for files or sockets. @@ -1668,53 +1699,63 @@ func preopenPath(fsc *sys.FSContext, fd int32) (string, syscall.Errno) { } } -func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags int) { +func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags experimentalsys.Oflag) { if dirflags&wasip1.LOOKUP_SYMLINK_FOLLOW == 0 { - openFlags |= fsapi.O_NOFOLLOW + openFlags |= experimentalsys.O_NOFOLLOW } if oflags&wasip1.O_DIRECTORY != 0 { - openFlags |= fsapi.O_DIRECTORY + openFlags |= experimentalsys.O_DIRECTORY return // Early return for directories as the rest of flags doesn't make sense for it. } else if oflags&wasip1.O_EXCL != 0 { - openFlags |= syscall.O_EXCL + openFlags |= experimentalsys.O_EXCL } - // Because we don't implement rights, we paritally rely on the open flags + // Because we don't implement rights, we partially rely on the open flags // to determine the mode in which the file will be opened. This will create // divergent behavior compared to WASI runtimes which have a more strict // interpretation of the WASI capabilities model; for example, a program // which sets O_CREAT but does not give read or write permissions will // successfully create a file when running with wazero, but might get a // permission denied error on other runtimes. - defaultMode := syscall.O_RDONLY + defaultMode := experimentalsys.O_RDONLY if oflags&wasip1.O_TRUNC != 0 { - openFlags |= syscall.O_TRUNC - defaultMode = syscall.O_RDWR + openFlags |= experimentalsys.O_TRUNC + defaultMode = experimentalsys.O_RDWR } if oflags&wasip1.O_CREAT != 0 { - openFlags |= syscall.O_CREAT - defaultMode = syscall.O_RDWR + openFlags |= experimentalsys.O_CREAT + defaultMode = experimentalsys.O_RDWR } if fdflags&wasip1.FD_NONBLOCK != 0 { - openFlags |= syscall.O_NONBLOCK + openFlags |= experimentalsys.O_NONBLOCK } if fdflags&wasip1.FD_APPEND != 0 { - openFlags |= syscall.O_APPEND - defaultMode = syscall.O_RDWR + openFlags |= experimentalsys.O_APPEND + defaultMode = experimentalsys.O_RDWR + } + if fdflags&wasip1.FD_DSYNC != 0 { + openFlags |= experimentalsys.O_DSYNC + } + if fdflags&wasip1.FD_RSYNC != 0 { + openFlags |= experimentalsys.O_RSYNC } + if fdflags&wasip1.FD_SYNC != 0 { + openFlags |= experimentalsys.O_SYNC + } + // Since rights were discontinued in wasi, we only interpret RIGHT_FD_WRITE // because it is the only way to know that we need to set write permissions - // on a file if the application did not pass any of O_CREATE, O_APPEND, nor + // on a file if the application did not pass any of O_CREAT, O_APPEND, nor // O_TRUNC. const r = wasip1.RIGHT_FD_READ const w = wasip1.RIGHT_FD_WRITE const rw = r | w switch { case (rights & rw) == rw: - openFlags |= syscall.O_RDWR + openFlags |= experimentalsys.O_RDWR case (rights & w) == w: - openFlags |= syscall.O_WRONLY + openFlags |= experimentalsys.O_WRONLY case (rights & r) == r: - openFlags |= syscall.O_RDONLY + openFlags |= experimentalsys.O_RDONLY default: openFlags |= defaultMode } @@ -1731,7 +1772,7 @@ var pathReadlink = newHostFunc( "fd", "path", "path_len", "buf", "buf_len", "result.bufused", ) -func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1742,7 +1783,7 @@ func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall. resultBufused := uint32(params[5]) if pathLen == 0 || bufLen == 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } mem := mod.Memory() @@ -1757,11 +1798,11 @@ func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall. } if ok := mem.WriteString(buf, dst); !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } if !mem.WriteUint32Le(resultBufused, uint32(len(dst))) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -1778,10 +1819,10 @@ func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall. // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOENT: `path` does not exist. -// - syscall.ENOTEMPTY: `path` is not empty -// - syscall.ENOTDIR: `path` is a file +// - sys.EBADF: `fd` is invalid +// - sys.ENOENT: `path` does not exist. +// - sys.ENOTEMPTY: `path` is not empty +// - sys.ENOTDIR: `path` is a file // // # Notes // - This is similar to unlinkat with AT_REMOVEDIR in POSIX. @@ -1794,7 +1835,7 @@ var pathRemoveDirectory = newHostFunc( "fd", "path", "path_len", ) -func pathRemoveDirectoryFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathRemoveDirectoryFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1824,10 +1865,10 @@ func pathRemoveDirectoryFn(_ context.Context, mod api.Module, params []uint64) s // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` or `new_fd` are invalid -// - syscall.ENOENT: `old_path` does not exist. -// - syscall.ENOTDIR: `old` is a directory and `new` exists, but is a file. -// - syscall.EISDIR: `old` is a file and `new` exists, but is a directory. +// - sys.EBADF: `fd` or `new_fd` are invalid +// - sys.ENOENT: `old_path` does not exist. +// - sys.ENOTDIR: `old` is a directory and `new` exists, but is a file. +// - sys.EISDIR: `old` is a file and `new` exists, but is a directory. // // # Notes // - This is similar to unlinkat in POSIX. @@ -1840,7 +1881,7 @@ var pathRename = newHostFunc( "fd", "old_path", "old_path_len", "new_fd", "new_path", "new_path_len", ) -func pathRenameFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathRenameFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1862,7 +1903,7 @@ func pathRenameFn(_ context.Context, mod api.Module, params []uint64) syscall.Er } if oldFS != newFS { // TODO: handle renames across filesystems - return syscall.ENOSYS + return experimentalsys.ENOSYS } return oldFS.Rename(oldPathName, newPathName) @@ -1878,7 +1919,7 @@ var pathSymlink = newHostFunc( "old_path", "old_path_len", "fd", "new_path", "new_path_len", ) -func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() oldPath := uint32(params[0]) @@ -1891,25 +1932,25 @@ func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) syscall.E dir, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF // closed + return experimentalsys.EBADF // closed } else if isDir, errno := dir.File.IsDir(); errno != 0 { return errno } else if !isDir { - return syscall.ENOTDIR + return experimentalsys.ENOTDIR } if oldPathLen == 0 || newPathLen == 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } oldPathBuf, ok := mem.Read(oldPath, oldPathLen) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } newPathBuf, ok := mem.Read(newPath, newPathLen) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } return dir.FS.Symlink( @@ -1938,9 +1979,9 @@ func bufToStr(buf []byte) string { // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOENT: `path` does not exist. -// - syscall.EISDIR: `path` is a directory +// - sys.EBADF: `fd` is invalid +// - sys.ENOENT: `path` does not exist. +// - sys.EISDIR: `path` is a directory // // # Notes // - This is similar to unlinkat without AT_REMOVEDIR in POSIX. @@ -1953,7 +1994,7 @@ var pathUnlinkFile = newHostFunc( "fd", "path", "path_len", ) -func pathUnlinkFileFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathUnlinkFileFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go index 1d8ec7f94c..d09f30245b 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go @@ -2,10 +2,11 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "time" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" internalsys "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" @@ -18,15 +19,15 @@ import ( // // - in: pointer to the subscriptions (48 bytes each) // - out: pointer to the resulting events (32 bytes each) -// - nsubscriptions: count of subscriptions, zero returns syscall.EINVAL. +// - nsubscriptions: count of subscriptions, zero returns sys.EINVAL. // - resultNevents: count of events. // // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EINVAL: the parameters are invalid -// - syscall.ENOTSUP: a parameters is valid, but not yet supported. -// - syscall.EFAULT: there is not enough memory to read the subscriptions or +// - sys.EINVAL: the parameters are invalid +// - sys.ENOTSUP: a parameters is valid, but not yet supported. +// - sys.EFAULT: there is not enough memory to read the subscriptions or // write results. // // # Notes @@ -46,17 +47,16 @@ type event struct { eventType byte userData []byte errno wasip1.Errno - outOffset uint32 } -func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { in := uint32(params[0]) out := uint32(params[1]) nsubscriptions := uint32(params[2]) resultNevents := uint32(params[3]) if nsubscriptions == 0 { - return syscall.EINVAL + return sys.EINVAL } mem := mod.Memory() @@ -64,7 +64,7 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Ensure capacity prior to the read loop to reduce error handling. inBuf, ok := mem.Read(in, nsubscriptions*48) if !ok { - return syscall.EFAULT + return sys.EFAULT } outBuf, ok := mem.Read(out, nsubscriptions*32) // zero-out all buffer before writing @@ -73,33 +73,33 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er } if !ok { - return syscall.EFAULT + return sys.EFAULT } // Eagerly write the number of events which will equal subscriptions unless // there's a fault in parsing (not processing). if !mod.Memory().WriteUint32Le(resultNevents, nsubscriptions) { - return syscall.EFAULT + return sys.EFAULT } // Loop through all subscriptions and write their output. // Extract FS context, used in the body of the for loop for FS access. fsc := mod.(*wasm.ModuleInstance).Sys.FS() - // Slice of events that are processed out of the loop (stdin subscribers). - var stdinSubs []*event + // Slice of events that are processed out of the loop (blocking stdin subscribers). + var blockingStdinSubs []*event // The timeout is initialized at max Duration, the loop will find the minimum. var timeout time.Duration = 1<<63 - 1 - // Count of all the clock subscribers that have been already written back to outBuf. - clockEvents := uint32(0) - // Count of all the non-clock subscribers that have been already written back to outBuf. - readySubs := uint32(0) + // Count of all the subscriptions that have been already written back to outBuf. + // nevents*32 returns at all times the offset where the next event should be written: + // this way we ensure that there are no gaps between records. + nevents := uint32(0) // Layout is subscription_u: Union // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#subscription_u for i := uint32(0); i < nsubscriptions; i++ { inOffset := i * 48 - outOffset := i * 32 + outOffset := nevents * 32 eventType := inBuf[inOffset+8] // +8 past userdata // +8 past userdata +8 contents_offset @@ -110,12 +110,10 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er eventType: eventType, userData: userData, errno: wasip1.ErrnoSuccess, - outOffset: outOffset, } switch eventType { case wasip1.EventTypeClock: // handle later - clockEvents++ newTimeout, err := processClockEvent(argBuf) if err != 0 { return err @@ -125,69 +123,76 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er timeout = newTimeout } // Ack the clock event to the outBuf. - writeEvent(outBuf, evt) + writeEvent(outBuf[outOffset:], evt) + nevents++ case wasip1.EventTypeFdRead: fd := int32(le.Uint32(argBuf)) if fd < 0 { - return syscall.EBADF + return sys.EBADF } - if fd == internalsys.FdStdin { - // if the fd is Stdin, do not ack yet, - // append to a slice for delayed evaluation. - stdinSubs = append(stdinSubs, evt) + if file, ok := fsc.LookupFile(fd); !ok { + evt.errno = wasip1.ErrnoBadf + writeEvent(outBuf[outOffset:], evt) + nevents++ + } else if fd != internalsys.FdStdin && file.File.IsNonblock() { + writeEvent(outBuf[outOffset:], evt) + nevents++ } else { - evt.errno = processFDEventRead(fsc, fd) - writeEvent(outBuf, evt) - readySubs++ + // if the fd is Stdin, and it is in blocking mode, + // do not ack yet, append to a slice for delayed evaluation. + blockingStdinSubs = append(blockingStdinSubs, evt) } case wasip1.EventTypeFdWrite: fd := int32(le.Uint32(argBuf)) if fd < 0 { - return syscall.EBADF + return sys.EBADF } - evt.errno = processFDEventWrite(fsc, fd) - readySubs++ - writeEvent(outBuf, evt) + if _, ok := fsc.LookupFile(fd); ok { + evt.errno = wasip1.ErrnoNotsup + } else { + evt.errno = wasip1.ErrnoBadf + } + nevents++ + writeEvent(outBuf[outOffset:], evt) default: - return syscall.EINVAL + return sys.EINVAL } } - // If there are subscribers with data ready, we have already written them to outBuf, - // and we don't need to wait for the timeout: clear it. - if readySubs != 0 { - timeout = 0 + sysCtx := mod.(*wasm.ModuleInstance).Sys + if nevents == nsubscriptions { + // We already wrote back all the results. We already wrote this number + // earlier to offset `resultNevents`. + // We only need to observe the timeout (nonzero if there are clock subscriptions) + // and return. + if timeout > 0 { + sysCtx.Nanosleep(int64(timeout)) + } + return 0 } - // If there are stdin subscribers, check for data with given timeout. - if len(stdinSubs) > 0 { - stdin, ok := fsc.LookupFile(internalsys.FdStdin) - if !ok { - return syscall.EBADF - } - // Wait for the timeout to expire, or for some data to become available on Stdin. - stdinReady, errno := stdin.File.PollRead(&timeout) - if errno != 0 { - return errno - } - if stdinReady { - // stdin has data ready to for reading, write back all the events - for i := range stdinSubs { - readySubs++ - evt := stdinSubs[i] - evt.errno = 0 - writeEvent(outBuf, evt) - } + // If there are blocking stdin subscribers, check for data with given timeout. + stdin, ok := fsc.LookupFile(internalsys.FdStdin) + if !ok { + return sys.EBADF + } + // Wait for the timeout to expire, or for some data to become available on Stdin. + + if stdinReady, errno := stdin.File.Poll(fsapi.POLLIN, int32(timeout.Milliseconds())); errno != 0 { + return errno + } else if stdinReady { + // stdin has data ready to for reading, write back all the events + for i := range blockingStdinSubs { + evt := blockingStdinSubs[i] + evt.errno = 0 + writeEvent(outBuf[nevents*32:], evt) + nevents++ } - } else { - // No subscribers, just wait for the given timeout. - sysCtx := mod.(*wasm.ModuleInstance).Sys - sysCtx.Nanosleep(int64(timeout)) } - if readySubs != nsubscriptions { - if !mod.Memory().WriteUint32Le(resultNevents, readySubs+clockEvents) { - return syscall.EFAULT + if nevents != nsubscriptions { + if !mod.Memory().WriteUint32Le(resultNevents, nevents) { + return sys.EFAULT } } @@ -196,20 +201,20 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // processClockEvent supports only relative name events, as that's what's used // to implement sleep in various compilers including Rust, Zig and TinyGo. -func processClockEvent(inBuf []byte) (time.Duration, syscall.Errno) { +func processClockEvent(inBuf []byte) (time.Duration, sys.Errno) { _ /* ID */ = le.Uint32(inBuf[0:8]) // See below timeout := le.Uint64(inBuf[8:16]) // nanos if relative _ /* precision */ = le.Uint64(inBuf[16:24]) // Unused flags := le.Uint16(inBuf[24:32]) - var err syscall.Errno + var err sys.Errno // subclockflags has only one flag defined: subscription_clock_abstime switch flags { case 0: // relative time case 1: // subscription_clock_abstime - err = syscall.ENOTSUP + err = sys.ENOTSUP default: // subclockflags has only one flag defined. - err = syscall.EINVAL + err = sys.EINVAL } if err != 0 { @@ -223,29 +228,12 @@ func processClockEvent(inBuf []byte) (time.Duration, syscall.Errno) { } } -// processFDEventRead returns ErrnoSuccess if the file exists and ErrnoBadf otherwise. -func processFDEventRead(fsc *internalsys.FSContext, fd int32) wasip1.Errno { - if _, ok := fsc.LookupFile(fd); ok { - return wasip1.ErrnoSuccess - } else { - return wasip1.ErrnoBadf - } -} - -// processFDEventWrite returns ErrnoNotsup if the file exists and ErrnoBadf otherwise. -func processFDEventWrite(fsc *internalsys.FSContext, fd int32) wasip1.Errno { - if _, ok := fsc.LookupFile(fd); ok { - return wasip1.ErrnoNotsup - } - return wasip1.ErrnoBadf -} - // writeEvent writes the event corresponding to the processed subscription. // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-event-struct func writeEvent(outBuf []byte, evt *event) { - copy(outBuf[evt.outOffset:], evt.userData) // userdata - outBuf[evt.outOffset+8] = byte(evt.errno) // uint16, but safe as < 255 - outBuf[evt.outOffset+9] = 0 - le.PutUint32(outBuf[evt.outOffset+10:], uint32(evt.eventType)) + copy(outBuf, evt.userData) // userdata + outBuf[8] = byte(evt.errno) // uint16, but safe as < 255 + outBuf[9] = 0 + le.PutUint32(outBuf[10:], uint32(evt.eventType)) // TODO: When FD events are supported, write outOffset+16 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go index dc94bf7da1..e4d7ccee15 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go @@ -3,9 +3,9 @@ package wasi_snapshot_preview1 import ( "context" "io" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -21,8 +21,8 @@ import ( // Result (Errno) // // The return value is ErrnoSuccess except the following error conditions: -// - syscall.EFAULT: `buf` or `bufLen` point to an offset out of memory -// - syscall.EIO: a file system error +// - sys.EFAULT: `buf` or `bufLen` point to an offset out of memory +// - sys.EIO: a file system error // // For example, if underlying random source was seeded like // `rand.NewSource(42)`, we expect api.Memory to contain: @@ -36,19 +36,19 @@ import ( // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-random_getbuf-pointeru8-bufLen-size---errno var randomGet = newHostFunc(wasip1.RandomGetName, randomGetFn, []api.ValueType{i32, i32}, "buf", "buf_len") -func randomGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func randomGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys randSource := sysCtx.RandSource() buf, bufLen := uint32(params[0]), uint32(params[1]) randomBytes, ok := mod.Memory().Read(buf, bufLen) if !ok { // out-of-range - return syscall.EFAULT + return sys.EFAULT } // We can ignore the returned n as it only != byteCount on error if _, err := io.ReadAtLeast(randSource, randomBytes, int(bufLen)); err != nil { - return syscall.EIO + return sys.EIO } return 0 diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go index b6dbf190d5..86748e6d6f 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -15,7 +15,7 @@ import ( // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-sched_yield---errno var schedYield = newHostFunc(wasip1.SchedYieldName, schedYieldFn, nil) -func schedYieldFn(_ context.Context, mod api.Module, _ []uint64) syscall.Errno { +func schedYieldFn(_ context.Context, mod api.Module, _ []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys sysCtx.Osyield() return 0 diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go index 3dacf3df15..756c0d3913 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sysfs" "github.com/tetratelabs/wazero/internal/wasip1" @@ -23,7 +23,7 @@ var sockAccept = newHostFunc( "fd", "flags", "result.fd", ) -func sockAcceptFn(_ context.Context, mod api.Module, params []uint64) (errno syscall.Errno) { +func sockAcceptFn(_ context.Context, mod api.Module, params []uint64) (errno sys.Errno) { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -50,7 +50,7 @@ var sockRecv = newHostFunc( "fd", "ri_data", "ri_data_len", "ri_flags", "result.ro_datalen", "result.ro_flags", ) -func sockRecvFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func sockRecvFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -63,13 +63,13 @@ func sockRecvFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn var conn socketapi.TCPConn if e, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF // Not open + return sys.EBADF // Not open } else if conn, ok = e.File.(socketapi.TCPConn); !ok { - return syscall.EBADF // Not a conn + return sys.EBADF // Not a conn } if riFlags & ^(wasip1.RI_RECV_PEEK|wasip1.RI_RECV_WAITALL) != 0 { - return syscall.ENOTSUP + return sys.ENOTSUP } if riFlags&wasip1.RI_RECV_PEEK != 0 { @@ -78,16 +78,16 @@ func sockRecvFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // This means that the first `uint32` is a `buf *uint8`. firstIovecBufAddr, ok := mem.ReadUint32Le(riData) if !ok { - return syscall.EINVAL + return sys.EINVAL } // Read bufLen firstIovecBufLen, ok := mem.ReadUint32Le(riData + 4) if !ok { - return syscall.EINVAL + return sys.EINVAL } firstIovecBuf, ok := mem.Read(firstIovecBufAddr, firstIovecBufLen) if !ok { - return syscall.EINVAL + return sys.EINVAL } n, err := conn.Recvfrom(firstIovecBuf, sysfs.MSG_PEEK) if err != 0 { @@ -122,7 +122,7 @@ var sockSend = newHostFunc( "fd", "si_data", "si_data_len", "si_flags", "result.so_datalen", ) -func sockSendFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func sockSendFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -133,14 +133,14 @@ func sockSendFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn resultSoDatalen := uint32(params[4]) if siFlags != 0 { - return syscall.ENOTSUP + return sys.ENOTSUP } var conn socketapi.TCPConn if e, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF // Not open + return sys.EBADF // Not open } else if conn, ok = e.File.(socketapi.TCPConn); !ok { - return syscall.EBADF // Not a conn + return sys.EBADF // Not a conn } bufSize, errno := writev(mem, siData, siDataCount, conn.Write) @@ -157,7 +157,7 @@ func sockSendFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // See: https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-sock_shutdownfd-fd-how-sdflags---errno var sockShutdown = newHostFunc(wasip1.SockShutdownName, sockShutdownFn, []wasm.ValueType{i32, i32}, "fd", "how") -func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -165,23 +165,24 @@ func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) syscall. var conn socketapi.TCPConn if e, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF // Not open + return sys.EBADF // Not open } else if conn, ok = e.File.(socketapi.TCPConn); !ok { - return syscall.EBADF // Not a conn + return sys.EBADF // Not a conn } sysHow := 0 switch how { case wasip1.SD_RD | wasip1.SD_WR: - sysHow = syscall.SHUT_RD | syscall.SHUT_WR + sysHow = socketapi.SHUT_RD | socketapi.SHUT_WR case wasip1.SD_RD: - sysHow = syscall.SHUT_RD + sysHow = socketapi.SHUT_RD case wasip1.SD_WR: - sysHow = syscall.SHUT_WR + sysHow = socketapi.SHUT_WR default: - return syscall.EINVAL + return sys.EINVAL } + // TODO: Map this instead of relying on syscall symbols. return conn.Shutdown(sysHow) } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go index 50612cb871..78fd70ce21 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go @@ -1,32 +1,117 @@ package main import ( + "bytes" + "errors" "fmt" "io" + "io/fs" "net" "net/http" "os" + "strconv" + "strings" "sync" "syscall" + "time" ) func main() { switch os.Args[1] { + case "ls": + var repeat bool + if len(os.Args) == 4 { + repeat = os.Args[3] == "repeat" + } + // Go doesn't open with O_DIRECTORY, so we don't end up with ENOTDIR, + // rather EBADF trying to read the directory later. + if err := mainLs(os.Args[2], repeat); errors.Is(err, syscall.EBADF) { + fmt.Println("ENOTDIR") + } else if err != nil { + panic(err) + } + case "stat": + if err := mainStat(); err != nil { + panic(err) + } case "sock": if err := mainSock(); err != nil { panic(err) } + case "nonblock": + if err := mainNonblock(os.Args[2], os.Args[3:]); err != nil { + panic(err) + } + } + + // Handle go-specific additions + switch os.Args[1] { case "http": if err := mainHTTP(); err != nil { panic(err) } - case "nonblock": - if err := mainNonblock(os.Args[2], os.Args[3:]); err != nil { + case "stdin": + if err := mainStdin(); err != nil { panic(err) } + case "stdout": + mainStdout() + case "largestdout": + mainLargeStdout() } } +func mainLs(path string, repeat bool) error { + d, err := os.Open(path) + if err != nil { + return err + } + defer d.Close() + + if err = printFileNames(d); err != nil { + return err + } else if repeat { + // rewind + if _, err = d.Seek(0, io.SeekStart); err != nil { + return err + } + return printFileNames(d) + } + return nil +} + +func printFileNames(d *os.File) error { + if names, err := d.Readdirnames(-1); err != nil { + return err + } else { + for _, n := range names { + fmt.Println("./" + n) + } + } + return nil +} + +func mainStat() error { + var isatty = func(name string, fd uintptr) error { + f := os.NewFile(fd, "") + if st, err := f.Stat(); err != nil { + return err + } else { + ttyMode := fs.ModeDevice | fs.ModeCharDevice + isatty := st.Mode()&ttyMode == ttyMode + fmt.Println(name, "isatty:", isatty) + return nil + } + } + + for fd, name := range []string{"stdin", "stdout", "stderr", "/"} { + if err := isatty(name, uintptr(fd)); err != nil { + return err + } + } + return nil +} + // mainSock is an explicit test of a blocking socket. func mainSock() error { // Get a listener from the pre-opened file descriptor. @@ -57,6 +142,61 @@ func mainSock() error { return nil } +// Adapted from nonblock.go +// https://github.com/golang/go/blob/0fcc70ecd56e3b5c214ddaee4065ea1139ae16b5/src/runtime/internal/wasitest/testdata/nonblock.go +func mainNonblock(mode string, files []string) error { + ready := make(chan struct{}) + + var wg sync.WaitGroup + for _, path := range files { + f, err := os.Open(path) + if err != nil { + return err + } + switch mode { + case "open": + case "create": + fd := f.Fd() + if err = syscall.SetNonblock(int(fd), true); err != nil { + return err + } + f = os.NewFile(fd, path) + default: + return fmt.Errorf("invalid test mode") + } + + spawnWait := make(chan struct{}) + + wg.Add(1) + go func(f *os.File) { + defer f.Close() + defer wg.Done() + + // Signal the routine has been spawned. + close(spawnWait) + + // Wait until ready. + <-ready + + var buf [256]byte + + if n, err := f.Read(buf[:]); err != nil { + panic(err) + } else { + os.Stderr.Write(buf[:n]) + } + }(f) + + // Spawn one goroutine at a time. + <-spawnWait + } + + println("waiting") + close(ready) + wg.Wait() + return nil +} + // mainHTTP implicitly tests non-blocking sockets, as they are needed for // middleware. func mainHTTP() error { @@ -106,57 +246,64 @@ func (e echoOnce) ServeHTTP(w http.ResponseWriter, r *http.Request) { close(e.ch) } -// Adapted from nonblock.go -// https://github.com/golang/go/blob/0fcc70ecd56e3b5c214ddaee4065ea1139ae16b5/src/runtime/internal/wasitest/testdata/nonblock.go -func mainNonblock(mode string, files []string) error { - ready := make(chan struct{}) +// Reproducer for https://github.com/tetratelabs/wazero/issues/1538 +func mainStdin() error { + go func() { + time.Sleep(1 * time.Second) + os.Stdout.WriteString("waiting for stdin...\n") + }() - var wg sync.WaitGroup - for _, path := range files { - f, err := os.Open(path) - if err != nil { - return err - } - switch mode { - case "open": - case "create": - fd := f.Fd() - if err = syscall.SetNonblock(int(fd), true); err != nil { - return err - } - f = os.NewFile(fd, path) - default: - return fmt.Errorf("invalid test mode") - } + b, err := io.ReadAll(os.Stdin) + if err != nil { + return err + } + os.Stdout.Write(b) + return nil +} - spawnWait := make(chan struct{}) +func mainStdout() { + os.Stdout.WriteString("test") +} - wg.Add(1) - go func(f *os.File) { - defer f.Close() - defer wg.Done() +func mainLargeStdout() { + const ntest = 1024 - // Signal the routine has been spawned. - close(spawnWait) + var decls, calls bytes.Buffer - // Wait until ready. - <-ready + for i := 1; i <= ntest; i++ { + s := strconv.Itoa(i) + decls.WriteString(strings.Replace(decl, "$", s, -1)) + calls.WriteString(strings.Replace("call(test$)\n\t", "$", s, -1)) + } - var buf [256]byte + program = strings.Replace(program, "$DECLS", decls.String(), 1) + program = strings.Replace(program, "$CALLS", calls.String(), 1) + fmt.Print(program) +} - if n, err := f.Read(buf[:]); err != nil { - panic(err) - } else { - os.Stderr.Write(buf[:n]) - } - }(f) +var program = `package main - // Spawn one goroutine at a time. - <-spawnWait +var count int + +func call(f func() bool) { + if f() { + count++ } +} - println("waiting") - close(ready) - wg.Wait() - return nil +$DECLS + +func main() { + $CALLS + if count != 0 { + println("failed", count, "case(s)") + } } +` + +const decl = ` +type T$ [$]uint8 +func test$() bool { + v := T${1} + return v == [$]uint8{2} || v != [$]uint8{1} +}` diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go new file mode 100644 index 0000000000..6c52cc4bcd --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go @@ -0,0 +1,88 @@ +package main + +import ( + "errors" + "fmt" + "io" + "io/fs" + "os" + "syscall" +) + +func main() { + switch os.Args[1] { + case "ls": + var repeat bool + if len(os.Args) == 4 { + repeat = os.Args[3] == "repeat" + } + // Go doesn't open with O_DIRECTORY, so we don't end up with ENOTDIR, + // rather EBADF trying to read the directory later. + if err := mainLs(os.Args[2], repeat); errors.Is(err, syscall.EBADF) { + fmt.Println("ENOTDIR") + } else if err != nil { + panic(err) + } + case "stat": + if err := mainStat(); err != nil { + panic(err) + } + case "sock": + // TODO: undefined: net.FileListener + // See https://github.com/tinygo-org/tinygo/pull/2748 + case "nonblock": + // TODO: undefined: syscall.SetNonblock + // See https://github.com/tinygo-org/tinygo/issues/3840 + } +} + +func mainLs(path string, repeat bool) error { + d, err := os.Open(path) + if err != nil { + return err + } + defer d.Close() + + if err = printFileNames(d); err != nil { + return err + } else if repeat { + // rewind + if _, err = d.Seek(0, io.SeekStart); err != nil { + return err + } + return printFileNames(d) + } + return nil +} + +func printFileNames(d *os.File) error { + if names, err := d.Readdirnames(-1); err != nil { + return err + } else { + for _, n := range names { + fmt.Println("./" + n) + } + } + return nil +} + +func mainStat() error { + var isatty = func(name string, fd uintptr) error { + f := os.NewFile(fd, "") + if st, err := f.Stat(); err != nil { + return err + } else { + ttyMode := fs.ModeDevice | fs.ModeCharDevice + isatty := st.Mode()&ttyMode == ttyMode + fmt.Println(name, "isatty:", isatty) + return nil + } + } + + for fd, name := range []string{"stdin", "stdout", "stderr", "/"} { + if err := isatty(name, uintptr(fd)); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.wasm b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d7dfb28d32ebedf2bfeacf61001e24253ca08b20 GIT binary patch literal 109235 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�L-oJ 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go index c6190316df..4ef41d501c 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go @@ -19,10 +19,10 @@ package wasi_snapshot_preview1 import ( "context" "encoding/binary" - "syscall" "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -229,18 +229,18 @@ func exportFunctions(builder wazero.HostModuleBuilder) { // writeOffsetsAndNullTerminatedValues is used to write NUL-terminated values // for args or environ, given a pre-defined bytesLen (which includes NUL // terminators). -func writeOffsetsAndNullTerminatedValues(mem api.Memory, values [][]byte, offsets, bytes, bytesLen uint32) syscall.Errno { +func writeOffsetsAndNullTerminatedValues(mem api.Memory, values [][]byte, offsets, bytes, bytesLen uint32) sys.Errno { // The caller may not place bytes directly after offsets, so we have to // read them independently. valuesLen := len(values) offsetsLen := uint32(valuesLen * 4) // uint32Le offsetsBuf, ok := mem.Read(offsets, offsetsLen) if !ok { - return syscall.EFAULT + return sys.EFAULT } bytesBuf, ok := mem.Read(bytes, bytesLen) if !ok { - return syscall.EFAULT + return sys.EFAULT } // Loop through the values, first writing the location of its data to @@ -285,7 +285,7 @@ func newHostFunc( // wasiFunc special cases that all WASI functions return a single Errno // result. The returned value will be written back to the stack at index zero. -type wasiFunc func(ctx context.Context, mod api.Module, params []uint64) syscall.Errno +type wasiFunc func(ctx context.Context, mod api.Module, params []uint64) sys.Errno // Call implements the same method as documented on api.GoModuleFunction. func (f wasiFunc) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/tetratelabs/wazero/internal/close/close.go b/vendor/github.com/tetratelabs/wazero/internal/close/close.go new file mode 100644 index 0000000000..33b39b1e23 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/close/close.go @@ -0,0 +1,13 @@ +// Package close allows experimental.CloseNotifier without introducing a +// package cycle. +package close + +import "context" + +// NotifierKey is a context.Context Value key. Its associated value should be a +// Notifier. +type NotifierKey struct{} + +type Notifier interface { + CloseNotify(ctx context.Context, exitCode uint32) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go index d5ec8e27b6..86abce4a51 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go @@ -48,6 +48,10 @@ type ( // as the underlying memory region is accessed by assembly directly by using // codesElement0Address. functions []function + + // Keep a reference to the compiled module to prevent the GC from reclaiming + // it while the code may still be needed. + module *compiledModule } // callEngine holds context per moduleEngine.Call, and shared across all the @@ -130,11 +134,13 @@ type ( // initialFn is the initial function for this call engine. initialFn *function + // Keep a reference to the compiled module to prevent the GC from reclaiming + // it while the code may still be needed. + module *compiledModule + // stackIterator provides a way to iterate over the stack for Listeners. // It is setup and valid only during a call to a Listener hook. stackIterator stackIterator - - ensureTermination bool } // moduleContext holds the per-function call specific module information. @@ -264,12 +270,27 @@ type ( } compiledModule struct { - executable asm.CodeSegment - functions []compiledFunction - source *wasm.Module + // The data that need to be accessed by compiledFunction.parent are + // separated in an embedded field because we use finalizers to manage + // the lifecycle of compiledModule instances and having cyclic pointers + // prevents the Go runtime from calling them, which results in memory + // leaks since the memory mapped code segments cannot be released. + // + // The indirection guarantees that the finalizer set on compiledModule + // instances can run when all references are gone, and the Go GC can + // manage to reclaim the compiledCode when all compiledFunction objects + // referencing it have been freed. + *compiledCode + functions []compiledFunction + ensureTermination bool } + compiledCode struct { + source *wasm.Module + executable asm.CodeSegment + } + // compiledFunction corresponds to a function in a module (not instantiated one). This holds the machine code // compiled by wazero compiler. compiledFunction struct { @@ -282,7 +303,7 @@ type ( index wasm.Index goFunc interface{} listener experimental.FunctionListener - parent *compiledModule + parent *compiledCode sourceOffsetMap sourceOffsetMap } @@ -516,9 +537,11 @@ func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners var withGoFunc bool localFuncs, importedFuncs := len(module.FunctionSection), module.ImportFunctionCount cm := &compiledModule{ + compiledCode: &compiledCode{ + source: module, + }, functions: make([]compiledFunction, localFuncs), ensureTermination: ensureTermination, - source: module, } if localFuncs == 0 { @@ -552,7 +575,7 @@ func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners funcIndex := wasm.Index(i) compiledFn := &cm.functions[i] compiledFn.executableOffset = executable.Size() - compiledFn.parent = cm + compiledFn.parent = cm.compiledCode compiledFn.index = importedFuncs + funcIndex if i < ln { compiledFn.listener = listeners[i] @@ -621,6 +644,8 @@ func (e *engine) NewModuleEngine(module *wasm.Module, instance *wasm.ModuleInsta parent: c, } } + + me.module = cm return me, nil } @@ -713,7 +738,7 @@ func (ce *callEngine) CallWithStack(ctx context.Context, stack []uint64) error { func (ce *callEngine) call(ctx context.Context, params, results []uint64) (_ []uint64, err error) { m := ce.initialFn.moduleInstance - if ce.ensureTermination { + if ce.module.ensureTermination { select { case <-ctx.Done(): // If the provided context is already done, close the call context @@ -734,12 +759,14 @@ func (ce *callEngine) call(ctx context.Context, params, results []uint64) (_ []u // If the module closed during the call, and the call didn't err for another reason, set an ExitError. err = m.FailIfClosed() } + // Ensure that the compiled module will never be GC'd before this method returns. + runtime.KeepAlive(ce.module) }() ft := ce.initialFn.funcType ce.initializeStack(ft, params) - if ce.ensureTermination { + if ce.module.ensureTermination { done := m.CloseModuleOnCanceledOrTimeout(ctx) defer done() } @@ -952,11 +979,11 @@ var initialStackSize uint64 = 512 func (e *moduleEngine) newCallEngine(stackSize uint64, fn *function) *callEngine { ce := &callEngine{ - stack: make([]uint64, stackSize), - archContext: newArchContext(), - initialFn: fn, - moduleContext: moduleContext{fn: fn}, - ensureTermination: fn.parent.parent.ensureTermination, + stack: make([]uint64, stackSize), + archContext: newArchContext(), + initialFn: fn, + moduleContext: moduleContext{fn: fn}, + module: e.module, } stackHeader := (*reflect.SliceHeader)(unsafe.Pointer(&ce.stack)) diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go index e6b3b0e914..37e481bdb6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go @@ -17,6 +17,7 @@ import ( func (e *engine) deleteCompiledModule(module *wasm.Module) { e.mux.Lock() defer e.mux.Unlock() + delete(e.codes, module.ID) // Note: we do not call e.Cache.Delete, as the lifetime of @@ -158,14 +159,18 @@ func deserializeCompiledModule(wazeroVersion string, reader io.ReadCloser, modul ensureTermination := header[cachedVersionEnd] != 0 functionsNum := binary.LittleEndian.Uint32(header[len(header)-4:]) - cm = &compiledModule{functions: make([]compiledFunction, functionsNum), ensureTermination: ensureTermination} + cm = &compiledModule{ + compiledCode: new(compiledCode), + functions: make([]compiledFunction, functionsNum), + ensureTermination: ensureTermination, + } imported := module.ImportFunctionCount var eightBytes [8]byte for i := uint32(0); i < functionsNum; i++ { f := &cm.functions[i] - f.parent = cm + f.parent = cm.compiledCode // Read the stack pointer ceil. if f.stackPointerCeil, err = readUint64(reader, &eightBytes); err != nil { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go index 79b299ec9d..7de2b33189 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go @@ -1088,7 +1088,7 @@ func (c *amd64Compiler) compileAdd(o *wazeroir.UnionOperation) error { return err } - x1 := c.locationStack.peek() // Note this is peek, pop! + x1 := c.locationStack.peek() // Note this is peek! if err := c.compileEnsureOnRegister(x1); err != nil { return err } @@ -1125,7 +1125,7 @@ func (c *amd64Compiler) compileSub(o *wazeroir.UnionOperation) error { return err } - x1 := c.locationStack.peek() // Note this is peek, pop! + x1 := c.locationStack.peek() // Note this is peek! if err := c.compileEnsureOnRegister(x1); err != nil { return err } @@ -3499,7 +3499,7 @@ func (c *amd64Compiler) compileStoreImpl(offsetConst uint32, inst asm.Instructio reg, err := c.compileMemoryAccessCeilSetup(offsetConst, targetSizeInBytes) if err != nil { - return nil + return err } c.assembler.CompileRegisterToMemoryWithIndex( @@ -4856,6 +4856,7 @@ func (c *amd64Compiler) compileMaybeExitFromNativeCode(skipCondition asm.Instruc func (c *amd64Compiler) compileExitFromNativeCode(status nativeCallStatusCode) { if target := c.compiledTrapTargets[status]; target != nil { c.assembler.CompileJump(amd64.JMP).AssignJumpTarget(target) + return } switch status { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go index af02481885..b5be128fab 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go @@ -380,42 +380,16 @@ func (c *arm64Compiler) compileReturnFunction() error { } func (c *arm64Compiler) compileMaybeExitFromNativeCode(skipCondition asm.Instruction, status nativeCallStatusCode) { - if target := c.compiledTrapTargets[status]; target != nil { - // We've already compiled this. - // Invert the condition to jump into the appropriate target. - var trapCondition asm.Instruction - switch skipCondition { - case arm64.BCONDEQ: - trapCondition = arm64.BCONDNE - case arm64.BCONDNE: - trapCondition = arm64.BCONDEQ - case arm64.BCONDLO: - trapCondition = arm64.BCONDHS - case arm64.BCONDHS: - trapCondition = arm64.BCONDLO - case arm64.BCONDLS: - trapCondition = arm64.BCONDHI - case arm64.BCONDHI: - trapCondition = arm64.BCONDLS - case arm64.BCONDVS: - trapCondition = arm64.BCONDVC - case arm64.BCONDVC: - trapCondition = arm64.BCONDVS - default: - panic("BUG: couldn't invert condition") - } - c.assembler.CompileJump(trapCondition).AssignJumpTarget(target) - } else { - skip := c.assembler.CompileJump(skipCondition) - c.compileExitFromNativeCode(status) - c.assembler.SetJumpTargetOnNext(skip) - } + skip := c.assembler.CompileJump(skipCondition) + c.compileExitFromNativeCode(status) + c.assembler.SetJumpTargetOnNext(skip) } // compileExitFromNativeCode adds instructions to give the control back to ce.exec with the given status code. func (c *arm64Compiler) compileExitFromNativeCode(status nativeCallStatusCode) { if target := c.compiledTrapTargets[status]; target != nil { c.assembler.CompileJump(arm64.B).AssignJumpTarget(target) + return } switch status { diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go deleted file mode 100644 index 868b9c16a3..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !windows && !js && !illumos && !solaris - -package fsapi - -import "syscall" - -// Simple aliases to constants in the syscall package for portability with -// platforms which do not have them (e.g. windows) -const ( - O_DIRECTORY = syscall.O_DIRECTORY - O_NOFOLLOW = syscall.O_NOFOLLOW - O_NONBLOCK = syscall.O_NONBLOCK -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go deleted file mode 100644 index af73ddb66c..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go +++ /dev/null @@ -1,8 +0,0 @@ -package fsapi - -// See the comments on the same constants in constants_windows.go -const ( - O_DIRECTORY = 1 << 29 - O_NOFOLLOW = 1 << 30 - O_NONBLOCK = 1 << 31 -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go deleted file mode 100644 index a0de49b73f..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build illumos || solaris - -package fsapi - -import "syscall" - -// See https://github.com/illumos/illumos-gate/blob/edd580643f2cf1434e252cd7779e83182ea84945/usr/src/uts/common/sys/fcntl.h#L90 -const ( - O_DIRECTORY = 0x1000000 - O_NOFOLLOW = syscall.O_NOFOLLOW - O_NONBLOCK = syscall.O_NONBLOCK -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go deleted file mode 100644 index 33aed87052..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go +++ /dev/null @@ -1,24 +0,0 @@ -package fsapi - -import "syscall" - -// Windows does not have these constants, we declare placeholders which should -// not conflict with other open flags. These placeholders are not declared as -// value zero so code written in a way which expects them to be bit flags still -// works as expected. -// -// Since those placeholder are not interpreted by the open function, the unix -// features they represent are also not implemented on windows: -// -// - O_DIRECTORY allows programs to ensure that the opened file is a directory. -// This could be emulated by doing a stat call on the file after opening it -// to verify that it is in fact a directory, then closing it and returning an -// error if it is not. -// -// - O_NOFOLLOW allows programs to ensure that if the opened file is a symbolic -// link, the link itself is opened instead of its target. -const ( - O_DIRECTORY = 1 << 29 - O_NOFOLLOW = 1 << 30 - O_NONBLOCK = syscall.O_NONBLOCK -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go deleted file mode 100644 index c28783b461..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go +++ /dev/null @@ -1,99 +0,0 @@ -package fsapi - -import ( - "fmt" - "io/fs" - "syscall" - "time" -) - -// Dirent is an entry read from a directory. -// -// This is a portable variant of syscall.Dirent containing fields needed for -// WebAssembly ABI including WASI snapshot-01 and wasi-filesystem. Unlike -// fs.DirEntry, this may include the Ino. -type Dirent struct { - // ^^ Dirent name matches syscall.Dirent - - // Name is the base name of the directory entry. - Name string - - // Ino is the file serial number, or zero if not available. - Ino uint64 - - // Type is fs.FileMode masked on fs.ModeType. For example, zero is a - // regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. - Type fs.FileMode -} - -func (d *Dirent) String() string { - return fmt.Sprintf("name=%s, type=%v, ino=%d", d.Name, d.Type, d.Ino) -} - -// IsDir returns true if the Type is fs.ModeDir. -func (d *Dirent) IsDir() bool { - return d.Type == fs.ModeDir -} - -// DirFile is embeddable to reduce the amount of functions to implement a file. -type DirFile struct{} - -// IsAppend implements File.IsAppend -func (DirFile) IsAppend() bool { - return false -} - -// SetAppend implements File.SetAppend -func (DirFile) SetAppend(bool) syscall.Errno { - return syscall.EISDIR -} - -// IsNonblock implements File.IsNonblock -func (DirFile) IsNonblock() bool { - return false -} - -// SetNonblock implements File.SetNonblock -func (DirFile) SetNonblock(bool) syscall.Errno { - return syscall.EISDIR -} - -// IsDir implements File.IsDir -func (DirFile) IsDir() (bool, syscall.Errno) { - return true, 0 -} - -// Read implements File.Read -func (DirFile) Read([]byte) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Pread implements File.Pread -func (DirFile) Pread([]byte, int64) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Seek implements File.Seek -func (DirFile) Seek(int64, int) (int64, syscall.Errno) { - return 0, syscall.EISDIR -} - -// PollRead implements File.PollRead -func (DirFile) PollRead(*time.Duration) (ready bool, errno syscall.Errno) { - return false, syscall.ENOSYS -} - -// Write implements File.Write -func (DirFile) Write([]byte) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Pwrite implements File.Pwrite -func (DirFile) Pwrite([]byte, int64) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Truncate implements File.Truncate -func (DirFile) Truncate(int64) syscall.Errno { - return syscall.EISDIR -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go index 2d6ad0372e..0640b22712 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go @@ -1,44 +1,17 @@ package fsapi -import ( - "io/fs" - "syscall" - "time" -) +import experimentalsys "github.com/tetratelabs/wazero/experimental/sys" -// File is a writeable fs.File bridge backed by syscall functions needed for ABI -// including WASI and runtime.GOOS=js. +// File includes methods not yet ready to document for end users, notably +// non-blocking functionality. // -// Implementations should embed UnimplementedFile for forward compatability. Any -// unsupported method or parameter should return syscall.ENOSYS. -// -// # Errors -// -// All methods that can return an error return a syscall.Errno, which is zero -// on success. -// -// Restricting to syscall.Errno matches current WebAssembly host functions, -// which are constrained to well-known error codes. For example, `GOOS=js` maps -// hard coded values and panics otherwise. More commonly, WASI maps syscall -// errors to u32 numeric values. -// -// # Notes -// -// A writable filesystem abstraction is not yet implemented as of Go 1.20. See -// https://github.com/golang/go/issues/45757 +// Particularly, Poll is subject to debate. For example, whether a user should +// be able to choose how to implement timeout or not. Currently, this interface +// allows the user to choose to sleep or use native polling, and which choice +// they make impacts thread behavior as summarized here: +// https://github.com/tetratelabs/wazero/pull/1606#issuecomment-1665475516 type File interface { - // Ino returns the inode (Stat_t.Ino) of this file, zero if unknown or an - // error there was an error retrieving it. - // - // # Errors - // - // Possible errors are those from Stat, except syscall.ENOSYS should not - // be returned. Zero should be returned if there is no implementation. - // - // # Notes - // - // - Some implementations implement this with a cached call to Stat. - Ino() (uint64, syscall.Errno) + experimentalsys.File // IsNonblock returns true if the file was opened with O_NONBLOCK, or // SetNonblock was successfully enabled on this file. @@ -53,330 +26,44 @@ type File interface { // // # Errors // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. // // # Notes // // - This is like syscall.SetNonblock and `fcntl` with O_NONBLOCK in // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html - SetNonblock(enable bool) syscall.Errno - - // IsAppend returns true if the file was opened with syscall.O_APPEND, or - // SetAppend was successfully enabled on this file. - // - // # Notes - // - // - This might not match the underlying state of the file descriptor if - // the file was not opened via OpenFile. - IsAppend() bool - - // SetAppend toggles the append mode (syscall.O_APPEND) of this file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - There is no `O_APPEND` for `fcntl` in POSIX, so implementations may - // have to re-open the underlying file to apply this. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - SetAppend(enable bool) syscall.Errno - - // Stat is similar to syscall.Fstat. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fstat and `fstatat` with `AT_FDCWD` in POSIX. - // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html - // - A fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - Windows allows you to stat a closed directory. - Stat() (Stat_t, syscall.Errno) - - // IsDir returns true if this file is a directory or an error there was an - // error retrieving this information. - // - // # Errors - // - // Possible errors are those from Stat. - // - // # Notes - // - // - Some implementations implement this with a cached call to Stat. - IsDir() (bool, syscall.Errno) - - // Read attempts to read all bytes in the file into `buf`, and returns the - // count read even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not readable. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.Reader and `read` in POSIX, preferring semantics of - // io.Reader. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html - // - Unlike io.Reader, there is no io.EOF returned on end-of-file. To - // read the file completely, the caller must repeat until `n` is zero. - Read(buf []byte) (n int, errno syscall.Errno) - - // Pread attempts to read all bytes in the file into `p`, starting at the - // offset `off`, and returns the count read even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not readable. - // - syscall.EINVAL: the offset was negative. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.ReaderAt and `pread` in POSIX, preferring semantics - // of io.ReaderAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html - // - Unlike io.ReaderAt, there is no io.EOF returned on end-of-file. To - // read the file completely, the caller must repeat until `n` is zero. - Pread(buf []byte, off int64) (n int, errno syscall.Errno) + SetNonblock(enable bool) experimentalsys.Errno - // Seek attempts to set the next offset for Read or Write and returns the - // resulting absolute offset or an error. + // Poll returns if the file has data ready to be read or written. // // # Parameters // - // The `offset` parameters is interpreted in terms of `whence`: - // - io.SeekStart: relative to the start of the file, e.g. offset=0 sets - // the next Read or Write to the beginning of the file. - // - io.SeekCurrent: relative to the current offset, e.g. offset=16 sets - // the next Read or Write 16 bytes past the prior. - // - io.SeekEnd: relative to the end of the file, e.g. offset=-1 sets the - // next Read or Write to the last byte in the file. + // The `flag` parameter determines which event to await, such as POLLIN, + // POLLOUT, or a combination like `POLLIN|POLLOUT`. // - // # Behavior when a directory + // The `timeoutMillis` parameter is how long to block for an event, or + // interrupted, in milliseconds. There are two special values: + // - zero returns immediately + // - any negative value blocks any amount of time // - // The only supported use case for a directory is seeking to `offset` zero - // (`whence` = io.SeekStart). This should have the same behavior as - // os.File, which resets any internal state used by Readdir. + // # Results // - // # Errors + // `ready` means there was data ready to read or written. False can mean no + // event was ready or `errno` is not zero. // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not readable. - // - syscall.EINVAL: the offset was negative. - // - // # Notes - // - // - This is like io.Seeker and `fseek` in POSIX, preferring semantics - // of io.Seeker. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html - Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) - - // PollRead returns if the file has data ready to be read or an error. - // - // # Parameters - // - // The `timeout` parameter when nil blocks up to forever. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. + // A zero `errno` is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - ENOTSUP: the implementation does not the flag combination. + // - EINTR: the call was interrupted prior to an event. // // # Notes // // - This is like `poll` in POSIX, for a single file. // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html // - No-op files, such as those which read from /dev/null, should return - // immediately true to avoid hangs (because data will never become - // available). - PollRead(timeout *time.Duration) (ready bool, errno syscall.Errno) - - // Readdir reads the contents of the directory associated with file and - // returns a slice of up to n Dirent values in an arbitrary order. This is - // a stateful function, so subsequent calls return any next values. - // - // If n > 0, Readdir returns at most n entries or an error. - // If n <= 0, Readdir returns all remaining entries or an error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.ENOTDIR: the file was not a directory - // - // # Notes - // - // - This is like `Readdir` on os.File, but unlike `readdir` in POSIX. - // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html - // - For portability reasons, no error is returned at the end of the - // directory, when the file is closed or removed while open. - // See https://github.com/ziglang/zig/blob/0.10.1/lib/std/fs.zig#L635-L637 - Readdir(n int) (dirents []Dirent, errno syscall.Errno) - // ^-- TODO: consider being more like POSIX, for example, returning a - // closeable Dirent object that can iterate on demand. This would - // centralize sizing logic needed by wasi, particularly extra dirents - // stored in the sys.FileEntry type. It could possibly reduce the need to - // reopen the whole file. - - // Write attempts to write all bytes in `p` to the file, and returns the - // count written even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file was closed, not writeable, or a directory. - // - // # Notes - // - // - This is like io.Writer and `write` in POSIX, preferring semantics of - // io.Writer. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html - Write(buf []byte) (n int, errno syscall.Errno) - - // Pwrite attempts to write all bytes in `p` to the file at the given - // offset `off`, and returns the count written even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not writeable. - // - syscall.EINVAL: the offset was negative. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.WriterAt and `pwrite` in POSIX, preferring semantics - // of io.WriterAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html - Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) - - // Truncate truncates a file to a specified length. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - syscall.EINVAL: the `size` is negative. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like syscall.Ftruncate and `ftruncate` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html - // - Windows does not error when calling Truncate on a closed file. - Truncate(size int64) syscall.Errno - - // Sync synchronizes changes to the file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fsync and `fsync` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html - // - This returns with no error instead of syscall.ENOSYS when - // unimplemented. This prevents fake filesystems from erring. - // - Windows does not error when calling Sync on a closed file. - Sync() syscall.Errno - - // Datasync synchronizes the data of a file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fdatasync and `fdatasync` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html - // - This returns with no error instead of syscall.ENOSYS when - // unimplemented. This prevents fake filesystems from erring. - // - As this is commonly missing, some implementations dispatch to Sync. - Datasync() syscall.Errno - - // Chmod changes the mode of the file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fchmod and `fchmod` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchmod.html - // - Windows ignores the execute bit, and any permissions come back as - // group and world. For example, chmod of 0400 reads back as 0444, and - // 0700 0666. Also, permissions on directories aren't supported at all. - Chmod(fs.FileMode) syscall.Errno - - // Chown changes the owner and group of a file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fchown and `fchown` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchown.html - // - This always returns syscall.ENOSYS on windows. - Chown(uid, gid int) syscall.Errno - - // Utimens set file access and modification times of this file, at - // nanosecond precision. - // - // # Parameters - // - // The `times` parameter includes the access and modification timestamps to - // assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT may be - // specified instead of real timestamps. A nil `times` parameter behaves the - // same as if both were set to UTIME_NOW. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.UtimesNano and `futimens` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html - // - Windows requires files to be open with syscall.O_RDWR, which means you - // cannot use this to update timestamps on a directory (syscall.EPERM). - Utimens(times *[2]syscall.Timespec) syscall.Errno - - // Close closes the underlying file. - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - // # Notes - // - // - This is like syscall.Close and `close` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html - Close() syscall.Errno + // immediately true, as data will never become available. + // - See /RATIONALE.md for detailed notes including impact of blocking. + Poll(flag Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go deleted file mode 100644 index 9a46bfe6c6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go +++ /dev/null @@ -1,365 +0,0 @@ -package fsapi - -import ( - "io/fs" - "syscall" -) - -// FS is a writeable fs.FS bridge backed by syscall functions needed for ABI -// including WASI and runtime.GOOS=js. -// -// Implementations should embed UnimplementedFS for forward compatability. Any -// unsupported method or parameter should return syscall.ENO -// -// # Errors -// -// All methods that can return an error return a syscall.Errno, which is zero -// on success. -// -// Restricting to syscall.Errno matches current WebAssembly host functions, -// which are constrained to well-known error codes. For example, `GOOS=js` maps -// hard coded values and panics otherwise. More commonly, WASI maps syscall -// errors to u32 numeric values. -// -// # Notes -// -// A writable filesystem abstraction is not yet implemented as of Go 1.20. See -// https://github.com/golang/go/issues/45757 -type FS interface { - // String should return a human-readable format of the filesystem - // - // For example, if this filesystem is backed by the real directory - // "/tmp/wasm", the expected value is "/tmp/wasm". - // - // When the host filesystem isn't a real filesystem, substitute a symbolic, - // human-readable name. e.g. "virtual" - String() string - - // OpenFile opens a file. It should be closed via Close on File. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` or `flag` is invalid. - // - syscall.EISDIR: the path was a directory, but flag included - // syscall.O_RDWR or syscall.O_WRONLY - // - syscall.ENOENT: `path` doesn't exist and `flag` doesn't contain - // os.O_CREATE. - // - // # Constraints on the returned file - // - // Implementations that can read flags should enforce them regardless of - // the type returned. For example, while os.File implements io.Writer, - // attempts to write to a directory or a file opened with os.O_RDONLY fail - // with a syscall.EBADF. - // - // Some implementations choose whether to enforce read-only opens, namely - // fs.FS. While fs.FS is supported (Adapt), wazero cannot runtime enforce - // open flags. Instead, we encourage good behavior and test our built-in - // implementations. - // - // # Notes - // - // - This is like os.OpenFile, except the path is relative to this file - // system, and syscall.Errno is returned instead of os.PathError. - // - flag are the same as os.OpenFile, for example, os.O_CREATE. - // - Implications of permissions when os.O_CREATE are described in Chmod - // notes. - // - This is like `open` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - OpenFile(path string, flag int, perm fs.FileMode) (File, syscall.Errno) - // ^^ TODO: Consider syscall.Open, though this implies defining and - // coercing flags and perms similar to what is done in os.OpenFile. - - // Lstat gets file status without following symbolic links. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.ENOENT: `path` doesn't exist. - // - // # Notes - // - // - This is like syscall.Lstat, except the `path` is relative to this - // file system. - // - This is like `lstat` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html - // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - When the path is a symbolic link, the stat returned is for the link, - // not the file it refers to. - Lstat(path string) (Stat_t, syscall.Errno) - - // Stat gets file status. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.ENOENT: `path` doesn't exist. - // - // # Notes - // - // - This is like syscall.Stat, except the `path` is relative to this - // file system. - // - This is like `stat` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html - // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - When the path is a symbolic link, the stat returned is for the file - // it refers to. - Stat(path string) (Stat_t, syscall.Errno) - - // Mkdir makes a directory. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.EEXIST: `path` exists and is a directory. - // - syscall.ENOTDIR: `path` exists and is a file. - // - // # Notes - // - // - This is like syscall.Mkdir, except the `path` is relative to this - // file system. - // - This is like `mkdir` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html - // - Implications of permissions are described in Chmod notes. - Mkdir(path string, perm fs.FileMode) syscall.Errno - // ^^ TODO: Consider syscall.Mkdir, though this implies defining and - // coercing flags and perms similar to what is done in os.Mkdir. - - // Chmod changes the mode of the file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Chmod, except the `path` is relative to this - // file system. - // - This is like `chmod` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html - // - Windows ignores the execute bit, and any permissions come back as - // group and world. For example, chmod of 0400 reads back as 0444, and - // 0700 0666. Also, permissions on directories aren't supported at all. - Chmod(path string, perm fs.FileMode) syscall.Errno - - // Chown changes the owner and group of a file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Chown, except the `path` is relative to this - // file system. - // - This is like `chown` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html - // - This always returns syscall.ENOSYS on windows. - Chown(path string, uid, gid int) syscall.Errno - - // Lchown changes the owner and group of a symbolic link. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Lchown, except the `path` is relative to this - // file system. - // - This is like `lchown` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html - // - Windows will always return syscall.ENOSYS - Lchown(path string, uid, gid int) syscall.Errno - - // Rename renames file or directory. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `from` or `to` is invalid. - // - syscall.ENOENT: `from` or `to` don't exist. - // - syscall.ENOTDIR: `from` is a directory and `to` exists as a file. - // - syscall.EISDIR: `from` is a file and `to` exists as a directory. - // - syscall.ENOTEMPTY: `both from` and `to` are existing directory, but - // `to` is not empty. - // - // # Notes - // - // - This is like syscall.Rename, except the paths are relative to this - // file system. - // - This is like `rename` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html - // - Windows doesn't let you overwrite an existing directory. - Rename(from, to string) syscall.Errno - - // Rmdir removes a directory. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` doesn't exist. - // - syscall.ENOTDIR: `path` exists, but isn't a directory. - // - syscall.ENOTEMPTY: `path` exists, but isn't empty. - // - // # Notes - // - // - This is like syscall.Rmdir, except the `path` is relative to this - // file system. - // - This is like `rmdir` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html - // - As of Go 1.19, Windows maps syscall.ENOTDIR to syscall.ENOENT. - Rmdir(path string) syscall.Errno - - // Unlink removes a directory entry. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` doesn't exist. - // - syscall.EISDIR: `path` exists, but is a directory. - // - // # Notes - // - // - This is like syscall.Unlink, except the `path` is relative to this - // file system. - // - This is like `unlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html - // - On Windows, syscall.Unlink doesn't delete symlink to directory unlike other platforms. Implementations might - // want to combine syscall.RemoveDirectory with syscall.Unlink in order to delete such links on Windows. - // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya - Unlink(path string) syscall.Errno - - // Link creates a "hard" link from oldPath to newPath, in contrast to a - // soft link (via Symlink). - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EPERM: `oldPath` is invalid. - // - syscall.ENOENT: `oldPath` doesn't exist. - // - syscall.EISDIR: `newPath` exists, but is a directory. - // - // # Notes - // - // - This is like syscall.Link, except the `oldPath` is relative to this - // file system. - // - This is like `link` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html - Link(oldPath, newPath string) syscall.Errno - - // Symlink creates a "soft" link from oldPath to newPath, in contrast to a - // hard link (via Link). - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EPERM: `oldPath` or `newPath` is invalid. - // - syscall.EEXIST: `newPath` exists. - // - // # Notes - // - // - This is like syscall.Symlink, except the `oldPath` is relative to - // this file system. - // - This is like `symlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html - // - Only `newPath` is relative to this file system and `oldPath` is kept - // as-is. That is because the link is only resolved relative to the - // directory when dereferencing it (e.g. ReadLink). - // See https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 - // for how others implement this. - // - Symlinks in Windows requires `SeCreateSymbolicLinkPrivilege`. - // Otherwise, syscall.EPERM results. - // See https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links - Symlink(oldPath, linkName string) syscall.Errno - - // Readlink reads the contents of a symbolic link. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - // # Notes - // - // - This is like syscall.Readlink, except the path is relative to this - // filesystem. - // - This is like `readlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html - // - On Windows, the path separator is different from other platforms, - // but to provide consistent results to Wasm, this normalizes to a "/" - // separator. - Readlink(path string) (string, syscall.Errno) - - // Truncate truncates a file to a specified length. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid or size is negative. - // - syscall.ENOENT: `path` doesn't exist. - // - syscall.EISDIR: `path` is a directory. - // - syscall.EACCES: `path` doesn't have write access. - // - // # Notes - // - // - This is like syscall.Truncate, except the path is relative to this - // filesystem. - // - This is like `truncate` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html - Truncate(path string, size int64) syscall.Errno - - // Utimens set file access and modification times on a path relative to - // this file system, at nanosecond precision. - // - // # Parameters - // - // The `times` parameter includes the access and modification timestamps to - // assign. Special syscall.Timespec NSec values platform.UTIME_NOW and - // platform.UTIME_OMIT may be specified instead of real timestamps. A nil - // `times` parameter behaves the same as if both were set to - // platform.UTIME_NOW. - // - // When the `symlinkFollow` parameter is true and the path is a symbolic link, - // the target of expanding that link is updated. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.EEXIST: `path` exists and is a directory. - // - syscall.ENOTDIR: `path` exists and is a file. - // - // # Notes - // - // - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in - // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html - Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go new file mode 100644 index 0000000000..25f7c5711b --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go @@ -0,0 +1,20 @@ +package fsapi + +// Pflag are bit flags used for File.Poll. Values, including zero, should not +// be interpreted numerically. Instead, use by constants prefixed with 'POLL'. +// +// # Notes +// +// - This is like `pollfd.events` flags for `poll` in POSIX. See +// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/poll.h.html +type Pflag uint32 + +// Only define bitflags we support and are needed by `poll_oneoff` in wasip1 +// See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#eventrwflags +const ( + // POLLIN is a read event. + POLLIN Pflag = 1 << iota + + // POLLOUT is a write event. + POLLOUT +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go deleted file mode 100644 index 3901a6aff9..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go +++ /dev/null @@ -1,48 +0,0 @@ -package fsapi - -import "io/fs" - -// Stat_t is similar to syscall.Stat_t, and fields frequently used by -// WebAssembly ABI including WASI snapshot-01, GOOS=js and wasi-filesystem. -// -// # Note -// -// Zero values may be returned where not available. For example, fs.FileInfo -// implementations may not be able to provide Ino values. -type Stat_t struct { - // Dev is the device ID of device containing the file. - Dev uint64 - - // Ino is the file serial number. - Ino uint64 - - // Uid is the user ID that owns the file, or zero if unsupported. - // For example, this is unsupported on some virtual filesystems or windows. - Uid uint32 - - // Gid is the group ID that owns the file, or zero if unsupported. - // For example, this is unsupported on some virtual filesystems or windows. - Gid uint32 - - // Mode is the same as Mode on fs.FileInfo containing bits to identify the - // type of the file (fs.ModeType) and its permissions (fs.ModePerm). - Mode fs.FileMode - - /// Nlink is the number of hard links to the file. - Nlink uint64 - // ^^ uint64 not uint16 to accept widest syscall.Stat_t.Nlink - - // Size is the length in bytes for regular files. For symbolic links, this - // is length in bytes of the pathname contained in the symbolic link. - Size int64 - // ^^ int64 not uint64 to defer to fs.FileInfo - - // Atim is the last data access timestamp in epoch nanoseconds. - Atim int64 - - // Mtim is the last data modification timestamp in epoch nanoseconds. - Mtim int64 - - // Ctim is the last file status change timestamp in epoch nanoseconds. - Ctim int64 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go index 7a57468ba7..99d9c2db34 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go @@ -1,205 +1,27 @@ package fsapi -import ( - "io/fs" - "syscall" - "time" -) +import experimentalsys "github.com/tetratelabs/wazero/experimental/sys" -// UnimplementedFS is an FS that returns syscall.ENOSYS for all functions, -// This should be embedded to have forward compatible implementations. -type UnimplementedFS struct{} - -// String implements fmt.Stringer -func (UnimplementedFS) String() string { - return "Unimplemented:/" -} - -// Open implements the same method as documented on fs.FS -func (UnimplementedFS) Open(name string) (fs.File, error) { - return nil, &fs.PathError{Op: "open", Path: name, Err: syscall.ENOSYS} -} - -// OpenFile implements FS.OpenFile -func (UnimplementedFS) OpenFile(path string, flag int, perm fs.FileMode) (File, syscall.Errno) { - return nil, syscall.ENOSYS -} - -// Lstat implements FS.Lstat -func (UnimplementedFS) Lstat(path string) (Stat_t, syscall.Errno) { - return Stat_t{}, syscall.ENOSYS -} - -// Stat implements FS.Stat -func (UnimplementedFS) Stat(path string) (Stat_t, syscall.Errno) { - return Stat_t{}, syscall.ENOSYS +func Adapt(f experimentalsys.File) File { + if f, ok := f.(File); ok { + return f + } + return unimplementedFile{f} } -// Readlink implements FS.Readlink -func (UnimplementedFS) Readlink(path string) (string, syscall.Errno) { - return "", syscall.ENOSYS -} - -// Mkdir implements FS.Mkdir -func (UnimplementedFS) Mkdir(path string, perm fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chmod implements FS.Chmod -func (UnimplementedFS) Chmod(path string, perm fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements FS.Chown -func (UnimplementedFS) Chown(path string, uid, gid int) syscall.Errno { - return syscall.ENOSYS -} - -// Lchown implements FS.Lchown -func (UnimplementedFS) Lchown(path string, uid, gid int) syscall.Errno { - return syscall.ENOSYS -} - -// Rename implements FS.Rename -func (UnimplementedFS) Rename(from, to string) syscall.Errno { - return syscall.ENOSYS -} - -// Rmdir implements FS.Rmdir -func (UnimplementedFS) Rmdir(path string) syscall.Errno { - return syscall.ENOSYS -} - -// Link implements FS.Link -func (UnimplementedFS) Link(_, _ string) syscall.Errno { - return syscall.ENOSYS -} - -// Symlink implements FS.Symlink -func (UnimplementedFS) Symlink(_, _ string) syscall.Errno { - return syscall.ENOSYS -} - -// Unlink implements FS.Unlink -func (UnimplementedFS) Unlink(path string) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements FS.Utimens -func (UnimplementedFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - return syscall.ENOSYS -} - -// Truncate implements FS.Truncate -func (UnimplementedFS) Truncate(string, int64) syscall.Errno { - return syscall.ENOSYS -} - -// UnimplementedFile is a File that returns syscall.ENOSYS for all functions, -// except where no-op are otherwise documented. -// -// This should be embedded to have forward compatible implementations. -type UnimplementedFile struct{} - -// Ino implements File.Ino -func (UnimplementedFile) Ino() (uint64, syscall.Errno) { - return 0, 0 -} - -// IsAppend implements File.IsAppend -func (UnimplementedFile) IsAppend() bool { - return false -} - -// SetAppend implements File.SetAppend -func (UnimplementedFile) SetAppend(bool) syscall.Errno { - return syscall.ENOSYS -} +type unimplementedFile struct{ experimentalsys.File } // IsNonblock implements File.IsNonblock -func (UnimplementedFile) IsNonblock() bool { +func (unimplementedFile) IsNonblock() bool { return false } // SetNonblock implements File.SetNonblock -func (UnimplementedFile) SetNonblock(bool) syscall.Errno { - return syscall.ENOSYS -} - -// Stat implements File.Stat -func (UnimplementedFile) Stat() (Stat_t, syscall.Errno) { - return Stat_t{}, syscall.ENOSYS -} - -// IsDir implements File.IsDir -func (UnimplementedFile) IsDir() (bool, syscall.Errno) { - return false, syscall.ENOSYS -} - -// Read implements File.Read -func (UnimplementedFile) Read([]byte) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Pread implements File.Pread -func (UnimplementedFile) Pread([]byte, int64) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Seek implements File.Seek -func (UnimplementedFile) Seek(int64, int) (int64, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Readdir implements File.Readdir -func (UnimplementedFile) Readdir(int) (dirents []Dirent, errno syscall.Errno) { - return nil, syscall.ENOSYS +func (unimplementedFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS } -// PollRead implements File.PollRead -func (UnimplementedFile) PollRead(*time.Duration) (ready bool, errno syscall.Errno) { - return false, syscall.ENOSYS +// Poll implements File.Poll +func (unimplementedFile) Poll(Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS } - -// Write implements File.Write -func (UnimplementedFile) Write([]byte) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Pwrite implements File.Pwrite -func (UnimplementedFile) Pwrite([]byte, int64) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Truncate implements File.Truncate -func (UnimplementedFile) Truncate(int64) syscall.Errno { - return syscall.ENOSYS -} - -// Sync implements File.Sync -func (UnimplementedFile) Sync() syscall.Errno { - return 0 // not syscall.ENOSYS -} - -// Datasync implements File.Datasync -func (UnimplementedFile) Datasync() syscall.Errno { - return 0 // not syscall.ENOSYS -} - -// Chmod implements File.Chmod -func (UnimplementedFile) Chmod(fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements File.Chown -func (UnimplementedFile) Chown(int, int) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements File.Utimens -func (UnimplementedFile) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.ENOSYS -} - -// Close implements File.Close -func (UnimplementedFile) Close() (errno syscall.Errno) { return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/errno.go b/vendor/github.com/tetratelabs/wazero/internal/platform/errno.go deleted file mode 100644 index 43e0342690..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/errno.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build !windows - -package platform - -import "syscall" - -func adjustErrno(err syscall.Errno) syscall.Errno { - return err -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go b/vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go deleted file mode 100644 index d07e10cb3c..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go +++ /dev/null @@ -1,72 +0,0 @@ -package platform - -import "syscall" - -// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- -const ( - // ERROR_ACCESS_DENIED is a Windows error returned by syscall.Unlink - // instead of syscall.EACCES - ERROR_ACCESS_DENIED = syscall.Errno(5) - - // ERROR_INVALID_HANDLE is a Windows error returned by syscall.Write - // instead of syscall.EBADF - ERROR_INVALID_HANDLE = syscall.Errno(6) - - // ERROR_FILE_EXISTS is a Windows error returned by os.OpenFile - // instead of syscall.EEXIST - ERROR_FILE_EXISTS = syscall.Errno(0x50) - - // ERROR_INVALID_NAME is a Windows error returned by open when a file - // path has a trailing slash - ERROR_INVALID_NAME = syscall.Errno(0x7B) - - // ERROR_NEGATIVE_SEEK is a Windows error returned by os.Truncate - // instead of syscall.EINVAL - ERROR_NEGATIVE_SEEK = syscall.Errno(0x83) - - // ERROR_DIR_NOT_EMPTY is a Windows error returned by syscall.Rmdir - // instead of syscall.ENOTEMPTY - ERROR_DIR_NOT_EMPTY = syscall.Errno(0x91) - - // ERROR_ALREADY_EXISTS is a Windows error returned by os.Mkdir - // instead of syscall.EEXIST - ERROR_ALREADY_EXISTS = syscall.Errno(0xB7) - - // ERROR_DIRECTORY is a Windows error returned by syscall.Rmdir - // instead of syscall.ENOTDIR - ERROR_DIRECTORY = syscall.Errno(0x10B) -) - -// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--1300-1699- -const ( - // ERROR_PRIVILEGE_NOT_HELD is a Windows error returned by os.Symlink - // instead of syscall.EPERM. - // - // Note: This can happen when trying to create symlinks w/o admin perms. - ERROR_PRIVILEGE_NOT_HELD = syscall.Errno(0x522) -) - -func adjustErrno(err syscall.Errno) syscall.Errno { - // Note: In windows, ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR - switch err { - case ERROR_ALREADY_EXISTS: - return syscall.EEXIST - case ERROR_DIRECTORY: - return syscall.ENOTDIR - case ERROR_DIR_NOT_EMPTY: - return syscall.ENOTEMPTY - case ERROR_FILE_EXISTS: - return syscall.EEXIST - case ERROR_INVALID_HANDLE: - return syscall.EBADF - case ERROR_ACCESS_DENIED: - // POSIX read and write functions expect EBADF, not EACCES when not - // open for reading or writing. - return syscall.EBADF - case ERROR_PRIVILEGE_NOT_HELD: - return syscall.EPERM - case ERROR_NEGATIVE_SEEK, ERROR_INVALID_NAME: - return syscall.EINVAL - } - return err -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go deleted file mode 100644 index 0e8a13d5c6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go +++ /dev/null @@ -1,23 +0,0 @@ -package platform - -// Set adds the given fd to the set. -func (f *FdSet) Set(fd int) { - f.Bits[fd/nfdbits] |= (1 << (uintptr(fd) % nfdbits)) -} - -// Clear removes the given fd from the set. -func (f *FdSet) Clear(fd int) { - f.Bits[fd/nfdbits] &^= (1 << (uintptr(fd) % nfdbits)) -} - -// IsSet returns true when fd is in the set. -func (f *FdSet) IsSet(fd int) bool { - return f.Bits[fd/nfdbits]&(1<<(uintptr(fd)%nfdbits)) != 0 -} - -// Zero clears the set. -func (f *FdSet) Zero() { - for i := range f.Bits { - f.Bits[i] = 0 - } -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go deleted file mode 100644 index da52339cbc..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go +++ /dev/null @@ -1,8 +0,0 @@ -package platform - -import "syscall" - -const nfdbits = 0x20 - -// FdSet re-exports syscall.FdSet with utility methods. -type FdSet syscall.FdSet diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go deleted file mode 100644 index f392caf4c1..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go +++ /dev/null @@ -1,8 +0,0 @@ -package platform - -import "syscall" - -const nfdbits = 0x40 - -// FdSet re-exports syscall.FdSet with utility methods. -type FdSet syscall.FdSet diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go deleted file mode 100644 index b5aa3c1561..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build !darwin && !linux - -package platform - -const nfdbits = 0x40 - -// FdSet mocks syscall.FdSet on systems that do not support it. -type FdSet struct { - Bits [16]int64 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go index 620cdd3c65..ed5c40a4dc 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go @@ -1,4 +1,4 @@ -// This uses syscall.Mprotect. Go's SDK only supports this on darwin and linux. +// Separated from linux which has support for huge pages. //go:build darwin || freebsd package platform diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go b/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go index 267db88098..508b89f22a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go @@ -5,12 +5,17 @@ package platform import ( + "regexp" "runtime" - "strings" ) -// TODO: IsAtLeastGo120 -var IsGo120 = strings.Contains(runtime.Version(), "go1.20") +// IsAtLeastGo120 checks features added in 1.20. We can remove this when Go +// 1.22 is out. +var IsAtLeastGo120 = isAtLeastGo120(runtime.Version()) + +func isAtLeastGo120(version string) bool { + return regexp.MustCompile("go1.[2-9][0-9][^0-9]").MatchString(version) +} // archRequirementsVerified is set by platform-specific init to true if the platform is supported var archRequirementsVerified bool diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go index 6c0be1516b..ca17aa39ee 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go @@ -3,26 +3,27 @@ package sock import ( "fmt" "net" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) // TCPSock is a pseudo-file representing a TCP socket. type TCPSock interface { - fsapi.File + sys.File - Accept() (TCPConn, syscall.Errno) + Accept() (TCPConn, sys.Errno) } // TCPConn is a pseudo-file representing a TCP connection. type TCPConn interface { - fsapi.File + sys.File // Recvfrom only supports the flag sysfs.MSG_PEEK - Recvfrom(p []byte, flags int) (n int, errno syscall.Errno) + // TODO: document this like sys.File with known sys.Errno + Recvfrom(p []byte, flags int) (n int, errno sys.Errno) - Shutdown(how int) syscall.Errno + // TODO: document this like sys.File with known sys.Errno + Shutdown(how int) sys.Errno } // ConfigKey is a context.Context Value key. Its associated value should be a Config. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go new file mode 100644 index 0000000000..30cdb9f926 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go @@ -0,0 +1,11 @@ +//go:build !plan9 && !js + +package sock + +import "syscall" + +const ( + SHUT_RD = syscall.SHUT_RD + SHUT_RDWR = syscall.SHUT_RDWR + SHUT_WR = syscall.SHUT_WR +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go new file mode 100644 index 0000000000..76ec031efa --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go @@ -0,0 +1,10 @@ +//go:build plan9 || js + +package sock + +// plan9/js doesn't declare these constants +const ( + SHUT_RD = 1 << iota + SHUT_WR + SHUT_RDWR = SHUT_RD | SHUT_WR +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go b/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go index 3f1eb6e545..332a952626 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go @@ -4,12 +4,10 @@ import ( "io" "io/fs" "net" - "path" - "syscall" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/descriptor" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sysfs" ) @@ -50,334 +48,267 @@ type FileEntry struct { IsPreopen bool // FS is the filesystem associated with the pre-open. - FS fsapi.FS + FS sys.FS // File is always non-nil. File fsapi.File -} - -const direntBufSize = 16 - -// Readdir is the status of a prior fs.ReadDirFile call. -type Readdir struct { - // cursor is the current position in the buffer. - cursor uint64 - // countRead is the total count of files read including Dirents. - // - // Notes: - // - // * countRead is the index of the next file in the list. This is - // also the value that Cookie returns, so it should always be - // higher or equal than the cookie given in Rewind. - // - // * this can overflow to negative, which means our implementation - // doesn't support writing greater than max int64 entries. - // countRead uint64 - countRead uint64 - - // dirents is a fixed buffer of size direntBufSize. Notably, - // directory listing are not rewindable, so we keep entries around in case - // the caller mis-estimated their buffer and needs a few still cached. - // - // Note: This is wasi-specific and needs to be refactored. - // In wasi preview1, dot and dot-dot entries are required to exist, but the - // reverse is true for preview2. More importantly, preview2 holds separate - // stateful dir-entry-streams per file. - dirents []fsapi.Dirent - - // dirInit seeks and reset the provider for dirents to the beginning - // and returns an initial batch (e.g. dot directories). - dirInit func() ([]fsapi.Dirent, syscall.Errno) - - // dirReader fetches a new batch of direntBufSize elements. - dirReader func(n uint64) ([]fsapi.Dirent, syscall.Errno) + // direntCache is nil until DirentCache was called. + direntCache *DirentCache } -// NewReaddir is a constructor for Readdir. It takes a dirInit -func NewReaddir( - dirInit func() ([]fsapi.Dirent, syscall.Errno), - dirReader func(n uint64) ([]fsapi.Dirent, syscall.Errno), -) (*Readdir, syscall.Errno) { - d := &Readdir{dirReader: dirReader, dirInit: dirInit} - return d, d.init() -} - -// init resets the cursor and invokes the dirInit, dirReader -// methods to reset the internal state of the Readdir struct. +// DirentCache gets or creates a DirentCache for this file or returns an error. // -// Note: this is different from Reset, because it will not short-circuit -// when cursor is already 0, but it will force an unconditional reload. -func (d *Readdir) init() syscall.Errno { - d.cursor = 0 - d.countRead = 0 - // Reset the buffer to the initial state. - initialDirents, errno := d.dirInit() - if errno != 0 { - return errno - } - if len(initialDirents) > direntBufSize { - return syscall.EINVAL - } - d.dirents = initialDirents - // Fill the buffer with more data. - count := direntBufSize - len(initialDirents) - if count == 0 { - // No need to fill up the buffer further. - return 0 - } - dirents, errno := d.dirReader(uint64(count)) - if errno != 0 { - return errno +// # Errors +// +// A zero sys.Errno is success. The below are expected otherwise: +// - sys.ENOSYS: the implementation does not support this function. +// - sys.EBADF: the dir was closed or not readable. +// - sys.ENOTDIR: the file was not a directory. +// +// # Notes +// +// - See /RATIONALE.md for design notes. +func (f *FileEntry) DirentCache() (*DirentCache, sys.Errno) { + if dir := f.direntCache; dir != nil { + return dir, 0 } - d.dirents = append(d.dirents, dirents...) - return 0 -} -// newReaddirFromFileEntry is a constructor for Readdir that takes a FileEntry to initialize. -func newReaddirFromFileEntry(f *FileEntry) (*Readdir, syscall.Errno) { - // Generate the dotEntries only once and return it many times in the dirInit closure. - dotEntries, errno := synthesizeDotEntries(f) - if errno != 0 { + // Require the file to be a directory vs a late error on the same. + if isDir, errno := f.File.IsDir(); errno != 0 { return nil, errno + } else if !isDir { + return nil, sys.ENOTDIR } - dirInit := func() ([]fsapi.Dirent, syscall.Errno) { - // Ensure we always rewind to the beginning when we re-init. - if _, errno := f.File.Seek(0, io.SeekStart); errno != 0 { - return nil, errno - } - // Return the dotEntries that we have already generated outside the closure. - return dotEntries, 0 + + // Generate the dotEntries only once. + if dotEntries, errno := synthesizeDotEntries(f); errno != 0 { + return nil, errno + } else { + f.direntCache = &DirentCache{f: f.File, dotEntries: dotEntries} } - dirReader := func(n uint64) ([]fsapi.Dirent, syscall.Errno) { return f.File.Readdir(int(n)) } - return NewReaddir(dirInit, dirReader) + + return f.direntCache, 0 +} + +// DirentCache is a caching abstraction of sys.File Readdir. +// +// This is special-cased for "wasi_snapshot_preview1.fd_readdir", and may be +// unneeded, or require changes, to support preview1 or preview2. +// - The position of the dirents are serialized as `d_next`. For reasons +// described below, any may need to be re-read. This accepts any positions +// in the cache, rather than track the position of the last dirent. +// - dot entries ("." and "..") must be returned. See /RATIONALE.md for why. +// - An sys.Dirent Name is variable length, it could exceed memory size and +// need to be re-read. +// - Multiple dirents may be returned. It is more efficient to read from the +// underlying file in bulk vs one-at-a-time. +// +// The last results returned by Read are cached, but entries before that +// position are not. This support re-reading entries that couldn't fit into +// memory without accidentally caching all entries in a large directory. This +// approach is sometimes called a sliding window. +type DirentCache struct { + // f is the underlying file + f sys.File + + // dotEntries are the "." and ".." entries added when the directory is + // initialized. + dotEntries []sys.Dirent + + // dirents are the potentially unread directory entries. + // + // Internal detail: nil is different from zero length. Zero length is an + // exhausted directory (eof). nil means the re-read. + dirents []sys.Dirent + + // countRead is the total count of dirents read since last rewind. + countRead uint64 + + // eof is true when the underlying file is at EOF. This avoids re-reading + // the directory when it is exhausted. Entires in an exhausted directory + // are not visible until it is rewound via calling Read with `pos==0`. + eof bool } // synthesizeDotEntries generates a slice of the two elements "." and "..". -func synthesizeDotEntries(f *FileEntry) (result []fsapi.Dirent, errno syscall.Errno) { +func synthesizeDotEntries(f *FileEntry) ([]sys.Dirent, sys.Errno) { dotIno, errno := f.File.Ino() if errno != 0 { return nil, errno } - result = append(result, fsapi.Dirent{Name: ".", Ino: dotIno, Type: fs.ModeDir}) - dotDotIno := uint64(0) - if !f.IsPreopen && f.Name != "." { - if st, errno := f.FS.Stat(path.Dir(f.Name)); errno != 0 { - return nil, errno - } else { - dotDotIno = st.Ino - } - } - result = append(result, fsapi.Dirent{Name: "..", Ino: dotDotIno, Type: fs.ModeDir}) - return result, 0 + result := [2]sys.Dirent{} + result[0] = sys.Dirent{Name: ".", Ino: dotIno, Type: fs.ModeDir} + // See /RATIONALE.md for why we don't attempt to get an inode for ".." and + // why in wasi-libc this won't fan-out either. + result[1] = sys.Dirent{Name: "..", Ino: 0, Type: fs.ModeDir} + return result[:], 0 } -// Reset seeks the internal cursor to 0 and refills the buffer. -func (d *Readdir) Reset() syscall.Errno { - if d.countRead == 0 { - return 0 +// exhaustedDirents avoids allocating empty slices. +var exhaustedDirents = [0]sys.Dirent{} + +// Read is similar to and returns the same errors as `Readdir` on sys.File. +// The main difference is this caches entries returned, resulting in multiple +// valid positions to read from. +// +// When zero, `pos` means rewind to the beginning of this directory. This +// implies a rewind (Seek to zero on the underlying sys.File), unless the +// initial entries are still cached. +// +// When non-zero, `pos` is the zero based index of all dirents returned since +// last rewind. Only entries beginning at `pos` are cached for subsequent +// calls. A non-zero `pos` before the cache returns sys.ENOENT for reasons +// described on DirentCache documentation. +// +// Up to `n` entries are cached and returned. When `n` exceeds the cache, the +// difference are read from the underlying sys.File via `Readdir`. EOF is +// when `len(dirents)` returned are less than `n`. +func (d *DirentCache) Read(pos uint64, n uint32) (dirents []sys.Dirent, errno sys.Errno) { + switch { + case pos > d.countRead: // farther than read or negative coerced to uint64. + return nil, sys.ENOENT + case pos == 0 && d.dirents != nil: + // Rewind if we have already read entries. This allows us to see new + // entries added after the directory was opened. + if _, errno = d.f.Seek(0, io.SeekStart); errno != 0 { + return + } + d.dirents = nil // dump cache + d.countRead = 0 } - return d.init() -} -// Skip is equivalent to calling n times Advance. -func (d *Readdir) Skip(n uint64) { - end := d.countRead + n - var err syscall.Errno = 0 - for d.countRead < end && err == 0 { - err = d.Advance() + if n == 0 { + return // special case no entries. } -} -// Cookie returns a cookie representing the current state of the ReadDir struct. -// -// Note: this returns the countRead field, but it is an implementation detail. -func (d *Readdir) Cookie() uint64 { - return d.countRead -} + if d.dirents == nil { + // Always populate dot entries, which makes min len(dirents) == 2. + d.dirents = d.dotEntries + d.countRead = 2 + d.eof = false + + if countToRead := int(n - 2); countToRead <= 0 { + return + } else if dirents, errno = d.f.Readdir(countToRead); errno != 0 { + return + } else if countRead := len(dirents); countRead > 0 { + d.eof = countRead < countToRead + d.dirents = append(d.dotEntries, dirents...) + d.countRead += uint64(countRead) + } -// Rewind seeks the internal cursor to the state represented by the cookie. -// It returns a syscall.Errno if the cursor was reset and an I/O error occurred while trying to re-init. -func (d *Readdir) Rewind(cookie int64) syscall.Errno { - unsignedCookie := uint64(cookie) - switch { - case cookie < 0 || unsignedCookie > d.countRead: - // the cookie can neither be negative nor can it be larger than countRead. - return syscall.EINVAL - case cookie == 0 && d.countRead == 0: - return 0 - case cookie == 0 && d.countRead != 0: - // This means that there was a previous call to the dir, but cookie is reset. - // This happens when the program calls rewinddir, for example: - // https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c#L10-L12 - return d.Reset() - case unsignedCookie < d.countRead: - if cookie/direntBufSize != int64(d.countRead)/direntBufSize { - // The cookie is not 0, but it points into a window before the current one. - return syscall.ENOSYS + return d.cachedDirents(n), 0 + } + + // Reset our cache to the first entry being read. + cacheStart := d.countRead - uint64(len(d.dirents)) + if pos < cacheStart { + // We don't currently allow reads before our cache because Seek(0) is + // the only portable way. Doing otherwise requires skipping, which we + // won't do unless wasi-testsuite starts requiring it. Implementing + // this would allow re-reading a large directory, so care would be + // needed to not buffer the entire directory in memory while skipping. + errno = sys.ENOENT + return + } else if posInCache := pos - cacheStart; posInCache != 0 { + if uint64(len(d.dirents)) == posInCache { + // Avoid allocation re-slicing to zero length. + d.dirents = exhaustedDirents[:] + } else { + d.dirents = d.dirents[posInCache:] } - // We are allowed to rewind back to a previous offset within the current window. - d.countRead = unsignedCookie - d.cursor = d.countRead % direntBufSize - return 0 - default: - // The cookie is valid. - return 0 } -} -// Peek emits the current value. -// It returns syscall.ENOENT when there are no entries left in the directory. -func (d *Readdir) Peek() (*fsapi.Dirent, syscall.Errno) { - switch { - case d.cursor == uint64(len(d.dirents)): - // We're past the buf size, fill it up again. - dirents, errno := d.dirReader(direntBufSize) - if errno != 0 { - return nil, errno + // See if we need more entries. + if countToRead := int(n) - len(d.dirents); countToRead > 0 && !d.eof { + // Try to read more, which could fail. + if dirents, errno = d.f.Readdir(countToRead); errno != 0 { + return } - d.dirents = append(d.dirents, dirents...) - fallthrough - default: // d.cursor < direntBufSize FIXME - if d.cursor == uint64(len(d.dirents)) { - return nil, syscall.ENOENT + + // Append the next read entries if we weren't at EOF. + if countRead := len(dirents); countRead > 0 { + d.eof = countRead < countToRead + d.dirents = append(d.dirents, dirents...) + d.countRead += uint64(countRead) } - dirent := &d.dirents[d.cursor] - return dirent, 0 } + + return d.cachedDirents(n), 0 } -// Advance advances the internal counters and indices to the next value. -// It also empties and refill the buffer with the next set of values when the internal cursor -// reaches the end of it. -func (d *Readdir) Advance() syscall.Errno { - if d.cursor == uint64(len(d.dirents)) { - return syscall.ENOENT +// cachedDirents returns up to `n` dirents from the cache. +func (d *DirentCache) cachedDirents(n uint32) []sys.Dirent { + direntCount := uint32(len(d.dirents)) + switch { + case direntCount == 0: + return nil + case direntCount > n: + return d.dirents[:n] } - d.cursor++ - d.countRead++ - return 0 + return d.dirents } type FSContext struct { // rootFS is the root ("/") mount. - rootFS fsapi.FS + rootFS sys.FS // openedFiles is a map of file descriptor numbers (>=FdPreopen) to open files // (or directories) and defaults to empty. // TODO: This is unguarded, so not goroutine-safe! openedFiles FileTable - - // readdirs is a map of numeric identifiers to Readdir structs - // and defaults to empty. - // TODO: This is unguarded, so not goroutine-safe! - readdirs ReaddirTable } // FileTable is a specialization of the descriptor.Table type used to map file // descriptors to file entries. type FileTable = descriptor.Table[int32, *FileEntry] -// ReaddirTable is a specialization of the descriptor.Table type used to map file -// descriptors to Readdir structs. -type ReaddirTable = descriptor.Table[int32, *Readdir] +// RootFS returns a possibly unimplemented root filesystem. Any files that +// should be added to the table should be inserted via InsertFile. +// +// TODO: This is only used by GOOS=js and tests: Remove when we remove GOOS=js +// (after Go 1.22 is released). +func (c *FSContext) RootFS() sys.FS { + if rootFS := c.rootFS; rootFS == nil { + return sys.UnimplementedFS{} + } else { + return rootFS + } +} -// RootFS returns the underlying filesystem. Any files that should be added to -// the table should be inserted via InsertFile. -func (c *FSContext) RootFS() fsapi.FS { - return c.rootFS +// LookupFile returns a file if it is in the table. +func (c *FSContext) LookupFile(fd int32) (*FileEntry, bool) { + return c.openedFiles.Lookup(fd) } // OpenFile opens the file into the table and returns its file descriptor. // The result must be closed by CloseFile or Close. -func (c *FSContext) OpenFile(fs fsapi.FS, path string, flag int, perm fs.FileMode) (int32, syscall.Errno) { +func (c *FSContext) OpenFile(fs sys.FS, path string, flag sys.Oflag, perm fs.FileMode) (int32, sys.Errno) { if f, errno := fs.OpenFile(path, flag, perm); errno != 0 { return 0, errno } else { - fe := &FileEntry{FS: fs, File: f} + fe := &FileEntry{FS: fs, File: fsapi.Adapt(f)} if path == "/" || path == "." { fe.Name = "" } else { fe.Name = path } if newFD, ok := c.openedFiles.Insert(fe); !ok { - return 0, syscall.EBADF + return 0, sys.EBADF } else { return newFD, 0 } } } -// SockAccept accepts a socketapi.TCPConn into the file table and returns -// its file descriptor. -func (c *FSContext) SockAccept(sockFD int32, nonblock bool) (int32, syscall.Errno) { - var sock socketapi.TCPSock - if e, ok := c.LookupFile(sockFD); !ok || !e.IsPreopen { - return 0, syscall.EBADF // Not a preopen - } else if sock, ok = e.File.(socketapi.TCPSock); !ok { - return 0, syscall.EBADF // Not a sock - } - - var conn socketapi.TCPConn - var errno syscall.Errno - if conn, errno = sock.Accept(); errno != 0 { - return 0, errno - } else if nonblock { - if errno = conn.SetNonblock(true); errno != 0 { - _ = conn.Close() - return 0, errno - } - } - - fe := &FileEntry{File: conn} - if newFD, ok := c.openedFiles.Insert(fe); !ok { - return 0, syscall.EBADF - } else { - return newFD, 0 - } -} - -// LookupFile returns a file if it is in the table. -func (c *FSContext) LookupFile(fd int32) (*FileEntry, bool) { - return c.openedFiles.Lookup(fd) -} - -// LookupReaddir returns a Readdir struct or creates an empty one if it was not present. -// -// Note: this currently assumes that idx == fd, where fd is the file descriptor of the directory. -// CloseFile will delete this idx from the internal store. In the future, idx may be independent -// of a file fd, and the idx may have to be disposed with an explicit CloseReaddir. -func (c *FSContext) LookupReaddir(idx int32, f *FileEntry) (*Readdir, syscall.Errno) { - if item, _ := c.readdirs.Lookup(idx); item != nil { - return item, 0 - } else { - item, err := newReaddirFromFileEntry(f) - if err != 0 { - return nil, err - } - ok := c.readdirs.InsertAt(item, idx) - if !ok { - return nil, syscall.EINVAL - } - return item, 0 - } -} - -// CloseReaddir delete the Readdir struct at the given index -// -// Note: Currently only necessary in tests. In the future, the idx will have to be disposed explicitly, -// unless we maintain a map fd -> []idx, and we let CloseFile close all the idx in []idx. -func (c *FSContext) CloseReaddir(idx int32) { - c.readdirs.Delete(idx) -} - // Renumber assigns the file pointed by the descriptor `from` to `to`. -func (c *FSContext) Renumber(from, to int32) syscall.Errno { +func (c *FSContext) Renumber(from, to int32) sys.Errno { fromFile, ok := c.openedFiles.Lookup(from) if !ok || to < 0 { - return syscall.EBADF + return sys.EBADF } else if fromFile.IsPreopen { - return syscall.ENOTSUP + return sys.ENOTSUP } // If toFile is already open, we close it to prevent windows lock issues. @@ -387,27 +318,60 @@ func (c *FSContext) Renumber(from, to int32) syscall.Errno { // https://github.com/bytecodealliance/wasmtime/blob/main/crates/wasi-common/src/snapshots/preview_1.rs#L531-L546 if toFile, ok := c.openedFiles.Lookup(to); ok { if toFile.IsPreopen { - return syscall.ENOTSUP + return sys.ENOTSUP } _ = toFile.File.Close() } c.openedFiles.Delete(from) if !c.openedFiles.InsertAt(fromFile, to) { - return syscall.EBADF + return sys.EBADF } return 0 } +// SockAccept accepts a sock.TCPConn into the file table and returns its file +// descriptor. +func (c *FSContext) SockAccept(sockFD int32, nonblock bool) (int32, sys.Errno) { + var sock socketapi.TCPSock + if e, ok := c.LookupFile(sockFD); !ok || !e.IsPreopen { + return 0, sys.EBADF // Not a preopen + } else if sock, ok = e.File.(socketapi.TCPSock); !ok { + return 0, sys.EBADF // Not a sock + } + + conn, errno := sock.Accept() + if errno != 0 { + return 0, errno + } + + fe := &FileEntry{File: fsapi.Adapt(conn)} + + if nonblock { + if errno = fe.File.SetNonblock(true); errno != 0 { + _ = conn.Close() + return 0, errno + } + } + + if newFD, ok := c.openedFiles.Insert(fe); !ok { + return 0, sys.EBADF + } else { + return newFD, 0 + } +} + // CloseFile returns any error closing the existing file. -func (c *FSContext) CloseFile(fd int32) syscall.Errno { +func (c *FSContext) CloseFile(fd int32) (errno sys.Errno) { f, ok := c.openedFiles.Lookup(fd) if !ok { - return syscall.EBADF + return sys.EBADF + } + if errno = f.File.Close(); errno != 0 { + return errno } c.openedFiles.Delete(fd) - c.readdirs.Delete(fd) - return platform.UnwrapOSError(f.File.Close()) + return errno } // Close implements io.Closer @@ -419,25 +383,19 @@ func (c *FSContext) Close() (err error) { } return true }) - // A closed FSContext cannot be reused so clear the state instead of - // using Reset. + // A closed FSContext cannot be reused so clear the state. c.openedFiles = FileTable{} - c.readdirs = ReaddirTable{} return } -// NewFSContext creates a FSContext with stdio streams and an optional -// pre-opened filesystem. -// -// If `preopened` is not UnimplementedFS, it is inserted into -// the file descriptor table as FdPreopen. -func (c *Context) NewFSContext( +// InitFSContext initializes a FSContext with stdio streams and optional +// pre-opened filesystems and TCP listeners. +func (c *Context) InitFSContext( stdin io.Reader, stdout, stderr io.Writer, - rootFS fsapi.FS, + fs []sys.FS, guestPaths []string, tcpListeners []*net.TCPListener, ) (err error) { - c.fsc.rootFS = rootFS inFile, err := stdinFileEntry(stdin) if err != nil { return err @@ -454,29 +412,63 @@ func (c *Context) NewFSContext( } c.fsc.openedFiles.Insert(errWriter) - if _, ok := rootFS.(fsapi.UnimplementedFS); ok { - // don't add to the pre-opens - } else if comp, ok := rootFS.(*sysfs.CompositeFS); ok { - preopens := comp.FS() - for i, p := range comp.GuestPaths() { - c.fsc.openedFiles.Insert(&FileEntry{ - FS: preopens[i], - Name: p, - IsPreopen: true, - File: &lazyDir{fs: rootFS}, - }) + for i, fs := range fs { + guestPath := guestPaths[i] + + if StripPrefixesAndTrailingSlash(guestPath) == "" { + // Default to bind to '/' when guestPath is effectively empty. + guestPath = "/" + c.fsc.rootFS = fs } - } else { c.fsc.openedFiles.Insert(&FileEntry{ - FS: rootFS, - Name: "/", + FS: fs, + Name: guestPath, IsPreopen: true, - File: &lazyDir{fs: rootFS}, + File: &lazyDir{fs: fs}, }) } for _, tl := range tcpListeners { - c.fsc.openedFiles.Insert(&FileEntry{IsPreopen: true, File: sysfs.NewTCPListenerFile(tl)}) + c.fsc.openedFiles.Insert(&FileEntry{IsPreopen: true, File: fsapi.Adapt(sysfs.NewTCPListenerFile(tl))}) } return nil } + +// StripPrefixesAndTrailingSlash skips any leading "./" or "/" such that the +// result index begins with another string. A result of "." coerces to the +// empty string "" because the current directory is handled by the guest. +// +// Results are the offset/len pair which is an optimization to avoid re-slicing +// overhead, as this function is called for every path operation. +// +// Note: Relative paths should be handled by the guest, as that's what knows +// what the current directory is. However, paths that escape the current +// directory e.g. "../.." have been found in `tinygo test` and this +// implementation takes care to avoid it. +func StripPrefixesAndTrailingSlash(path string) string { + // strip trailing slashes + pathLen := len(path) + for ; pathLen > 0 && path[pathLen-1] == '/'; pathLen-- { + } + + pathI := 0 +loop: + for pathI < pathLen { + switch path[pathI] { + case '/': + pathI++ + case '.': + nextI := pathI + 1 + if nextI < pathLen && path[nextI] == '/' { + pathI = nextI + 1 + } else if nextI == pathLen { + pathI = nextI + } else { + break loop + } + default: + break loop + } + } + return path[pathI:pathLen] +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go b/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go index df68b51b6e..fe233d29ea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go @@ -1,125 +1,125 @@ package sys import ( - "io/fs" - "os" - "syscall" - + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/sys" ) -// compile-time check to ensure lazyDir implements internalapi.File. -var _ fsapi.File = (*lazyDir)(nil) +// compile-time check to ensure lazyDir implements sys.File. +var _ experimentalsys.File = (*lazyDir)(nil) type lazyDir struct { - fsapi.DirFile + experimentalsys.DirFile + + fs experimentalsys.FS + f experimentalsys.File +} - fs fsapi.FS - f fsapi.File +// Dev implements the same method as documented on sys.File +func (d *lazyDir) Dev() (uint64, experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return 0, experimentalsys.EBADF + } else { + return f.Dev() + } } -// Ino implements the same method as documented on internalapi.File -func (r *lazyDir) Ino() (uint64, syscall.Errno) { - if f, ok := r.file(); !ok { - return 0, syscall.EBADF +// Ino implements the same method as documented on sys.File +func (d *lazyDir) Ino() (sys.Inode, experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return 0, experimentalsys.EBADF } else { return f.Ino() } } -// IsAppend implements the same method as documented on internalapi.File -func (r *lazyDir) IsAppend() bool { +// IsDir implements the same method as documented on sys.File +func (d *lazyDir) IsDir() (bool, experimentalsys.Errno) { + // Note: we don't return a constant because we don't know if this is really + // backed by a dir, until the first call. + if f, ok := d.file(); !ok { + return false, experimentalsys.EBADF + } else { + return f.IsDir() + } +} + +// IsAppend implements the same method as documented on sys.File +func (d *lazyDir) IsAppend() bool { return false } -// SetAppend implements the same method as documented on internalapi.File -func (r *lazyDir) SetAppend(bool) syscall.Errno { - return syscall.EISDIR +// SetAppend implements the same method as documented on sys.File +func (d *lazyDir) SetAppend(bool) experimentalsys.Errno { + return experimentalsys.EISDIR } -// Seek implements the same method as documented on internalapi.File -func (r *lazyDir) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { - if f, ok := r.file(); !ok { - return 0, syscall.EBADF +// Seek implements the same method as documented on sys.File +func (d *lazyDir) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return 0, experimentalsys.EBADF } else { return f.Seek(offset, whence) } } -// Stat implements the same method as documented on internalapi.File -func (r *lazyDir) Stat() (fsapi.Stat_t, syscall.Errno) { - if f, ok := r.file(); !ok { - return fsapi.Stat_t{}, syscall.EBADF +// Stat implements the same method as documented on sys.File +func (d *lazyDir) Stat() (sys.Stat_t, experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return sys.Stat_t{}, experimentalsys.EBADF } else { return f.Stat() } } -// Readdir implements the same method as documented on internalapi.File -func (r *lazyDir) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if f, ok := r.file(); !ok { - return nil, syscall.EBADF +// Readdir implements the same method as documented on sys.File +func (d *lazyDir) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return nil, experimentalsys.EBADF } else { return f.Readdir(n) } } -// Sync implements the same method as documented on internalapi.File -func (r *lazyDir) Sync() syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF +// Sync implements the same method as documented on sys.File +func (d *lazyDir) Sync() experimentalsys.Errno { + if f, ok := d.file(); !ok { + return experimentalsys.EBADF } else { return f.Sync() } } -// Datasync implements the same method as documented on internalapi.File -func (r *lazyDir) Datasync() syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF +// Datasync implements the same method as documented on sys.File +func (d *lazyDir) Datasync() experimentalsys.Errno { + if f, ok := d.file(); !ok { + return experimentalsys.EBADF } else { return f.Datasync() } } -// Chmod implements the same method as documented on internalapi.File -func (r *lazyDir) Chmod(mode fs.FileMode) syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF - } else { - return f.Chmod(mode) - } -} - -// Chown implements the same method as documented on internalapi.File -func (r *lazyDir) Chown(uid, gid int) syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF - } else { - return f.Chown(uid, gid) - } -} - -// Utimens implements the same method as documented on internalapi.File -func (r *lazyDir) Utimens(times *[2]syscall.Timespec) syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF +// Utimens implements the same method as documented on sys.File +func (d *lazyDir) Utimens(atim, mtim int64) experimentalsys.Errno { + if f, ok := d.file(); !ok { + return experimentalsys.EBADF } else { - return f.Utimens(times) + return f.Utimens(atim, mtim) } } // file returns the underlying file or false if it doesn't exist. -func (r *lazyDir) file() (fsapi.File, bool) { - if f := r.f; r.f != nil { +func (d *lazyDir) file() (experimentalsys.File, bool) { + if f := d.f; d.f != nil { return f, true } - var errno syscall.Errno - r.f, errno = r.fs.OpenFile(".", os.O_RDONLY, 0) + var errno experimentalsys.Errno + d.f, errno = d.fs.OpenFile(".", experimentalsys.O_RDONLY, 0) switch errno { case 0: - return r.f, true - case syscall.ENOENT: + return d.f, true + case experimentalsys.ENOENT: return nil, false default: panic(errno) // unexpected @@ -127,10 +127,25 @@ func (r *lazyDir) file() (fsapi.File, bool) { } // Close implements fs.File -func (r *lazyDir) Close() syscall.Errno { - f := r.f +func (d *lazyDir) Close() experimentalsys.Errno { + f := d.f if f == nil { return 0 // never opened } return f.Close() } + +// IsNonblock implements the same method as documented on fsapi.File +func (d *lazyDir) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (d *lazyDir) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.EISDIR +} + +// Poll implements the same method as documented on fsapi.File +func (d *lazyDir) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go b/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go index c9e852c5eb..32c33661eb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go @@ -3,12 +3,11 @@ package sys import ( "io" "os" - "syscall" - "time" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/internal/sysfs" + "github.com/tetratelabs/wazero/sys" ) // StdinFile is a fs.ModeDevice file for use implementing FdStdin. @@ -19,10 +18,10 @@ type StdinFile struct { io.Reader } -// Read implements the same method as documented on internalapi.File -func (f *StdinFile) Read(buf []byte) (int, syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *StdinFile) Read(buf []byte) (int, experimentalsys.Errno) { n, err := f.Reader.Read(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } type writerFile struct { @@ -31,10 +30,10 @@ type writerFile struct { w io.Writer } -// Write implements the same method as documented on internalapi.File -func (f *writerFile) Write(buf []byte) (int, syscall.Errno) { +// Write implements the same method as documented on sys.File +func (f *writerFile) Write(buf []byte) (int, experimentalsys.Errno) { n, err := f.w.Write(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } // noopStdinFile is a fs.ModeDevice file for use implementing FdStdin. This is @@ -44,18 +43,16 @@ type noopStdinFile struct { noopStdioFile } -// AccessMode implements the same method as documented on internalapi.File -func (noopStdinFile) AccessMode() int { - return syscall.O_RDONLY -} - -// Read implements the same method as documented on internalapi.File -func (noopStdinFile) Read([]byte) (int, syscall.Errno) { +// Read implements the same method as documented on sys.File +func (noopStdinFile) Read([]byte) (int, experimentalsys.Errno) { return 0, 0 // Always EOF } -// PollRead implements the same method as documented on internalapi.File -func (noopStdinFile) PollRead(*time.Duration) (ready bool, errno syscall.Errno) { +// Poll implements the same method as documented on fsapi.File +func (noopStdinFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) { + if flag != fsapi.POLLIN { + return false, experimentalsys.ENOTSUP + } return true, 0 // always ready to read nothing } @@ -65,32 +62,42 @@ type noopStdoutFile struct { noopStdioFile } -// AccessMode implements the same method as documented on internalapi.File -func (noopStdoutFile) AccessMode() int { - return syscall.O_WRONLY -} - -// Write implements the same method as documented on internalapi.File -func (noopStdoutFile) Write(buf []byte) (int, syscall.Errno) { +// Write implements the same method as documented on sys.File +func (noopStdoutFile) Write(buf []byte) (int, experimentalsys.Errno) { return len(buf), 0 // same as io.Discard } type noopStdioFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile } -// Stat implements the same method as documented on internalapi.File -func (noopStdioFile) Stat() (fsapi.Stat_t, syscall.Errno) { - return fsapi.Stat_t{Mode: modeDevice, Nlink: 1}, 0 +// Stat implements the same method as documented on sys.File +func (noopStdioFile) Stat() (sys.Stat_t, experimentalsys.Errno) { + return sys.Stat_t{Mode: modeDevice, Nlink: 1}, 0 } -// IsDir implements the same method as documented on internalapi.File -func (noopStdioFile) IsDir() (bool, syscall.Errno) { +// IsDir implements the same method as documented on sys.File +func (noopStdioFile) IsDir() (bool, experimentalsys.Errno) { return false, 0 } -// Close implements the same method as documented on internalapi.File -func (noopStdioFile) Close() (errno syscall.Errno) { return } +// Close implements the same method as documented on sys.File +func (noopStdioFile) Close() (errno experimentalsys.Errno) { return } + +// IsNonblock implements the same method as documented on fsapi.File +func (noopStdioFile) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (noopStdioFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Poll implements the same method as documented on fsapi.File +func (noopStdioFile) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} func stdinFileEntry(r io.Reader) (*FileEntry, error) { if r == nil { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go b/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go index f035712eee..12279ee495 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go @@ -7,7 +7,7 @@ import ( "net" "time" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/sys" ) @@ -110,11 +110,11 @@ func (c *Context) RandSource() io.Reader { } // DefaultContext returns Context with no values set except a possible nil -// fsapi.FS. +// sys.FS. // // Note: This is only used for testing. -func DefaultContext(fs fsapi.FS) *Context { - if sysCtx, err := NewContext(0, nil, nil, nil, nil, nil, nil, nil, 0, nil, 0, nil, nil, fs, nil); err != nil { +func DefaultContext(fs experimentalsys.FS) *Context { + if sysCtx, err := NewContext(0, nil, nil, nil, nil, nil, nil, nil, 0, nil, 0, nil, nil, []experimentalsys.FS{fs}, []string{""}, nil); err != nil { panic(fmt.Errorf("BUG: DefaultContext should never error: %w", err)) } else { return sysCtx @@ -135,7 +135,7 @@ func NewContext( nanotimeResolution sys.ClockResolution, nanosleep sys.Nanosleep, osyield sys.Osyield, - rootFS fsapi.FS, + fs []experimentalsys.FS, guestPaths []string, tcpListeners []*net.TCPListener, ) (sysCtx *Context, err error) { sysCtx = &Context{args: args, environ: environ} @@ -188,11 +188,7 @@ func NewContext( sysCtx.osyield = platform.FakeOsyield } - if rootFS != nil { - err = sysCtx.NewFSContext(stdin, stdout, stderr, rootFS, tcpListeners) - } else { - err = sysCtx.NewFSContext(stdin, stdout, stderr, fsapi.UnimplementedFS{}, tcpListeners) - } + err = sysCtx.InitFSContext(stdin, stdout, stderr, fs, guestPaths, tcpListeners) return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go index 022ca69762..51a9a54804 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go @@ -4,64 +4,91 @@ import ( "fmt" "io/fs" "path" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -// Adapt adapts the input to api.FS unless it is already one. Use NewDirFS instead -// of os.DirFS as it handles interop issues such as windows support. -// -// Note: This performs no flag verification on OpenFile. fsapi.FS cannot read -// flags as there is no parameter to pass them through with. Moreover, fsapi.FS -// documentation does not require the file to be present. In summary, we can't -// enforce flag behavior. -func Adapt(fs fs.FS) fsapi.FS { - if fs == nil { - return fsapi.UnimplementedFS{} - } - if sys, ok := fs.(fsapi.FS); ok { - return sys - } - return &adapter{fs: fs} +type AdaptFS struct { + FS fs.FS } -type adapter struct { - fsapi.UnimplementedFS - fs fs.FS +// String implements fmt.Stringer +func (a *AdaptFS) String() string { + return fmt.Sprintf("%v", a.FS) } -// String implements fmt.Stringer -func (a *adapter) String() string { - return fmt.Sprintf("%v", a.fs) +// OpenFile implements the same method as documented on sys.FS +func (a *AdaptFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(a.FS, cleanPath(path), flag, perm) } -// OpenFile implements the same method as documented on api.FS -func (a *adapter) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - return OpenFSFile(a.fs, cleanPath(path), flag, perm) +// Lstat implements the same method as documented on sys.FS +func (a *AdaptFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + // At this time, we make the assumption sys.FS instances do not support + // symbolic links, therefore Lstat is the same as Stat. This is obviously + // not true, but until FS.FS has a solid story for how to handle symlinks, + // we are better off not making a decision that would be difficult to + // revert later on. + // + // For further discussions on the topic, see: + // https://github.com/golang/go/issues/49580 + return a.Stat(path) } -// Stat implements the same method as documented on api.FS -func (a *adapter) Stat(path string) (fsapi.Stat_t, syscall.Errno) { - f, errno := a.OpenFile(path, syscall.O_RDONLY, 0) +// Stat implements the same method as documented on sys.FS +func (a *AdaptFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { + f, errno := a.OpenFile(path, experimentalsys.O_RDONLY, 0) if errno != 0 { - return fsapi.Stat_t{}, errno + return sys.Stat_t{}, errno } defer f.Close() return f.Stat() } -// Lstat implements the same method as documented on api.FS -func (a *adapter) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { - // At this time, we make the assumption that api.FS instances do not support - // symbolic links, therefore Lstat is the same as Stat. This is obviously - // not true but until api.FS has a solid story for how to handle symlinks we - // are better off not making a decision that would be difficult to revert - // later on. - // - // For further discussions on the topic, see: - // https://github.com/golang/go/issues/49580 - return a.Stat(path) +// Readlink implements the same method as documented on sys.FS +func (a *AdaptFS) Readlink(string) (string, experimentalsys.Errno) { + return "", experimentalsys.ENOSYS +} + +// Mkdir implements the same method as documented on sys.FS +func (a *AdaptFS) Mkdir(string, fs.FileMode) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Chmod implements the same method as documented on sys.FS +func (a *AdaptFS) Chmod(string, fs.FileMode) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Rename implements the same method as documented on sys.FS +func (a *AdaptFS) Rename(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Rmdir implements the same method as documented on sys.FS +func (a *AdaptFS) Rmdir(string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Link implements the same method as documented on sys.FS +func (a *AdaptFS) Link(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Symlink implements the same method as documented on sys.FS +func (a *AdaptFS) Symlink(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Unlink implements the same method as documented on sys.FS +func (a *AdaptFS) Unlink(string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Utimens implements the same method as documented on sys.FS +func (a *AdaptFS) Utimens(string, int64, int64) experimentalsys.Errno { + return experimentalsys.ENOSYS } func cleanPath(name string) string { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go deleted file mode 100644 index 93c774c923..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go +++ /dev/null @@ -1,30 +0,0 @@ -package sysfs - -import ( - "os" - "syscall" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// Chown is like os.Chown, except it returns a syscall.Errno, not a -// fs.PathError. For example, this returns syscall.ENOENT if the path doesn't -// exist. A syscall.Errno of zero is success. -// -// Note: This always returns syscall.ENOSYS on windows. -// See https://linux.die.net/man/3/chown -func Chown(path string, uid, gid int) syscall.Errno { - err := os.Chown(path, uid, gid) - return platform.UnwrapOSError(err) -} - -// Lchown is like os.Lchown, except it returns a syscall.Errno, not a -// fs.PathError. For example, this returns syscall.ENOENT if the path doesn't -// exist. A syscall.Errno of zero is success. -// -// Note: This always returns syscall.ENOSYS on windows. -// See https://linux.die.net/man/3/lchown -func Lchown(path string, uid, gid int) syscall.Errno { - err := os.Lchown(path, uid, gid) - return platform.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go deleted file mode 100644 index 5907a9d980..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !windows - -package sysfs - -import ( - "syscall" - - "github.com/tetratelabs/wazero/internal/platform" -) - -func fchown(fd uintptr, uid, gid int) syscall.Errno { - return platform.UnwrapOSError(syscall.Fchown(int(fd), uid, gid)) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go deleted file mode 100644 index 5e7fd79be9..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build windows - -package sysfs - -import "syscall" - -// fchown is not supported on windows. For example, syscall.Fchown returns -// syscall.EWINDOWS, which is the same as syscall.ENOSYS. -func fchown(fd uintptr, uid, gid int) syscall.Errno { - return syscall.ENOSYS -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go index 715a952dfa..c37e698d2f 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go @@ -6,9 +6,9 @@ import ( "os" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func datasync(f *os.File) syscall.Errno { - return platform.UnwrapOSError(syscall.Fdatasync(int(f.Fd()))) +func datasync(f *os.File) sys.Errno { + return sys.UnwrapOSError(syscall.Fdatasync(int(f.Fd()))) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go index 4261f56575..aa05719be6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go @@ -4,10 +4,11 @@ package sysfs import ( "os" - "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" ) -func datasync(f *os.File) syscall.Errno { +func datasync(f *os.File) sys.Errno { // Attempt to sync everything, even if we only need to sync the data. return fsync(f) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go index 8462e846f8..f9823287cf 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go @@ -2,23 +2,21 @@ package sysfs import ( "io" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func adjustReaddirErr(f fsapi.File, isClosed bool, err error) syscall.Errno { +func adjustReaddirErr(f sys.File, isClosed bool, err error) sys.Errno { if err == io.EOF { return 0 // e.g. Readdir on darwin returns io.EOF, but linux doesn't. - } else if errno := platform.UnwrapOSError(err); errno != 0 { + } else if errno := sys.UnwrapOSError(err); errno != 0 { errno = dirError(f, isClosed, errno) - // Ignore errors when the file was closed or removed. + // Comply with errors allowed on sys.File Readdir switch errno { - case syscall.EIO, syscall.EBADF: // closed while open - return 0 - case syscall.ENOENT: // Linux error when removed while open - return 0 + case sys.EINVAL: // os.File Readdir can return this + return sys.EBADF + case sys.ENOTDIR: // dirError can return this + return sys.EBADF } return errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go index 5f2645de80..05d5b647ea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go @@ -3,13 +3,13 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/sys" ) -func NewDirFS(dir string) fsapi.FS { +func DirFS(dir string) experimentalsys.FS { return &dirFS{ dir: dir, cleanedDir: ensureTrailingPathSeparator(dir), @@ -23,8 +23,11 @@ func ensureTrailingPathSeparator(dir string) string { return dir } +// dirFS is not exported because the input fields must be maintained together. +// This is likely why os.DirFS doesn't, either! type dirFS struct { - fsapi.UnimplementedFS + experimentalsys.UnimplementedFS + dir string // cleanedDir is for easier OS-specific concatenation, as it always has // a trailing path separator. @@ -36,99 +39,81 @@ func (d *dirFS) String() string { return d.dir } -// OpenFile implements the same method as documented on api.FS -func (d *dirFS) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { +// OpenFile implements the same method as documented on sys.FS +func (d *dirFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { return OpenOSFile(d.join(path), flag, perm) } -// Lstat implements the same method as documented on api.FS -func (d *dirFS) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { +// Lstat implements the same method as documented on sys.FS +func (d *dirFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { return lstat(d.join(path)) } -// Stat implements the same method as documented on api.FS -func (d *dirFS) Stat(path string) (fsapi.Stat_t, syscall.Errno) { +// Stat implements the same method as documented on sys.FS +func (d *dirFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { return stat(d.join(path)) } -// Mkdir implements the same method as documented on api.FS -func (d *dirFS) Mkdir(path string, perm fs.FileMode) (errno syscall.Errno) { +// Mkdir implements the same method as documented on sys.FS +func (d *dirFS) Mkdir(path string, perm fs.FileMode) (errno experimentalsys.Errno) { err := os.Mkdir(d.join(path), perm) - if errno = platform.UnwrapOSError(err); errno == syscall.ENOTDIR { - errno = syscall.ENOENT + if errno = experimentalsys.UnwrapOSError(err); errno == experimentalsys.ENOTDIR { + errno = experimentalsys.ENOENT } return } -// Chmod implements the same method as documented on api.FS -func (d *dirFS) Chmod(path string, perm fs.FileMode) syscall.Errno { +// Chmod implements the same method as documented on sys.FS +func (d *dirFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { err := os.Chmod(d.join(path), perm) - return platform.UnwrapOSError(err) -} - -// Chown implements the same method as documented on api.FS -func (d *dirFS) Chown(path string, uid, gid int) syscall.Errno { - return Chown(d.join(path), uid, gid) + return experimentalsys.UnwrapOSError(err) } -// Lchown implements the same method as documented on api.FS -func (d *dirFS) Lchown(path string, uid, gid int) syscall.Errno { - return Lchown(d.join(path), uid, gid) -} - -// Rename implements the same method as documented on api.FS -func (d *dirFS) Rename(from, to string) syscall.Errno { +// Rename implements the same method as documented on sys.FS +func (d *dirFS) Rename(from, to string) experimentalsys.Errno { from, to = d.join(from), d.join(to) - return Rename(from, to) + return rename(from, to) } -// Readlink implements the same method as documented on api.FS -func (d *dirFS) Readlink(path string) (string, syscall.Errno) { +// Readlink implements the same method as documented on sys.FS +func (d *dirFS) Readlink(path string) (string, experimentalsys.Errno) { // Note: do not use syscall.Readlink as that causes race on Windows. // In any case, syscall.Readlink does almost the same logic as os.Readlink. dst, err := os.Readlink(d.join(path)) if err != nil { - return "", platform.UnwrapOSError(err) + return "", experimentalsys.UnwrapOSError(err) } return platform.ToPosixPath(dst), 0 } -// Link implements the same method as documented on api.FS -func (d *dirFS) Link(oldName, newName string) syscall.Errno { +// Link implements the same method as documented on sys.FS +func (d *dirFS) Link(oldName, newName string) experimentalsys.Errno { err := os.Link(d.join(oldName), d.join(newName)) - return platform.UnwrapOSError(err) + return experimentalsys.UnwrapOSError(err) } -// Rmdir implements the same method as documented on api.FS -func (d *dirFS) Rmdir(path string) syscall.Errno { - err := syscall.Rmdir(d.join(path)) - return platform.UnwrapOSError(err) +// Rmdir implements the same method as documented on sys.FS +func (d *dirFS) Rmdir(path string) experimentalsys.Errno { + return rmdir(d.join(path)) } -// Unlink implements the same method as documented on api.FS -func (d *dirFS) Unlink(path string) (err syscall.Errno) { - return Unlink(d.join(path)) +// Unlink implements the same method as documented on sys.FS +func (d *dirFS) Unlink(path string) (err experimentalsys.Errno) { + return unlink(d.join(path)) } -// Symlink implements the same method as documented on api.FS -func (d *dirFS) Symlink(oldName, link string) syscall.Errno { +// Symlink implements the same method as documented on sys.FS +func (d *dirFS) Symlink(oldName, link string) experimentalsys.Errno { // Note: do not resolve `oldName` relative to this dirFS. The link result is always resolved // when dereference the `link` on its usage (e.g. readlink, read, etc). // https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 err := os.Symlink(oldName, d.join(link)) - return platform.UnwrapOSError(err) -} - -// Utimens implements the same method as documented on api.FS -func (d *dirFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - return Utimens(d.join(path), times, symlinkFollow) + return experimentalsys.UnwrapOSError(err) } -// Truncate implements the same method as documented on api.FS -func (d *dirFS) Truncate(path string, size int64) syscall.Errno { - // Use os.Truncate as syscall.Truncate doesn't exist on Windows. - err := os.Truncate(d.join(path), size) - return platform.UnwrapOSError(err) +// Utimens implements the same method as documented on sys.FS +func (d *dirFS) Utimens(path string, atim, mtim int64) experimentalsys.Errno { + return utimens(d.join(path), atim, mtim) } func (d *dirFS) join(path string) string { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go index f4a7cbf8aa..9a77205bb5 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go @@ -4,10 +4,11 @@ import ( "io" "io/fs" "os" - "syscall" + "time" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/sys" ) func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { @@ -20,11 +21,11 @@ func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { } else { mode = st.Mode() } - var flag int + var flag experimentalsys.Oflag if stdin { - flag = syscall.O_RDONLY + flag = experimentalsys.O_RDONLY } else { - flag = syscall.O_WRONLY + flag = experimentalsys.O_WRONLY } var file fsapi.File if of, ok := f.(*os.File); ok { @@ -33,17 +34,17 @@ func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { } else { file = &fsFile{file: f} } - return &stdioFile{File: file, st: fsapi.Stat_t{Mode: mode, Nlink: 1}}, nil + return &stdioFile{File: file, st: sys.Stat_t{Mode: mode, Nlink: 1}}, nil } -func OpenFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - if flag&fsapi.O_DIRECTORY != 0 && flag&(syscall.O_WRONLY|syscall.O_RDWR) != 0 { - return nil, syscall.EISDIR // invalid to open a directory writeable +func OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (*os.File, experimentalsys.Errno) { + if flag&experimentalsys.O_DIRECTORY != 0 && flag&(experimentalsys.O_WRONLY|experimentalsys.O_RDWR) != 0 { + return nil, experimentalsys.EISDIR // invalid to open a directory writeable } return openFile(path, flag, perm) } -func OpenOSFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { +func OpenOSFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { f, errno := OpenFile(path, flag, perm) if errno != 0 { return nil, errno @@ -51,44 +52,50 @@ func OpenOSFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Er return newOsFile(path, flag, perm, f), 0 } -func OpenFSFile(fs fs.FS, path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - if flag&fsapi.O_DIRECTORY != 0 && flag&(syscall.O_WRONLY|syscall.O_RDWR) != 0 { - return nil, syscall.EISDIR // invalid to open a directory writeable +func OpenFSFile(fs fs.FS, path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + if flag&experimentalsys.O_DIRECTORY != 0 && flag&(experimentalsys.O_WRONLY|experimentalsys.O_RDWR) != 0 { + return nil, experimentalsys.EISDIR // invalid to open a directory writeable } f, err := fs.Open(path) - if errno := platform.UnwrapOSError(err); errno != 0 { + if errno := experimentalsys.UnwrapOSError(err); errno != 0 { return nil, errno } // Don't return an os.File because the path is not absolute. osFile needs - // the path to be real and certain fs.File impls are subrooted. + // the path to be real and certain FS.File impls are subrooted. return &fsFile{fs: fs, name: path, file: f}, 0 } type stdioFile struct { fsapi.File - st fsapi.Stat_t + st sys.Stat_t } -// IsDir implements File.IsDir -func (f *stdioFile) IsDir() (bool, syscall.Errno) { - return false, 0 +// SetAppend implements File.SetAppend +func (f *stdioFile) SetAppend(bool) experimentalsys.Errno { + // Ignore for stdio. + return 0 +} + +// IsAppend implements File.SetAppend +func (f *stdioFile) IsAppend() bool { + return true } // Stat implements File.Stat -func (f *stdioFile) Stat() (fsapi.Stat_t, syscall.Errno) { +func (f *stdioFile) Stat() (sys.Stat_t, experimentalsys.Errno) { return f.st, 0 } // Close implements File.Close -func (f *stdioFile) Close() syscall.Errno { +func (f *stdioFile) Close() experimentalsys.Errno { return 0 } -// fsFile is used for wrapped os.File, like os.Stdin or any fs.File +// fsFile is used for wrapped fs.File, like os.Stdin or any fs.File // implementation. Notably, this does not have access to the full file path. // so certain operations can't be supported, such as inode lookups on Windows. type fsFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile // fs is the file-system that opened the file, or nil when wrapped for // pre-opens like stdio. @@ -100,7 +107,13 @@ type fsFile struct { // file is always set, possibly an os.File like os.Stdin. file fs.File - // closed is true when closed was called. This ensures proper syscall.EBADF + // reopenDir is true if reopen should be called before Readdir. This flag + // is deferred until Readdir to prevent redundant rewinds. This could + // happen if Seek(0) was called twice, or if in Windows, Seek(0) was called + // before Readdir. + reopenDir bool + + // closed is true when closed was called. This ensures proper sys.EBADF closed bool // cachedStat includes fields that won't change while a file is open. @@ -108,84 +121,73 @@ type fsFile struct { } type cachedStat struct { - // fileType is the same as what's documented on Dirent. - fileType fs.FileMode + // dev is the same as sys.Stat_t Dev. + dev uint64 - // ino is the same as what's documented on Dirent. - ino uint64 + // dev is the same as sys.Stat_t Ino. + ino sys.Inode + + // isDir is sys.Stat_t Mode masked with fs.ModeDir + isDir bool } -// cachedStat returns the cacheable parts of platform.sys.Stat_t or an error if -// they couldn't be retrieved. -func (f *fsFile) cachedStat() (fileType fs.FileMode, ino uint64, errno syscall.Errno) { +// cachedStat returns the cacheable parts of sys.Stat_t or an error if they +// couldn't be retrieved. +func (f *fsFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno experimentalsys.Errno) { if f.cachedSt == nil { if _, errno = f.Stat(); errno != 0 { return } } - return f.cachedSt.fileType, f.cachedSt.ino, 0 + return f.cachedSt.dev, f.cachedSt.ino, f.cachedSt.isDir, 0 } -// Ino implements File.Ino -func (f *fsFile) Ino() (uint64, syscall.Errno) { - if _, ino, errno := f.cachedStat(); errno != 0 { - return 0, errno - } else { - return ino, 0 - } +// Dev implements the same method as documented on sys.File +func (f *fsFile) Dev() (uint64, experimentalsys.Errno) { + dev, _, _, errno := f.cachedStat() + return dev, errno } -// IsAppend implements File.IsAppend -func (f *fsFile) IsAppend() bool { - return false +// Ino implements the same method as documented on sys.File +func (f *fsFile) Ino() (sys.Inode, experimentalsys.Errno) { + _, ino, _, errno := f.cachedStat() + return ino, errno } -// SetAppend implements File.SetAppend -func (f *fsFile) SetAppend(bool) (errno syscall.Errno) { - return fileError(f, f.closed, syscall.ENOSYS) +// IsDir implements the same method as documented on sys.File +func (f *fsFile) IsDir() (bool, experimentalsys.Errno) { + _, _, isDir, errno := f.cachedStat() + return isDir, errno } -// IsDir implements File.IsDir -func (f *fsFile) IsDir() (bool, syscall.Errno) { - if ft, _, errno := f.cachedStat(); errno != 0 { - return false, errno - } else if ft.Type() == fs.ModeDir { - return true, 0 - } - return false, 0 +// IsAppend implements the same method as documented on sys.File +func (f *fsFile) IsAppend() bool { + return false } -// Stat implements File.Stat -func (f *fsFile) Stat() (st fsapi.Stat_t, errno syscall.Errno) { +// SetAppend implements the same method as documented on sys.File +func (f *fsFile) SetAppend(bool) (errno experimentalsys.Errno) { + return fileError(f, f.closed, experimentalsys.ENOSYS) +} + +// Stat implements the same method as documented on sys.File +func (f *fsFile) Stat() (sys.Stat_t, experimentalsys.Errno) { if f.closed { - errno = syscall.EBADF - return + return sys.Stat_t{}, experimentalsys.EBADF } - // While some functions in fsapi.File need the full path, especially in - // Windows, stat does not. Casting here allows os.DirFS to return inode - // information. - if of, ok := f.file.(*os.File); ok { - if st, errno = statFile(of); errno != 0 { - return - } - return f.cacheStat(st) - } else if t, err := f.file.Stat(); err != nil { - errno = platform.UnwrapOSError(err) - return - } else { - st = StatFromDefaultFileInfo(t) - return f.cacheStat(st) + st, errno := statFile(f.file) + switch errno { + case 0: + f.cachedSt = &cachedStat{dev: st.Dev, ino: st.Ino, isDir: st.Mode&fs.ModeDir == fs.ModeDir} + case experimentalsys.EIO: + errno = experimentalsys.EBADF } + return st, errno } -func (f *fsFile) cacheStat(st fsapi.Stat_t) (fsapi.Stat_t, syscall.Errno) { - f.cachedSt = &cachedStat{fileType: st.Mode & fs.ModeType, ino: st.Ino} - return st, 0 -} - -// Read implements File.Read -func (f *fsFile) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *fsFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { if n, errno = read(f.file, buf); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) @@ -193,8 +195,8 @@ func (f *fsFile) Read(buf []byte) (n int, errno syscall.Errno) { return } -// Pread implements File.Pread -func (f *fsFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pread implements the same method as documented on sys.File +func (f *fsFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if ra, ok := f.file.(io.ReaderAt); ok { if n, errno = pread(ra, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. @@ -208,7 +210,7 @@ func (f *fsFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { // Determine the current position in the file, as we need to revert it. currentOffset, err := rs.Seek(0, io.SeekCurrent) if err != nil { - return 0, fileError(f, f.closed, platform.UnwrapOSError(err)) + return 0, fileError(f, f.closed, experimentalsys.UnwrapOSError(err)) } // Put the read position back when complete. @@ -217,31 +219,30 @@ func (f *fsFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { // If the current offset isn't in sync with this reader, move it. if off != currentOffset { if _, err = rs.Seek(off, io.SeekStart); err != nil { - return 0, fileError(f, f.closed, platform.UnwrapOSError(err)) + return 0, fileError(f, f.closed, experimentalsys.UnwrapOSError(err)) } } n, err = rs.Read(buf) - if errno = platform.UnwrapOSError(err); errno != 0 { + if errno = experimentalsys.UnwrapOSError(err); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -// Seek implements File.Seek. -func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { +// Seek implements the same method as documented on sys.File +func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { // If this is a directory, and we're attempting to seek to position zero, // we have to re-open the file to ensure the directory state is reset. var isDir bool if offset == 0 && whence == io.SeekStart { - if isDir, errno = f.IsDir(); errno != 0 { + if isDir, errno = f.IsDir(); errno == 0 && isDir { + f.reopenDir = true return - } else if isDir { - return 0, f.reopen() } } @@ -251,23 +252,33 @@ func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno syscall. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -func (f *fsFile) reopen() syscall.Errno { - _ = f.close() - var err error - f.file, err = f.fs.Open(f.name) - return platform.UnwrapOSError(err) -} +// Readdir implements the same method as documented on sys.File +// +// Notably, this uses readdirFile or fs.ReadDirFile if available. This does not +// return inodes on windows. +func (f *fsFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + // Windows lets you Readdir after close, FS.File also may not implement + // close in a meaningful way. read our closed field to return consistent + // results. + if f.closed { + errno = experimentalsys.EBADF + return + } -// Readdir implements File.Readdir. Notably, this uses fs.ReadDirFile if -// available. -func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if of, ok := f.file.(*os.File); ok { - // We can't use f.name here because it is the path up to the fsapi.FS, + if f.reopenDir { // re-open the directory if needed. + f.reopenDir = false + if errno = adjustReaddirErr(f, f.closed, f.reopen()); errno != 0 { + return + } + } + + if of, ok := f.file.(readdirFile); ok { + // We can't use f.name here because it is the path up to the sys.FS, // not necessarily the real path. For this reason, Windows may not be // able to populate inodes. However, Darwin and Linux will. if dirents, errno = readdir(of, "", n); errno != 0 { @@ -276,52 +287,52 @@ func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { return } - // Try with fs.ReadDirFile which is available on api.FS implementations - // like embed:fs. + // Try with FS.ReadDirFile which is available on api.FS implementations + // like embed:FS. if rdf, ok := f.file.(fs.ReadDirFile); ok { entries, e := rdf.ReadDir(n) if errno = adjustReaddirErr(f, f.closed, e); errno != 0 { return } - dirents = make([]fsapi.Dirent, 0, len(entries)) + dirents = make([]experimentalsys.Dirent, 0, len(entries)) for _, e := range entries { // By default, we don't attempt to read inode data - dirents = append(dirents, fsapi.Dirent{Name: e.Name(), Type: e.Type()}) + dirents = append(dirents, experimentalsys.Dirent{Name: e.Name(), Type: e.Type()}) } } else { - errno = syscall.ENOTDIR + errno = experimentalsys.EBADF // not a directory } return } -// Write implements File.Write -func (f *fsFile) Write(buf []byte) (n int, errno syscall.Errno) { +// Write implements the same method as documented on sys.File. +func (f *fsFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { if w, ok := f.file.(io.Writer); ok { if n, errno = write(w, buf); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -// Pwrite implements File.Pwrite -func (f *fsFile) Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pwrite implements the same method as documented on sys.File. +func (f *fsFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if wa, ok := f.file.(io.WriterAt); ok { if n, errno = pwrite(wa, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -// Close implements File.Close -func (f *fsFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File. +func (f *fsFile) Close() experimentalsys.Errno { if f.closed { return 0 } @@ -329,12 +340,27 @@ func (f *fsFile) Close() syscall.Errno { return f.close() } -func (f *fsFile) close() syscall.Errno { - return platform.UnwrapOSError(f.file.Close()) +func (f *fsFile) close() experimentalsys.Errno { + return experimentalsys.UnwrapOSError(f.file.Close()) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *fsFile) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *fsFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Poll implements the same method as documented on fsapi.File +func (f *fsFile) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS } // dirError is used for commands that work against a directory, but not a file. -func dirError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { +func dirError(f experimentalsys.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { if vErrno := validate(f, isClosed, false, true); vErrno != 0 { return vErrno } @@ -342,7 +368,7 @@ func dirError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { } // fileError is used for commands that work against a file, but not a directory. -func fileError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { +func fileError(f experimentalsys.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { if vErrno := validate(f, isClosed, true, false); vErrno != 0 { return vErrno } @@ -350,9 +376,9 @@ func fileError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { } // validate is used to making syscalls which will fail. -func validate(f fsapi.File, isClosed, wantFile, wantDir bool) syscall.Errno { +func validate(f experimentalsys.File, isClosed, wantFile, wantDir bool) experimentalsys.Errno { if isClosed { - return syscall.EBADF + return experimentalsys.EBADF } isDir, errno := f.IsDir() @@ -361,74 +387,134 @@ func validate(f fsapi.File, isClosed, wantFile, wantDir bool) syscall.Errno { } if wantFile && isDir { - return syscall.EISDIR + return experimentalsys.EISDIR } else if wantDir && !isDir { - return syscall.ENOTDIR + return experimentalsys.ENOTDIR } return 0 } -func read(r io.Reader, buf []byte) (n int, errno syscall.Errno) { +func read(r io.Reader, buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. } n, err := r.Read(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } -func pread(ra io.ReaderAt, buf []byte, off int64) (n int, errno syscall.Errno) { +func pread(ra io.ReaderAt, buf []byte, off int64) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. } n, err := ra.ReadAt(buf, off) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } -func seek(s io.Seeker, offset int64, whence int) (int64, syscall.Errno) { +func seek(s io.Seeker, offset int64, whence int) (int64, experimentalsys.Errno) { if uint(whence) > io.SeekEnd { - return 0, syscall.EINVAL // negative or exceeds the largest valid whence + return 0, experimentalsys.EINVAL // negative or exceeds the largest valid whence } newOffset, err := s.Seek(offset, whence) - return newOffset, platform.UnwrapOSError(err) + return newOffset, experimentalsys.UnwrapOSError(err) +} + +// reopenFile allows re-opening a file for reasons such as applying flags or +// directory iteration. +type reopenFile func() experimentalsys.Errno + +// compile-time check to ensure fsFile.reopen implements reopenFile. +var _ reopenFile = (*fsFile)(nil).reopen + +// reopen implements the same method as documented on reopenFile. +func (f *fsFile) reopen() experimentalsys.Errno { + _ = f.close() + var err error + f.file, err = f.fs.Open(f.name) + return experimentalsys.UnwrapOSError(err) +} + +// readdirFile allows masking the `Readdir` function on os.File. +type readdirFile interface { + Readdir(n int) ([]fs.FileInfo, error) } -func readdir(f *os.File, path string, n int) (dirents []fsapi.Dirent, errno syscall.Errno) { +// readdir uses readdirFile.Readdir, special casing windows when path !="". +func readdir(f readdirFile, path string, n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { fis, e := f.Readdir(n) - if errno = platform.UnwrapOSError(e); errno != 0 { + if errno = experimentalsys.UnwrapOSError(e); errno != 0 { return } - dirents = make([]fsapi.Dirent, 0, len(fis)) + dirents = make([]experimentalsys.Dirent, 0, len(fis)) // linux/darwin won't have to fan out to lstat, but windows will. - var ino uint64 + var ino sys.Inode for fi := range fis { t := fis[fi] + // inoFromFileInfo is more efficient than sys.NewStat_t, as it gets the + // inode without allocating an instance and filling other fields. if ino, errno = inoFromFileInfo(path, t); errno != 0 { return } - dirents = append(dirents, fsapi.Dirent{Name: t.Name(), Ino: ino, Type: t.Mode().Type()}) + dirents = append(dirents, experimentalsys.Dirent{Name: t.Name(), Ino: ino, Type: t.Mode().Type()}) } return } -func write(w io.Writer, buf []byte) (n int, errno syscall.Errno) { +func write(w io.Writer, buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. } n, err := w.Write(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } -func pwrite(w io.WriterAt, buf []byte, off int64) (n int, errno syscall.Errno) { +func pwrite(w io.WriterAt, buf []byte, off int64) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. } n, err := w.WriteAt(buf, off) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) +} + +func chtimes(path string, atim, mtim int64) (errno experimentalsys.Errno) { //nolint:unused + // When both inputs are omitted, there is nothing to change. + if atim == experimentalsys.UTIME_OMIT && mtim == experimentalsys.UTIME_OMIT { + return + } + + // UTIME_OMIT is expensive until progress is made in Go, as it requires a + // stat to read-back the value to re-apply. + // - https://github.com/golang/go/issues/32558. + // - https://go-review.googlesource.com/c/go/+/219638 (unmerged) + var st sys.Stat_t + if atim == experimentalsys.UTIME_OMIT || mtim == experimentalsys.UTIME_OMIT { + if st, errno = stat(path); errno != 0 { + return + } + } + + var atime, mtime time.Time + if atim == experimentalsys.UTIME_OMIT { + atime = epochNanosToTime(st.Atim) + mtime = epochNanosToTime(mtim) + } else if mtim == experimentalsys.UTIME_OMIT { + atime = epochNanosToTime(atim) + mtime = epochNanosToTime(st.Mtim) + } else { + atime = epochNanosToTime(atim) + mtime = epochNanosToTime(mtim) + } + return experimentalsys.UnwrapOSError(os.Chtimes(path, atime, mtime)) +} + +func epochNanosToTime(epochNanos int64) time.Time { //nolint:unused + seconds := epochNanos / 1e9 + nanos := epochNanos % 1e9 + return time.Unix(seconds, nanos) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go index 3f10c61269..1b97eb860a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go @@ -7,15 +7,14 @@ import ( "os" "path" "runtime" - "strings" - "syscall" "testing" gofstest "testing/fstest" - "time" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/internal/testing/require" + "github.com/tetratelabs/wazero/sys" ) //go:embed file_test.go @@ -48,17 +47,13 @@ func TestStdioFileSetNonblock(t *testing.T) { } func TestRegularFileSetNonblock(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("Nonblock on regular files is not supported on Windows") - } - // Test using os.Pipe as it is known to support non-blocking reads. r, w, err := os.Pipe() require.NoError(t, err) defer r.Close() defer w.Close() - rF := newOsFile("", syscall.O_RDONLY, 0, r) + rF := newOsFile("", experimentalsys.O_RDONLY, 0, r) errno := rF.SetNonblock(true) require.EqualErrno(t, 0, errno) @@ -67,7 +62,7 @@ func TestRegularFileSetNonblock(t *testing.T) { // Read from the file without ever writing to it should not block. buf := make([]byte, 8) _, e := rF.Read(buf) - require.EqualErrno(t, syscall.EAGAIN, e) + require.EqualErrno(t, experimentalsys.EAGAIN, e) errno = rF.SetNonblock(false) require.EqualErrno(t, 0, errno) @@ -82,17 +77,44 @@ func TestReadFdNonblock(t *testing.T) { defer w.Close() fd := r.Fd() - err = setNonblock(fd, true) - require.NoError(t, err) + errno := setNonblock(fd, true) + require.EqualErrno(t, 0, errno) // Read from the file without ever writing to it should not block. buf := make([]byte, 8) - _, e := readFd(fd, buf) - if runtime.GOOS == "windows" { - require.EqualErrno(t, syscall.ENOSYS, e) - } else { - require.EqualErrno(t, syscall.EAGAIN, e) + _, errno = readFd(fd, buf) + require.EqualErrno(t, experimentalsys.EAGAIN, errno) +} + +func TestWriteFdNonblock(t *testing.T) { + // Test using os.Pipe as it is known to support non-blocking reads. + r, w, err := os.Pipe() + require.NoError(t, err) + defer r.Close() + defer w.Close() + + fd := w.Fd() + errno := setNonblock(fd, true) + + require.EqualErrno(t, 0, errno) + + // Create a buffer (the content is not relevant) + buf := make([]byte, 1024) + // Write to the file until the pipe buffer gets filled up. + numWrites := 100 + for i := 0; i < numWrites; i++ { + _, e := writeFd(fd, buf) + if e != 0 { + if runtime.GOOS == "windows" { + // This is currently not supported on Windows. + require.EqualErrno(t, experimentalsys.ENOSYS, e) + } else { + require.EqualErrno(t, experimentalsys.EAGAIN, e) + } + return + } } + t.Fatal("writeFd should return EAGAIN at some point") } func TestFileSetAppend(t *testing.T) { @@ -102,7 +124,7 @@ func TestFileSetAppend(t *testing.T) { require.NoError(t, os.WriteFile(fPath, []byte("0123456789"), 0o600)) // Open without APPEND. - f, errno := OpenOSFile(fPath, os.O_RDWR, 0o600) + f, errno := OpenOSFile(fPath, experimentalsys.O_RDWR, 0o600) require.EqualErrno(t, 0, errno) require.False(t, f.IsAppend()) @@ -131,6 +153,16 @@ func TestFileSetAppend(t *testing.T) { requireFileContent("wazero6789wazero") } +func TestStdioFile_SetAppend(t *testing.T) { + // SetAppend should not affect Stdio. + file, err := NewStdioFile(false, os.Stdout) + require.NoError(t, err) + errno := file.SetAppend(true) + require.EqualErrno(t, 0, errno) + _, errno = file.Write([]byte{}) + require.EqualErrno(t, 0, errno) +} + func TestFileIno(t *testing.T) { tmpDir := t.TempDir() dirFS, embedFS, mapFS := dirEmbedMapFS(t, tmpDir) @@ -142,7 +174,7 @@ func TestFileIno(t *testing.T) { tests := []struct { name string fs fs.FS - expectedIno uint64 + expectedIno sys.Inode }{ {name: "os.DirFS", fs: dirFS, expectedIno: st.Ino}, {name: "embed.api.FS", fs: embedFS}, @@ -153,39 +185,44 @@ func TestFileIno(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", syscall.O_RDONLY, 0) + d, errno := OpenFSFile(tc.fs, ".", experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() ino, errno := d.Ino() require.EqualErrno(t, 0, errno) - if !canReadDirInode() { - tc.expectedIno = 0 + // Results are inconsistent, so don't validate the opposite. + if statSetsIno() { + require.Equal(t, tc.expectedIno, ino) } - require.Equal(t, tc.expectedIno, ino) }) } t.Run("OS", func(t *testing.T) { - d, errno := OpenOSFile(tmpDir, syscall.O_RDONLY, 0) + d, errno := OpenOSFile(tmpDir, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() ino, errno := d.Ino() require.EqualErrno(t, 0, errno) - if canReadDirInode() { + // Results are inconsistent, so don't validate the opposite. + if statSetsIno() { require.Equal(t, st.Ino, ino) - } else { - require.Zero(t, ino) } }) } -func canReadDirInode() bool { +// statSetsIno returns true if this will set sys.Stat_t Ino on stat. The +// reverse doesn't mean it won't. Rather it is inconsistent. This is needed +// because Windows on Go 1.18 sometimes, but not always returns non-zero inode. +func statSetsIno() bool { if runtime.GOOS != "windows" { return true } else { - return strings.HasPrefix(runtime.Version(), "go1.20") + // Go can read the inode via a Windows file handle, but it is + // inconsistent on Go 1.18. + // TODO: check on 1.19 can! + return platform.IsAtLeastGo120 } } @@ -206,7 +243,7 @@ func TestFileIsDir(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Run("file", func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, wazeroFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -216,7 +253,7 @@ func TestFileIsDir(t *testing.T) { }) t.Run("dir", func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", syscall.O_RDONLY, 0) + d, errno := OpenFSFile(tc.fs, ".", experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -228,7 +265,7 @@ func TestFileIsDir(t *testing.T) { } t.Run("OS dir", func(t *testing.T) { - d, errno := OpenOSFile(t.TempDir(), syscall.O_RDONLY, 0) + d, errno := OpenOSFile(t.TempDir(), experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -256,7 +293,7 @@ func TestFileReadAndPread(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, wazeroFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -282,7 +319,9 @@ func TestFileReadAndPread(t *testing.T) { } } -func TestFilePollRead(t *testing.T) { +func TestFilePoll_POLLIN(t *testing.T) { + pflag := fsapi.POLLIN + // Test using os.Pipe as it is known to support poll. r, w, err := os.Pipe() require.NoError(t, err) @@ -292,14 +331,10 @@ func TestFilePollRead(t *testing.T) { rF, err := NewStdioFile(true, r) require.NoError(t, err) buf := make([]byte, 10) - timeout := time.Duration(0) // return immediately + timeout := int32(0) // return immediately // When there's nothing in the pipe, it isn't ready. - ready, errno := rF.PollRead(&timeout) - if runtime.GOOS == "windows" { - require.EqualErrno(t, syscall.ENOSYS, errno) - t.Skip("TODO: windows File.PollRead") - } + ready, errno := rF.Poll(pflag, timeout) require.EqualErrno(t, 0, errno) require.False(t, ready) @@ -309,7 +344,7 @@ func TestFilePollRead(t *testing.T) { require.NoError(t, err) // We should now be able to poll ready - ready, errno = rF.PollRead(&timeout) + ready, errno = rF.Poll(pflag, timeout) require.EqualErrno(t, 0, errno) require.True(t, ready) @@ -320,13 +355,32 @@ func TestFilePollRead(t *testing.T) { require.Equal(t, expected, buf[:len(expected)]) } -func requireRead(t *testing.T, f fsapi.File, buf []byte) { +func TestFilePoll_POLLOUT(t *testing.T) { + pflag := fsapi.POLLOUT + + // Test using os.Pipe as it is known to support poll. + r, w, err := os.Pipe() + require.NoError(t, err) + defer r.Close() + defer w.Close() + + wF, err := NewStdioFile(false, w) + require.NoError(t, err) + timeout := int32(0) // return immediately + + // We don't yet implement write blocking. + ready, errno := wF.Poll(pflag, timeout) + require.EqualErrno(t, experimentalsys.ENOTSUP, errno) + require.False(t, ready) +} + +func requireRead(t *testing.T, f experimentalsys.File, buf []byte) { n, errno := f.Read(buf) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } -func requirePread(t *testing.T, f fsapi.File, buf []byte, off int64) { +func requirePread(t *testing.T, f experimentalsys.File, buf []byte, off int64) { n, errno := f.Pread(buf, off) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) @@ -350,7 +404,7 @@ func TestFileRead_empty(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -383,13 +437,13 @@ func TestFilePread_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() buf := make([]byte, 3) _, errno = f.Pread(buf, 0) - require.EqualErrno(t, syscall.ENOSYS, errno) + require.EqualErrno(t, experimentalsys.ENOSYS, errno) } func TestFileRead_Errors(t *testing.T) { @@ -397,20 +451,20 @@ func TestFileRead_Errors(t *testing.T) { path := path.Join(t.TempDir(), emptyFile) // Open the file write-only - flag := syscall.O_WRONLY | syscall.O_CREAT + flag := experimentalsys.O_WRONLY | experimentalsys.O_CREAT f := requireOpenFile(t, path, flag, 0o600) defer f.Close() buf := make([]byte, 5) tests := []struct { name string - fn func(fsapi.File) syscall.Errno + fn func(experimentalsys.File) experimentalsys.Errno }{ - {name: "Read", fn: func(f fsapi.File) syscall.Errno { + {name: "Read", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Read(buf) return errno }}, - {name: "Pread", fn: func(f fsapi.File) syscall.Errno { + {name: "Pread", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Pread(buf, 0) return errno }}, @@ -423,7 +477,7 @@ func TestFileRead_Errors(t *testing.T) { t.Run("EBADF when not open for reading", func(t *testing.T) { // The descriptor exists, but not open for reading errno := tc.fn(f) - require.EqualErrno(t, syscall.EBADF, errno) + require.EqualErrno(t, experimentalsys.EBADF, errno) }) testEISDIR(t, tc.fn) }) @@ -431,15 +485,25 @@ func TestFileRead_Errors(t *testing.T) { } func TestFileSeek(t *testing.T) { - dirFS, embedFS, mapFS := dirEmbedMapFS(t, t.TempDir()) + tmpDir := t.TempDir() + dirFS, embedFS, mapFS := dirEmbedMapFS(t, tmpDir) tests := []struct { - name string - fs fs.FS + name string + openFile func(string) (experimentalsys.File, experimentalsys.Errno) }{ - {name: "os.DirFS", fs: dirFS}, - {name: "embed.api.FS", fs: embedFS}, - {name: "fstest.MapFS", fs: mapFS}, + {name: "fsFile os.DirFS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(dirFS, name, experimentalsys.O_RDONLY, 0) + }}, + {name: "fsFile embed.api.FS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(embedFS, name, experimentalsys.O_RDONLY, 0) + }}, + {name: "fsFile fstest.MapFS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(mapFS, name, experimentalsys.O_RDONLY, 0) + }}, + {name: "osFile", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenOSFile(path.Join(tmpDir, name), experimentalsys.O_RDONLY, 0o666) + }}, } buf := make([]byte, 3) @@ -448,19 +512,19 @@ func TestFileSeek(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, syscall.O_RDONLY, 0) + f, errno := tc.openFile(wazeroFile) require.EqualErrno(t, 0, errno) defer f.Close() // Shouldn't be able to use an invalid whence _, errno = f.Seek(0, io.SeekEnd+1) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) _, errno = f.Seek(0, -1) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) // Shouldn't be able to seek before the file starts. _, errno = f.Seek(-1, io.SeekStart) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) requireRead(t, f, buf) // read 3 bytes @@ -491,32 +555,41 @@ func TestFileSeek(t *testing.T) { require.Equal(t, "o\n", string(buf[:2])) t.Run("directory seek to zero", func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", syscall.O_RDONLY, 0) + dotF, errno := tc.openFile(".") require.EqualErrno(t, 0, errno) - defer d.Close() + defer dotF.Close() - _, errno = d.Seek(0, io.SeekStart) + dirents, errno := dotF.Readdir(-1) require.EqualErrno(t, 0, errno) - }) - }) - } + direntCount := len(dirents) + require.False(t, direntCount == 0) - t.Run("os.File directory seek to zero", func(t *testing.T) { - d := requireOpenFile(t, os.TempDir(), syscall.O_RDONLY|fsapi.O_DIRECTORY, 0o666) - defer d.Close() + // rewind via seek to zero + newOffset, errno := dotF.Seek(0, io.SeekStart) + require.EqualErrno(t, 0, errno) + require.Zero(t, newOffset) - _, errno := d.Seek(0, io.SeekStart) - require.EqualErrno(t, 0, errno) - }) + // redundantly seek to zero again + newOffset, errno = dotF.Seek(0, io.SeekStart) + require.EqualErrno(t, 0, errno) + require.Zero(t, newOffset) - seekToZero := func(f fsapi.File) syscall.Errno { - _, errno := f.Seek(0, io.SeekStart) - return errno + // We should be able to read again + dirents, errno = dotF.Readdir(-1) + require.EqualErrno(t, 0, errno) + require.Equal(t, direntCount, len(dirents)) + }) + + seekToZero := func(f experimentalsys.File) experimentalsys.Errno { + _, errno := f.Seek(0, io.SeekStart) + return errno + } + testEBADFIfFileClosed(t, seekToZero) + }) } - testEBADFIfFileClosed(t, seekToZero) } -func requireSeek(t *testing.T, f fsapi.File, off int64, whence int) int64 { +func requireSeek(t *testing.T, f experimentalsys.File, off int64, whence int) int64 { n, errno := f.Seek(off, whence) require.EqualErrno(t, 0, errno) return n @@ -538,7 +611,7 @@ func TestFileSeek_empty(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -561,19 +634,19 @@ func TestFileSeek_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() _, errno = f.Seek(0, io.SeekCurrent) - require.EqualErrno(t, syscall.ENOSYS, errno) + require.EqualErrno(t, experimentalsys.ENOSYS, errno) } func TestFileWriteAndPwrite(t *testing.T) { - // fsapi.FS doesn't support writes, and there is no other built-in + // sys.FS doesn't support writes, and there is no other built-in // implementation except os.File. path := path.Join(t.TempDir(), wazeroFile) - f := requireOpenFile(t, path, syscall.O_RDWR|os.O_CREATE, 0o600) + f := requireOpenFile(t, path, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() text := "wazero" @@ -610,36 +683,36 @@ func TestFileWriteAndPwrite(t *testing.T) { require.Equal(t, "wazerowazeroero", string(b)) } -func requireWrite(t *testing.T, f fsapi.File, buf []byte) { +func requireWrite(t *testing.T, f experimentalsys.File, buf []byte) { n, errno := f.Write(buf) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } -func requirePwrite(t *testing.T, f fsapi.File, buf []byte, off int64) { +func requirePwrite(t *testing.T, f experimentalsys.File, buf []byte, off int64) { n, errno := f.Pwrite(buf, off) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } func TestFileWrite_empty(t *testing.T) { - // fsapi.FS doesn't support writes, and there is no other built-in + // sys.FS doesn't support writes, and there is no other built-in // implementation except os.File. path := path.Join(t.TempDir(), emptyFile) - f := requireOpenFile(t, path, syscall.O_RDWR|os.O_CREATE, 0o600) + f := requireOpenFile(t, path, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() tests := []struct { name string - fn func(fsapi.File, []byte) (int, syscall.Errno) + fn func(experimentalsys.File, []byte) (int, experimentalsys.Errno) }{ - {name: "Write", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Write", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Write(buf) }}, - {name: "Pwrite from zero", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Pwrite from zero", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 0) }}, - {name: "Pwrite from 3", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Pwrite from 3", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 3) }}, } @@ -666,19 +739,19 @@ func TestFileWrite_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - // Use syscall.O_RDWR so that it fails due to type not flags - f, errno := OpenFSFile(&maskFS{embedFS}, wazeroFile, syscall.O_RDWR, 0) + // Use sys.O_RDWR so that it fails due to type not flags + f, errno := OpenFSFile(&maskFS{embedFS}, wazeroFile, experimentalsys.O_RDWR, 0) require.EqualErrno(t, 0, errno) defer f.Close() tests := []struct { name string - fn func(fsapi.File, []byte) (int, syscall.Errno) + fn func(experimentalsys.File, []byte) (int, experimentalsys.Errno) }{ - {name: "Write", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Write", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Write(buf) }}, - {name: "Pwrite", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Pwrite", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 0) }}, } @@ -690,7 +763,7 @@ func TestFileWrite_Unsupported(t *testing.T) { t.Run(tc.name, func(t *testing.T) { _, errno := tc.fn(f, buf) - require.EqualErrno(t, syscall.ENOSYS, errno) + require.EqualErrno(t, experimentalsys.ENOSYS, errno) }) } } @@ -703,20 +776,20 @@ func TestFileWrite_Errors(t *testing.T) { require.NoError(t, of.Close()) // Open the file read-only - flag := syscall.O_RDONLY + flag := experimentalsys.O_RDONLY f := requireOpenFile(t, path, flag, 0o600) defer f.Close() buf := []byte("wazero") tests := []struct { name string - fn func(fsapi.File) syscall.Errno + fn func(experimentalsys.File) experimentalsys.Errno }{ - {name: "Write", fn: func(f fsapi.File) syscall.Errno { + {name: "Write", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Write(buf) return errno }}, - {name: "Pwrite", fn: func(f fsapi.File) syscall.Errno { + {name: "Pwrite", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Pwrite(buf, 0) return errno }}, @@ -729,7 +802,7 @@ func TestFileWrite_Errors(t *testing.T) { t.Run("EBADF when not open for writing", func(t *testing.T) { // The descriptor exists, but not open for writing errno := tc.fn(f) - require.EqualErrno(t, syscall.EBADF, errno) + require.EqualErrno(t, experimentalsys.EBADF, errno) }) testEISDIR(t, tc.fn) }) @@ -737,30 +810,30 @@ func TestFileWrite_Errors(t *testing.T) { } func TestFileSync_NoError(t *testing.T) { - testSync_NoError(t, fsapi.File.Sync) + testSync_NoError(t, experimentalsys.File.Sync) } func TestFileDatasync_NoError(t *testing.T) { - testSync_NoError(t, fsapi.File.Datasync) + testSync_NoError(t, experimentalsys.File.Datasync) } -func testSync_NoError(t *testing.T, sync func(fsapi.File) syscall.Errno) { +func testSync_NoError(t *testing.T, sync func(experimentalsys.File) experimentalsys.Errno) { roPath := "file_test.go" - ro, errno := OpenFSFile(embedFS, roPath, syscall.O_RDONLY, 0) + ro, errno := OpenFSFile(embedFS, roPath, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer ro.Close() rwPath := path.Join(t.TempDir(), "datasync") - rw, errno := OpenOSFile(rwPath, syscall.O_CREAT|syscall.O_RDWR, 0o600) + rw, errno := OpenOSFile(rwPath, experimentalsys.O_CREAT|experimentalsys.O_RDWR, 0o600) require.EqualErrno(t, 0, errno) defer rw.Close() tests := []struct { name string - f fsapi.File + f experimentalsys.File }{ - {name: "UnimplementedFile", f: fsapi.UnimplementedFile{}}, - {name: "File of read-only fs.File", f: ro}, + {name: "UnimplementedFile", f: experimentalsys.UnimplementedFile{}}, + {name: "File of read-only FS.File", f: ro}, {name: "File of os.File", f: rw}, } @@ -774,20 +847,20 @@ func testSync_NoError(t *testing.T, sync func(fsapi.File) syscall.Errno) { } func TestFileSync(t *testing.T) { - testSync(t, fsapi.File.Sync) + testSync(t, experimentalsys.File.Sync) } func TestFileDatasync(t *testing.T) { - testSync(t, fsapi.File.Datasync) + testSync(t, experimentalsys.File.Datasync) } // testSync doesn't guarantee sync works because the operating system may // sync anyway. There is no test in Go for syscall.Fdatasync, but closest is // similar to below. Effectively, this only tests that things don't error. -func testSync(t *testing.T, sync func(fsapi.File) syscall.Errno) { +func testSync(t *testing.T, sync func(experimentalsys.File) experimentalsys.Errno) { // Even though it is invalid, try to sync a directory dPath := t.TempDir() - d := requireOpenFile(t, dPath, syscall.O_RDONLY, 0) + d := requireOpenFile(t, dPath, experimentalsys.O_RDONLY, 0) defer d.Close() errno := sync(d) @@ -795,7 +868,7 @@ func testSync(t *testing.T, sync func(fsapi.File) syscall.Errno) { fPath := path.Join(dPath, t.Name()) - f := requireOpenFile(t, fPath, syscall.O_RDWR|os.O_CREATE, 0o600) + f := requireOpenFile(t, fPath, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() expected := "hello world!" @@ -876,7 +949,7 @@ func TestFileTruncate(t *testing.T) { }) } - truncateToZero := func(f fsapi.File) syscall.Errno { + truncateToZero := func(f experimentalsys.File) experimentalsys.Errno { return f.Truncate(0) } @@ -894,7 +967,7 @@ func TestFileTruncate(t *testing.T) { defer f.Close() errno := f.Truncate(-1) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) }) } @@ -903,7 +976,7 @@ func TestFileUtimens(t *testing.T) { case "linux", "darwin": // supported case "freebsd": // TODO: support freebsd w/o CGO case "windows": - if !platform.IsGo120 { + if !platform.IsAtLeastGo120 { t.Skip("windows only works after Go 1.20") // TODO: possibly 1.19 ;) } default: // expect ENOSYS and callers need to fall back to Utimens @@ -912,11 +985,11 @@ func TestFileUtimens(t *testing.T) { testUtimens(t, true) - testEBADFIfFileClosed(t, func(f fsapi.File) syscall.Errno { - return f.Utimens(nil) + testEBADFIfFileClosed(t, func(f experimentalsys.File) experimentalsys.Errno { + return f.Utimens(experimentalsys.UTIME_OMIT, experimentalsys.UTIME_OMIT) }) - testEBADFIfDirClosed(t, func(d fsapi.File) syscall.Errno { - return d.Utimens(nil) + testEBADFIfDirClosed(t, func(d experimentalsys.File) experimentalsys.Errno { + return d.Utimens(experimentalsys.UTIME_OMIT, experimentalsys.UTIME_OMIT) }) } @@ -944,7 +1017,7 @@ func TestNewStdioFile(t *testing.T) { tests := []struct { name string - f fsapi.File + f experimentalsys.File // Depending on how the tests run, os.Stdin won't necessarily be a char // device. We compare against an os.File, to account for this. expectedType fs.FileMode @@ -989,18 +1062,18 @@ func TestNewStdioFile(t *testing.T) { } } -func testEBADFIfDirClosed(t *testing.T, fn func(fsapi.File) syscall.Errno) bool { +func testEBADFIfDirClosed(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EBADF if dir closed", func(t *testing.T) { - d := requireOpenFile(t, t.TempDir(), syscall.O_RDONLY, 0o755) + d := requireOpenFile(t, t.TempDir(), experimentalsys.O_RDONLY, 0o755) // close the directory underneath require.EqualErrno(t, 0, d.Close()) - require.EqualErrno(t, syscall.EBADF, fn(d)) + require.EqualErrno(t, experimentalsys.EBADF, fn(d)) }) } -func testEBADFIfFileClosed(t *testing.T, fn func(fsapi.File) syscall.Errno) bool { +func testEBADFIfFileClosed(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EBADF if file closed", func(t *testing.T) { tmpDir := t.TempDir() @@ -1009,28 +1082,28 @@ func testEBADFIfFileClosed(t *testing.T, fn func(fsapi.File) syscall.Errno) bool // close the file underneath require.EqualErrno(t, 0, f.Close()) - require.EqualErrno(t, syscall.EBADF, fn(f)) + require.EqualErrno(t, experimentalsys.EBADF, fn(f)) }) } -func testEISDIR(t *testing.T, fn func(fsapi.File) syscall.Errno) bool { +func testEISDIR(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EISDIR if directory", func(t *testing.T) { - f := requireOpenFile(t, os.TempDir(), syscall.O_RDONLY|fsapi.O_DIRECTORY, 0o666) + f := requireOpenFile(t, os.TempDir(), experimentalsys.O_RDONLY|experimentalsys.O_DIRECTORY, 0o666) defer f.Close() - require.EqualErrno(t, syscall.EISDIR, fn(f)) + require.EqualErrno(t, experimentalsys.EISDIR, fn(f)) }) } -func openForWrite(t *testing.T, path string, content []byte) fsapi.File { +func openForWrite(t *testing.T, path string, content []byte) experimentalsys.File { require.NoError(t, os.WriteFile(path, content, 0o0666)) - f := requireOpenFile(t, path, syscall.O_RDWR, 0o666) + f := requireOpenFile(t, path, experimentalsys.O_RDWR, 0o666) _, errno := f.Write(content) require.EqualErrno(t, 0, errno) return f } -func requireOpenFile(t *testing.T, path string, flag int, perm fs.FileMode) fsapi.File { +func requireOpenFile(t *testing.T, path string, flag experimentalsys.Oflag, perm fs.FileMode) experimentalsys.File { f, errno := OpenOSFile(path, flag, perm) require.EqualErrno(t, 0, errno) return f diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go index e451df820b..f56439e081 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go @@ -5,17 +5,35 @@ package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -const NonBlockingFileIoSupported = true +const ( + nonBlockingFileReadSupported = true + nonBlockingFileWriteSupported = true +) + +func rmdir(path string) sys.Errno { + err := syscall.Rmdir(path) + return sys.UnwrapOSError(err) +} // readFd exposes syscall.Read. -func readFd(fd uintptr, buf []byte) (int, syscall.Errno) { +func readFd(fd uintptr, buf []byte) (int, sys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len reads. } n, err := syscall.Read(int(fd), buf) - errno := platform.UnwrapOSError(err) + errno := sys.UnwrapOSError(err) + return n, errno +} + +// writeFd exposes syscall.Write. +func writeFd(fd uintptr, buf []byte) (int, sys.Errno) { + if len(buf) == 0 { + return 0, 0 // Short-circuit 0-len writes. + } + n, err := syscall.Write(int(fd), buf) + errno := sys.UnwrapOSError(err) return n, errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go index cb4bddb339..54e224bbf9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go @@ -1,12 +1,28 @@ -//go:build !unix && !linux && !darwin +//go:build !unix && !linux && !darwin && !windows package sysfs -import "syscall" +import ( + "os" -const NonBlockingFileIoSupported = false + "github.com/tetratelabs/wazero/experimental/sys" +) + +const ( + nonBlockingFileReadSupported = false + nonBlockingFileWriteSupported = false +) + +func rmdir(path string) sys.Errno { + return sys.UnwrapOSError(os.Remove(path)) +} // readFd returns ENOSYS on unsupported platforms. -func readFd(fd uintptr, buf []byte) (int, syscall.Errno) { - return -1, syscall.ENOSYS +func readFd(fd uintptr, buf []byte) (int, sys.Errno) { + return -1, sys.ENOSYS +} + +// writeFd returns ENOSYS on unsupported platforms. +func writeFd(fd uintptr, buf []byte) (int, sys.Errno) { + return -1, sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go new file mode 100644 index 0000000000..3ad9648e65 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go @@ -0,0 +1,88 @@ +package sysfs + +import ( + "syscall" + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const ( + nonBlockingFileReadSupported = true + nonBlockingFileWriteSupported = false +) + +var kernel32 = syscall.NewLazyDLL("kernel32.dll") + +// procPeekNamedPipe is the syscall.LazyProc in kernel32 for PeekNamedPipe +var procPeekNamedPipe = kernel32.NewProc("PeekNamedPipe") + +// readFd returns ENOSYS on unsupported platforms. +// +// PeekNamedPipe: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe +// "GetFileType can assist in determining what device type the handle refers to. A console handle presents as FILE_TYPE_CHAR." +// https://learn.microsoft.com/en-us/windows/console/console-handles +func readFd(fd uintptr, buf []byte) (int, sys.Errno) { + handle := syscall.Handle(fd) + fileType, err := syscall.GetFileType(handle) + if err != nil { + return 0, sys.UnwrapOSError(err) + } + if fileType&syscall.FILE_TYPE_CHAR == 0 { + return -1, sys.ENOSYS + } + n, errno := peekNamedPipe(handle) + if errno == syscall.ERROR_BROKEN_PIPE { + return 0, 0 + } + if n == 0 { + return -1, sys.EAGAIN + } + un, err := syscall.Read(handle, buf[0:n]) + return un, sys.UnwrapOSError(err) +} + +func writeFd(fd uintptr, buf []byte) (int, sys.Errno) { + return -1, sys.ENOSYS +} + +func readSocket(h syscall.Handle, buf []byte) (int, sys.Errno) { + var overlapped syscall.Overlapped + var done uint32 + errno := syscall.ReadFile(h, buf, &done, &overlapped) + if errno == syscall.ERROR_IO_PENDING { + errno = sys.EAGAIN + } + return int(done), sys.UnwrapOSError(errno) +} + +func writeSocket(fd uintptr, buf []byte) (int, sys.Errno) { + var done uint32 + var overlapped syscall.Overlapped + errno := syscall.WriteFile(syscall.Handle(fd), buf, &done, &overlapped) + if errno == syscall.ERROR_IO_PENDING { + errno = syscall.EAGAIN + } + return int(done), sys.UnwrapOSError(errno) +} + +// peekNamedPipe partially exposes PeekNamedPipe from the Win32 API +// see https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe +func peekNamedPipe(handle syscall.Handle) (uint32, syscall.Errno) { + var totalBytesAvail uint32 + totalBytesPtr := unsafe.Pointer(&totalBytesAvail) + _, _, errno := syscall.SyscallN( + procPeekNamedPipe.Addr(), + uintptr(handle), // [in] HANDLE hNamedPipe, + 0, // [out, optional] LPVOID lpBuffer, + 0, // [in] DWORD nBufferSize, + 0, // [out, optional] LPDWORD lpBytesRead + uintptr(totalBytesPtr), // [out, optional] LPDWORD lpTotalBytesAvail, + 0) // [out, optional] LPDWORD lpBytesLeftThisMessage + return totalBytesAvail, errno +} + +func rmdir(path string) sys.Errno { + err := syscall.Rmdir(path) + return sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go index 1c2bceadc4..1f670ca116 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go @@ -1,132 +1,37 @@ +//go:build linux || darwin + package sysfs import ( "syscall" - "time" "unsafe" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" -) - -const ( - // UTIME_NOW is a special syscall.Timespec NSec value used to set the - // file's timestamp to a value close to, but not greater than the current - // system time. - UTIME_NOW = _UTIME_NOW - - // UTIME_OMIT is a special syscall.Timespec NSec value used to avoid - // setting the file's timestamp. - UTIME_OMIT = _UTIME_OMIT + "github.com/tetratelabs/wazero/experimental/sys" ) -// Utimens set file access and modification times on a path resolved to the -// current working directory, at nanosecond precision. -// -// # Parameters -// -// The `times` parameter includes the access and modification timestamps to -// assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT may be -// specified instead of real timestamps. A nil `times` parameter behaves the -// same as if both were set to UTIME_NOW. -// -// When the `symlinkFollow` parameter is true and the path is a symbolic link, -// the target of expanding that link is updated. -// -// # Errors -// -// A zero syscall.Errno is success. The below are expected otherwise: -// - syscall.ENOSYS: the implementation does not support this function. -// - syscall.EINVAL: `path` is invalid. -// - syscall.EEXIST: `path` exists and is a directory. -// - syscall.ENOTDIR: `path` exists and is a file. -// -// # Notes -// -// - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in -// POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html -func Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - err := utimens(path, times, symlinkFollow) - return platform.UnwrapOSError(err) -} - -var _zero uintptr //nolint:unused - func timesToPtr(times *[2]syscall.Timespec) unsafe.Pointer { //nolint:unused - var _p0 unsafe.Pointer if times != nil { - _p0 = unsafe.Pointer(×[0]) - } else { - _p0 = unsafe.Pointer(&_zero) + return unsafe.Pointer(×[0]) } - return _p0 + return unsafe.Pointer(nil) } -func utimensPortable(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { //nolint:unused - if !symlinkFollow { - return syscall.ENOSYS - } - - // Handle when both inputs are current system time. - if times == nil || times[0].Nsec == UTIME_NOW && times[1].Nsec == UTIME_NOW { - ts := nowTimespec() - return syscall.UtimesNano(path, []syscall.Timespec{ts, ts}) - } - +func timesToTimespecs(atim int64, mtim int64) (times *[2]syscall.Timespec) { // When both inputs are omitted, there is nothing to change. - if times[0].Nsec == UTIME_OMIT && times[1].Nsec == UTIME_OMIT { - return nil - } - - // Handle when neither input are special values - if times[0].Nsec != UTIME_NOW && times[1].Nsec != UTIME_NOW && - times[0].Nsec != UTIME_OMIT && times[1].Nsec != UTIME_OMIT { - return syscall.UtimesNano(path, times[:]) + if atim == sys.UTIME_OMIT && mtim == sys.UTIME_OMIT { + return } - // Now, either atim or mtim is a special value, but not both. - - // Now, either one of the inputs is a special value, or neither. This means - // we don't have a risk of re-reading the clock or re-doing stat. - if atim, err := normalizeTimespec(path, times, 0); err != 0 { - return err - } else if mtim, err := normalizeTimespec(path, times, 1); err != 0 { - return err + times = &[2]syscall.Timespec{} + if atim == sys.UTIME_OMIT { + times[0] = syscall.Timespec{Nsec: _UTIME_OMIT} + times[1] = syscall.NsecToTimespec(mtim) + } else if mtim == sys.UTIME_OMIT { + times[0] = syscall.NsecToTimespec(atim) + times[1] = syscall.Timespec{Nsec: _UTIME_OMIT} } else { - return syscall.UtimesNano(path, []syscall.Timespec{atim, mtim}) - } -} - -func normalizeTimespec(path string, times *[2]syscall.Timespec, i int) (ts syscall.Timespec, err syscall.Errno) { //nolint:unused - switch times[i].Nsec { - case UTIME_NOW: // declined in Go per golang/go#31880. - ts = nowTimespec() - return - case UTIME_OMIT: - // UTIME_OMIT is expensive until progress is made in Go, as it requires a - // stat to read-back the value to re-apply. - // - https://github.com/golang/go/issues/32558. - // - https://go-review.googlesource.com/c/go/+/219638 (unmerged) - var st fsapi.Stat_t - if st, err = stat(path); err != 0 { - return - } - switch i { - case 0: - ts = syscall.NsecToTimespec(st.Atim) - case 1: - ts = syscall.NsecToTimespec(st.Mtim) - default: - panic("BUG") - } - return - default: // not special - ts = times[i] - return + times[0] = syscall.NsecToTimespec(atim) + times[1] = syscall.NsecToTimespec(mtim) } -} - -func nowTimespec() syscall.Timespec { //nolint:unused - now := time.Now().UnixNano() - return syscall.NsecToTimespec(now) + return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go index f4ede33778..88e4008f0a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go @@ -2,38 +2,40 @@ package sysfs import ( "syscall" - _ "unsafe" // for go:linkname + _ "unsafe" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) const ( - _AT_FDCWD = -0x2 - _AT_SYMLINK_NOFOLLOW = 0x0020 - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = true + _AT_FDCWD = -0x2 + _AT_SYMLINK_NOFOLLOW = 0x0020 + _UTIME_OMIT = -2 ) //go:noescape //go:linkname utimensat syscall.utimensat func utimensat(dirfd int, path string, times *[2]syscall.Timespec, flags int) error -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { - var flags int - if !symlinkFollow { - flags = _AT_SYMLINK_NOFOLLOW +func utimens(path string, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 } - return utimensat(_AT_FDCWD, path, times, flags) + var flags int + return experimentalsys.UnwrapOSError(utimensat(_AT_FDCWD, path, times, flags)) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } _p0 := timesToPtr(times) // Warning: futimens only exists since High Sierra (10.13). _, _, e1 := syscall_syscall6(libc_futimens_trampoline_addr, fd, uintptr(_p0), 0, 0, 0, 0) - if e1 != 0 { - return e1 - } - return nil + return experimentalsys.UnwrapOSError(e1) } // libc_futimens_trampoline_addr is the address of the diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go index a7ae264d2b..3ec68537be 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go @@ -3,34 +3,38 @@ package sysfs import ( "syscall" "unsafe" - _ "unsafe" // for go:linkname + _ "unsafe" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) const ( - _AT_FDCWD = -0x64 - _AT_SYMLINK_NOFOLLOW = 0x100 - _UTIME_NOW = (1 << 30) - 1 - _UTIME_OMIT = (1 << 30) - 2 - SupportsSymlinkNoFollow = true + _AT_FDCWD = -0x64 + _UTIME_OMIT = (1 << 30) - 2 ) -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) (err error) { - var flags int - if !symlinkFollow { - flags = _AT_SYMLINK_NOFOLLOW +func utimens(path string, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 } + var flags int var _p0 *byte - _p0, err = syscall.BytePtrFromString(path) - if err != nil { - return + _p0, err := syscall.BytePtrFromString(path) + if err == nil { + err = utimensat(_AT_FDCWD, uintptr(unsafe.Pointer(_p0)), times, flags) } - return utimensat(_AT_FDCWD, uintptr(unsafe.Pointer(_p0)), times, flags) + return experimentalsys.UnwrapOSError(err) } // On linux, implement futimens via utimensat with the NUL path. -func futimens(fd uintptr, times *[2]syscall.Timespec) error { - return utimensat(int(fd), 0 /* NUL */, times, 0) +func futimens(fd uintptr, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } + return experimentalsys.UnwrapOSError(utimensat(int(fd), 0 /* NUL */, times, 0)) } // utimensat is like syscall.utimensat special-cased to accept a NUL string for the path value. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go index 60860e6c48..c78a16b407 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go @@ -2,22 +2,17 @@ package sysfs -import "syscall" - -// Define values even if not used except as sentinels. -const ( - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = false +import ( + "github.com/tetratelabs/wazero/experimental/sys" ) -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { - return utimensPortable(path, times, symlinkFollow) +func utimens(path string, atim, mtim int64) sys.Errno { + return chtimes(path, atim, mtim) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) error { // Go exports syscall.Futimes, which is microsecond granularity, and // WASI tests expect nanosecond. We don't yet have a way to invoke the // futimens syscall portably. - return syscall.ENOSYS + return sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go index 39696067ee..3a5289b70b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go @@ -2,33 +2,26 @@ package sysfs import ( "syscall" - "time" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" ) -// Define values even if not used except as sentinels. -const ( - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = false -) - -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { - return utimensPortable(path, times, symlinkFollow) +func utimens(path string, atim, mtim int64) sys.Errno { + return chtimes(path, atim, mtim) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) error { // Before Go 1.20, ERROR_INVALID_HANDLE was returned for too many reasons. // Kick out so that callers can use path-based operations instead. - if !platform.IsGo120 { - return syscall.ENOSYS + if !platform.IsAtLeastGo120 { + return sys.ENOSYS } // Per docs, zero isn't a valid timestamp as it cannot be differentiated - // from nil. In both cases, it is a marker like syscall.UTIME_OMIT. + // from nil. In both cases, it is a marker like sys.UTIME_OMIT. // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfiletime - a, w := timespecToFiletime(times) + a, w := timespecToFiletime(atim, mtim) if a == nil && w == nil { return nil // both omitted, so nothing to change @@ -41,32 +34,16 @@ func futimens(fd uintptr, times *[2]syscall.Timespec) error { return syscall.SetFileTime(h, nil, a, w) } -func timespecToFiletime(times *[2]syscall.Timespec) (a, w *syscall.Filetime) { - // Handle when both inputs are current system time. - if times == nil || times[0].Nsec == UTIME_NOW && times[1].Nsec == UTIME_NOW { - now := time.Now().UnixNano() - ft := syscall.NsecToFiletime(now) - return &ft, &ft - } - - // Now, either one of the inputs is current time, or neither. This - // means we don't have a risk of re-reading the clock. - a = timespecToFileTime(times, 0) - w = timespecToFileTime(times, 1) +func timespecToFiletime(atim, mtim int64) (a, w *syscall.Filetime) { + a = timespecToFileTime(atim) + w = timespecToFileTime(mtim) return } -func timespecToFileTime(times *[2]syscall.Timespec, i int) *syscall.Filetime { - if times[i].Nsec == UTIME_OMIT { +func timespecToFileTime(tim int64) *syscall.Filetime { + if tim == sys.UTIME_OMIT { return nil } - - var nsec int64 - if times[i].Nsec == UTIME_NOW { - nsec = time.Now().UnixNano() - } else { - nsec = syscall.TimespecToNsec(times[i]) - } - ft := syscall.NsecToFiletime(nsec) + ft := syscall.NsecToFiletime(tim) return &ft } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go new file mode 100644 index 0000000000..703f113660 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go @@ -0,0 +1,22 @@ +//go:build !windows && !plan9 + +package sysfs + +import ( + "io/fs" + "syscall" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" +) + +func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { + switch v := info.Sys().(type) { + case *sys.Stat_t: + return v.Ino, 0 + case *syscall.Stat_t: + return v.Ino, 0 + default: + return 0, 0 + } +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go new file mode 100644 index 0000000000..9c669a475c --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go @@ -0,0 +1,15 @@ +package sysfs + +import ( + "io/fs" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" +) + +func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { + if v, ok := info.Sys().(*sys.Stat_t); ok { + return v.Ino, 0 + } + return 0, 0 +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go new file mode 100644 index 0000000000..d163b3601e --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go @@ -0,0 +1,28 @@ +package sysfs + +import ( + "io/fs" + "path" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" +) + +// inoFromFileInfo uses stat to get the inode information of the file. +func inoFromFileInfo(dirPath string, info fs.FileInfo) (ino sys.Inode, errno experimentalsys.Errno) { + if v, ok := info.Sys().(*sys.Stat_t); ok { + return v.Ino, 0 + } + if dirPath == "" { + // This is a FS.File backed implementation which doesn't have access to + // the original file path. + return + } + // Ino is no not in Win32FileAttributeData + inoPath := path.Clean(path.Join(dirPath, info.Name())) + var st sys.Stat_t + if st, errno = lstat(inoPath); errno == 0 { + ino = st.Ino + } + return +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go new file mode 100644 index 0000000000..8e94e5922f --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go @@ -0,0 +1,11 @@ +package sysfs + +import "github.com/tetratelabs/wazero/experimental/sys" + +func setNonblock(fd uintptr, enable bool) sys.Errno { + return sys.ENOSYS +} + +func isNonblock(f *osFile) bool { + return false +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go index 1ac13e5397..07fb15cf12 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go @@ -1,9 +1,17 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs -import "syscall" +import ( + "syscall" -func setNonblock(fd uintptr, enable bool) error { - return syscall.SetNonblock(int(fd), enable) + "github.com/tetratelabs/wazero/experimental/sys" +) + +func setNonblock(fd uintptr, enable bool) sys.Errno { + return sys.UnwrapOSError(syscall.SetNonblock(int(fd), enable)) +} + +func isNonblock(f *osFile) bool { + return f.flag&sys.O_NONBLOCK == sys.O_NONBLOCK } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go index d4a29ac331..eb38ea5afa 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go @@ -1,9 +1,23 @@ -//go:build windows - package sysfs -import "syscall" +import ( + "io/fs" + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +func setNonblock(fd uintptr, enable bool) sys.Errno { + // We invoke the syscall, but this is currently no-op. + return sys.UnwrapOSError(syscall.SetNonblock(syscall.Handle(fd), enable)) +} -func setNonblock(fd uintptr, enable bool) error { - return syscall.SetNonblock(syscall.Handle(fd), enable) +func isNonblock(f *osFile) bool { + // On Windows, we support non-blocking reads only on named pipes. + isValid := false + st, errno := f.Stat() + if errno == 0 { + isValid = st.Mode&fs.ModeNamedPipe != 0 + } + return isValid && f.flag&sys.O_NONBLOCK == sys.O_NONBLOCK } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go new file mode 100644 index 0000000000..be6d2c35f6 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go @@ -0,0 +1,38 @@ +package sysfs + +import ( + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// toOsOpenFlag converts the input to the flag parameter of os.OpenFile +func toOsOpenFlag(oflag sys.Oflag) (flag int) { + // First flags are exclusive + switch oflag & (sys.O_RDONLY | sys.O_RDWR | sys.O_WRONLY) { + case sys.O_RDONLY: + flag |= os.O_RDONLY + case sys.O_RDWR: + flag |= os.O_RDWR + case sys.O_WRONLY: + flag |= os.O_WRONLY + } + + // Run down the flags defined in the os package + if oflag&sys.O_APPEND != 0 { + flag |= os.O_APPEND + } + if oflag&sys.O_CREAT != 0 { + flag |= os.O_CREATE + } + if oflag&sys.O_EXCL != 0 { + flag |= os.O_EXCL + } + if oflag&sys.O_SYNC != 0 { + flag |= os.O_SYNC + } + if oflag&sys.O_TRUNC != 0 { + flag |= os.O_TRUNC + } + return withSyscallOflag(oflag, flag) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go deleted file mode 100644 index 473f8ca638..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go +++ /dev/null @@ -1,26 +0,0 @@ -//go:build !windows && !js && !illumos && !solaris - -package sysfs - -import ( - "io/fs" - "os" - "syscall" - - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" -) - -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return newDefaultOsFile(openPath, openFlag, openPerm, f) -} - -// OpenFile is like os.OpenFile except it returns syscall.Errno. A zero -// syscall.Errno is success. -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - f, err := os.OpenFile(path, flag, perm) - // Note: This does not return a fsapi.File because fsapi.FS that returns - // one may want to hide the real OS path. For example, this is needed for - // pre-opens. - return f, platform.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go new file mode 100644 index 0000000000..a4f54ca2cc --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go @@ -0,0 +1,26 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + flag |= syscall.O_DIRECTORY + } + if oflag&sys.O_DSYNC != 0 { + flag |= syscall.O_DSYNC + } + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + // syscall.O_RSYNC not defined on darwin + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go new file mode 100644 index 0000000000..42adaa2140 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go @@ -0,0 +1,24 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_NOFOLLOW | sys.O_NONBLOCK + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + flag |= syscall.O_DIRECTORY + } + // syscall.O_DSYNC not defined on darwin + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + // syscall.O_RSYNC not defined on darwin + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go deleted file mode 100644 index e473acbe48..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go +++ /dev/null @@ -1,19 +0,0 @@ -package sysfs - -import ( - "io/fs" - "os" - "syscall" - - "github.com/tetratelabs/wazero/internal/platform" -) - -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) File { - return newDefaultOsFile(openPath, openFlag, openPerm, f) -} - -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - flag &= ^(O_DIRECTORY | O_NOFOLLOW) // erase placeholders - f, err := os.OpenFile(path, flag, perm) - return f, platform.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go new file mode 100644 index 0000000000..7f4915480c --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go @@ -0,0 +1,28 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK | sys.O_RSYNC + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + flag |= syscall.O_DIRECTORY + } + if oflag&sys.O_DSYNC != 0 { + flag |= syscall.O_DSYNC + } + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + if oflag&sys.O_RSYNC != 0 { + flag |= syscall.O_RSYNC + } + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go new file mode 100644 index 0000000000..9ae1e2bcdb --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go @@ -0,0 +1,20 @@ +//go:build !windows + +package sysfs + +import ( + "io/fs" + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// openFile is like os.OpenFile except it accepts a sys.Oflag and returns +// sys.Errno. A zero sys.Errno is success. +func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { + f, err := os.OpenFile(path, toOsOpenFlag(oflag), perm) + // Note: This does not return a sys.File because sys.FS that returns + // one may want to hide the real OS path. For example, this is needed for + // pre-opens. + return f, sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go index e23b7185c2..bdf7dd84d2 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go @@ -3,19 +3,29 @@ package sysfs import ( - "io/fs" - "os" "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return newDefaultOsFile(openPath, openFlag, openPerm, f) -} +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK | sys.O_RSYNC -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - f, err := os.OpenFile(path, flag, perm) - return f, platform.UnwrapOSError(err) +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + // See https://github.com/illumos/illumos-gate/blob/edd580643f2cf1434e252cd7779e83182ea84945/usr/src/uts/common/sys/fcntl.h#L90 + flag |= 0x1000000 + } + if oflag&sys.O_DSYNC != 0 { + flag |= syscall.O_DSYNC + } + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + if oflag&sys.O_RSYNC != 0 { + flag |= syscall.O_RSYNC + } + return flag } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go new file mode 100644 index 0000000000..9f7a6d0885 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go @@ -0,0 +1,18 @@ +//go:build !darwin && !linux && !windows && !illumos && !solaris && !freebsd + +package sysfs + +import ( + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.Oflag(0) + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + // O_DIRECTORY not defined + // O_DSYNC not defined + // O_NOFOLLOW not defined + // O_NONBLOCK not defined + // O_RSYNC not defined + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go index d9297d7e8b..bcfbfbcd6b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go @@ -7,19 +7,13 @@ import ( "syscall" "unsafe" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" ) -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return &windowsOsFile{ - osFile: osFile{path: openPath, flag: openFlag, perm: openPerm, file: f, fd: f.Fd()}, - } -} - -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - isDir := flag&fsapi.O_DIRECTORY > 0 - flag &= ^(fsapi.O_DIRECTORY | fsapi.O_NOFOLLOW) // erase placeholders +func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { + isDir := oflag&sys.O_DIRECTORY > 0 + flag := toOsOpenFlag(oflag) // TODO: document why we are opening twice fd, err := open(path, flag|syscall.O_CLOEXEC, uint32(perm)) @@ -29,37 +23,51 @@ func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) // TODO: Set FILE_SHARE_DELETE for directory as well. f, err := os.OpenFile(path, flag, perm) - errno := platform.UnwrapOSError(err) + errno := sys.UnwrapOSError(err) if errno == 0 { return f, 0 } switch errno { - case syscall.EINVAL: + case sys.EINVAL: // WASI expects ENOTDIR for a file path with a trailing slash. if strings.HasSuffix(path, "/") { - errno = syscall.ENOTDIR + errno = sys.ENOTDIR } // To match expectations of WASI, e.g. TinyGo TestStatBadDir, return // ENOENT, not ENOTDIR. - case syscall.ENOTDIR: - errno = syscall.ENOENT - case syscall.ENOENT: + case sys.ENOTDIR: + errno = sys.ENOENT + case sys.ENOENT: if isSymlink(path) { // Either symlink or hard link not found. We change the returned // errno depending on if it is symlink or not to have consistent // behavior across OSes. if isDir { // Dangling symlink dir must raise ENOTDIR. - errno = syscall.ENOTDIR + errno = sys.ENOTDIR } else { - errno = syscall.ELOOP + errno = sys.ELOOP } } } return f, errno } +const supportedSyscallOflag = sys.O_NONBLOCK + +// Map to synthetic values here https://github.com/golang/go/blob/go1.20/src/syscall/types_windows.go#L34-L48 +func withSyscallOflag(oflag sys.Oflag, flag int) int { + // O_DIRECTORY not defined in windows + // O_DSYNC not defined in windows + // O_NOFOLLOW not defined in windows + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + // O_RSYNC not defined in windows + return flag +} + func isSymlink(path string) bool { if st, e := os.Lstat(path); e == nil && st.Mode()&os.ModeSymlink != 0 { return true @@ -142,7 +150,7 @@ func open(path string, mode int, perm uint32) (fd syscall.Handle, err error) { } } - if platform.IsGo120 { + if platform.IsAtLeastGo120 { // This shouldn't be included before 1.20 to have consistent behavior. // https://github.com/golang/go/commit/0f0aa5d8a6a0253627d58b3aa083b24a1091933f if createmode == syscall.OPEN_EXISTING && access == syscall.GENERIC_READ { @@ -154,46 +162,3 @@ func open(path string, mode int, perm uint32) (fd syscall.Handle, err error) { h, e := syscall.CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0) return h, e } - -// windowsOsFile overrides osFile to special case directory handling in Windows. -type windowsOsFile struct { - osFile - - dirInitialized bool -} - -// Readdir implements File.Readdir -func (f *windowsOsFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if errno = f.maybeInitDir(); errno != 0 { - return - } - - return f.osFile.Readdir(n) -} - -func (f *windowsOsFile) maybeInitDir() syscall.Errno { - if f.dirInitialized { - return 0 - } - - if isDir, errno := f.IsDir(); errno != 0 { - return errno - } else if !isDir { - return syscall.ENOTDIR - } - - // On Windows, once the directory is opened, changes to the directory are - // not visible on ReadDir on that already-opened file handle. - // - // To provide consistent behavior with other platforms, we re-open it. - if errno := f.osFile.Close(); errno != 0 { - return errno - } - newW, errno := openFile(f.path, f.flag, f.perm) - if errno != 0 { - return errno - } - f.osFile.file = newW - f.dirInitialized = true - return 0 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go index 95798f4820..ac0df777a9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go @@ -4,77 +4,99 @@ import ( "io" "io/fs" "os" - "syscall" - "time" + "runtime" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/sys" ) -func newDefaultOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return &osFile{path: openPath, flag: openFlag, perm: openPerm, file: f, fd: f.Fd()} +func newOsFile(path string, flag experimentalsys.Oflag, perm fs.FileMode, f *os.File) fsapi.File { + // Windows cannot read files written to a directory after it was opened. + // This was noticed in #1087 in zig tests. Use a flag instead of a + // different type. + reopenDir := runtime.GOOS == "windows" + return &osFile{path: path, flag: flag, perm: perm, reopenDir: reopenDir, file: f, fd: f.Fd()} } // osFile is a file opened with this package, and uses os.File or syscalls to // implement api.File. type osFile struct { path string - flag int + flag experimentalsys.Oflag perm fs.FileMode file *os.File fd uintptr - // closed is true when closed was called. This ensures proper syscall.EBADF + // reopenDir is true if reopen should be called before Readdir. This flag + // is deferred until Readdir to prevent redundant rewinds. This could + // happen if Seek(0) was called twice, or if in Windows, Seek(0) was called + // before Readdir. + reopenDir bool + + // closed is true when closed was called. This ensures proper sys.EBADF closed bool // cachedStat includes fields that won't change while a file is open. cachedSt *cachedStat } -// cachedStat returns the cacheable parts of platform.sys.Stat_t or an error if -// they couldn't be retrieved. -func (f *osFile) cachedStat() (fileType fs.FileMode, ino uint64, errno syscall.Errno) { +// cachedStat returns the cacheable parts of sys.Stat_t or an error if they +// couldn't be retrieved. +func (f *osFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno experimentalsys.Errno) { if f.cachedSt == nil { if _, errno = f.Stat(); errno != 0 { return } } - return f.cachedSt.fileType, f.cachedSt.ino, 0 + return f.cachedSt.dev, f.cachedSt.ino, f.cachedSt.isDir, 0 } -// Ino implements the same method as documented on fsapi.File -func (f *osFile) Ino() (uint64, syscall.Errno) { - if _, ino, errno := f.cachedStat(); errno != 0 { - return 0, errno - } else { - return ino, 0 - } +// Dev implements the same method as documented on sys.File +func (f *osFile) Dev() (uint64, experimentalsys.Errno) { + dev, _, _, errno := f.cachedStat() + return dev, errno +} + +// Ino implements the same method as documented on sys.File +func (f *osFile) Ino() (sys.Inode, experimentalsys.Errno) { + _, ino, _, errno := f.cachedStat() + return ino, errno +} + +// IsDir implements the same method as documented on sys.File +func (f *osFile) IsDir() (bool, experimentalsys.Errno) { + _, _, isDir, errno := f.cachedStat() + return isDir, errno } // IsAppend implements File.IsAppend func (f *osFile) IsAppend() bool { - return f.flag&syscall.O_APPEND == syscall.O_APPEND + return f.flag&experimentalsys.O_APPEND == experimentalsys.O_APPEND } -// SetAppend implements the same method as documented on fsapi.File -func (f *osFile) SetAppend(enable bool) (errno syscall.Errno) { +// SetAppend implements the same method as documented on sys.File +func (f *osFile) SetAppend(enable bool) (errno experimentalsys.Errno) { if enable { - f.flag |= syscall.O_APPEND + f.flag |= experimentalsys.O_APPEND } else { - f.flag &= ^syscall.O_APPEND + f.flag &= ^experimentalsys.O_APPEND } // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^syscall.O_CREAT + f.flag &= ^experimentalsys.O_CREAT // appendMode (bool) cannot be changed later, so we have to re-open the // file. https://github.com/golang/go/blob/go1.20/src/os/file_unix.go#L60 return fileError(f, f.closed, f.reopen()) } -func (f *osFile) reopen() (errno syscall.Errno) { +// compile-time check to ensure osFile.reopen implements reopenFile. +var _ reopenFile = (*fsFile)(nil).reopen + +func (f *osFile) reopen() (errno experimentalsys.Errno) { // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^syscall.O_CREAT + f.flag &= ^experimentalsys.O_CREAT _ = f.close() f.file, errno = OpenFile(f.path, f.flag, f.perm) @@ -83,54 +105,44 @@ func (f *osFile) reopen() (errno syscall.Errno) { // IsNonblock implements the same method as documented on fsapi.File func (f *osFile) IsNonblock() bool { - return f.flag&fsapi.O_NONBLOCK == fsapi.O_NONBLOCK + return isNonblock(f) } // SetNonblock implements the same method as documented on fsapi.File -func (f *osFile) SetNonblock(enable bool) (errno syscall.Errno) { +func (f *osFile) SetNonblock(enable bool) (errno experimentalsys.Errno) { if enable { - f.flag |= fsapi.O_NONBLOCK + f.flag |= experimentalsys.O_NONBLOCK } else { - f.flag &= ^fsapi.O_NONBLOCK + f.flag &= ^experimentalsys.O_NONBLOCK } - if err := setNonblock(f.fd, enable); err != nil { - return fileError(f, f.closed, platform.UnwrapOSError(err)) + if errno = setNonblock(f.fd, enable); errno != 0 { + return fileError(f, f.closed, errno) } return 0 } -// IsDir implements the same method as documented on fsapi.File -func (f *osFile) IsDir() (bool, syscall.Errno) { - if ft, _, errno := f.cachedStat(); errno != 0 { - return false, errno - } else if ft.Type() == fs.ModeDir { - return true, 0 - } - return false, 0 -} - -// Stat implements the same method as documented on fsapi.File -func (f *osFile) Stat() (fsapi.Stat_t, syscall.Errno) { +// Stat implements the same method as documented on sys.File +func (f *osFile) Stat() (sys.Stat_t, experimentalsys.Errno) { if f.closed { - return fsapi.Stat_t{}, syscall.EBADF + return sys.Stat_t{}, experimentalsys.EBADF } st, errno := statFile(f.file) switch errno { case 0: - f.cachedSt = &cachedStat{fileType: st.Mode & fs.ModeType, ino: st.Ino} - case syscall.EIO: - errno = syscall.EBADF + f.cachedSt = &cachedStat{dev: st.Dev, ino: st.Ino, isDir: st.Mode&fs.ModeDir == fs.ModeDir} + case experimentalsys.EIO: + errno = experimentalsys.EBADF } return st, errno } -// Read implements the same method as documented on fsapi.File -func (f *osFile) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *osFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len reads. } - if NonBlockingFileIoSupported && f.IsNonblock() { + if nonBlockingFileReadSupported && f.IsNonblock() { n, errno = readFd(f.fd, buf) } else { n, errno = read(f.file, buf) @@ -142,8 +154,8 @@ func (f *osFile) Read(buf []byte) (n int, errno syscall.Errno) { return } -// Pread implements the same method as documented on fsapi.File -func (f *osFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pread implements the same method as documented on sys.File +func (f *osFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if n, errno = pread(f.file, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) @@ -151,55 +163,59 @@ func (f *osFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { return } -// Seek implements the same method as documented on fsapi.File -func (f *osFile) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { +// Seek implements the same method as documented on sys.File +func (f *osFile) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { if newOffset, errno = seek(f.file, offset, whence); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) // If the error was trying to rewind a directory, re-open it. Notably, // seeking to zero on a directory doesn't work on Windows with Go 1.18. - if errno == syscall.EISDIR && offset == 0 && whence == io.SeekStart { - return 0, f.reopen() + if errno == experimentalsys.EISDIR && offset == 0 && whence == io.SeekStart { + errno = 0 + f.reopenDir = true } } return } -// PollRead implements the same method as documented on fsapi.File -func (f *osFile) PollRead(timeout *time.Duration) (ready bool, errno syscall.Errno) { - fdSet := platform.FdSet{} - fd := int(f.fd) - fdSet.Set(fd) - nfds := fd + 1 // See https://man7.org/linux/man-pages/man2/select.2.html#:~:text=condition%20has%20occurred.-,nfds,-This%20argument%20should - count, err := _select(nfds, &fdSet, nil, nil, timeout) - if errno = platform.UnwrapOSError(err); errno != 0 { - // Defer validation overhead until we've already had an error. - errno = fileError(f, f.closed, errno) - } - return count > 0, errno +// Poll implements the same method as documented on fsapi.File +func (f *osFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) { + return poll(f.fd, flag, timeoutMillis) } // Readdir implements File.Readdir. Notably, this uses "Readdir", not // "ReadDir", from os.File. -func (f *osFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { +func (f *osFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + if f.reopenDir { // re-open the directory if needed. + f.reopenDir = false + if errno = adjustReaddirErr(f, f.closed, f.reopen()); errno != 0 { + return + } + } + if dirents, errno = readdir(f.file, f.path, n); errno != 0 { errno = adjustReaddirErr(f, f.closed, errno) } return } -// Write implements the same method as documented on fsapi.File -func (f *osFile) Write(buf []byte) (n int, errno syscall.Errno) { - if n, errno = write(f.file, buf); errno != 0 { +// Write implements the same method as documented on sys.File +func (f *osFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { + if len(buf) == 0 { + return 0, 0 // Short-circuit 0-len writes. + } + if nonBlockingFileWriteSupported && f.IsNonblock() { + n, errno = writeFd(f.fd, buf) + } else if n, errno = write(f.file, buf); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } return } -// Pwrite implements the same method as documented on fsapi.File -func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pwrite implements the same method as documented on sys.File +func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if n, errno = pwrite(f.file, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) @@ -207,55 +223,37 @@ func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) { return } -// Truncate implements the same method as documented on fsapi.File -func (f *osFile) Truncate(size int64) (errno syscall.Errno) { - if errno = platform.UnwrapOSError(f.file.Truncate(size)); errno != 0 { +// Truncate implements the same method as documented on sys.File +func (f *osFile) Truncate(size int64) (errno experimentalsys.Errno) { + if errno = experimentalsys.UnwrapOSError(f.file.Truncate(size)); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } return } -// Sync implements the same method as documented on fsapi.File -func (f *osFile) Sync() syscall.Errno { +// Sync implements the same method as documented on sys.File +func (f *osFile) Sync() experimentalsys.Errno { return fsync(f.file) } -// Datasync implements the same method as documented on fsapi.File -func (f *osFile) Datasync() syscall.Errno { +// Datasync implements the same method as documented on sys.File +func (f *osFile) Datasync() experimentalsys.Errno { return datasync(f.file) } -// Chmod implements the same method as documented on fsapi.File -func (f *osFile) Chmod(mode fs.FileMode) syscall.Errno { - if f.closed { - return syscall.EBADF - } - - return platform.UnwrapOSError(f.file.Chmod(mode)) -} - -// Chown implements the same method as documented on fsapi.File -func (f *osFile) Chown(uid, gid int) syscall.Errno { - if f.closed { - return syscall.EBADF - } - - return fchown(f.fd, uid, gid) -} - -// Utimens implements the same method as documented on fsapi.File -func (f *osFile) Utimens(times *[2]syscall.Timespec) syscall.Errno { +// Utimens implements the same method as documented on sys.File +func (f *osFile) Utimens(atim, mtim int64) experimentalsys.Errno { if f.closed { - return syscall.EBADF + return experimentalsys.EBADF } - err := futimens(f.fd, times) - return platform.UnwrapOSError(err) + err := futimens(f.fd, atim, mtim) + return experimentalsys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File -func (f *osFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File +func (f *osFile) Close() experimentalsys.Errno { if f.closed { return 0 } @@ -263,6 +261,6 @@ func (f *osFile) Close() syscall.Errno { return f.close() } -func (f *osFile) close() syscall.Errno { - return platform.UnwrapOSError(f.file.Close()) +func (f *osFile) close() experimentalsys.Errno { + return experimentalsys.UnwrapOSError(f.file.Close()) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go new file mode 100644 index 0000000000..f5c9829529 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go @@ -0,0 +1,18 @@ +//go:build windows || linux || darwin + +package sysfs + +import ( + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" +) + +// poll implements `Poll` as documented on sys.File via a file descriptor. +func poll(fd uintptr, flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + if flag != fsapi.POLLIN { + return false, sys.ENOTSUP + } + fds := []pollFd{newPollFd(fd, _POLLIN, 0)} + count, errno := _poll(fds, timeoutMillis) + return count > 0, errno +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go new file mode 100644 index 0000000000..1f7f890937 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go @@ -0,0 +1,55 @@ +package sysfs + +import ( + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// pollFd is the struct to query for file descriptor events using poll. +type pollFd struct { + // fd is the file descriptor. + fd int32 + // events is a bitmap containing the requested events. + events int16 + // revents is a bitmap containing the returned events. + revents int16 +} + +// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors. +func newPollFd(fd uintptr, events, revents int16) pollFd { + return pollFd{fd: int32(fd), events: events, revents: revents} +} + +// _POLLIN subscribes a notification when any readable data is available. +const _POLLIN = 0x0001 + +// _poll implements poll on Darwin via the corresponding libc function. +func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) { + var fdptr *pollFd + nfds := len(fds) + if nfds > 0 { + fdptr = &fds[0] + } + n1, _, err := syscall_syscall6( + libc_poll_trampoline_addr, + uintptr(unsafe.Pointer(fdptr)), + uintptr(nfds), + uintptr(int(timeoutMillis)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil))) + return int(n1), sys.UnwrapOSError(err) +} + +// libc_poll_trampoline_addr is the address of the +// `libc_poll_trampoline` symbol, defined in `poll_darwin.s`. +// +// We use this to invoke the syscall through syscall_syscall6 imported below. +var libc_poll_trampoline_addr uintptr + +// Imports the select symbol from libc as `libc_poll`. +// +// Note: CGO mechanisms are used in darwin regardless of the CGO_ENABLED value +// or the "cgo" build flag. See /RATIONALE.md for why. +//go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib" diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s new file mode 100644 index 0000000000..e04fca583b --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s @@ -0,0 +1,8 @@ +// lifted from golang.org/x/sys unix +#include "textflag.h" + +TEXT libc_poll_trampoline<>(SB), NOSPLIT, $0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go new file mode 100644 index 0000000000..dab7bb2cab --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go @@ -0,0 +1,57 @@ +package sysfs + +import ( + "syscall" + "time" + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// pollFd is the struct to query for file descriptor events using poll. +type pollFd struct { + // fd is the file descriptor. + fd int32 + // events is a bitmap containing the requested events. + events int16 + // revents is a bitmap containing the returned events. + revents int16 +} + +// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors. +func newPollFd(fd uintptr, events, revents int16) pollFd { + return pollFd{fd: int32(fd), events: events, revents: revents} +} + +// _POLLIN subscribes a notification when any readable data is available. +const _POLLIN = 0x0001 + +// _poll implements poll on Linux via ppoll. +func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) { + var ts syscall.Timespec + if timeoutMillis >= 0 { + ts = syscall.NsecToTimespec(int64(time.Duration(timeoutMillis) * time.Millisecond)) + } + return ppoll(fds, &ts) +} + +// ppoll is a poll variant that allows to subscribe to a mask of signals. +// However, we do not need such mask, so the corresponding argument is always nil. +func ppoll(fds []pollFd, timespec *syscall.Timespec) (n int, err sys.Errno) { + var fdptr *pollFd + nfd := len(fds) + if nfd != 0 { + fdptr = &fds[0] + } + + n1, _, errno := syscall.Syscall6( + uintptr(syscall.SYS_PPOLL), + uintptr(unsafe.Pointer(fdptr)), + uintptr(nfd), + uintptr(unsafe.Pointer(timespec)), + uintptr(unsafe.Pointer(nil)), // sigmask is currently always ignored + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil))) + + return int(n1), sys.UnwrapOSError(errno) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go new file mode 100644 index 0000000000..ebe8a6fa92 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go @@ -0,0 +1,13 @@ +//go:build !linux && !darwin && !windows + +package sysfs + +import ( + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" +) + +// poll implements `Poll` as documented on fsapi.File via a file descriptor. +func poll(uintptr, fsapi.Pflag, int32) (bool, sys.Errno) { + return false, sys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go new file mode 100644 index 0000000000..82c8b2bafd --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go @@ -0,0 +1,224 @@ +package sysfs + +import ( + "syscall" + "time" + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +var ( + procWSAPoll = modws2_32.NewProc("WSAPoll") + procGetNamedPipeInfo = kernel32.NewProc("GetNamedPipeInfo") +) + +const ( + // _POLLRDNORM subscribes to normal data for read. + _POLLRDNORM = 0x0100 + // _POLLRDBAND subscribes to priority band (out-of-band) data for read. + _POLLRDBAND = 0x0200 + // _POLLIN subscribes a notification when any readable data is available. + _POLLIN = (_POLLRDNORM | _POLLRDBAND) +) + +// pollFd is the struct to query for file descriptor events using poll. +type pollFd struct { + // fd is the file descriptor. + fd uintptr + // events is a bitmap containing the requested events. + events int16 + // revents is a bitmap containing the returned events. + revents int16 +} + +// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors. +func newPollFd(fd uintptr, events, revents int16) pollFd { + return pollFd{fd: fd, events: events, revents: revents} +} + +// pollInterval is the interval between each calls to peekNamedPipe in selectAllHandles +const pollInterval = 100 * time.Millisecond + +// _poll implements poll on Windows, for a subset of cases. +// +// fds may contain any number of file handles, but regular files and pipes are only processed for _POLLIN. +// Stdin is a pipe, thus it is checked for readiness when present. Pipes are checked using PeekNamedPipe. +// Regular files always immediately reported as ready, regardless their actual state and timeouts. +// +// If n==0 it will wait for the given timeout duration, but it will return sys.ENOSYS if timeout is nil, +// i.e. it won't block indefinitely. The given ctx is used to allow for cancellation, +// and it is currently used only in tests. +// +// The implementation actually polls every 100 milliseconds (pollInterval) until it reaches the +// given timeout (in millis). +// +// The duration may be negative, in which case it will wait indefinitely. The given ctx is +// used to allow for cancellation, and it is currently used only in tests. +func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) { + if fds == nil { + return -1, sys.ENOSYS + } + + regular, pipes, sockets, errno := partionByFtype(fds) + nregular := len(regular) + if errno != 0 { + return -1, errno + } + + // Ticker that emits at every pollInterval. + tick := time.NewTicker(pollInterval) + tickCh := tick.C + defer tick.Stop() + + // Timer that expires after the given duration. + // Initialize afterCh as nil: the select below will wait forever. + var afterCh <-chan time.Time + if timeoutMillis >= 0 { + // If duration is not nil, instantiate the timer. + after := time.NewTimer(time.Duration(timeoutMillis) * time.Millisecond) + defer after.Stop() + afterCh = after.C + } + + npipes, nsockets, errno := peekAll(pipes, sockets) + if errno != 0 { + return -1, errno + } + count := nregular + npipes + nsockets + if count > 0 { + return count, 0 + } + + for { + select { + case <-afterCh: + return 0, 0 + case <-tickCh: + npipes, nsockets, errno := peekAll(pipes, sockets) + if errno != 0 { + return -1, errno + } + count = nregular + npipes + nsockets + if count > 0 { + return count, 0 + } + } + } +} + +func peekAll(pipes, sockets []pollFd) (npipes, nsockets int, errno sys.Errno) { + npipes, errno = peekPipes(pipes) + if errno != 0 { + return + } + + // Invoke wsaPoll with a 0-timeout to avoid blocking. + // Timeouts are handled in pollWithContext instead. + nsockets, errno = wsaPoll(sockets, 0) + if errno != 0 { + return + } + + count := npipes + nsockets + if count > 0 { + return + } + + return +} + +func peekPipes(fds []pollFd) (n int, errno sys.Errno) { + for _, fd := range fds { + bytes, errno := peekNamedPipe(syscall.Handle(fd.fd)) + if errno != 0 { + return -1, sys.UnwrapOSError(errno) + } + if bytes > 0 { + n++ + } + } + return +} + +// wsaPoll is the WSAPoll function from winsock2. +// +// See https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll +func wsaPoll(fds []pollFd, timeout int) (n int, errno sys.Errno) { + if len(fds) > 0 { + sockptr := &fds[0] + ns, _, e := syscall.SyscallN( + procWSAPoll.Addr(), + uintptr(unsafe.Pointer(sockptr)), + uintptr(len(fds)), + uintptr(timeout)) + if e != 0 { + return -1, sys.UnwrapOSError(e) + } + n = int(ns) + } + return +} + +// ftype is a type of file that can be handled by poll. +type ftype uint8 + +const ( + ftype_regular ftype = iota + ftype_pipe + ftype_socket +) + +// partionByFtype checks the type of each fd in fds and returns 3 distinct partitions +// for regular files, named pipes and sockets. +func partionByFtype(fds []pollFd) (regular, pipe, socket []pollFd, errno sys.Errno) { + for _, pfd := range fds { + t, errno := ftypeOf(pfd.fd) + if errno != 0 { + return nil, nil, nil, errno + } + switch t { + case ftype_regular: + regular = append(regular, pfd) + case ftype_pipe: + pipe = append(pipe, pfd) + case ftype_socket: + socket = append(socket, pfd) + } + } + return +} + +// ftypeOf checks the type of fd and return the corresponding ftype. +func ftypeOf(fd uintptr) (ftype, sys.Errno) { + h := syscall.Handle(fd) + t, err := syscall.GetFileType(h) + if err != nil { + return 0, sys.UnwrapOSError(err) + } + switch t { + case syscall.FILE_TYPE_CHAR, syscall.FILE_TYPE_DISK: + return ftype_regular, 0 + case syscall.FILE_TYPE_PIPE: + if isSocket(h) { + return ftype_socket, 0 + } else { + return ftype_pipe, 0 + } + default: + return ftype_regular, 0 + } +} + +// isSocket returns true if the given file handle +// is a pipe. +func isSocket(fd syscall.Handle) bool { + r, _, errno := syscall.SyscallN( + procGetNamedPipeInfo.Addr(), + uintptr(fd), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil))) + return r == 0 || errno != 0 +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go index b83778f97c..59e331a298 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go @@ -2,259 +2,116 @@ package sysfs import ( "io/fs" - "os" - "syscall" - "time" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) -// NewReadFS is used to mask an existing api.FS for reads. Notably, this allows -// the CLI to do read-only mounts of directories the host user can write, but -// doesn't want the guest wasm to. For example, Python libraries shouldn't be -// written to at runtime by the python wasm file. -func NewReadFS(fs fsapi.FS) fsapi.FS { - if _, ok := fs.(*readFS); ok { - return fs - } else if _, ok = fs.(fsapi.UnimplementedFS); ok { - return fs // unimplemented is read-only - } - return &readFS{fs: fs} -} - -type readFS struct { - fs fsapi.FS +type ReadFS struct { + experimentalsys.FS } -// String implements fmt.Stringer -func (r *readFS) String() string { - return r.fs.String() -} - -// OpenFile implements the same method as documented on api.FS -func (r *readFS) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - // TODO: Once the real implementation is complete, move the below to - // /RATIONALE.md. Doing this while the type is unstable creates - // documentation drift as we expect a lot of reshaping meanwhile. - // - // Callers of this function expect to either open a valid file handle, or - // get an error, if they can't. We want to return ENOSYS if opened for - // anything except reads. - // - // Instead, we could return a fake no-op file on O_WRONLY. However, this - // hurts observability because a later write error to that file will be on - // a different source code line than the root cause which is opening with - // an unsupported flag. - // - // The tricky part is os.RD_ONLY is typically defined as zero, so while the - // parameter is named flag, the part about opening read vs write isn't a - // typical bitflag. We can't compare against zero anyway, because even if - // there isn't a current flag to OR in with that, there may be in the - // future. What we do instead is mask the flags about read/write mode and - // check if they are the opposite of read or not. - switch flag & (os.O_RDONLY | os.O_WRONLY | os.O_RDWR) { - case os.O_WRONLY, os.O_RDWR: - if flag&fsapi.O_DIRECTORY != 0 { - return nil, syscall.EISDIR +// OpenFile implements the same method as documented on sys.FS +func (r *ReadFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + // Mask the mutually exclusive bits as they determine write mode. + switch flag & (experimentalsys.O_RDONLY | experimentalsys.O_WRONLY | experimentalsys.O_RDWR) { + case experimentalsys.O_WRONLY, experimentalsys.O_RDWR: + // Return the correct error if a directory was opened for write. + if flag&experimentalsys.O_DIRECTORY != 0 { + return nil, experimentalsys.EISDIR } - return nil, syscall.ENOSYS - default: // os.O_RDONLY (or no flag) so we are ok! + return nil, experimentalsys.ENOSYS + default: // sys.O_RDONLY (integer zero) so we are ok! } - f, errno := r.fs.OpenFile(path, flag, perm) + f, errno := r.FS.OpenFile(path, flag, perm) if errno != 0 { return nil, errno } - return &readFile{f: f}, 0 + return &readFile{f}, 0 } -// compile-time check to ensure readFile implements api.File. -var _ fsapi.File = (*readFile)(nil) - -type readFile struct { - f fsapi.File -} - -// Ino implements the same method as documented on fsapi.File. -func (r *readFile) Ino() (uint64, syscall.Errno) { - return r.f.Ino() +// Mkdir implements the same method as documented on sys.FS +func (r *ReadFS) Mkdir(path string, perm fs.FileMode) experimentalsys.Errno { + return experimentalsys.EROFS } -// IsNonblock implements the same method as documented on fsapi.File. -func (r *readFile) IsNonblock() bool { - return r.f.IsNonblock() +// Chmod implements the same method as documented on sys.FS +func (r *ReadFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { + return experimentalsys.EROFS } -// SetNonblock implements the same method as documented on fsapi.File. -func (r *readFile) SetNonblock(enabled bool) syscall.Errno { - return r.f.SetNonblock(enabled) +// Rename implements the same method as documented on sys.FS +func (r *ReadFS) Rename(from, to string) experimentalsys.Errno { + return experimentalsys.EROFS } -// IsAppend implements the same method as documented on fsapi.File. -func (r *readFile) IsAppend() bool { - return r.f.IsAppend() +// Rmdir implements the same method as documented on sys.FS +func (r *ReadFS) Rmdir(path string) experimentalsys.Errno { + return experimentalsys.EROFS } -// SetAppend implements the same method as documented on fsapi.File. -func (r *readFile) SetAppend(enabled bool) syscall.Errno { - return r.f.SetAppend(enabled) +// Link implements the same method as documented on sys.FS +func (r *ReadFS) Link(_, _ string) experimentalsys.Errno { + return experimentalsys.EROFS } -// Stat implements the same method as documented on fsapi.File. -func (r *readFile) Stat() (fsapi.Stat_t, syscall.Errno) { - return r.f.Stat() +// Symlink implements the same method as documented on sys.FS +func (r *ReadFS) Symlink(_, _ string) experimentalsys.Errno { + return experimentalsys.EROFS } -// IsDir implements the same method as documented on fsapi.File. -func (r *readFile) IsDir() (bool, syscall.Errno) { - return r.f.IsDir() +// Unlink implements the same method as documented on sys.FS +func (r *ReadFS) Unlink(path string) experimentalsys.Errno { + return experimentalsys.EROFS } -// Read implements the same method as documented on fsapi.File. -func (r *readFile) Read(buf []byte) (int, syscall.Errno) { - return r.f.Read(buf) +// Utimens implements the same method as documented on sys.FS +func (r *ReadFS) Utimens(path string, atim, mtim int64) experimentalsys.Errno { + return experimentalsys.EROFS } -// Pread implements the same method as documented on fsapi.File. -func (r *readFile) Pread(buf []byte, offset int64) (int, syscall.Errno) { - return r.f.Pread(buf, offset) -} - -// Seek implements the same method as documented on fsapi.File. -func (r *readFile) Seek(offset int64, whence int) (int64, syscall.Errno) { - return r.f.Seek(offset, whence) -} +// compile-time check to ensure readFile implements api.File. +var _ experimentalsys.File = (*readFile)(nil) -// Readdir implements the same method as documented on fsapi.File. -func (r *readFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - return r.f.Readdir(n) +type readFile struct { + experimentalsys.File } -// Write implements the same method as documented on fsapi.File. -func (r *readFile) Write([]byte) (int, syscall.Errno) { +// Write implements the same method as documented on sys.File. +func (r *readFile) Write([]byte) (int, experimentalsys.Errno) { return 0, r.writeErr() } -// Pwrite implements the same method as documented on fsapi.File. -func (r *readFile) Pwrite([]byte, int64) (n int, errno syscall.Errno) { +// Pwrite implements the same method as documented on sys.File. +func (r *readFile) Pwrite([]byte, int64) (n int, errno experimentalsys.Errno) { return 0, r.writeErr() } -// Truncate implements the same method as documented on fsapi.File. -func (r *readFile) Truncate(int64) syscall.Errno { +// Truncate implements the same method as documented on sys.File. +func (r *readFile) Truncate(int64) experimentalsys.Errno { return r.writeErr() } -// Sync implements the same method as documented on fsapi.File. -func (r *readFile) Sync() syscall.Errno { - return syscall.EBADF -} - -// Datasync implements the same method as documented on fsapi.File. -func (r *readFile) Datasync() syscall.Errno { - return syscall.EBADF +// Sync implements the same method as documented on sys.File. +func (r *readFile) Sync() experimentalsys.Errno { + return experimentalsys.EBADF } -// Chmod implements the same method as documented on fsapi.File. -func (r *readFile) Chmod(fs.FileMode) syscall.Errno { - return syscall.EBADF +// Datasync implements the same method as documented on sys.File. +func (r *readFile) Datasync() experimentalsys.Errno { + return experimentalsys.EBADF } -// Chown implements the same method as documented on fsapi.File. -func (r *readFile) Chown(int, int) syscall.Errno { - return syscall.EBADF +// Utimens implements the same method as documented on sys.File. +func (r *readFile) Utimens(int64, int64) experimentalsys.Errno { + return experimentalsys.EBADF } -// Utimens implements the same method as documented on fsapi.File. -func (r *readFile) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.EBADF -} - -func (r *readFile) writeErr() syscall.Errno { +func (r *readFile) writeErr() experimentalsys.Errno { if isDir, errno := r.IsDir(); errno != 0 { return errno } else if isDir { - return syscall.EISDIR + return experimentalsys.EISDIR } - return syscall.EBADF -} - -// Close implements the same method as documented on fsapi.File. -func (r *readFile) Close() syscall.Errno { - return r.f.Close() -} - -// PollRead implements File.PollRead -func (r *readFile) PollRead(timeout *time.Duration) (ready bool, errno syscall.Errno) { - return r.f.PollRead(timeout) -} - -// Lstat implements the same method as documented on api.FS -func (r *readFS) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { - return r.fs.Lstat(path) -} - -// Stat implements the same method as documented on api.FS -func (r *readFS) Stat(path string) (fsapi.Stat_t, syscall.Errno) { - return r.fs.Stat(path) -} - -// Readlink implements the same method as documented on api.FS -func (r *readFS) Readlink(path string) (dst string, err syscall.Errno) { - return r.fs.Readlink(path) -} - -// Mkdir implements the same method as documented on api.FS -func (r *readFS) Mkdir(path string, perm fs.FileMode) syscall.Errno { - return syscall.EROFS -} - -// Chmod implements the same method as documented on api.FS -func (r *readFS) Chmod(path string, perm fs.FileMode) syscall.Errno { - return syscall.EROFS -} - -// Chown implements the same method as documented on api.FS -func (r *readFS) Chown(path string, uid, gid int) syscall.Errno { - return syscall.EROFS -} - -// Lchown implements the same method as documented on api.FS -func (r *readFS) Lchown(path string, uid, gid int) syscall.Errno { - return syscall.EROFS -} - -// Rename implements the same method as documented on api.FS -func (r *readFS) Rename(from, to string) syscall.Errno { - return syscall.EROFS -} - -// Rmdir implements the same method as documented on api.FS -func (r *readFS) Rmdir(path string) syscall.Errno { - return syscall.EROFS -} - -// Link implements the same method as documented on api.FS -func (r *readFS) Link(_, _ string) syscall.Errno { - return syscall.EROFS -} - -// Symlink implements the same method as documented on api.FS -func (r *readFS) Symlink(_, _ string) syscall.Errno { - return syscall.EROFS -} - -// Unlink implements the same method as documented on api.FS -func (r *readFS) Unlink(path string) syscall.Errno { - return syscall.EROFS -} - -// Utimens implements the same method as documented on api.FS -func (r *readFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - return syscall.EROFS -} - -// Truncate implements the same method as documented on api.FS -func (r *readFS) Truncate(string, int64) syscall.Errno { - return syscall.EROFS + return experimentalsys.EBADF } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go index b107bc19d0..f7d84ef7ae 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go @@ -1,16 +1,16 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Rename(from, to string) syscall.Errno { +func rename(from, to string) sys.Errno { if from == to { return 0 } - return platform.UnwrapOSError(syscall.Rename(from, to)) + return sys.UnwrapOSError(syscall.Rename(from, to)) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go new file mode 100644 index 0000000000..474cc7595e --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go @@ -0,0 +1,14 @@ +package sysfs + +import ( + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +func rename(from, to string) sys.Errno { + if from == to { + return 0 + } + return sys.UnwrapOSError(os.Rename(from, to)) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go index 25e53d4ff0..5e81022391 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go @@ -1,47 +1,55 @@ package sysfs import ( - "errors" "os" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Rename(from, to string) syscall.Errno { +func rename(from, to string) sys.Errno { if from == to { return 0 } - fromStat, err := os.Stat(from) - if err != nil { - return syscall.ENOENT + var fromIsDir, toIsDir bool + if fromStat, errno := stat(from); errno != 0 { + return errno // failed to stat from + } else { + fromIsDir = fromStat.Mode.IsDir() } + if toStat, errno := stat(to); errno == sys.ENOENT { + return syscallRename(from, to) // file or dir to not-exist is ok + } else if errno != 0 { + return errno // failed to stat to + } else { + toIsDir = toStat.Mode.IsDir() + } + + // Now, handle known cases + switch { + case !fromIsDir && toIsDir: // file to dir + return sys.EISDIR + case !fromIsDir && !toIsDir: // file to file + // Use os.Rename instead of syscall.Rename to overwrite a file. + // This uses MoveFileEx instead of MoveFile (used by syscall.Rename). + return sys.UnwrapOSError(os.Rename(from, to)) + case fromIsDir && !toIsDir: // dir to file + return sys.ENOTDIR + default: // dir to dir - if toStat, err := os.Stat(to); err == nil { - fromIsDir, toIsDir := fromStat.IsDir(), toStat.IsDir() - if fromIsDir && !toIsDir { // dir to file - return syscall.ENOTDIR - } else if !fromIsDir && toIsDir { // file to dir - return syscall.EISDIR - } else if !fromIsDir && !toIsDir { // file to file - // Use os.Rename instead of syscall.Rename in order to allow the overrides of the existing file. - // Underneath os.Rename, it uses MoveFileEx instead of MoveFile (used by syscall.Rename). - return platform.UnwrapOSError(os.Rename(from, to)) - } else { // dir to dir - if dirs, _ := os.ReadDir(to); len(dirs) == 0 { - // On Windows, renaming to the empty dir will be rejected, - // so first we remove the empty dir, and then rename to it. - if err := os.Remove(to); err != nil { - return platform.UnwrapOSError(err) - } - return platform.UnwrapOSError(syscall.Rename(from, to)) - } - return syscall.ENOTEMPTY + // We can't tell if a directory is empty or not, via stat information. + // Reading the directory is expensive, as it can buffer large amounts + // of data on fail. Instead, speculatively try to remove the directory. + // This is only one syscall and won't buffer anything. + if errno := rmdir(to); errno == 0 || errno == sys.ENOENT { + return syscallRename(from, to) + } else { + return errno } - } else if !errors.Is(err, syscall.ENOENT) { // Failed to stat the destination. - return platform.UnwrapOSError(err) - } else { // Destination not-exist. - return platform.UnwrapOSError(syscall.Rename(from, to)) } } + +func syscallRename(from string, to string) sys.Errno { + return sys.UnwrapOSError(syscall.Rename(from, to)) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go deleted file mode 100644 index 75bd839f44..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go +++ /dev/null @@ -1,559 +0,0 @@ -package sysfs - -import ( - "fmt" - "io" - "io/fs" - "strings" - "syscall" - - "github.com/tetratelabs/wazero/internal/fsapi" -) - -func NewRootFS(fs []fsapi.FS, guestPaths []string) (fsapi.FS, error) { - switch len(fs) { - case 0: - return fsapi.UnimplementedFS{}, nil - case 1: - if StripPrefixesAndTrailingSlash(guestPaths[0]) == "" { - return fs[0], nil - } - } - - ret := &CompositeFS{ - string: stringFS(fs, guestPaths), - fs: make([]fsapi.FS, len(fs)), - guestPaths: make([]string, len(fs)), - cleanedGuestPaths: make([]string, len(fs)), - rootGuestPaths: map[string]int{}, - rootIndex: -1, - } - - copy(ret.guestPaths, guestPaths) - copy(ret.fs, fs) - - for i, guestPath := range guestPaths { - // Clean the prefix in the same way path matches will. - cleaned := StripPrefixesAndTrailingSlash(guestPath) - if cleaned == "" { - if ret.rootIndex != -1 { - return nil, fmt.Errorf("multiple root filesystems are invalid: %s", ret.string) - } - ret.rootIndex = i - } else if strings.HasPrefix(cleaned, "..") { - // ../ mounts are special cased and aren't returned in a directory - // listing, so we can ignore them for now. - } else if strings.Contains(cleaned, "/") { - return nil, fmt.Errorf("only single-level guest paths allowed: %s", ret.string) - } else { - ret.rootGuestPaths[cleaned] = i - } - ret.cleanedGuestPaths[i] = cleaned - } - - // Ensure there is always a root match to keep runtime logic simpler. - if ret.rootIndex == -1 { - ret.rootIndex = len(fs) - ret.cleanedGuestPaths = append(ret.cleanedGuestPaths, "") - ret.fs = append(ret.fs, &fakeRootFS{}) - } - return ret, nil -} - -type CompositeFS struct { - fsapi.UnimplementedFS - // string is cached for convenience. - string string - // fs is index-correlated with cleanedGuestPaths - fs []fsapi.FS - // guestPaths are the original paths supplied by the end user, cleaned as - // cleanedGuestPaths. - guestPaths []string - // cleanedGuestPaths to match in precedence order, ascending. - cleanedGuestPaths []string - // rootGuestPaths are cleanedGuestPaths that exist directly under root, such as - // "tmp". - rootGuestPaths map[string]int - // rootIndex is the index in fs that is the root filesystem - rootIndex int -} - -// String implements fmt.Stringer -func (c *CompositeFS) String() string { - return c.string -} - -func stringFS(fs []fsapi.FS, guestPaths []string) string { - var ret strings.Builder - ret.WriteString("[") - writeMount(&ret, fs[0], guestPaths[0]) - for i, f := range fs[1:] { - ret.WriteString(" ") - writeMount(&ret, f, guestPaths[i+1]) - } - ret.WriteString("]") - return ret.String() -} - -func writeMount(ret *strings.Builder, f fsapi.FS, guestPath string) { - ret.WriteString(f.String()) - ret.WriteString(":") - ret.WriteString(guestPath) - if _, ok := f.(*readFS); ok { - ret.WriteString(":ro") - } -} - -// GuestPaths returns the underlying pre-open paths in original order. -func (c *CompositeFS) GuestPaths() (guestPaths []string) { - return c.guestPaths -} - -// FS returns the underlying filesystems in original order. -func (c *CompositeFS) FS() (fs []fsapi.FS) { - fs = make([]fsapi.FS, len(c.guestPaths)) - copy(fs, c.fs) - return -} - -// OpenFile implements the same method as documented on api.FS -func (c *CompositeFS) OpenFile(path string, flag int, perm fs.FileMode) (f fsapi.File, err syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - - f, err = c.fs[matchIndex].OpenFile(relativePath, flag, perm) - if err != 0 { - return - } - - // Ensure the root directory listing includes any prefix mounts. - if matchIndex == c.rootIndex { - switch path { - case ".", "/", "": - if len(c.rootGuestPaths) > 0 { - f = &openRootDir{path: path, c: c, f: f} - } - } - } - return -} - -// An openRootDir is a root directory open for reading, which has mounts inside -// of it. -type openRootDir struct { - fsapi.DirFile - - path string - c *CompositeFS - f fsapi.File // the directory file itself - dirents []fsapi.Dirent // the directory contents - direntsI int // the read offset, an index into the files slice -} - -// Ino implements the same method as documented on fsapi.File -func (d *openRootDir) Ino() (uint64, syscall.Errno) { - return d.f.Ino() -} - -// Stat implements the same method as documented on fsapi.File -func (d *openRootDir) Stat() (fsapi.Stat_t, syscall.Errno) { - return d.f.Stat() -} - -// Seek implements the same method as documented on fsapi.File -func (d *openRootDir) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { - if offset != 0 || whence != io.SeekStart { - errno = syscall.ENOSYS - return - } - d.dirents = nil - d.direntsI = 0 - return d.f.Seek(offset, whence) -} - -// Readdir implements the same method as documented on fsapi.File -func (d *openRootDir) Readdir(count int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if d.dirents == nil { - if errno = d.readdir(); errno != 0 { - return - } - } - - // logic similar to go:embed - n := len(d.dirents) - d.direntsI - if n == 0 { - return - } - if count > 0 && n > count { - n = count - } - dirents = make([]fsapi.Dirent, n) - for i := range dirents { - dirents[i] = d.dirents[d.direntsI+i] - } - d.direntsI += n - return -} - -func (d *openRootDir) readdir() (errno syscall.Errno) { - // readDir reads the directory fully into d.dirents, replacing any entries that - // correspond to prefix matches or appending them to the end. - if d.dirents, errno = d.f.Readdir(-1); errno != 0 { - return - } - - remaining := make(map[string]int, len(d.c.rootGuestPaths)) - for k, v := range d.c.rootGuestPaths { - remaining[k] = v - } - - for i := range d.dirents { - e := d.dirents[i] - if fsI, ok := remaining[e.Name]; ok { - if d.dirents[i], errno = d.rootEntry(e.Name, fsI); errno != 0 { - return - } - delete(remaining, e.Name) - } - } - - var di fsapi.Dirent - for n, fsI := range remaining { - if di, errno = d.rootEntry(n, fsI); errno != 0 { - return - } - d.dirents = append(d.dirents, di) - } - return -} - -// Sync implements the same method as documented on fsapi.File -func (d *openRootDir) Sync() syscall.Errno { - return d.f.Sync() -} - -// Datasync implements the same method as documented on fsapi.File -func (d *openRootDir) Datasync() syscall.Errno { - return d.f.Datasync() -} - -// Chmod implements the same method as documented on fsapi.File -func (d *openRootDir) Chmod(fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements the same method as documented on fsapi.File -func (d *openRootDir) Chown(int, int) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements the same method as documented on fsapi.File -func (d *openRootDir) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.ENOSYS -} - -// Close implements fs.File -func (d *openRootDir) Close() syscall.Errno { - return d.f.Close() -} - -func (d *openRootDir) rootEntry(name string, fsI int) (fsapi.Dirent, syscall.Errno) { - if st, errno := d.c.fs[fsI].Stat("."); errno != 0 { - return fsapi.Dirent{}, errno - } else { - return fsapi.Dirent{Name: name, Ino: st.Ino, Type: st.Mode.Type()}, 0 - } -} - -// Lstat implements the same method as documented on api.FS -func (c *CompositeFS) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Lstat(relativePath) -} - -// Stat implements the same method as documented on api.FS -func (c *CompositeFS) Stat(path string) (fsapi.Stat_t, syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Stat(relativePath) -} - -// Mkdir implements the same method as documented on api.FS -func (c *CompositeFS) Mkdir(path string, perm fs.FileMode) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Mkdir(relativePath, perm) -} - -// Chmod implements the same method as documented on api.FS -func (c *CompositeFS) Chmod(path string, perm fs.FileMode) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Chmod(relativePath, perm) -} - -// Chown implements the same method as documented on api.FS -func (c *CompositeFS) Chown(path string, uid, gid int) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Chown(relativePath, uid, gid) -} - -// Lchown implements the same method as documented on api.FS -func (c *CompositeFS) Lchown(path string, uid, gid int) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Lchown(relativePath, uid, gid) -} - -// Rename implements the same method as documented on api.FS -func (c *CompositeFS) Rename(from, to string) syscall.Errno { - fromFS, fromPath := c.chooseFS(from) - toFS, toPath := c.chooseFS(to) - if fromFS != toFS { - return syscall.ENOSYS // not yet anyway - } - return c.fs[fromFS].Rename(fromPath, toPath) -} - -// Readlink implements the same method as documented on api.FS -func (c *CompositeFS) Readlink(path string) (string, syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Readlink(relativePath) -} - -// Link implements the same method as documented on api.FS -func (c *CompositeFS) Link(oldName, newName string) syscall.Errno { - fromFS, oldNamePath := c.chooseFS(oldName) - toFS, newNamePath := c.chooseFS(newName) - if fromFS != toFS { - return syscall.ENOSYS // not yet anyway - } - return c.fs[fromFS].Link(oldNamePath, newNamePath) -} - -// Utimens implements the same method as documented on api.FS -func (c *CompositeFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Utimens(relativePath, times, symlinkFollow) -} - -// Symlink implements the same method as documented on api.FS -func (c *CompositeFS) Symlink(oldName, link string) (err syscall.Errno) { - fromFS, oldNamePath := c.chooseFS(oldName) - toFS, linkPath := c.chooseFS(link) - if fromFS != toFS { - return syscall.ENOSYS // not yet anyway - } - return c.fs[fromFS].Symlink(oldNamePath, linkPath) -} - -// Truncate implements the same method as documented on api.FS -func (c *CompositeFS) Truncate(path string, size int64) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Truncate(relativePath, size) -} - -// Rmdir implements the same method as documented on api.FS -func (c *CompositeFS) Rmdir(path string) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Rmdir(relativePath) -} - -// Unlink implements the same method as documented on api.FS -func (c *CompositeFS) Unlink(path string) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Unlink(relativePath) -} - -// chooseFS chooses the best fs and the relative path to use for the input. -func (c *CompositeFS) chooseFS(path string) (matchIndex int, relativePath string) { - matchIndex = -1 - matchPrefixLen := 0 - pathI, pathLen := stripPrefixesAndTrailingSlash(path) - - // Last is the highest precedence, so we iterate backwards. The last longest - // match wins. e.g. the pre-open "tmp" wins vs "" regardless of order. - for i := len(c.fs) - 1; i >= 0; i-- { - prefix := c.cleanedGuestPaths[i] - if eq, match := hasPathPrefix(path, pathI, pathLen, prefix); eq { - // When the input equals the prefix, there cannot be a longer match - // later. The relative path is the fsapi.FS root, so return empty - // string. - matchIndex = i - relativePath = "" - return - } else if match { - // Check to see if this is a longer match - prefixLen := len(prefix) - if prefixLen > matchPrefixLen || matchIndex == -1 { - matchIndex = i - matchPrefixLen = prefixLen - } - } // Otherwise, keep looking for a match - } - - // Now, we know the path != prefix, but it matched an existing fs, because - // setup ensures there's always a root filesystem. - - // If this was a root path match the cleaned path is the relative one to - // pass to the underlying filesystem. - if matchPrefixLen == 0 { - // Avoid re-slicing when the input is already clean - if pathI == 0 && len(path) == pathLen { - relativePath = path - } else { - relativePath = path[pathI:pathLen] - } - return - } - - // Otherwise, it is non-root match: the relative path is past "$prefix/" - pathI += matchPrefixLen + 1 // e.g. prefix=foo, path=foo/bar -> bar - relativePath = path[pathI:pathLen] - return -} - -// hasPathPrefix compares an input path against a prefix, both cleaned by -// stripPrefixesAndTrailingSlash. This returns a pair of eq, match to allow an -// early short circuit on match. -// -// Note: This is case-sensitive because POSIX paths are compared case -// sensitively. -func hasPathPrefix(path string, pathI, pathLen int, prefix string) (eq, match bool) { - matchLen := pathLen - pathI - if prefix == "" { - return matchLen == 0, true // e.g. prefix=, path=foo - } - - prefixLen := len(prefix) - // reset pathLen temporarily to represent the length to match as opposed to - // the length of the string (that may contain leading slashes). - if matchLen == prefixLen { - if pathContainsPrefix(path, pathI, prefixLen, prefix) { - return true, true // e.g. prefix=bar, path=bar - } - return false, false - } else if matchLen < prefixLen { - return false, false // e.g. prefix=fooo, path=foo - } - - if path[pathI+prefixLen] != '/' { - return false, false // e.g. prefix=foo, path=fooo - } - - // Not equal, but maybe a match. e.g. prefix=foo, path=foo/bar - return false, pathContainsPrefix(path, pathI, prefixLen, prefix) -} - -// pathContainsPrefix is faster than strings.HasPrefix even if we didn't cache -// the index,len. See benchmarks. -func pathContainsPrefix(path string, pathI, prefixLen int, prefix string) bool { - for i := 0; i < prefixLen; i++ { - if path[pathI] != prefix[i] { - return false // e.g. prefix=bar, path=foo or foo/bar - } - pathI++ - } - return true // e.g. prefix=foo, path=foo or foo/bar -} - -func StripPrefixesAndTrailingSlash(path string) string { - pathI, pathLen := stripPrefixesAndTrailingSlash(path) - return path[pathI:pathLen] -} - -// stripPrefixesAndTrailingSlash skips any leading "./" or "/" such that the -// result index begins with another string. A result of "." coerces to the -// empty string "" because the current directory is handled by the guest. -// -// Results are the offset/len pair which is an optimization to avoid re-slicing -// overhead, as this function is called for every path operation. -// -// Note: Relative paths should be handled by the guest, as that's what knows -// what the current directory is. However, paths that escape the current -// directory e.g. "../.." have been found in `tinygo test` and this -// implementation takes care to avoid it. -func stripPrefixesAndTrailingSlash(path string) (pathI, pathLen int) { - // strip trailing slashes - pathLen = len(path) - for ; pathLen > 0 && path[pathLen-1] == '/'; pathLen-- { - } - - pathI = 0 -loop: - for pathI < pathLen { - switch path[pathI] { - case '/': - pathI++ - case '.': - nextI := pathI + 1 - if nextI < pathLen && path[nextI] == '/' { - pathI = nextI + 1 - } else if nextI == pathLen { - pathI = nextI - } else { - break loop - } - default: - break loop - } - } - return -} - -type fakeRootFS struct { - fsapi.UnimplementedFS -} - -// OpenFile implements the same method as documented on api.FS -func (fakeRootFS) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - switch path { - case ".", "/", "": - return fakeRootDir{}, 0 - } - return nil, syscall.ENOENT -} - -type fakeRootDir struct { - fsapi.DirFile -} - -// Ino implements the same method as documented on fsapi.File -func (fakeRootDir) Ino() (uint64, syscall.Errno) { - return 0, 0 -} - -// Stat implements the same method as documented on fsapi.File -func (fakeRootDir) Stat() (fsapi.Stat_t, syscall.Errno) { - return fsapi.Stat_t{Mode: fs.ModeDir, Nlink: 1}, 0 -} - -// Readdir implements the same method as documented on fsapi.File -func (fakeRootDir) Readdir(int) (dirents []fsapi.Dirent, errno syscall.Errno) { - return // empty -} - -// Sync implements the same method as documented on fsapi.File -func (fakeRootDir) Sync() syscall.Errno { - return 0 -} - -// Datasync implements the same method as documented on fsapi.File -func (fakeRootDir) Datasync() syscall.Errno { - return 0 -} - -// Chmod implements the same method as documented on fsapi.File -func (fakeRootDir) Chmod(fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements the same method as documented on fsapi.File -func (fakeRootDir) Chown(int, int) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements the same method as documented on fsapi.File -func (fakeRootDir) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.ENOSYS -} - -// Close implements the same method as documented on fsapi.File -func (fakeRootDir) Close() syscall.Errno { - return 0 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go deleted file mode 100644 index ac0861fda4..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go +++ /dev/null @@ -1,36 +0,0 @@ -package sysfs - -import ( - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// _select exposes the select(2) syscall. This is named as such to avoid -// colliding with they keyword select while not exporting the function. -// -// # Notes on Parameters -// -// For convenience, we expose a pointer to a time.Duration instead of a pointer to a syscall.Timeval. -// It must be a pointer because `nil` means "wait forever". -// -// However, notice that select(2) may mutate the pointed Timeval on some platforms, -// for instance if the call returns early. -// -// This implementation *will not* update the pointed time.Duration value accordingly. -// -// See also: https://github.com/golang/sys/blob/master/unix/syscall_unix_test.go#L606-L617 -// -// # Notes on the Syscall -// -// Because this is a blocking syscall, it will also block the carrier thread of the goroutine, -// preventing any means to support context cancellation directly. -// -// There are ways to obviate this issue. We outline here one idea, that is however not currently implemented. -// A common approach to support context cancellation is to add a signal file descriptor to the set, -// e.g. the read-end of a pipe or an eventfd on Linux. -// When the context is canceled, we may unblock a Select call by writing to the fd, causing it to return immediately. -// This however requires to do a bit of housekeeping to hide the "special" FD from the end-user. -func _select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - return syscall_select(n, r, w, e, timeout) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go deleted file mode 100644 index eabf4f455b..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go +++ /dev/null @@ -1,45 +0,0 @@ -package sysfs - -import ( - "syscall" - "time" - "unsafe" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// syscall_select invokes select on Darwin, with the given timeout Duration. -// We implement our own version instead of relying on syscall.Select because the latter -// only returns the error and discards the result. -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - result, _, errno := syscall_syscall6( - libc_select_trampoline_addr, - uintptr(n), - uintptr(unsafe.Pointer(r)), - uintptr(unsafe.Pointer(w)), - uintptr(unsafe.Pointer(e)), - uintptr(unsafe.Pointer(t)), - 0) - res := int(result) - if errno == 0 { - return res, nil - } - return res, errno -} - -// libc_select_trampoline_addr is the address of the -// `libc_select_trampoline` symbol, defined in `select_darwin.s`. -// -// We use this to invoke the syscall through syscall_syscall6 imported below. -var libc_select_trampoline_addr uintptr - -// Imports the select symbol from libc as `libc_select`. -// -// Note: CGO mechanisms are used in darwin regardless of the CGO_ENABLED value -// or the "cgo" build flag. See /RATIONALE.md for why. -//go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s deleted file mode 100644 index 16e65e8ec6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s +++ /dev/null @@ -1,8 +0,0 @@ -// lifted from golang.org/x/sys unix -#include "textflag.h" - -TEXT libc_select_trampoline<>(SB), NOSPLIT, $0-0 - JMP libc_select(SB) - -GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 -DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go deleted file mode 100644 index aae5e48f66..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go +++ /dev/null @@ -1,18 +0,0 @@ -package sysfs - -import ( - "syscall" - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// syscall_select invokes select on Unix (unless Darwin), with the given timeout Duration. -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - return syscall.Select(n, (*syscall.FdSet)(r), (*syscall.FdSet)(w), (*syscall.FdSet)(e), t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go deleted file mode 100644 index 5244374b32..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !darwin && !linux && !windows - -package sysfs - -import ( - "syscall" - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - return -1, syscall.ENOSYS -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go deleted file mode 100644 index 811c648d60..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go +++ /dev/null @@ -1,127 +0,0 @@ -package sysfs - -import ( - "context" - "syscall" - "time" - "unsafe" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// wasiFdStdin is the constant value for stdin on Wasi. -// We need this constant because on Windows os.Stdin.Fd() != 0. -const wasiFdStdin = 0 - -// pollInterval is the interval between each calls to peekNamedPipe in pollNamedPipe -const pollInterval = 100 * time.Millisecond - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -// procPeekNamedPipe is the syscall.LazyProc in kernel32 for PeekNamedPipe -var procPeekNamedPipe = kernel32.NewProc("PeekNamedPipe") - -// syscall_select emulates the select syscall on Windows for two, well-known cases, returns syscall.ENOSYS for all others. -// If r contains fd 0, and it is a regular file, then it immediately returns 1 (data ready on stdin) -// and r will have the fd 0 bit set. -// If r contains fd 0, and it is a FILE_TYPE_CHAR, then it invokes PeekNamedPipe to check the buffer for input; -// if there is data ready, then it returns 1 and r will have fd 0 bit set. -// If n==0 it will wait for the given timeout duration, but it will return syscall.ENOSYS if timeout is nil, -// i.e. it won't block indefinitely. -// -// Note: idea taken from https://stackoverflow.com/questions/6839508/test-if-stdin-has-input-for-c-windows-and-or-linux -// PeekNamedPipe: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe -// "GetFileType can assist in determining what device type the handle refers to. A console handle presents as FILE_TYPE_CHAR." -// https://learn.microsoft.com/en-us/windows/console/console-handles -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - if n == 0 { - // Don't block indefinitely. - if timeout == nil { - return -1, syscall.ENOSYS - } - time.Sleep(*timeout) - return 0, nil - } - if r.IsSet(wasiFdStdin) { - fileType, err := syscall.GetFileType(syscall.Stdin) - if err != nil { - return 0, err - } - if fileType&syscall.FILE_TYPE_CHAR != 0 { - res, err := pollNamedPipe(context.TODO(), syscall.Stdin, timeout) - if err != nil { - return -1, err - } - if !res { - r.Zero() - return 0, nil - } - } - r.Zero() - r.Set(wasiFdStdin) - return 1, nil - } - return -1, syscall.ENOSYS -} - -// pollNamedPipe polls the given named pipe handle for the given duration. -// -// The implementation actually polls every 100 milliseconds until it reaches the given duration. -// The duration may be nil, in which case it will wait undefinely. The given ctx is -// used to allow for cancellation. Currently used only in tests. -func pollNamedPipe(ctx context.Context, pipeHandle syscall.Handle, duration *time.Duration) (bool, error) { - // Short circuit when the duration is zero. - if duration != nil && *duration == time.Duration(0) { - return peekNamedPipe(pipeHandle) - } - - // Ticker that emits at every pollInterval. - tick := time.NewTicker(pollInterval) - tichCh := tick.C - defer tick.Stop() - - // Timer that expires after the given duration. - // Initialize afterCh as nil: the select below will wait forever. - var afterCh <-chan time.Time - if duration != nil { - // If duration is not nil, instantiate the timer. - after := time.NewTimer(*duration) - defer after.Stop() - afterCh = after.C - } - - for { - select { - case <-ctx.Done(): - return false, nil - case <-afterCh: - return false, nil - case <-tichCh: - res, err := peekNamedPipe(pipeHandle) - if err != nil { - return false, err - } - if res { - return true, nil - } - } - } -} - -// peekNamedPipe partially exposes PeekNamedPipe from the Win32 API -// see https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe -func peekNamedPipe(handle syscall.Handle) (bool, error) { - var totalBytesAvail uint32 - totalBytesPtr := unsafe.Pointer(&totalBytesAvail) - _, _, err := procPeekNamedPipe.Call( - uintptr(handle), // [in] HANDLE hNamedPipe, - 0, // [out, optional] LPVOID lpBuffer, - 0, // [in] DWORD nBufferSize, - 0, // [out, optional] LPDWORD lpBytesRead - uintptr(totalBytesPtr), // [out, optional] LPDWORD lpTotalBytesAvail, - 0) // [out, optional] LPDWORD lpBytesLeftThisMessage - if err == syscall.Errno(0) { - return totalBytesAvail > 0, nil - } - return totalBytesAvail > 0, err -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go index 62bef426fb..af739a9082 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go @@ -3,10 +3,10 @@ package sysfs import ( "net" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" + "github.com/tetratelabs/wazero/sys" ) // NewTCPListenerFile creates a socketapi.TCPSock for a given *net.TCPListener. @@ -17,20 +17,20 @@ func NewTCPListenerFile(tl *net.TCPListener) socketapi.TCPSock { // baseSockFile implements base behavior for all TCPSock, TCPConn files, // regardless the platform. type baseSockFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile } -var _ fsapi.File = (*baseSockFile)(nil) +var _ experimentalsys.File = (*baseSockFile)(nil) // IsDir implements the same method as documented on File.IsDir -func (*baseSockFile) IsDir() (bool, syscall.Errno) { +func (*baseSockFile) IsDir() (bool, experimentalsys.Errno) { // We need to override this method because WASI-libc prestats the FD // and the default impl returns ENOSYS otherwise. return false, 0 } // Stat implements the same method as documented on File.Stat -func (f *baseSockFile) Stat() (fs fsapi.Stat_t, errno syscall.Errno) { +func (f *baseSockFile) Stat() (fs sys.Stat_t, errno experimentalsys.Errno) { // The mode is not really important, but it should be neither a regular file nor a directory. fs.Mode = os.ModeIrregular return diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go index aa3d3bb59d..3698f560e0 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go @@ -6,7 +6,8 @@ import ( "net" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" ) @@ -41,28 +42,24 @@ var _ socketapi.TCPSock = (*tcpListenerFile)(nil) type tcpListenerFile struct { baseSockFile - fd uintptr - addr *net.TCPAddr + fd uintptr + addr *net.TCPAddr + nonblock bool } // Accept implements the same method as documented on socketapi.TCPSock -func (f *tcpListenerFile) Accept() (socketapi.TCPConn, syscall.Errno) { +func (f *tcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { nfd, _, err := syscall.Accept(int(f.fd)) - errno := platform.UnwrapOSError(err) + errno := sys.UnwrapOSError(err) if errno != 0 { return nil, errno } return &tcpConnFile{fd: uintptr(nfd)}, 0 } -// SetNonblock implements the same method as documented on fsapi.File -func (f *tcpListenerFile) SetNonblock(enabled bool) syscall.Errno { - return platform.UnwrapOSError(setNonblock(f.fd, enabled)) -} - -// Close implements the same method as documented on fsapi.File -func (f *tcpListenerFile) Close() syscall.Errno { - return platform.UnwrapOSError(syscall.Close(int(f.fd))) +// Close implements the same method as documented on sys.File +func (f *tcpListenerFile) Close() sys.Errno { + return sys.UnwrapOSError(syscall.Close(int(f.fd))) } // Addr is exposed for testing. @@ -70,14 +67,31 @@ func (f *tcpListenerFile) Addr() *net.TCPAddr { return f.addr } +// SetNonblock implements the same method as documented on fsapi.File +func (f *tcpListenerFile) SetNonblock(enabled bool) sys.Errno { + f.nonblock = enabled + return sys.UnwrapOSError(setNonblock(f.fd, enabled)) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *tcpListenerFile) IsNonblock() bool { + return f.nonblock +} + +// Poll implements the same method as documented on fsapi.File +func (f *tcpListenerFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} + var _ socketapi.TCPConn = (*tcpConnFile)(nil) type tcpConnFile struct { baseSockFile - fd uintptr + fd uintptr + nonblock bool - // closed is true when closed was called. This ensures proper syscall.EBADF + // closed is true when closed was called. This ensures proper sys.EBADF closed bool } @@ -89,46 +103,41 @@ func newTcpConn(tc *net.TCPConn) socketapi.TCPConn { return &tcpConnFile{fd: f.Fd()} } -// SetNonblock implements the same method as documented on fsapi.File -func (f *tcpConnFile) SetNonblock(enabled bool) (errno syscall.Errno) { - return platform.UnwrapOSError(setNonblock(f.fd, enabled)) -} - -// Read implements the same method as documented on fsapi.File -func (f *tcpConnFile) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *tcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { n, err := syscall.Read(int(f.fd), buf) if err != nil { // Defer validation overhead until we've already had an error. - errno = platform.UnwrapOSError(err) + errno = sys.UnwrapOSError(err) errno = fileError(f, f.closed, errno) } return n, errno } -// Write implements the same method as documented on fsapi.File -func (f *tcpConnFile) Write(buf []byte) (n int, errno syscall.Errno) { +// Write implements the same method as documented on sys.File +func (f *tcpConnFile) Write(buf []byte) (n int, errno sys.Errno) { n, err := syscall.Write(int(f.fd), buf) if err != nil { // Defer validation overhead until we've already had an error. - errno = platform.UnwrapOSError(err) + errno = sys.UnwrapOSError(err) errno = fileError(f, f.closed, errno) } return n, errno } // Recvfrom implements the same method as documented on socketapi.TCPConn -func (f *tcpConnFile) Recvfrom(p []byte, flags int) (n int, errno syscall.Errno) { +func (f *tcpConnFile) Recvfrom(p []byte, flags int) (n int, errno sys.Errno) { if flags != MSG_PEEK { - errno = syscall.EINVAL + errno = sys.EINVAL return } n, _, recvfromErr := syscall.Recvfrom(int(f.fd), p, MSG_PEEK) - errno = platform.UnwrapOSError(recvfromErr) + errno = sys.UnwrapOSError(recvfromErr) return n, errno } -// Shutdown implements the same method as documented on fsapi.Conn -func (f *tcpConnFile) Shutdown(how int) syscall.Errno { +// Shutdown implements the same method as documented on sys.Conn +func (f *tcpConnFile) Shutdown(how int) sys.Errno { var err error switch how { case syscall.SHUT_RD, syscall.SHUT_WR: @@ -136,20 +145,36 @@ func (f *tcpConnFile) Shutdown(how int) syscall.Errno { case syscall.SHUT_RDWR: return f.close() default: - return syscall.EINVAL + return sys.EINVAL } - return platform.UnwrapOSError(err) + return sys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File -func (f *tcpConnFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File +func (f *tcpConnFile) Close() sys.Errno { return f.close() } -func (f *tcpConnFile) close() syscall.Errno { +func (f *tcpConnFile) close() sys.Errno { if f.closed { return 0 } f.closed = true - return platform.UnwrapOSError(syscall.Shutdown(int(f.fd), syscall.SHUT_RDWR)) + return sys.UnwrapOSError(syscall.Shutdown(int(f.fd), syscall.SHUT_RDWR)) +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *tcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { + f.nonblock = enabled + return sys.UnwrapOSError(setNonblock(f.fd, enabled)) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *tcpConnFile) IsNonblock() bool { + return f.nonblock +} + +// Poll implements the same method as documented on fsapi.File +func (f *tcpConnFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go index 57e8eb10a2..76a10a8b61 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go @@ -4,8 +4,8 @@ package sysfs import ( "net" - "syscall" + "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" ) @@ -21,6 +21,6 @@ type unsupportedSockFile struct { } // Accept implements the same method as documented on socketapi.TCPSock -func (f *unsupportedSockFile) Accept() (socketapi.TCPConn, syscall.Errno) { - return nil, syscall.ENOSYS +func (f *unsupportedSockFile) Accept() (socketapi.TCPConn, sys.Errno) { + return nil, sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go index 9f3b46913a..ed275e6290 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go @@ -7,19 +7,26 @@ import ( "syscall" "unsafe" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" ) -// MSG_PEEK is the flag PEEK for syscall.Recvfrom on Windows. -// This constant is not exported on this platform. -const MSG_PEEK = 0x2 +const ( + // MSG_PEEK is the flag PEEK for syscall.Recvfrom on Windows. + // This constant is not exported on this platform. + MSG_PEEK = 0x2 + // _FIONBIO is the flag to set the O_NONBLOCK flag on socket handles using ioctlsocket. + _FIONBIO = 0x8004667e +) var ( // modws2_32 is WinSock. modws2_32 = syscall.NewLazyDLL("ws2_32.dll") // procrecvfrom exposes recvfrom from WinSock. procrecvfrom = modws2_32.NewProc("recvfrom") + // procioctlsocket exposes ioctlsocket from WinSock. + procioctlsocket = modws2_32.NewProc("ioctlsocket") ) // recvfrom exposes the underlying syscall in Windows. @@ -28,7 +35,7 @@ var ( // we do not need really need all the parameters that are actually // allowed in WinSock. // We ignore `from *sockaddr` and `fromlen *int`. -func recvfrom(s syscall.Handle, buf []byte, flags int32) (n int, errno syscall.Errno) { +func recvfrom(s syscall.Handle, buf []byte, flags int32) (n int, errno sys.Errno) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] @@ -41,7 +48,51 @@ func recvfrom(s syscall.Handle, buf []byte, flags int32) (n int, errno syscall.E uintptr(flags), 0, // from *sockaddr (optional) 0) // fromlen *int (optional) - return int(r0), e1 + return int(r0), sys.UnwrapOSError(e1) +} + +func setNonblockSocket(fd syscall.Handle, enabled bool) sys.Errno { + opt := uint64(0) + if enabled { + opt = 1 + } + // ioctlsocket(fd, FIONBIO, &opt) + _, _, errno := syscall.SyscallN( + procioctlsocket.Addr(), + uintptr(fd), + uintptr(_FIONBIO), + uintptr(unsafe.Pointer(&opt))) + return sys.UnwrapOSError(errno) +} + +// syscallConnControl extracts a syscall.RawConn from the given syscall.Conn and applies +// the given fn to a file descriptor, returning an integer or a nonzero syscall.Errno on failure. +// +// syscallConnControl streamlines the pattern of extracting the syscall.Rawconn, +// invoking its syscall.RawConn.Control method, then handling properly the errors that may occur +// within fn or returned by syscall.RawConn.Control itself. +func syscallConnControl(conn syscall.Conn, fn func(fd uintptr) (int, sys.Errno)) (n int, errno sys.Errno) { + syscallConn, err := conn.SyscallConn() + if err != nil { + return 0, sys.UnwrapOSError(err) + } + // Prioritize the inner errno over Control + if controlErr := syscallConn.Control(func(fd uintptr) { + n, errno = fn(fd) + }); errno == 0 { + errno = sys.UnwrapOSError(controlErr) + } + return +} + +func _pollSock(conn syscall.Conn, flag fsapi.Pflag, timeoutMillis int32) (bool, sys.Errno) { + if flag != fsapi.POLLIN { + return false, sys.ENOTSUP + } + n, errno := syscallConnControl(conn, func(fd uintptr) (int, sys.Errno) { + return _poll([]pollFd{newPollFd(fd, _POLLIN, 0)}, timeoutMillis) + }) + return n > 0, errno } // newTCPListenerFile is a constructor for a socketapi.TCPSock. @@ -61,26 +112,36 @@ var _ socketapi.TCPSock = (*winTcpListenerFile)(nil) type winTcpListenerFile struct { baseSockFile - tl *net.TCPListener + tl *net.TCPListener + closed bool + nonblock bool } // Accept implements the same method as documented on socketapi.TCPSock -func (f *winTcpListenerFile) Accept() (socketapi.TCPConn, syscall.Errno) { - conn, err := f.tl.Accept() - if err != nil { - return nil, platform.UnwrapOSError(err) +func (f *winTcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { + // Ensure we have an incoming connection using winsock_select, otherwise return immediately. + if f.nonblock { + if ready, errno := _pollSock(f.tl, fsapi.POLLIN, 0); !ready || errno != 0 { + return nil, sys.EAGAIN + } } - return &winTcpConnFile{tc: conn.(*net.TCPConn)}, 0 -} -// SetNonblock implements the same method as documented on fsapi.File -func (f *winTcpListenerFile) SetNonblock(enabled bool) syscall.Errno { - return 0 // setNonblock() is a no-op on Windows + // Accept normally blocks goroutines, but we + // made sure that we have an incoming connection, + // so we should be safe. + if conn, err := f.tl.Accept(); err != nil { + return nil, sys.UnwrapOSError(err) + } else { + return newTcpConn(conn.(*net.TCPConn)), 0 + } } -// Close implements the same method as documented on fsapi.File -func (f *winTcpListenerFile) Close() syscall.Errno { - return platform.UnwrapOSError(f.tl.Close()) +// Close implements the same method as documented on sys.File +func (f *winTcpListenerFile) Close() sys.Errno { + if !f.closed { + return sys.UnwrapOSError(f.tl.Close()) + } + return 0 } // Addr is exposed for testing. @@ -88,14 +149,39 @@ func (f *winTcpListenerFile) Addr() *net.TCPAddr { return f.tl.Addr().(*net.TCPAddr) } +// IsNonblock implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) IsNonblock() bool { + return f.nonblock +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) SetNonblock(enabled bool) sys.Errno { + f.nonblock = enabled + _, errno := syscallConnControl(f.tl, func(fd uintptr) (int, sys.Errno) { + return 0, setNonblockSocket(syscall.Handle(fd), enabled) + }) + return errno +} + +// Poll implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) Poll(fsapi.Pflag, int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} + var _ socketapi.TCPConn = (*winTcpConnFile)(nil) +// winTcpConnFile is a blocking connection. +// +// It is a wrapper for an underlying net.TCPConn. type winTcpConnFile struct { baseSockFile tc *net.TCPConn - // closed is true when closed was called. This ensures proper syscall.EBADF + // nonblock is true when the underlying connection is flagged as non-blocking. + // This ensures that reads and writes return sys.EAGAIN without blocking the caller. + nonblock bool + // closed is true when closed was called. This ensures proper sys.EBADF closed bool } @@ -103,34 +189,35 @@ func newTcpConn(tc *net.TCPConn) socketapi.TCPConn { return &winTcpConnFile{tc: tc} } -// SetNonblock implements the same method as documented on fsapi.File -func (f *winTcpConnFile) SetNonblock(enabled bool) (errno syscall.Errno) { - syscallConn, err := f.tc.SyscallConn() - if err != nil { - return platform.UnwrapOSError(err) +// Read implements the same method as documented on sys.File +func (f *winTcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { + if len(buf) == 0 { + return 0, 0 // Short-circuit 0-len reads. } - - // Prioritize the error from setNonblock over Control - if controlErr := syscallConn.Control(func(fd uintptr) { - errno = platform.UnwrapOSError(setNonblock(fd, enabled)) - }); errno == 0 { - errno = platform.UnwrapOSError(controlErr) + if nonBlockingFileReadSupported && f.IsNonblock() { + n, errno = syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return readSocket(syscall.Handle(fd), buf) + }) + } else { + n, errno = read(f.tc, buf) } - return -} - -// Read implements the same method as documented on fsapi.File -func (f *winTcpConnFile) Read(buf []byte) (n int, errno syscall.Errno) { - if n, errno = read(f.tc, buf); errno != 0 { + if errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } return } -// Write implements the same method as documented on fsapi.File -func (f *winTcpConnFile) Write(buf []byte) (n int, errno syscall.Errno) { - if n, errno = write(f.tc, buf); errno != 0 { +// Write implements the same method as documented on sys.File +func (f *winTcpConnFile) Write(buf []byte) (n int, errno sys.Errno) { + if nonBlockingFileWriteSupported && f.IsNonblock() { + return syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return writeSocket(fd, buf) + }) + } else { + n, errno = write(f.tc, buf) + } + if errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } @@ -138,31 +225,18 @@ func (f *winTcpConnFile) Write(buf []byte) (n int, errno syscall.Errno) { } // Recvfrom implements the same method as documented on socketapi.TCPConn -func (f *winTcpConnFile) Recvfrom(p []byte, flags int) (n int, errno syscall.Errno) { +func (f *winTcpConnFile) Recvfrom(p []byte, flags int) (n int, errno sys.Errno) { if flags != MSG_PEEK { - errno = syscall.EINVAL - return - } - conn := f.tc - syscallConn, err := conn.SyscallConn() - if err != nil { - errno = platform.UnwrapOSError(err) + errno = sys.EINVAL return } - - // Prioritize the error from recvfrom over Control - if controlErr := syscallConn.Control(func(fd uintptr) { - var recvfromErr error - n, recvfromErr = recvfrom(syscall.Handle(fd), p, MSG_PEEK) - errno = platform.UnwrapOSError(recvfromErr) - }); errno == 0 { - errno = platform.UnwrapOSError(controlErr) - } - return + return syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return recvfrom(syscall.Handle(fd), p, MSG_PEEK) + }) } -// Shutdown implements the same method as documented on fsapi.Conn -func (f *winTcpConnFile) Shutdown(how int) syscall.Errno { +// Shutdown implements the same method as documented on sys.Conn +func (f *winTcpConnFile) Shutdown(how int) sys.Errno { // FIXME: can userland shutdown listeners? var err error switch how { @@ -173,20 +247,39 @@ func (f *winTcpConnFile) Shutdown(how int) syscall.Errno { case syscall.SHUT_RDWR: return f.close() default: - return syscall.EINVAL + return sys.EINVAL } - return platform.UnwrapOSError(err) + return sys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File -func (f *winTcpConnFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File +func (f *winTcpConnFile) Close() sys.Errno { return f.close() } -func (f *winTcpConnFile) close() syscall.Errno { +func (f *winTcpConnFile) close() sys.Errno { if f.closed { return 0 } f.closed = true return f.Shutdown(syscall.SHUT_RDWR) } + +// IsNonblock implements the same method as documented on fsapi.File +func (f *winTcpConnFile) IsNonblock() bool { + return f.nonblock +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *winTcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { + f.nonblock = true + _, errno = syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return 0, sys.UnwrapOSError(setNonblockSocket(syscall.Handle(fd), enabled)) + }) + return +} + +// Poll implements the same method as documented on fsapi.File +func (f *winTcpConnFile) Poll(fsapi.Pflag, int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go index 60690fd90b..2d973b16cb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go @@ -2,31 +2,15 @@ package sysfs import ( "io/fs" - "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func defaultStatFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { - if t, err := f.Stat(); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +func defaultStatFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { + if info, err := f.Stat(); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } - -func StatFromDefaultFileInfo(t fs.FileInfo) fsapi.Stat_t { - st := fsapi.Stat_t{} - st.Ino = 0 - st.Dev = 0 - st.Mode = t.Mode() - st.Nlink = 1 - st.Size = t.Size() - mtim := t.ModTime().UnixNano() // Set all times to the mod time - st.Atim = mtim - st.Mtim = mtim - st.Ctim = mtim - return st -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go index 8297e8502a..254e204cd9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go @@ -5,56 +5,33 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Lstat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +// dirNlinkIncludesDot is true because even though os.File filters out dot +// entries, the underlying syscall.Stat includes them. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = true + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Lstat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Stat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Stat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - ino = d.Ino - } - return -} - -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - st := fsapi.Stat_t{} - st.Dev = uint64(d.Dev) - st.Ino = d.Ino - st.Uid = d.Uid - st.Gid = d.Gid - st.Mode = t.Mode() - st.Nlink = uint64(d.Nlink) - st.Size = d.Size - atime := d.Atimespec - st.Atim = atime.Sec*1e9 + atime.Nsec - mtime := d.Mtimespec - st.Mtim = mtime.Sec*1e9 + mtime.Nsec - ctime := d.Ctimespec - st.Ctim = ctime.Sec*1e9 + ctime.Nsec - return st - } - return StatFromDefaultFileInfo(t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go index e90f29b513..fd289756de 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go @@ -8,56 +8,33 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Lstat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +// dirNlinkIncludesDot is true because even though os.File filters out dot +// entries, the underlying syscall.Stat includes them. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = true + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Lstat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Stat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Stat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - ino = d.Ino - } - return -} - -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - st := fsapi.Stat_t{} - st.Dev = uint64(d.Dev) - st.Ino = uint64(d.Ino) - st.Uid = d.Uid - st.Gid = d.Gid - st.Mode = t.Mode() - st.Nlink = uint64(d.Nlink) - st.Size = d.Size - atime := d.Atim - st.Atim = atime.Sec*1e9 + atime.Nsec - mtime := d.Mtim - st.Mtim = mtime.Sec*1e9 + mtime.Nsec - ctime := d.Ctim - st.Ctim = ctime.Sec*1e9 + ctime.Nsec - return st - } - return StatFromDefaultFileInfo(t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go index 4c2b70550e..4b05a89772 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go @@ -5,38 +5,36 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { - t, err := os.Lstat(path) - if errno := platform.UnwrapOSError(err); errno == 0 { - return statFromFileInfo(t), 0 +// Note: go:build constraints must be the same as /sys.stat_unsupported.go for +// the same reasons. + +// dirNlinkIncludesDot might be true for some operating systems, which can have +// new stat_XX.go files as necessary. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = false + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Lstat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return fsapi.Stat_t{}, errno + return sys.NewStat_t(info), 0 } } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { - t, err := os.Stat(path) - if errno := platform.UnwrapOSError(err); errno == 0 { - return statFromFileInfo(t), 0 +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Stat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return fsapi.Stat_t{}, errno + return sys.NewStat_t(info), 0 } } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { - return -} - -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - return StatFromDefaultFileInfo(t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go index 4b05727e15..4456dd7828 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go @@ -4,15 +4,18 @@ package sysfs import ( "io/fs" - "os" - "path" "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { +// dirNlinkIncludesDot is false because Windows does not return dot entries. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = false + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) // Use FILE_FLAG_OPEN_REPARSE_POINT, otherwise CreateFile will follow symlink. // See https://docs.microsoft.com/en-us/windows/desktop/FileIO/symbolic-link-effects-on-file-systems-functions#createfile-and-createfiletransacted @@ -20,93 +23,68 @@ func lstat(path string) (fsapi.Stat_t, syscall.Errno) { return statPath(attrs, path) } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) return statPath(attrs, path) } -func statPath(createFileAttrs uint32, path string) (fsapi.Stat_t, syscall.Errno) { +func statPath(createFileAttrs uint32, path string) (sys.Stat_t, experimentalsys.Errno) { if len(path) == 0 { - return fsapi.Stat_t{}, syscall.ENOENT + return sys.Stat_t{}, experimentalsys.ENOENT } pathp, err := syscall.UTF16PtrFromString(path) if err != nil { - return fsapi.Stat_t{}, syscall.EINVAL + return sys.Stat_t{}, experimentalsys.EINVAL } // open the file handle h, err := syscall.CreateFile(pathp, 0, 0, nil, syscall.OPEN_EXISTING, createFileAttrs, 0) if err != nil { + errno := experimentalsys.UnwrapOSError(err) // To match expectations of WASI, e.g. TinyGo TestStatBadDir, return // ENOENT, not ENOTDIR. - if err == syscall.ENOTDIR { - err = syscall.ENOENT + if errno == experimentalsys.ENOTDIR { + errno = experimentalsys.ENOENT } - return fsapi.Stat_t{}, platform.UnwrapOSError(err) + return sys.Stat_t{}, errno } defer syscall.CloseHandle(h) return statHandle(h) } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { - // Attempt to get the stat by handle, which works for normal files - st, err := statHandle(syscall.Handle(f.Fd())) - - // ERROR_INVALID_HANDLE happens before Go 1.20. Don't fail as we only - // use that approach to fill in inode data, which is not critical. - // - // Note: statHandle uses UnwrapOSError which coerces - // ERROR_INVALID_HANDLE to EBADF. - if err != syscall.EBADF { - return st, err - } - return defaultStatFile(f) -} - -// inoFromFileInfo uses stat to get the inode information of the file. -func inoFromFileInfo(filePath string, t fs.FileInfo) (ino uint64, errno syscall.Errno) { - if filePath == "" { - // This is a fs.File backed implementation which doesn't have access to - // the original file path. - return - } - // ino is no not in Win32FileAttributeData - inoPath := path.Clean(path.Join(filePath, t.Name())) - var st fsapi.Stat_t - if st, errno = lstat(inoPath); errno == 0 { - ino = st.Ino - } - return +// fdFile allows masking the `Fd` function on os.File. +type fdFile interface { + Fd() uintptr } -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - if d, ok := t.Sys().(*syscall.Win32FileAttributeData); ok { - st := fsapi.Stat_t{} - st.Ino = 0 // not in Win32FileAttributeData - st.Dev = 0 // not in Win32FileAttributeData - st.Mode = t.Mode() - st.Nlink = 1 // not in Win32FileAttributeData - st.Size = t.Size() - st.Atim = d.LastAccessTime.Nanoseconds() - st.Mtim = d.LastWriteTime.Nanoseconds() - st.Ctim = d.CreationTime.Nanoseconds() - return st - } else { - return StatFromDefaultFileInfo(t) +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { + if osF, ok := f.(fdFile); ok { + // Attempt to get the stat by handle, which works for normal files + st, err := statHandle(syscall.Handle(osF.Fd())) + + // ERROR_INVALID_HANDLE happens before Go 1.20. Don't fail as we only + // use that approach to fill in inode data, which is not critical. + // + // Note: statHandle uses UnwrapOSError which coerces + // ERROR_INVALID_HANDLE to EBADF. + if err != experimentalsys.EBADF { + return st, err + } } + return defaultStatFile(f) } -func statHandle(h syscall.Handle) (fsapi.Stat_t, syscall.Errno) { +func statHandle(h syscall.Handle) (sys.Stat_t, experimentalsys.Errno) { winFt, err := syscall.GetFileType(h) if err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } var fi syscall.ByHandleFileInformation if err = syscall.GetFileInformationByHandle(h, &fi); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } var m fs.FileMode @@ -127,7 +105,7 @@ func statHandle(h syscall.Handle) (fsapi.Stat_t, syscall.Errno) { m |= fs.ModeDir | 0o111 // e.g. 0o444 -> 0o555 } - st := fsapi.Stat_t{} + st := sys.Stat_t{} // FileIndex{High,Low} can be combined and used as a unique identifier like inode. // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/ns-fileapi-by_handle_file_information st.Dev = uint64(fi.VolumeSerialNumber) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go index ba336c8d5d..86f9a0865d 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go @@ -4,11 +4,10 @@ package sysfs import ( "os" - "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func fsync(f *os.File) syscall.Errno { - return platform.UnwrapOSError(f.Sync()) +func fsync(f *os.File) sys.Errno { + return sys.UnwrapOSError(f.Sync()) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go index e83dc3044a..0f05ba7764 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go @@ -2,17 +2,16 @@ package sysfs import ( "os" - "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func fsync(f *os.File) syscall.Errno { - errno := platform.UnwrapOSError(f.Sync()) +func fsync(f *os.File) sys.Errno { + errno := sys.UnwrapOSError(f.Sync()) // Coerce error performing stat on a directory to 0, as it won't work // on Windows. switch errno { - case syscall.EACCES /* Go 1.20 */, syscall.EBADF /* Go 1.18 */ : + case sys.EACCES /* Go 1.20 */, sys.EBADF /* Go 1.18 */ : if st, err := f.Stat(); err == nil && st.IsDir() { errno = 0 } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go index 37b74e182f..4f7dbe3fe7 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go @@ -1,17 +1,17 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Unlink(name string) (errno syscall.Errno) { +func unlink(name string) (errno sys.Errno) { err := syscall.Unlink(name) - if errno = platform.UnwrapOSError(err); errno == syscall.EPERM { - errno = syscall.EISDIR + if errno = sys.UnwrapOSError(err); errno == sys.EPERM { + errno = sys.EISDIR } return errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go new file mode 100644 index 0000000000..16ed06ab2a --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go @@ -0,0 +1,12 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +func unlink(name string) sys.Errno { + err := syscall.Remove(name) + return sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go index 410ea8444b..be31c7b911 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go @@ -1,26 +1,24 @@ -//go:build windows - package sysfs import ( "os" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Unlink(name string) syscall.Errno { +func unlink(name string) sys.Errno { err := syscall.Unlink(name) if err == nil { return 0 } - errno := platform.UnwrapOSError(err) - if errno == syscall.EBADF { + errno := sys.UnwrapOSError(err) + if errno == sys.EBADF { lstat, errLstat := os.Lstat(name) if errLstat == nil && lstat.Mode()&os.ModeSymlink != 0 { - errno = platform.UnwrapOSError(os.Remove(name)) + errno = sys.UnwrapOSError(os.Remove(name)) } else { - errno = syscall.EISDIR + errno = sys.EISDIR } } return errno diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go b/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go index b4ec34eb76..b4af415083 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go @@ -2,7 +2,8 @@ package wasip1 import ( "fmt" - "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" ) // Errno is neither uint16 nor an alias for parity with wasm.ValueType. @@ -263,47 +264,47 @@ var errnoToString = [...]string{ // Note: Coercion isn't centralized in sys.FSContext because ABI use different // error codes. For example, wasi-filesystem and GOOS=js don't map to these // Errno. -func ToErrno(errno syscall.Errno) Errno { +func ToErrno(errno sys.Errno) Errno { switch errno { case 0: return ErrnoSuccess - case syscall.EACCES: + case sys.EACCES: return ErrnoAcces - case syscall.EAGAIN: + case sys.EAGAIN: return ErrnoAgain - case syscall.EBADF: + case sys.EBADF: return ErrnoBadf - case syscall.EEXIST: + case sys.EEXIST: return ErrnoExist - case syscall.EFAULT: + case sys.EFAULT: return ErrnoFault - case syscall.EINTR: + case sys.EINTR: return ErrnoIntr - case syscall.EINVAL: + case sys.EINVAL: return ErrnoInval - case syscall.EIO: + case sys.EIO: return ErrnoIo - case syscall.EISDIR: + case sys.EISDIR: return ErrnoIsdir - case syscall.ELOOP: + case sys.ELOOP: return ErrnoLoop - case syscall.ENAMETOOLONG: + case sys.ENAMETOOLONG: return ErrnoNametoolong - case syscall.ENOENT: + case sys.ENOENT: return ErrnoNoent - case syscall.ENOSYS: + case sys.ENOSYS: return ErrnoNosys - case syscall.ENOTDIR: + case sys.ENOTDIR: return ErrnoNotdir - case syscall.ENOTEMPTY: + case sys.ENOTEMPTY: return ErrnoNotempty - case syscall.ENOTSOCK: + case sys.ENOTSOCK: return ErrnoNotsock - case syscall.ENOTSUP: + case sys.ENOTSUP: return ErrnoNotsup - case syscall.EPERM: + case sys.EPERM: return ErrnoPerm - case syscall.EROFS: + case sys.EROFS: return ErrnoRofs default: return ErrnoIo diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go b/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go index 3b6919cf07..2ab56c6041 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go @@ -41,7 +41,7 @@ const ( RIGHT_PATH_CREATE_DIRECTORY // RIGHT_PATH_CREATE_FILE when RIGHT_PATH_OPEN is set, the right to invoke - // path_open with O_CREATE. + // path_open with O_CREAT. RIGHT_PATH_CREATE_FILE // RIGHT_PATH_LINK_SOURCE is the right to invoke path_link with the file diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go index 20cdcd96ac..3e2e21dcd9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go @@ -106,6 +106,11 @@ func (m *ModuleInstance) CloseWithExitCode(ctx context.Context, exitCode uint32) return m.ensureResourcesClosed(ctx) } +// IsClosed implements the same method as documented on api.Module. +func (m *ModuleInstance) IsClosed() bool { + return atomic.LoadUint64(&m.Closed) != 0 +} + func (m *ModuleInstance) closeWithExitCodeWithoutClosingResource(exitCode uint32) (err error) { if !m.setExitCode(exitCode, exitCodeFlagResourceNotClosed) { return nil // not an error to have already closed @@ -139,8 +144,14 @@ func (m *ModuleInstance) setExitCode(exitCode uint32, flag exitCodeFlag) bool { } // ensureResourcesClosed ensures that resources assigned to ModuleInstance is released. -// Multiple calls to this function is safe. +// Only one call will happen per module, due to external atomic guards on Closed. func (m *ModuleInstance) ensureResourcesClosed(ctx context.Context) (err error) { + if closeNotifier := m.CloseNotifier; closeNotifier != nil { // experimental + closed := atomic.LoadUint64(&m.Closed) + closeNotifier.CloseNotify(ctx, uint32(closed>>32)) + m.CloseNotifier = nil + } + if sysCtx := m.Sys; sysCtx != nil { // nil if from HostModuleBuilder if err = sysCtx.FS().Close(); err != nil { return err diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go index 70af5e6fa0..e853d7fa48 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go @@ -7,6 +7,7 @@ import ( "sync" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/internal/close" "github.com/tetratelabs/wazero/internal/internalapi" "github.com/tetratelabs/wazero/internal/leb128" internalsys "github.com/tetratelabs/wazero/internal/sys" @@ -124,6 +125,9 @@ type ( prev, next *ModuleInstance // Source is a pointer to the Module from which this ModuleInstance derives. Source *Module + + // CloseNotifier is an experimental hook called once on close. + CloseNotifier close.Notifier } // DataInstance holds bytes corresponding to the data segment in a module. diff --git a/vendor/github.com/tetratelabs/wazero/netlify.toml b/vendor/github.com/tetratelabs/wazero/netlify.toml index 6c4751a153..1ba638bfe9 100644 --- a/vendor/github.com/tetratelabs/wazero/netlify.toml +++ b/vendor/github.com/tetratelabs/wazero/netlify.toml @@ -3,7 +3,7 @@ publish = "public" [build.environment] - HUGO_VERSION = "0.112.5" + HUGO_VERSION = "0.115.2" [context.production] command = "git submodule update --init && hugo --gc --minify" diff --git a/vendor/github.com/tetratelabs/wazero/runtime.go b/vendor/github.com/tetratelabs/wazero/runtime.go index 0a944175e1..70c63cdaa6 100644 --- a/vendor/github.com/tetratelabs/wazero/runtime.go +++ b/vendor/github.com/tetratelabs/wazero/runtime.go @@ -7,6 +7,7 @@ import ( "github.com/tetratelabs/wazero/api" experimentalapi "github.com/tetratelabs/wazero/experimental" + internalclose "github.com/tetratelabs/wazero/internal/close" internalsock "github.com/tetratelabs/wazero/internal/sock" internalsys "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/wasm" @@ -31,7 +32,8 @@ import ( // - Closing this closes any CompiledModule or Module it instantiated. type Runtime interface { // Instantiate instantiates a module from the WebAssembly binary (%.wasm) - // with default configuration. + // with default configuration, which notably calls the "_start" function, + // if it exists. // // Here's an example: // ctx := context.Background() @@ -291,8 +293,7 @@ func (r *runtime) InstantiateModule( code := compiled.(*compiledModule) config := mConfig.(*moduleConfig) - // Only build listeners on a guest module. A host module doesn't have - // memory, and a guest without memory can't use listeners anyway. + // Only add guest module configuration to guests. if !code.module.IsHostModule { if sockConfig, ok := ctx.Value(internalsock.ConfigKey{}).(*internalsock.Config); ok { config.sockConfig = sockConfig @@ -319,7 +320,12 @@ func (r *runtime) InstantiateModule( return } - // Attach the code closer so that anything afterwards closes the compiled code when closing the module. + if closeNotifier, ok := ctx.Value(internalclose.NotifierKey{}).(internalclose.Notifier); ok { + mod.(*wasm.ModuleInstance).CloseNotifier = closeNotifier + } + + // Attach the code closer so that anything afterward closes the compiled + // code when closing the module. if code.closeWithModule { mod.(*wasm.ModuleInstance).CodeCloser = code } diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat.go b/vendor/github.com/tetratelabs/wazero/sys/stat.go new file mode 100644 index 0000000000..bb7b9e5d33 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat.go @@ -0,0 +1,107 @@ +package sys + +import "io/fs" + +// Inode is the file serial number, or zero if unknown. +// +// Any constant value will invalidate functions that use this for +// equivalence, such as os.SameFile (Stat_t.Ino). +// +// When zero is returned by a `readdir`, some compilers will attempt to +// get a non-zero value with `lstat`. Those using this for darwin's definition +// of `getdirentries` conflate zero `d_fileno` with a deleted file, so skip the +// entry. See /RATIONALE.md for more on this. +type Inode = uint64 + +// ^-- Inode is a type alias to consolidate documentation and aid in reference +// searches. While only Stat_t is exposed publicly at the moment, this is used +// internally for Dirent and several function return values. + +// EpochNanos is a timestamp in epoch nanoseconds, or zero if unknown. +// +// This defines epoch time the same way as Walltime, except this value is +// packed into an int64. Common conversions are detailed in the examples. +type EpochNanos = int64 + +// Stat_t is similar to syscall.Stat_t, except available on all operating +// systems, including Windows. +// +// # Notes +// +// - This is used for WebAssembly ABI emulating the POSIX `stat` system call. +// Fields included are required for WebAssembly ABI including wasip1 +// (a.k.a. wasix) and wasi-filesystem (a.k.a. wasip2). See +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html +// - Fields here are required for WebAssembly ABI including wasip1 +// (a.k.a. wasix) and wasi-filesystem (a.k.a. wasip2). +// - This isn't the same as syscall.Stat_t because wazero supports Windows, +// which doesn't have that type. runtime.GOOS that has this already also +// have inconsistent field lengths, which complicates wasm binding. +// - Use NewStat_t to create this from an existing fs.FileInfo. +// - For portability, numeric fields are 64-bit when at least one platform +// defines it that large. +type Stat_t struct { + // Dev is the device ID of device containing the file. + Dev uint64 + + // Ino is the file serial number, or zero if not available. See Inode for + // more details including impact returning a zero value. + Ino Inode + + // Mode is the same as Mode on fs.FileInfo containing bits to identify the + // type of the file (fs.ModeType) and its permissions (fs.ModePerm). + Mode fs.FileMode + + // Nlink is the number of hard links to the file. + // + // Note: This value is platform-specific and often at least one. Linux will + // return 1+N for a directory, where BSD (like Darwin) return 2+N, which + // includes the dot entry. + Nlink uint64 + + // Size is the length in bytes for regular files. For symbolic links, this + // is length in bytes of the pathname contained in the symbolic link. + Size int64 + + // Atim is the last data access timestamp in epoch nanoseconds. + Atim EpochNanos + + // Mtim is the last data modification timestamp in epoch nanoseconds. + Mtim EpochNanos + + // Ctim is the last file status change timestamp in epoch nanoseconds. + Ctim EpochNanos +} + +// NewStat_t fills a new Stat_t from `info`, including any runtime.GOOS-specific +// details from fs.FileInfo `Sys`. When `Sys` is already a *Stat_t, it is +// returned as-is. +// +// # Notes +// +// - When already in fs.FileInfo `Sys`, Stat_t must be a pointer. +// - When runtime.GOOS is "windows" Stat_t.Ino will be zero. +// - When fs.FileInfo `Sys` is nil or unknown, some fields not in fs.FileInfo +// are defaulted: Stat_t.Atim and Stat_t.Ctim are set to `ModTime`, and +// are set to ModTime and Stat_t.Nlink is set to 1. +func NewStat_t(info fs.FileInfo) Stat_t { + // Note: Pointer, not val, for parity with Go, which sets *syscall.Stat_t + if st, ok := info.Sys().(*Stat_t); ok { + return *st + } + return statFromFileInfo(info) +} + +func defaultStatFromFileInfo(info fs.FileInfo) Stat_t { + st := Stat_t{} + st.Ino = 0 + st.Dev = 0 + st.Mode = info.Mode() + st.Nlink = 1 + st.Size = info.Size() + mtim := info.ModTime().UnixNano() // Set all times to the mod time + st.Atim = mtim + st.Mtim = mtim + st.Ctim = mtim + return st +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go b/vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go new file mode 100644 index 0000000000..3bf9b5d143 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go @@ -0,0 +1,29 @@ +//go:build (amd64 || arm64) && (darwin || freebsd) + +package sys + +import ( + "io/fs" + "syscall" +) + +const sysParseable = true + +func statFromFileInfo(info fs.FileInfo) Stat_t { + if d, ok := info.Sys().(*syscall.Stat_t); ok { + st := Stat_t{} + st.Dev = uint64(d.Dev) + st.Ino = d.Ino + st.Mode = info.Mode() + st.Nlink = uint64(d.Nlink) + st.Size = d.Size + atime := d.Atimespec + st.Atim = atime.Sec*1e9 + atime.Nsec + mtime := d.Mtimespec + st.Mtim = mtime.Sec*1e9 + mtime.Nsec + ctime := d.Ctimespec + st.Ctim = ctime.Sec*1e9 + ctime.Nsec + return st + } + return defaultStatFromFileInfo(info) +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_linux.go b/vendor/github.com/tetratelabs/wazero/sys/stat_linux.go new file mode 100644 index 0000000000..9b5e20e8d2 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_linux.go @@ -0,0 +1,32 @@ +//go:build (amd64 || arm64 || riscv64) && linux + +// Note: This expression is not the same as compiler support, even if it looks +// similar. Platform functions here are used in interpreter mode as well. + +package sys + +import ( + "io/fs" + "syscall" +) + +const sysParseable = true + +func statFromFileInfo(info fs.FileInfo) Stat_t { + if d, ok := info.Sys().(*syscall.Stat_t); ok { + st := Stat_t{} + st.Dev = uint64(d.Dev) + st.Ino = uint64(d.Ino) + st.Mode = info.Mode() + st.Nlink = uint64(d.Nlink) + st.Size = d.Size + atime := d.Atim + st.Atim = atime.Sec*1e9 + atime.Nsec + mtime := d.Mtim + st.Mtim = mtime.Sec*1e9 + mtime.Nsec + ctime := d.Ctim + st.Ctim = ctime.Sec*1e9 + ctime.Nsec + return st + } + return defaultStatFromFileInfo(info) +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go b/vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go new file mode 100644 index 0000000000..583c2adb04 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go @@ -0,0 +1,17 @@ +//go:build (!((amd64 || arm64 || riscv64) && linux) && !((amd64 || arm64) && (darwin || freebsd)) && !((amd64 || arm64) && windows)) || js + +package sys + +import "io/fs" + +// sysParseable is only used here as we define "supported" as being able to +// parse `info.Sys()`. The above `go:build` constraints exclude 32-bit until +// that's requested. +// +// TODO: When Go 1.21 is out, use the "unix" build constraint (as 1.21 makes +// our floor Go version 1.19. +const sysParseable = false + +func statFromFileInfo(info fs.FileInfo) Stat_t { + return defaultStatFromFileInfo(info) +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_windows.go b/vendor/github.com/tetratelabs/wazero/sys/stat_windows.go new file mode 100644 index 0000000000..1a7070f48a --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_windows.go @@ -0,0 +1,26 @@ +//go:build (amd64 || arm64) && windows + +package sys + +import ( + "io/fs" + "syscall" +) + +const sysParseable = true + +func statFromFileInfo(info fs.FileInfo) Stat_t { + if d, ok := info.Sys().(*syscall.Win32FileAttributeData); ok { + st := Stat_t{} + st.Ino = 0 // not in Win32FileAttributeData + st.Dev = 0 // not in Win32FileAttributeData + st.Mode = info.Mode() + st.Nlink = 1 // not in Win32FileAttributeData + st.Size = info.Size() + st.Atim = d.LastAccessTime.Nanoseconds() + st.Mtim = d.LastWriteTime.Nanoseconds() + st.Ctim = d.CreationTime.Nanoseconds() + return st + } + return defaultStatFromFileInfo(info) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 3156462715..8f775fafa6 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -519,7 +519,7 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || $2 ~ /^RAW_PAYLOAD_/ || @@ -624,7 +624,7 @@ ccflags="$@" $2 ~ /^MEM/ || $2 ~ /^WG/ || $2 ~ /^FIB_RULE_/ || - $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE|IOMIN$|IOOPT$|ALIGNOFF$|DISCARD|ROTATIONAL$|ZEROOUT$|GETDISKSEQ$)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/golang.org/x/sys/unix/mmap_nomremap.go b/vendor/golang.org/x/sys/unix/mmap_nomremap.go new file mode 100644 index 0000000000..ca0513632e --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mmap_nomremap.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || darwin || dragonfly || freebsd || openbsd || solaris +// +build aix darwin dragonfly freebsd openbsd solaris + +package unix + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go new file mode 100644 index 0000000000..fa93d0aa90 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mremap.go @@ -0,0 +1,53 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux || netbsd +// +build linux netbsd + +package unix + +import "unsafe" + +type mremapMmapper struct { + mmapper + mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) +} + +var mapper = &mremapMmapper{ + mmapper: mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, + }, + mremap: mremap, +} + +func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&mremapFixed != 0 { + return nil, EINVAL + } + + pOld := &oldData[cap(oldData)-1] + m.Lock() + defer m.Unlock() + bOld := m.active[pOld] + if bOld == nil || &bOld[0] != &oldData[0] { + return nil, EINVAL + } + newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0) + if errno != nil { + return nil, errno + } + bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength) + pNew := &bNew[cap(bNew)-1] + if flags&mremapDontunmap == 0 { + delete(m.active, pOld) + } + m.active[pNew] = bNew + return bNew, nil +} + +func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + return mapper.Mremap(oldData, newLength, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index c406ae00f4..9a6e5acacb 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -535,21 +535,6 @@ func Fsync(fd int) error { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 7705c3270b..4217de518b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -601,20 +601,6 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { // Gethostuuid(uuid *byte, timeout *Timespec) (err error) // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, behav int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 206921504c..135cc3cd75 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -510,30 +510,36 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { return nil, err } - // Find size. - n := uintptr(0) - if err := sysctl(mib, nil, &n, nil, 0); err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + for { + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // Read into buffer of that size. - buf := make([]KinfoProc, n/SizeofKinfoProc) - if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { - return nil, err - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + // Read into buffer of that size. + buf := make([]KinfoProc, n/SizeofKinfoProc) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { + if err == ENOMEM { + // Process table grew. Try again. + continue + } + return nil, err + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // The actual call may return less than the original reported required - // size so ensure we deal with that. - return buf[:n/SizeofKinfoProc], nil + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n/SizeofKinfoProc], nil + } } //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 6de486befe..a730878e49 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1885,7 +1885,7 @@ func Getpgrp() (pid int) { //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) -//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 +//sys pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) @@ -2124,21 +2124,7 @@ func writevRacedetect(iovecs []Iovec, n int) { // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - +//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) @@ -2147,6 +2133,12 @@ func Munmap(b []byte) (err error) { //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) +const ( + mremapFixed = MREMAP_FIXED + mremapDontunmap = MREMAP_DONTUNMAP + mremapMaymove = MREMAP_MAYMOVE +) + // Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, // using the specified flags. func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { @@ -2446,6 +2438,39 @@ func Getresgid() (rgid, egid, sgid int) { return int(r), int(e), int(s) } +// Pselect is a wrapper around the Linux pselect6 system call. +// This version does not modify the timeout argument. +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + // Per https://man7.org/linux/man-pages/man2/select.2.html#NOTES, + // The Linux pselect6() system call modifies its timeout argument. + // [Not modifying the argument] is the behavior required by POSIX.1-2001. + var mutableTimeout *Timespec + if timeout != nil { + mutableTimeout = new(Timespec) + *mutableTimeout = *timeout + } + + // The final argument of the pselect6() system call is not a + // sigset_t * pointer, but is instead a structure + var kernelMask *sigset_argpack + if sigmask != nil { + wordBits := 32 << (^uintptr(0) >> 63) // see math.intSize + + // A sigset stores one bit per signal, + // offset by 1 (because signal 0 does not exist). + // So the number of words needed is ⌈__C_NSIG - 1 / wordBits⌉. + sigsetWords := (_C__NSIG - 1 + wordBits - 1) / (wordBits) + + sigsetBytes := uintptr(sigsetWords * (wordBits / 8)) + kernelMask = &sigset_argpack{ + ss: sigmask, + ssLen: sigsetBytes, + } + } + + return pselect6(nfd, r, w, e, mutableTimeout, kernelMask) +} + /* * Unimplemented */ @@ -2487,7 +2512,6 @@ func Getresgid() (rgid, egid, sgid int) { // MqTimedreceive // MqTimedsend // MqUnlink -// Mremap // Msgctl // Msgget // Msgrcv diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 5b21fcfd75..70601ce369 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -40,7 +40,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index a81f5742b8..f5266689af 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -33,7 +33,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 69d2d7c3db..f6ab02ec15 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -28,7 +28,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 76d564095e..93fe59d25d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -31,7 +31,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 35851ef70b..5e6ceee129 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -32,7 +32,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) @@ -177,3 +177,14 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } + +//sys riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) + +func RISCVHWProbe(pairs []RISCVHWProbePairs, set *CPUSet, flags uint) (err error) { + var setSize uintptr + + if set != nil { + setSize = uintptr(unsafe.Sizeof(*set)) + } + return riscvHWProbe(pairs, setSize, set, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 018d7d4782..ddd1ac8534 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -360,6 +360,18 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) +const ( + mremapFixed = MAP_FIXED + mremapDontunmap = 0 + mremapMaymove = 0 +) + +//sys mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) = SYS_MREMAP + +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (uintptr, error) { + return mremapNetBSD(oldaddr, oldlength, newaddr, newlength, flags) +} + /* * Unimplemented */ @@ -564,7 +576,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { // mq_timedreceive // mq_timedsend // mq_unlink -// mremap // msgget // msgrcv // msgsnd diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index b600a289d3..72d23575fa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -716,20 +716,6 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { return } -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - // Event Ports type fileObjCookie struct { diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 8e48c29ec3..8bb30e7ce3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -147,6 +147,14 @@ func (m *mmapper) Munmap(data []byte) (err error) { return nil } +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + func Read(fd int, p []byte) (n int, err error) { n, err = read(fd, p) if raceenabled { diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index d3d49ec3ed..44e72edb42 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -285,25 +285,11 @@ func Close(fd int) (err error) { return } -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - // Dummy function: there are no semantics for Madvise on z/OS func Madvise(b []byte, advice int) (err error) { return } -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index de936b677b..3784f402e5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -493,6 +493,7 @@ const ( BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 + BPF_F_XDP_DEV_BOUND_ONLY = 0x40 BPF_F_XDP_HAS_FRAGS = 0x20 BPF_H = 0x8 BPF_IMM = 0x0 @@ -826,9 +827,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2022-07-28)" + DM_VERSION_EXTRA = "-ioctl (2023-03-01)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2f + DM_VERSION_MINOR = 0x30 DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -1197,6 +1198,7 @@ const ( FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_FS_ERROR = 0x8000 + FAN_INFO = 0x20 FAN_MARK_ADD = 0x1 FAN_MARK_DONT_FOLLOW = 0x4 FAN_MARK_EVICTABLE = 0x200 @@ -1233,6 +1235,8 @@ const ( FAN_REPORT_PIDFD = 0x80 FAN_REPORT_TARGET_FID = 0x1000 FAN_REPORT_TID = 0x100 + FAN_RESPONSE_INFO_AUDIT_RULE = 0x1 + FAN_RESPONSE_INFO_NONE = 0x0 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 @@ -1860,6 +1864,7 @@ const ( MEMWRITEOOB64 = 0xc0184d15 MFD_ALLOW_SEALING = 0x2 MFD_CLOEXEC = 0x1 + MFD_EXEC = 0x10 MFD_HUGETLB = 0x4 MFD_HUGE_16GB = 0x88000000 MFD_HUGE_16MB = 0x60000000 @@ -1875,6 +1880,7 @@ const ( MFD_HUGE_8MB = 0x5c000000 MFD_HUGE_MASK = 0x3f MFD_HUGE_SHIFT = 0x1a + MFD_NOEXEC_SEAL = 0x8 MINIX2_SUPER_MAGIC = 0x2468 MINIX2_SUPER_MAGIC2 = 0x2478 MINIX3_SUPER_MAGIC = 0x4d5a @@ -1898,6 +1904,9 @@ const ( MOUNT_ATTR_SIZE_VER0 = 0x20 MOUNT_ATTR_STRICTATIME = 0x20 MOUNT_ATTR__ATIME = 0x70 + MREMAP_DONTUNMAP = 0x4 + MREMAP_FIXED = 0x2 + MREMAP_MAYMOVE = 0x1 MSDOS_SUPER_MAGIC = 0x4d44 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 @@ -2204,6 +2213,7 @@ const ( PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf + PACKET_VNET_HDR_SZ = 0x18 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 @@ -2221,6 +2231,7 @@ const ( PERF_ATTR_SIZE_VER5 = 0x70 PERF_ATTR_SIZE_VER6 = 0x78 PERF_ATTR_SIZE_VER7 = 0x80 + PERF_ATTR_SIZE_VER8 = 0x88 PERF_AUX_FLAG_COLLISION = 0x8 PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT = 0x0 PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW = 0x100 @@ -2361,6 +2372,7 @@ const ( PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 + PR_GET_AUXV = 0x41555856 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 @@ -2369,6 +2381,8 @@ const ( PR_GET_FP_MODE = 0x2e PR_GET_IO_FLUSHER = 0x3a PR_GET_KEEPCAPS = 0x7 + PR_GET_MDWE = 0x42 + PR_GET_MEMORY_MERGE = 0x44 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 @@ -2389,6 +2403,7 @@ const ( PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 + PR_MDWE_REFUSE_EXEC_GAIN = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_MTE_TAG_MASK = 0x7fff8 @@ -2423,6 +2438,8 @@ const ( PR_SET_FP_MODE = 0x2d PR_SET_IO_FLUSHER = 0x39 PR_SET_KEEPCAPS = 0x8 + PR_SET_MDWE = 0x41 + PR_SET_MEMORY_MERGE = 0x43 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 @@ -2506,6 +2523,7 @@ const ( PTRACE_GETSIGMASK = 0x420a PTRACE_GET_RSEQ_CONFIGURATION = 0x420f PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG = 0x4211 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -2536,6 +2554,7 @@ const ( PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG = 0x4210 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_SYSCALL_INFO_ENTRY = 0x1 @@ -3072,7 +3091,7 @@ const ( TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0xd + TASKSTATS_VERSION = 0xe TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 @@ -3238,6 +3257,7 @@ const ( TP_STATUS_COPY = 0x2 TP_STATUS_CSUMNOTREADY = 0x8 TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_GSO_TCP = 0x100 TP_STATUS_KERNEL = 0x0 TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index a46df0f1e5..cfb1430018 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 6cd4a3ea9d..df64f2d590 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index c7ebee24df..3025cd5b2d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9d5352c3e4..09e1ffbef9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -443,6 +452,7 @@ const ( TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 + TPIDR2_MAGIC = 0x54504902 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETDEVNETNS = 0x54e3 @@ -515,6 +525,7 @@ const ( XCASE = 0x4 XTABS = 0x1800 ZA_MAGIC = 0x54366345 + ZT_MAGIC = 0x5a544e01 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index f26a164f4a..a457235407 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 890bc3c9b7..fee7dfb819 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 549f26ac64..a5b2373aea 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index e0365e32c1..5dde82c98a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index fdccce15ca..2e80ea6b33 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index b2205c83fa..a65dcd7cbe 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 81aa5ad0f6..cbd34e3d89 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 76807a1fd4..e4afa7a317 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index d4a5ab9e4e..44f45a039d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 66e65db951..74733e260f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 48984202c6..f5f3934b1a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -30,22 +30,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 722c29a008..a07321bed9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1356,7 +1356,7 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { +func pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { @@ -1868,6 +1868,17 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldaddr), uintptr(oldlength), uintptr(newlength), uintptr(flags), uintptr(newaddr), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 0b29239583..0ab4f2ed72 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -531,3 +531,19 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) { + var _p0 unsafe.Pointer + if len(pairs) > 0 { + _p0 = unsafe.Pointer(&pairs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_RISCV_HWPROBE, uintptr(_p0), uintptr(len(pairs)), uintptr(cpuCount), uintptr(unsafe.Pointer(cpus)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index cdb2af5ae0..35f499b32a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 9d25f76b0b..3cda65b0da 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index d3f8035169..1e1fea902b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 887188a529..3b77da1107 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 3e594a8c09..ef285c567b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -251,6 +251,8 @@ const ( SYS_ACCEPT4 = 242 SYS_RECVMMSG = 243 SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_RISCV_HWPROBE = 258 + SYS_RISCV_FLUSH_ICACHE = 259 SYS_WAIT4 = 260 SYS_PRLIMIT64 = 261 SYS_FANOTIFY_INIT = 262 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 7ea465204b..e6ed7d637d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -372,6 +372,7 @@ const ( SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 00c3b8c20f..26ef52aafc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -866,6 +866,11 @@ const ( POLLNVAL = 0x20 ) +type sigset_argpack struct { + ss *Sigset_t + ssLen uintptr +} + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1538,6 +1543,10 @@ const ( IFLA_GRO_MAX_SIZE = 0x3a IFLA_TSO_MAX_SIZE = 0x3b IFLA_TSO_MAX_SEGS = 0x3c + IFLA_ALLMULTI = 0x3d + IFLA_DEVLINK_PORT = 0x3e + IFLA_GSO_IPV4_MAX_SIZE = 0x3f + IFLA_GRO_IPV4_MAX_SIZE = 0x40 IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 IFLA_PROTO_DOWN_REASON_MASK = 0x1 IFLA_PROTO_DOWN_REASON_VALUE = 0x2 @@ -1968,7 +1977,7 @@ const ( NFT_MSG_GETFLOWTABLE = 0x17 NFT_MSG_DELFLOWTABLE = 0x18 NFT_MSG_GETRULE_RESET = 0x19 - NFT_MSG_MAX = 0x1a + NFT_MSG_MAX = 0x21 NFTA_LIST_UNSPEC = 0x0 NFTA_LIST_ELEM = 0x1 NFTA_HOOK_UNSPEC = 0x0 @@ -3651,7 +3660,7 @@ const ( ETHTOOL_MSG_PSE_GET = 0x24 ETHTOOL_MSG_PSE_SET = 0x25 ETHTOOL_MSG_RSS_GET = 0x26 - ETHTOOL_MSG_USER_MAX = 0x26 + ETHTOOL_MSG_USER_MAX = 0x2b ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3691,7 +3700,7 @@ const ( ETHTOOL_MSG_MODULE_NTF = 0x24 ETHTOOL_MSG_PSE_GET_REPLY = 0x25 ETHTOOL_MSG_RSS_GET_REPLY = 0x26 - ETHTOOL_MSG_KERNEL_MAX = 0x26 + ETHTOOL_MSG_KERNEL_MAX = 0x2b ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3795,7 +3804,7 @@ const ( ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 0xb ETHTOOL_A_RINGS_CQE_SIZE = 0xc ETHTOOL_A_RINGS_TX_PUSH = 0xd - ETHTOOL_A_RINGS_MAX = 0xd + ETHTOOL_A_RINGS_MAX = 0x10 ETHTOOL_A_CHANNELS_UNSPEC = 0x0 ETHTOOL_A_CHANNELS_HEADER = 0x1 ETHTOOL_A_CHANNELS_RX_MAX = 0x2 @@ -3833,14 +3842,14 @@ const ( ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 0x18 ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 0x19 - ETHTOOL_A_COALESCE_MAX = 0x19 + ETHTOOL_A_COALESCE_MAX = 0x1c ETHTOOL_A_PAUSE_UNSPEC = 0x0 ETHTOOL_A_PAUSE_HEADER = 0x1 ETHTOOL_A_PAUSE_AUTONEG = 0x2 ETHTOOL_A_PAUSE_RX = 0x3 ETHTOOL_A_PAUSE_TX = 0x4 ETHTOOL_A_PAUSE_STATS = 0x5 - ETHTOOL_A_PAUSE_MAX = 0x5 + ETHTOOL_A_PAUSE_MAX = 0x6 ETHTOOL_A_PAUSE_STAT_UNSPEC = 0x0 ETHTOOL_A_PAUSE_STAT_PAD = 0x1 ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 0x2 @@ -4490,7 +4499,7 @@ const ( NL80211_ATTR_MAC_HINT = 0xc8 NL80211_ATTR_MAC_MASK = 0xd7 NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca - NL80211_ATTR_MAX = 0x141 + NL80211_ATTR_MAX = 0x145 NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -4719,7 +4728,7 @@ const ( NL80211_BAND_ATTR_HT_CAPA = 0x4 NL80211_BAND_ATTR_HT_MCS_SET = 0x3 NL80211_BAND_ATTR_IFTYPE_DATA = 0x9 - NL80211_BAND_ATTR_MAX = 0xb + NL80211_BAND_ATTR_MAX = 0xd NL80211_BAND_ATTR_RATES = 0x2 NL80211_BAND_ATTR_VHT_CAPA = 0x8 NL80211_BAND_ATTR_VHT_MCS_SET = 0x7 @@ -4860,7 +4869,7 @@ const ( NL80211_CMD_LEAVE_IBSS = 0x2c NL80211_CMD_LEAVE_MESH = 0x45 NL80211_CMD_LEAVE_OCB = 0x6d - NL80211_CMD_MAX = 0x98 + NL80211_CMD_MAX = 0x99 NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 NL80211_CMD_MODIFY_LINK_STA = 0x97 NL80211_CMD_NAN_MATCH = 0x78 @@ -5841,6 +5850,8 @@ const ( TUN_F_TSO6 = 0x4 TUN_F_TSO_ECN = 0x8 TUN_F_UFO = 0x10 + TUN_F_USO4 = 0x20 + TUN_F_USO6 = 0x40 ) const ( @@ -5850,9 +5861,10 @@ const ( ) const ( - VIRTIO_NET_HDR_GSO_NONE = 0x0 - VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 - VIRTIO_NET_HDR_GSO_UDP = 0x3 - VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 - VIRTIO_NET_HDR_GSO_ECN = 0x80 + VIRTIO_NET_HDR_GSO_NONE = 0x0 + VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 + VIRTIO_NET_HDR_GSO_UDP = 0x3 + VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 + VIRTIO_NET_HDR_GSO_UDP_L4 = 0x5 + VIRTIO_NET_HDR_GSO_ECN = 0x80 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4ecc1495cd..6d8acbcc57 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -337,6 +337,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 34fddff964..59293c6884 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -350,6 +350,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 3b14a6031f..40cfa38c29 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -328,6 +328,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 0517651ab3..055bc4216d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -329,6 +329,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index 3b0c518134..f28affbc60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -330,6 +330,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index fccdf4dd0f..9d71e7ccd8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 500de8fc07..fd5ccd332a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index d0434cd2c6..7704de77a2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 84206ba534..df00b87571 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index ab078cf1f5..0942840db6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -340,6 +340,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 42eb2c4cef..0348743950 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 31304a4e8b..bad0670475 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index c311f9612d..83c69c119f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -357,6 +357,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 @@ -716,3 +718,26 @@ type SysvShmDesc struct { _ uint64 _ uint64 } + +type RISCVHWProbePairs struct { + Key int64 + Value uint64 +} + +const ( + RISCV_HWPROBE_KEY_MVENDORID = 0x0 + RISCV_HWPROBE_KEY_MARCHID = 0x1 + RISCV_HWPROBE_KEY_MIMPID = 0x2 + RISCV_HWPROBE_KEY_BASE_BEHAVIOR = 0x3 + RISCV_HWPROBE_BASE_BEHAVIOR_IMA = 0x1 + RISCV_HWPROBE_KEY_IMA_EXT_0 = 0x4 + RISCV_HWPROBE_IMA_FD = 0x1 + RISCV_HWPROBE_IMA_C = 0x2 + RISCV_HWPROBE_KEY_CPUPERF_0 = 0x5 + RISCV_HWPROBE_MISALIGNED_UNKNOWN = 0x0 + RISCV_HWPROBE_MISALIGNED_EMULATED = 0x1 + RISCV_HWPROBE_MISALIGNED_SLOW = 0x2 + RISCV_HWPROBE_MISALIGNED_FAST = 0x3 + RISCV_HWPROBE_MISALIGNED_UNSUPPORTED = 0x4 + RISCV_HWPROBE_MISALIGNED_MASK = 0x7 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index bba3cefac1..aa268d025c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -352,6 +352,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index ad8a013804..444045b6c5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -334,6 +334,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index c964b6848d..c44a1b9636 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -218,6 +218,10 @@ type SERVICE_FAILURE_ACTIONS struct { Actions *SC_ACTION } +type SERVICE_FAILURE_ACTIONS_FLAG struct { + FailureActionsOnNonCrashFailures int32 +} + type SC_ACTION struct { Type uint32 Delay uint32 diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go b/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go index 2e042dd695..321451990b 100644 --- a/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go +++ b/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go @@ -140,3 +140,30 @@ func (s *Service) RecoveryCommand() (string, error) { p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0])) return windows.UTF16PtrToString(p.Command), nil } + +// SetRecoveryActionsOnNonCrashFailures sets the failure actions flag. If the +// flag is set to false, recovery actions will only be performed if the service +// terminates without reporting a status of SERVICE_STOPPED. If the flag is set +// to true, recovery actions are also perfomed if the service stops with a +// nonzero exit code. +func (s *Service) SetRecoveryActionsOnNonCrashFailures(flag bool) error { + var setting windows.SERVICE_FAILURE_ACTIONS_FLAG + if flag { + setting.FailureActionsOnNonCrashFailures = 1 + } + return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS_FLAG, (*byte)(unsafe.Pointer(&setting))) +} + +// RecoveryActionsOnNonCrashFailures returns the current value of the failure +// actions flag. If the flag is set to false, recovery actions will only be +// performed if the service terminates without reporting a status of +// SERVICE_STOPPED. If the flag is set to true, recovery actions are also +// perfomed if the service stops with a nonzero exit code. +func (s *Service) RecoveryActionsOnNonCrashFailures() (bool, error) { + b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS_FLAG) + if err != nil { + return false, err + } + p := (*windows.SERVICE_FAILURE_ACTIONS_FLAG)(unsafe.Pointer(&b[0])) + return p.FailureActionsOnNonCrashFailures != 0, nil +} diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 9645900754..373d16388a 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -135,14 +135,14 @@ func Getpagesize() int { return 4096 } // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallback(fn interface{}) uintptr { return syscall.NewCallback(fn) } // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallbackCDecl(fn interface{}) uintptr { return syscall.NewCallbackCDecl(fn) } diff --git a/vendor/golang.org/x/text/cases/tables13.0.0.go b/vendor/golang.org/x/text/cases/tables13.0.0.go index cd874775b3..68d2981d18 100644 --- a/vendor/golang.org/x/text/cases/tables13.0.0.go +++ b/vendor/golang.org/x/text/cases/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package cases diff --git a/vendor/golang.org/x/text/cases/tables15.0.0.go b/vendor/golang.org/x/text/cases/tables15.0.0.go new file mode 100644 index 0000000000..e431b99537 --- /dev/null +++ b/vendor/golang.org/x/text/cases/tables15.0.0.go @@ -0,0 +1,2528 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package cases + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +var xorData string = "" + // Size: 213 bytes + "\x00\x06\x07\x00\x01?\x00\x0f\x03\x00\x0f\x12\x00\x0f\x1f\x00\x0f\x1d" + + "\x00\x01\x13\x00\x0f\x16\x00\x0f\x0b\x00\x0f3\x00\x0f7\x00\x01#\x00\x0f?" + + "\x00\x0e'\x00\x0f/\x00\x0e>\x00\x0f*\x00\x0c&\x00\x0c*\x00\x0c;\x00\x0c9" + + "\x00\x0c%\x00\x01\x08\x00\x03\x0d\x00\x03\x09\x00\x02\x06\x00\x02\x02" + + "\x00\x02\x0c\x00\x01\x00\x00\x01\x03\x00\x01\x01\x00\x01 \x00\x01\x0c" + + "\x00\x01\x10\x00\x03\x10\x00\x036 \x00\x037 \x00\x0b#\x10\x00\x0b 0\x00" + + "\x0b!\x10\x00\x0b!0\x001\x00\x00\x0b(\x04\x00\x03\x04\x1e\x00\x0b)\x08" + + "\x00\x03\x0a\x00\x02:\x00\x02>\x00\x02,\x00\x02\x00\x00\x02\x10\x00\x01<" + + "\x00\x01&\x00\x01*\x00\x01.\x00\x010\x003 \x00\x01\x18\x00\x01(\x00\x03'" + + "\x00\x03)\x00\x03+\x00\x03/\x00\x03\x19\x00\x03\x1b\x00\x03\x1f\x00\x01" + + "\x1e\x00\x01\x22" + +var exceptions string = "" + // Size: 2450 bytes + "\x00\x12\x12μΜΜ\x12\x12ssSSSs\x13\x18i̇i̇\x10\x09II\x13\x1bʼnʼNʼN\x11" + + "\x09sSS\x12\x12dždžDž\x12\x12dždžDŽ\x10\x12DŽDž\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj" + + "\x12\x12njnjNj\x12\x12njnjNJ\x10\x12NJNj\x13\x1bǰJ̌J̌\x12\x12dzdzDz\x12\x12dzdzDZ\x10" + + "\x12DZDz\x13\x18ⱥⱥ\x13\x18ⱦⱦ\x10\x1bⱾⱾ\x10\x1bⱿⱿ\x10\x1bⱯⱯ\x10\x1bⱭⱭ\x10" + + "\x1bⱰⱰ\x10\x1bꞫꞫ\x10\x1bꞬꞬ\x10\x1bꞍꞍ\x10\x1bꞪꞪ\x10\x1bꞮꞮ\x10\x1bⱢⱢ\x10" + + "\x1bꞭꞭ\x10\x1bⱮⱮ\x10\x1bⱤⱤ\x10\x1bꟅꟅ\x10\x1bꞱꞱ\x10\x1bꞲꞲ\x10\x1bꞰꞰ2\x12ι" + + "ΙΙ\x166ΐΪ́Ϊ́\x166ΰΫ́Ϋ́\x12\x12σΣΣ\x12\x12βΒΒ\x12\x12θΘΘ\x12\x12" + + "φΦΦ\x12\x12πΠΠ\x12\x12κΚΚ\x12\x12ρΡΡ\x12\x12εΕΕ\x14$եւԵՒԵւ\x10\x1bᲐა" + + "\x10\x1bᲑბ\x10\x1bᲒგ\x10\x1bᲓდ\x10\x1bᲔე\x10\x1bᲕვ\x10\x1bᲖზ\x10\x1bᲗთ" + + "\x10\x1bᲘი\x10\x1bᲙკ\x10\x1bᲚლ\x10\x1bᲛმ\x10\x1bᲜნ\x10\x1bᲝო\x10\x1bᲞპ" + + "\x10\x1bᲟჟ\x10\x1bᲠრ\x10\x1bᲡს\x10\x1bᲢტ\x10\x1bᲣუ\x10\x1bᲤფ\x10\x1bᲥქ" + + "\x10\x1bᲦღ\x10\x1bᲧყ\x10\x1bᲨშ\x10\x1bᲩჩ\x10\x1bᲪც\x10\x1bᲫძ\x10\x1bᲬწ" + + "\x10\x1bᲭჭ\x10\x1bᲮხ\x10\x1bᲯჯ\x10\x1bᲰჰ\x10\x1bᲱჱ\x10\x1bᲲჲ\x10\x1bᲳჳ" + + "\x10\x1bᲴჴ\x10\x1bᲵჵ\x10\x1bᲶჶ\x10\x1bᲷჷ\x10\x1bᲸჸ\x10\x1bᲹჹ\x10\x1bᲺჺ" + + "\x10\x1bᲽჽ\x10\x1bᲾჾ\x10\x1bᲿჿ\x12\x12вВВ\x12\x12дДД\x12\x12оОО\x12\x12с" + + "СС\x12\x12тТТ\x12\x12тТТ\x12\x12ъЪЪ\x12\x12ѣѢѢ\x13\x1bꙋꙊꙊ\x13\x1bẖH̱H̱" + + "\x13\x1bẗT̈T̈\x13\x1bẘW̊W̊\x13\x1bẙY̊Y̊\x13\x1baʾAʾAʾ\x13\x1bṡṠṠ\x12" + + "\x10ssß\x14$ὐΥ̓Υ̓\x166ὒΥ̓̀Υ̓̀\x166ὔΥ̓́Υ̓́\x166ὖΥ̓͂Υ̓͂\x15+ἀιἈΙᾈ" + + "\x15+ἁιἉΙᾉ\x15+ἂιἊΙᾊ\x15+ἃιἋΙᾋ\x15+ἄιἌΙᾌ\x15+ἅιἍΙᾍ\x15+ἆιἎΙᾎ\x15+ἇιἏΙᾏ" + + "\x15\x1dἀιᾀἈΙ\x15\x1dἁιᾁἉΙ\x15\x1dἂιᾂἊΙ\x15\x1dἃιᾃἋΙ\x15\x1dἄιᾄἌΙ\x15" + + "\x1dἅιᾅἍΙ\x15\x1dἆιᾆἎΙ\x15\x1dἇιᾇἏΙ\x15+ἠιἨΙᾘ\x15+ἡιἩΙᾙ\x15+ἢιἪΙᾚ\x15+ἣι" + + "ἫΙᾛ\x15+ἤιἬΙᾜ\x15+ἥιἭΙᾝ\x15+ἦιἮΙᾞ\x15+ἧιἯΙᾟ\x15\x1dἠιᾐἨΙ\x15\x1dἡιᾑἩΙ" + + "\x15\x1dἢιᾒἪΙ\x15\x1dἣιᾓἫΙ\x15\x1dἤιᾔἬΙ\x15\x1dἥιᾕἭΙ\x15\x1dἦιᾖἮΙ\x15" + + "\x1dἧιᾗἯΙ\x15+ὠιὨΙᾨ\x15+ὡιὩΙᾩ\x15+ὢιὪΙᾪ\x15+ὣιὫΙᾫ\x15+ὤιὬΙᾬ\x15+ὥιὭΙᾭ" + + "\x15+ὦιὮΙᾮ\x15+ὧιὯΙᾯ\x15\x1dὠιᾠὨΙ\x15\x1dὡιᾡὩΙ\x15\x1dὢιᾢὪΙ\x15\x1dὣιᾣὫΙ" + + "\x15\x1dὤιᾤὬΙ\x15\x1dὥιᾥὭΙ\x15\x1dὦιᾦὮΙ\x15\x1dὧιᾧὯΙ\x15-ὰιᾺΙᾺͅ\x14#αιΑΙ" + + "ᾼ\x14$άιΆΙΆͅ\x14$ᾶΑ͂Α͂\x166ᾶιΑ͂Ιᾼ͂\x14\x1cαιᾳΑΙ\x12\x12ιΙΙ\x15-ὴιῊΙ" + + "Ὴͅ\x14#ηιΗΙῌ\x14$ήιΉΙΉͅ\x14$ῆΗ͂Η͂\x166ῆιΗ͂Ιῌ͂\x14\x1cηιῃΗΙ\x166ῒΙ" + + "̈̀Ϊ̀\x166ΐΪ́Ϊ́\x14$ῖΙ͂Ι͂\x166ῗΪ͂Ϊ͂\x166ῢΫ̀Ϋ̀\x166ΰΫ́Ϋ" + + "́\x14$ῤΡ̓Ρ̓\x14$ῦΥ͂Υ͂\x166ῧΫ͂Ϋ͂\x15-ὼιῺΙῺͅ\x14#ωιΩΙῼ\x14$ώιΏΙΏͅ" + + "\x14$ῶΩ͂Ω͂\x166ῶιΩ͂Ιῼ͂\x14\x1cωιῳΩΙ\x12\x10ωω\x11\x08kk\x12\x10åå\x12" + + "\x10ɫɫ\x12\x10ɽɽ\x10\x12ȺȺ\x10\x12ȾȾ\x12\x10ɑɑ\x12\x10ɱɱ\x12\x10ɐɐ\x12" + + "\x10ɒɒ\x12\x10ȿȿ\x12\x10ɀɀ\x12\x10ɥɥ\x12\x10ɦɦ\x12\x10ɜɜ\x12\x10ɡɡ\x12" + + "\x10ɬɬ\x12\x10ɪɪ\x12\x10ʞʞ\x12\x10ʇʇ\x12\x10ʝʝ\x12\x10ʂʂ\x12\x12ffFFFf" + + "\x12\x12fiFIFi\x12\x12flFLFl\x13\x1bffiFFIFfi\x13\x1bfflFFLFfl\x12\x12st" + + "STSt\x12\x12stSTSt\x14$մնՄՆՄն\x14$մեՄԵՄե\x14$միՄԻՄի\x14$վնՎՆՎն\x14$մխՄԽՄ" + + "խ" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *caseTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = caseIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *caseTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *caseTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = caseIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *caseTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// caseTrie. Total size: 13398 bytes (13.08 KiB). Checksum: 544af6e6b1b70931. +type caseTrie struct{} + +func newCaseTrie(i int) *caseTrie { + return &caseTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *caseTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 22: + return uint16(caseValues[n<<6+uint32(b)]) + default: + n -= 22 + return uint16(sparse.lookup(n, b)) + } +} + +// caseValues: 24 blocks, 1536 entries, 3072 bytes +// The third block is the zero block. +var caseValues = [1536]uint16{ + // Block 0x0, offset 0x0 + 0x27: 0x0054, + 0x2e: 0x0054, + 0x30: 0x0010, 0x31: 0x0010, 0x32: 0x0010, 0x33: 0x0010, 0x34: 0x0010, 0x35: 0x0010, + 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0054, + // Block 0x1, offset 0x40 + 0x41: 0x2013, 0x42: 0x2013, 0x43: 0x2013, 0x44: 0x2013, 0x45: 0x2013, + 0x46: 0x2013, 0x47: 0x2013, 0x48: 0x2013, 0x49: 0x2013, 0x4a: 0x2013, 0x4b: 0x2013, + 0x4c: 0x2013, 0x4d: 0x2013, 0x4e: 0x2013, 0x4f: 0x2013, 0x50: 0x2013, 0x51: 0x2013, + 0x52: 0x2013, 0x53: 0x2013, 0x54: 0x2013, 0x55: 0x2013, 0x56: 0x2013, 0x57: 0x2013, + 0x58: 0x2013, 0x59: 0x2013, 0x5a: 0x2013, + 0x5e: 0x0004, 0x5f: 0x0010, 0x60: 0x0004, 0x61: 0x2012, 0x62: 0x2012, 0x63: 0x2012, + 0x64: 0x2012, 0x65: 0x2012, 0x66: 0x2012, 0x67: 0x2012, 0x68: 0x2012, 0x69: 0x2012, + 0x6a: 0x2012, 0x6b: 0x2012, 0x6c: 0x2012, 0x6d: 0x2012, 0x6e: 0x2012, 0x6f: 0x2012, + 0x70: 0x2012, 0x71: 0x2012, 0x72: 0x2012, 0x73: 0x2012, 0x74: 0x2012, 0x75: 0x2012, + 0x76: 0x2012, 0x77: 0x2012, 0x78: 0x2012, 0x79: 0x2012, 0x7a: 0x2012, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0852, 0xc1: 0x0b53, 0xc2: 0x0113, 0xc3: 0x0112, 0xc4: 0x0113, 0xc5: 0x0112, + 0xc6: 0x0b53, 0xc7: 0x0f13, 0xc8: 0x0f12, 0xc9: 0x0e53, 0xca: 0x1153, 0xcb: 0x0713, + 0xcc: 0x0712, 0xcd: 0x0012, 0xce: 0x1453, 0xcf: 0x1753, 0xd0: 0x1a53, 0xd1: 0x0313, + 0xd2: 0x0312, 0xd3: 0x1d53, 0xd4: 0x2053, 0xd5: 0x2352, 0xd6: 0x2653, 0xd7: 0x2653, + 0xd8: 0x0113, 0xd9: 0x0112, 0xda: 0x2952, 0xdb: 0x0012, 0xdc: 0x1d53, 0xdd: 0x2c53, + 0xde: 0x2f52, 0xdf: 0x3253, 0xe0: 0x0113, 0xe1: 0x0112, 0xe2: 0x0113, 0xe3: 0x0112, + 0xe4: 0x0113, 0xe5: 0x0112, 0xe6: 0x3553, 0xe7: 0x0f13, 0xe8: 0x0f12, 0xe9: 0x3853, + 0xea: 0x0012, 0xeb: 0x0012, 0xec: 0x0113, 0xed: 0x0112, 0xee: 0x3553, 0xef: 0x1f13, + 0xf0: 0x1f12, 0xf1: 0x3b53, 0xf2: 0x3e53, 0xf3: 0x0713, 0xf4: 0x0712, 0xf5: 0x0313, + 0xf6: 0x0312, 0xf7: 0x4153, 0xf8: 0x0113, 0xf9: 0x0112, 0xfa: 0x0012, 0xfb: 0x0010, + 0xfc: 0x0113, 0xfd: 0x0112, 0xfe: 0x0012, 0xff: 0x4452, + // Block 0x4, offset 0x100 + 0x100: 0x0010, 0x101: 0x0010, 0x102: 0x0010, 0x103: 0x0010, 0x104: 0x02db, 0x105: 0x0359, + 0x106: 0x03da, 0x107: 0x043b, 0x108: 0x04b9, 0x109: 0x053a, 0x10a: 0x059b, 0x10b: 0x0619, + 0x10c: 0x069a, 0x10d: 0x0313, 0x10e: 0x0312, 0x10f: 0x1f13, 0x110: 0x1f12, 0x111: 0x0313, + 0x112: 0x0312, 0x113: 0x0713, 0x114: 0x0712, 0x115: 0x0313, 0x116: 0x0312, 0x117: 0x0f13, + 0x118: 0x0f12, 0x119: 0x0313, 0x11a: 0x0312, 0x11b: 0x0713, 0x11c: 0x0712, 0x11d: 0x1452, + 0x11e: 0x0113, 0x11f: 0x0112, 0x120: 0x0113, 0x121: 0x0112, 0x122: 0x0113, 0x123: 0x0112, + 0x124: 0x0113, 0x125: 0x0112, 0x126: 0x0113, 0x127: 0x0112, 0x128: 0x0113, 0x129: 0x0112, + 0x12a: 0x0113, 0x12b: 0x0112, 0x12c: 0x0113, 0x12d: 0x0112, 0x12e: 0x0113, 0x12f: 0x0112, + 0x130: 0x06fa, 0x131: 0x07ab, 0x132: 0x0829, 0x133: 0x08aa, 0x134: 0x0113, 0x135: 0x0112, + 0x136: 0x2353, 0x137: 0x4453, 0x138: 0x0113, 0x139: 0x0112, 0x13a: 0x0113, 0x13b: 0x0112, + 0x13c: 0x0113, 0x13d: 0x0112, 0x13e: 0x0113, 0x13f: 0x0112, + // Block 0x5, offset 0x140 + 0x140: 0x0a8a, 0x141: 0x0313, 0x142: 0x0312, 0x143: 0x0853, 0x144: 0x4753, 0x145: 0x4a53, + 0x146: 0x0113, 0x147: 0x0112, 0x148: 0x0113, 0x149: 0x0112, 0x14a: 0x0113, 0x14b: 0x0112, + 0x14c: 0x0113, 0x14d: 0x0112, 0x14e: 0x0113, 0x14f: 0x0112, 0x150: 0x0b0a, 0x151: 0x0b8a, + 0x152: 0x0c0a, 0x153: 0x0b52, 0x154: 0x0b52, 0x155: 0x0012, 0x156: 0x0e52, 0x157: 0x1152, + 0x158: 0x0012, 0x159: 0x1752, 0x15a: 0x0012, 0x15b: 0x1a52, 0x15c: 0x0c8a, 0x15d: 0x0012, + 0x15e: 0x0012, 0x15f: 0x0012, 0x160: 0x1d52, 0x161: 0x0d0a, 0x162: 0x0012, 0x163: 0x2052, + 0x164: 0x0012, 0x165: 0x0d8a, 0x166: 0x0e0a, 0x167: 0x0012, 0x168: 0x2652, 0x169: 0x2652, + 0x16a: 0x0e8a, 0x16b: 0x0f0a, 0x16c: 0x0f8a, 0x16d: 0x0012, 0x16e: 0x0012, 0x16f: 0x1d52, + 0x170: 0x0012, 0x171: 0x100a, 0x172: 0x2c52, 0x173: 0x0012, 0x174: 0x0012, 0x175: 0x3252, + 0x176: 0x0012, 0x177: 0x0012, 0x178: 0x0012, 0x179: 0x0012, 0x17a: 0x0012, 0x17b: 0x0012, + 0x17c: 0x0012, 0x17d: 0x108a, 0x17e: 0x0012, 0x17f: 0x0012, + // Block 0x6, offset 0x180 + 0x180: 0x3552, 0x181: 0x0012, 0x182: 0x110a, 0x183: 0x3852, 0x184: 0x0012, 0x185: 0x0012, + 0x186: 0x0012, 0x187: 0x118a, 0x188: 0x3552, 0x189: 0x4752, 0x18a: 0x3b52, 0x18b: 0x3e52, + 0x18c: 0x4a52, 0x18d: 0x0012, 0x18e: 0x0012, 0x18f: 0x0012, 0x190: 0x0012, 0x191: 0x0012, + 0x192: 0x4152, 0x193: 0x0012, 0x194: 0x0010, 0x195: 0x0012, 0x196: 0x0012, 0x197: 0x0012, + 0x198: 0x0012, 0x199: 0x0012, 0x19a: 0x0012, 0x19b: 0x0012, 0x19c: 0x0012, 0x19d: 0x120a, + 0x19e: 0x128a, 0x19f: 0x0012, 0x1a0: 0x0012, 0x1a1: 0x0012, 0x1a2: 0x0012, 0x1a3: 0x0012, + 0x1a4: 0x0012, 0x1a5: 0x0012, 0x1a6: 0x0012, 0x1a7: 0x0012, 0x1a8: 0x0012, 0x1a9: 0x0012, + 0x1aa: 0x0012, 0x1ab: 0x0012, 0x1ac: 0x0012, 0x1ad: 0x0012, 0x1ae: 0x0012, 0x1af: 0x0012, + 0x1b0: 0x0015, 0x1b1: 0x0015, 0x1b2: 0x0015, 0x1b3: 0x0015, 0x1b4: 0x0015, 0x1b5: 0x0015, + 0x1b6: 0x0015, 0x1b7: 0x0015, 0x1b8: 0x0015, 0x1b9: 0x0014, 0x1ba: 0x0014, 0x1bb: 0x0014, + 0x1bc: 0x0014, 0x1bd: 0x0014, 0x1be: 0x0014, 0x1bf: 0x0014, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0024, 0x1c1: 0x0024, 0x1c2: 0x0024, 0x1c3: 0x0024, 0x1c4: 0x0024, 0x1c5: 0x130d, + 0x1c6: 0x0024, 0x1c7: 0x0034, 0x1c8: 0x0034, 0x1c9: 0x0034, 0x1ca: 0x0024, 0x1cb: 0x0024, + 0x1cc: 0x0024, 0x1cd: 0x0034, 0x1ce: 0x0034, 0x1cf: 0x0014, 0x1d0: 0x0024, 0x1d1: 0x0024, + 0x1d2: 0x0024, 0x1d3: 0x0034, 0x1d4: 0x0034, 0x1d5: 0x0034, 0x1d6: 0x0034, 0x1d7: 0x0024, + 0x1d8: 0x0034, 0x1d9: 0x0034, 0x1da: 0x0034, 0x1db: 0x0024, 0x1dc: 0x0034, 0x1dd: 0x0034, + 0x1de: 0x0034, 0x1df: 0x0034, 0x1e0: 0x0034, 0x1e1: 0x0034, 0x1e2: 0x0034, 0x1e3: 0x0024, + 0x1e4: 0x0024, 0x1e5: 0x0024, 0x1e6: 0x0024, 0x1e7: 0x0024, 0x1e8: 0x0024, 0x1e9: 0x0024, + 0x1ea: 0x0024, 0x1eb: 0x0024, 0x1ec: 0x0024, 0x1ed: 0x0024, 0x1ee: 0x0024, 0x1ef: 0x0024, + 0x1f0: 0x0113, 0x1f1: 0x0112, 0x1f2: 0x0113, 0x1f3: 0x0112, 0x1f4: 0x0014, 0x1f5: 0x0004, + 0x1f6: 0x0113, 0x1f7: 0x0112, 0x1fa: 0x0015, 0x1fb: 0x4d52, + 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353, + // Block 0x8, offset 0x200 + 0x204: 0x0004, 0x205: 0x0004, + 0x206: 0x2a13, 0x207: 0x0054, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, + 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x138a, 0x211: 0x2013, + 0x212: 0x2013, 0x213: 0x2013, 0x214: 0x2013, 0x215: 0x2013, 0x216: 0x2013, 0x217: 0x2013, + 0x218: 0x2013, 0x219: 0x2013, 0x21a: 0x2013, 0x21b: 0x2013, 0x21c: 0x2013, 0x21d: 0x2013, + 0x21e: 0x2013, 0x21f: 0x2013, 0x220: 0x5f53, 0x221: 0x5f53, 0x223: 0x5f53, + 0x224: 0x5f53, 0x225: 0x5f53, 0x226: 0x5f53, 0x227: 0x5f53, 0x228: 0x5f53, 0x229: 0x5f53, + 0x22a: 0x5f53, 0x22b: 0x5f53, 0x22c: 0x2a12, 0x22d: 0x2512, 0x22e: 0x2712, 0x22f: 0x2512, + 0x230: 0x14ca, 0x231: 0x2012, 0x232: 0x2012, 0x233: 0x2012, 0x234: 0x2012, 0x235: 0x2012, + 0x236: 0x2012, 0x237: 0x2012, 0x238: 0x2012, 0x239: 0x2012, 0x23a: 0x2012, 0x23b: 0x2012, + 0x23c: 0x2012, 0x23d: 0x2012, 0x23e: 0x2012, 0x23f: 0x2012, + // Block 0x9, offset 0x240 + 0x240: 0x5f52, 0x241: 0x5f52, 0x242: 0x160a, 0x243: 0x5f52, 0x244: 0x5f52, 0x245: 0x5f52, + 0x246: 0x5f52, 0x247: 0x5f52, 0x248: 0x5f52, 0x249: 0x5f52, 0x24a: 0x5f52, 0x24b: 0x5f52, + 0x24c: 0x5652, 0x24d: 0x5952, 0x24e: 0x5c52, 0x24f: 0x1813, 0x250: 0x168a, 0x251: 0x170a, + 0x252: 0x0013, 0x253: 0x0013, 0x254: 0x0013, 0x255: 0x178a, 0x256: 0x180a, 0x257: 0x1812, + 0x258: 0x0113, 0x259: 0x0112, 0x25a: 0x0113, 0x25b: 0x0112, 0x25c: 0x0113, 0x25d: 0x0112, + 0x25e: 0x0113, 0x25f: 0x0112, 0x260: 0x0113, 0x261: 0x0112, 0x262: 0x0113, 0x263: 0x0112, + 0x264: 0x0113, 0x265: 0x0112, 0x266: 0x0113, 0x267: 0x0112, 0x268: 0x0113, 0x269: 0x0112, + 0x26a: 0x0113, 0x26b: 0x0112, 0x26c: 0x0113, 0x26d: 0x0112, 0x26e: 0x0113, 0x26f: 0x0112, + 0x270: 0x188a, 0x271: 0x190a, 0x272: 0x0b12, 0x273: 0x5352, 0x274: 0x6253, 0x275: 0x198a, + 0x277: 0x0f13, 0x278: 0x0f12, 0x279: 0x0b13, 0x27a: 0x0113, 0x27b: 0x0112, + 0x27c: 0x0012, 0x27d: 0x4d53, 0x27e: 0x5053, 0x27f: 0x5053, + // Block 0xa, offset 0x280 + 0x280: 0x6852, 0x281: 0x6852, 0x282: 0x6852, 0x283: 0x6852, 0x284: 0x6852, 0x285: 0x6852, + 0x286: 0x6852, 0x287: 0x1a0a, 0x288: 0x0012, 0x28a: 0x0010, + 0x291: 0x0034, + 0x292: 0x0024, 0x293: 0x0024, 0x294: 0x0024, 0x295: 0x0024, 0x296: 0x0034, 0x297: 0x0024, + 0x298: 0x0024, 0x299: 0x0024, 0x29a: 0x0034, 0x29b: 0x0034, 0x29c: 0x0024, 0x29d: 0x0024, + 0x29e: 0x0024, 0x29f: 0x0024, 0x2a0: 0x0024, 0x2a1: 0x0024, 0x2a2: 0x0034, 0x2a3: 0x0034, + 0x2a4: 0x0034, 0x2a5: 0x0034, 0x2a6: 0x0034, 0x2a7: 0x0034, 0x2a8: 0x0024, 0x2a9: 0x0024, + 0x2aa: 0x0034, 0x2ab: 0x0024, 0x2ac: 0x0024, 0x2ad: 0x0034, 0x2ae: 0x0034, 0x2af: 0x0024, + 0x2b0: 0x0034, 0x2b1: 0x0034, 0x2b2: 0x0034, 0x2b3: 0x0034, 0x2b4: 0x0034, 0x2b5: 0x0034, + 0x2b6: 0x0034, 0x2b7: 0x0034, 0x2b8: 0x0034, 0x2b9: 0x0034, 0x2ba: 0x0034, 0x2bb: 0x0034, + 0x2bc: 0x0034, 0x2bd: 0x0034, 0x2bf: 0x0034, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0010, 0x2c1: 0x0010, 0x2c2: 0x0010, 0x2c3: 0x0010, 0x2c4: 0x0010, 0x2c5: 0x0010, + 0x2c6: 0x0010, 0x2c7: 0x0010, 0x2c8: 0x0010, 0x2c9: 0x0014, 0x2ca: 0x0024, 0x2cb: 0x0024, + 0x2cc: 0x0024, 0x2cd: 0x0024, 0x2ce: 0x0024, 0x2cf: 0x0034, 0x2d0: 0x0034, 0x2d1: 0x0034, + 0x2d2: 0x0034, 0x2d3: 0x0034, 0x2d4: 0x0024, 0x2d5: 0x0024, 0x2d6: 0x0024, 0x2d7: 0x0024, + 0x2d8: 0x0024, 0x2d9: 0x0024, 0x2da: 0x0024, 0x2db: 0x0024, 0x2dc: 0x0024, 0x2dd: 0x0024, + 0x2de: 0x0024, 0x2df: 0x0024, 0x2e0: 0x0024, 0x2e1: 0x0024, 0x2e2: 0x0014, 0x2e3: 0x0034, + 0x2e4: 0x0024, 0x2e5: 0x0024, 0x2e6: 0x0034, 0x2e7: 0x0024, 0x2e8: 0x0024, 0x2e9: 0x0034, + 0x2ea: 0x0024, 0x2eb: 0x0024, 0x2ec: 0x0024, 0x2ed: 0x0034, 0x2ee: 0x0034, 0x2ef: 0x0034, + 0x2f0: 0x0034, 0x2f1: 0x0034, 0x2f2: 0x0034, 0x2f3: 0x0024, 0x2f4: 0x0024, 0x2f5: 0x0024, + 0x2f6: 0x0034, 0x2f7: 0x0024, 0x2f8: 0x0024, 0x2f9: 0x0034, 0x2fa: 0x0034, 0x2fb: 0x0024, + 0x2fc: 0x0024, 0x2fd: 0x0024, 0x2fe: 0x0024, 0x2ff: 0x0024, + // Block 0xc, offset 0x300 + 0x300: 0x7053, 0x301: 0x7053, 0x302: 0x7053, 0x303: 0x7053, 0x304: 0x7053, 0x305: 0x7053, + 0x307: 0x7053, + 0x30d: 0x7053, 0x310: 0x1aea, 0x311: 0x1b6a, + 0x312: 0x1bea, 0x313: 0x1c6a, 0x314: 0x1cea, 0x315: 0x1d6a, 0x316: 0x1dea, 0x317: 0x1e6a, + 0x318: 0x1eea, 0x319: 0x1f6a, 0x31a: 0x1fea, 0x31b: 0x206a, 0x31c: 0x20ea, 0x31d: 0x216a, + 0x31e: 0x21ea, 0x31f: 0x226a, 0x320: 0x22ea, 0x321: 0x236a, 0x322: 0x23ea, 0x323: 0x246a, + 0x324: 0x24ea, 0x325: 0x256a, 0x326: 0x25ea, 0x327: 0x266a, 0x328: 0x26ea, 0x329: 0x276a, + 0x32a: 0x27ea, 0x32b: 0x286a, 0x32c: 0x28ea, 0x32d: 0x296a, 0x32e: 0x29ea, 0x32f: 0x2a6a, + 0x330: 0x2aea, 0x331: 0x2b6a, 0x332: 0x2bea, 0x333: 0x2c6a, 0x334: 0x2cea, 0x335: 0x2d6a, + 0x336: 0x2dea, 0x337: 0x2e6a, 0x338: 0x2eea, 0x339: 0x2f6a, 0x33a: 0x2fea, + 0x33c: 0x0015, 0x33d: 0x306a, 0x33e: 0x30ea, 0x33f: 0x316a, + // Block 0xd, offset 0x340 + 0x340: 0x0812, 0x341: 0x0812, 0x342: 0x0812, 0x343: 0x0812, 0x344: 0x0812, 0x345: 0x0812, + 0x348: 0x0813, 0x349: 0x0813, 0x34a: 0x0813, 0x34b: 0x0813, + 0x34c: 0x0813, 0x34d: 0x0813, 0x350: 0x3b1a, 0x351: 0x0812, + 0x352: 0x3bfa, 0x353: 0x0812, 0x354: 0x3d3a, 0x355: 0x0812, 0x356: 0x3e7a, 0x357: 0x0812, + 0x359: 0x0813, 0x35b: 0x0813, 0x35d: 0x0813, + 0x35f: 0x0813, 0x360: 0x0812, 0x361: 0x0812, 0x362: 0x0812, 0x363: 0x0812, + 0x364: 0x0812, 0x365: 0x0812, 0x366: 0x0812, 0x367: 0x0812, 0x368: 0x0813, 0x369: 0x0813, + 0x36a: 0x0813, 0x36b: 0x0813, 0x36c: 0x0813, 0x36d: 0x0813, 0x36e: 0x0813, 0x36f: 0x0813, + 0x370: 0x9252, 0x371: 0x9252, 0x372: 0x9552, 0x373: 0x9552, 0x374: 0x9852, 0x375: 0x9852, + 0x376: 0x9b52, 0x377: 0x9b52, 0x378: 0x9e52, 0x379: 0x9e52, 0x37a: 0xa152, 0x37b: 0xa152, + 0x37c: 0x4d52, 0x37d: 0x4d52, + // Block 0xe, offset 0x380 + 0x380: 0x3fba, 0x381: 0x40aa, 0x382: 0x419a, 0x383: 0x428a, 0x384: 0x437a, 0x385: 0x446a, + 0x386: 0x455a, 0x387: 0x464a, 0x388: 0x4739, 0x389: 0x4829, 0x38a: 0x4919, 0x38b: 0x4a09, + 0x38c: 0x4af9, 0x38d: 0x4be9, 0x38e: 0x4cd9, 0x38f: 0x4dc9, 0x390: 0x4eba, 0x391: 0x4faa, + 0x392: 0x509a, 0x393: 0x518a, 0x394: 0x527a, 0x395: 0x536a, 0x396: 0x545a, 0x397: 0x554a, + 0x398: 0x5639, 0x399: 0x5729, 0x39a: 0x5819, 0x39b: 0x5909, 0x39c: 0x59f9, 0x39d: 0x5ae9, + 0x39e: 0x5bd9, 0x39f: 0x5cc9, 0x3a0: 0x5dba, 0x3a1: 0x5eaa, 0x3a2: 0x5f9a, 0x3a3: 0x608a, + 0x3a4: 0x617a, 0x3a5: 0x626a, 0x3a6: 0x635a, 0x3a7: 0x644a, 0x3a8: 0x6539, 0x3a9: 0x6629, + 0x3aa: 0x6719, 0x3ab: 0x6809, 0x3ac: 0x68f9, 0x3ad: 0x69e9, 0x3ae: 0x6ad9, 0x3af: 0x6bc9, + 0x3b0: 0x0812, 0x3b1: 0x0812, 0x3b2: 0x6cba, 0x3b3: 0x6dca, 0x3b4: 0x6e9a, + 0x3b6: 0x6f7a, 0x3b7: 0x705a, 0x3b8: 0x0813, 0x3b9: 0x0813, 0x3ba: 0x9253, 0x3bb: 0x9253, + 0x3bc: 0x7199, 0x3bd: 0x0004, 0x3be: 0x726a, 0x3bf: 0x0004, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0004, 0x3c1: 0x0004, 0x3c2: 0x72ea, 0x3c3: 0x73fa, 0x3c4: 0x74ca, + 0x3c6: 0x75aa, 0x3c7: 0x768a, 0x3c8: 0x9553, 0x3c9: 0x9553, 0x3ca: 0x9853, 0x3cb: 0x9853, + 0x3cc: 0x77c9, 0x3cd: 0x0004, 0x3ce: 0x0004, 0x3cf: 0x0004, 0x3d0: 0x0812, 0x3d1: 0x0812, + 0x3d2: 0x789a, 0x3d3: 0x79da, 0x3d6: 0x7b1a, 0x3d7: 0x7bfa, + 0x3d8: 0x0813, 0x3d9: 0x0813, 0x3da: 0x9b53, 0x3db: 0x9b53, 0x3dd: 0x0004, + 0x3de: 0x0004, 0x3df: 0x0004, 0x3e0: 0x0812, 0x3e1: 0x0812, 0x3e2: 0x7d3a, 0x3e3: 0x7e7a, + 0x3e4: 0x7fba, 0x3e5: 0x0912, 0x3e6: 0x809a, 0x3e7: 0x817a, 0x3e8: 0x0813, 0x3e9: 0x0813, + 0x3ea: 0xa153, 0x3eb: 0xa153, 0x3ec: 0x0913, 0x3ed: 0x0004, 0x3ee: 0x0004, 0x3ef: 0x0004, + 0x3f2: 0x82ba, 0x3f3: 0x83ca, 0x3f4: 0x849a, + 0x3f6: 0x857a, 0x3f7: 0x865a, 0x3f8: 0x9e53, 0x3f9: 0x9e53, 0x3fa: 0x4d53, 0x3fb: 0x4d53, + 0x3fc: 0x8799, 0x3fd: 0x0004, 0x3fe: 0x0004, + // Block 0x10, offset 0x400 + 0x402: 0x0013, + 0x407: 0x0013, 0x40a: 0x0012, 0x40b: 0x0013, + 0x40c: 0x0013, 0x40d: 0x0013, 0x40e: 0x0012, 0x40f: 0x0012, 0x410: 0x0013, 0x411: 0x0013, + 0x412: 0x0013, 0x413: 0x0012, 0x415: 0x0013, + 0x419: 0x0013, 0x41a: 0x0013, 0x41b: 0x0013, 0x41c: 0x0013, 0x41d: 0x0013, + 0x424: 0x0013, 0x426: 0x886b, 0x428: 0x0013, + 0x42a: 0x88cb, 0x42b: 0x890b, 0x42c: 0x0013, 0x42d: 0x0013, 0x42f: 0x0012, + 0x430: 0x0013, 0x431: 0x0013, 0x432: 0xa453, 0x433: 0x0013, 0x434: 0x0012, 0x435: 0x0010, + 0x436: 0x0010, 0x437: 0x0010, 0x438: 0x0010, 0x439: 0x0012, + 0x43c: 0x0012, 0x43d: 0x0012, 0x43e: 0x0013, 0x43f: 0x0013, + // Block 0x11, offset 0x440 + 0x440: 0x1a13, 0x441: 0x1a13, 0x442: 0x1e13, 0x443: 0x1e13, 0x444: 0x1a13, 0x445: 0x1a13, + 0x446: 0x2613, 0x447: 0x2613, 0x448: 0x2a13, 0x449: 0x2a13, 0x44a: 0x2e13, 0x44b: 0x2e13, + 0x44c: 0x2a13, 0x44d: 0x2a13, 0x44e: 0x2613, 0x44f: 0x2613, 0x450: 0xa752, 0x451: 0xa752, + 0x452: 0xaa52, 0x453: 0xaa52, 0x454: 0xad52, 0x455: 0xad52, 0x456: 0xaa52, 0x457: 0xaa52, + 0x458: 0xa752, 0x459: 0xa752, 0x45a: 0x1a12, 0x45b: 0x1a12, 0x45c: 0x1e12, 0x45d: 0x1e12, + 0x45e: 0x1a12, 0x45f: 0x1a12, 0x460: 0x2612, 0x461: 0x2612, 0x462: 0x2a12, 0x463: 0x2a12, + 0x464: 0x2e12, 0x465: 0x2e12, 0x466: 0x2a12, 0x467: 0x2a12, 0x468: 0x2612, 0x469: 0x2612, + // Block 0x12, offset 0x480 + 0x480: 0x6552, 0x481: 0x6552, 0x482: 0x6552, 0x483: 0x6552, 0x484: 0x6552, 0x485: 0x6552, + 0x486: 0x6552, 0x487: 0x6552, 0x488: 0x6552, 0x489: 0x6552, 0x48a: 0x6552, 0x48b: 0x6552, + 0x48c: 0x6552, 0x48d: 0x6552, 0x48e: 0x6552, 0x48f: 0x6552, 0x490: 0xb052, 0x491: 0xb052, + 0x492: 0xb052, 0x493: 0xb052, 0x494: 0xb052, 0x495: 0xb052, 0x496: 0xb052, 0x497: 0xb052, + 0x498: 0xb052, 0x499: 0xb052, 0x49a: 0xb052, 0x49b: 0xb052, 0x49c: 0xb052, 0x49d: 0xb052, + 0x49e: 0xb052, 0x49f: 0xb052, 0x4a0: 0x0113, 0x4a1: 0x0112, 0x4a2: 0x896b, 0x4a3: 0x8b53, + 0x4a4: 0x89cb, 0x4a5: 0x8a2a, 0x4a6: 0x8a8a, 0x4a7: 0x0f13, 0x4a8: 0x0f12, 0x4a9: 0x0313, + 0x4aa: 0x0312, 0x4ab: 0x0713, 0x4ac: 0x0712, 0x4ad: 0x8aeb, 0x4ae: 0x8b4b, 0x4af: 0x8bab, + 0x4b0: 0x8c0b, 0x4b1: 0x0012, 0x4b2: 0x0113, 0x4b3: 0x0112, 0x4b4: 0x0012, 0x4b5: 0x0313, + 0x4b6: 0x0312, 0x4b7: 0x0012, 0x4b8: 0x0012, 0x4b9: 0x0012, 0x4ba: 0x0012, 0x4bb: 0x0012, + 0x4bc: 0x0015, 0x4bd: 0x0015, 0x4be: 0x8c6b, 0x4bf: 0x8ccb, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0113, 0x4c1: 0x0112, 0x4c2: 0x0113, 0x4c3: 0x0112, 0x4c4: 0x0113, 0x4c5: 0x0112, + 0x4c6: 0x0113, 0x4c7: 0x0112, 0x4c8: 0x0014, 0x4c9: 0x0014, 0x4ca: 0x0014, 0x4cb: 0x0713, + 0x4cc: 0x0712, 0x4cd: 0x8d2b, 0x4ce: 0x0012, 0x4cf: 0x0010, 0x4d0: 0x0113, 0x4d1: 0x0112, + 0x4d2: 0x0113, 0x4d3: 0x0112, 0x4d4: 0x6552, 0x4d5: 0x0012, 0x4d6: 0x0113, 0x4d7: 0x0112, + 0x4d8: 0x0113, 0x4d9: 0x0112, 0x4da: 0x0113, 0x4db: 0x0112, 0x4dc: 0x0113, 0x4dd: 0x0112, + 0x4de: 0x0113, 0x4df: 0x0112, 0x4e0: 0x0113, 0x4e1: 0x0112, 0x4e2: 0x0113, 0x4e3: 0x0112, + 0x4e4: 0x0113, 0x4e5: 0x0112, 0x4e6: 0x0113, 0x4e7: 0x0112, 0x4e8: 0x0113, 0x4e9: 0x0112, + 0x4ea: 0x8d8b, 0x4eb: 0x8deb, 0x4ec: 0x8e4b, 0x4ed: 0x8eab, 0x4ee: 0x8f0b, 0x4ef: 0x0012, + 0x4f0: 0x8f6b, 0x4f1: 0x8fcb, 0x4f2: 0x902b, 0x4f3: 0xb353, 0x4f4: 0x0113, 0x4f5: 0x0112, + 0x4f6: 0x0113, 0x4f7: 0x0112, 0x4f8: 0x0113, 0x4f9: 0x0112, 0x4fa: 0x0113, 0x4fb: 0x0112, + 0x4fc: 0x0113, 0x4fd: 0x0112, 0x4fe: 0x0113, 0x4ff: 0x0112, + // Block 0x14, offset 0x500 + 0x500: 0x90ea, 0x501: 0x916a, 0x502: 0x91ea, 0x503: 0x926a, 0x504: 0x931a, 0x505: 0x93ca, + 0x506: 0x944a, + 0x513: 0x94ca, 0x514: 0x95aa, 0x515: 0x968a, 0x516: 0x976a, 0x517: 0x984a, + 0x51d: 0x0010, + 0x51e: 0x0034, 0x51f: 0x0010, 0x520: 0x0010, 0x521: 0x0010, 0x522: 0x0010, 0x523: 0x0010, + 0x524: 0x0010, 0x525: 0x0010, 0x526: 0x0010, 0x527: 0x0010, 0x528: 0x0010, + 0x52a: 0x0010, 0x52b: 0x0010, 0x52c: 0x0010, 0x52d: 0x0010, 0x52e: 0x0010, 0x52f: 0x0010, + 0x530: 0x0010, 0x531: 0x0010, 0x532: 0x0010, 0x533: 0x0010, 0x534: 0x0010, 0x535: 0x0010, + 0x536: 0x0010, 0x538: 0x0010, 0x539: 0x0010, 0x53a: 0x0010, 0x53b: 0x0010, + 0x53c: 0x0010, 0x53e: 0x0010, + // Block 0x15, offset 0x540 + 0x540: 0x2713, 0x541: 0x2913, 0x542: 0x2b13, 0x543: 0x2913, 0x544: 0x2f13, 0x545: 0x2913, + 0x546: 0x2b13, 0x547: 0x2913, 0x548: 0x2713, 0x549: 0x3913, 0x54a: 0x3b13, + 0x54c: 0x3f13, 0x54d: 0x3913, 0x54e: 0x3b13, 0x54f: 0x3913, 0x550: 0x2713, 0x551: 0x2913, + 0x552: 0x2b13, 0x554: 0x2f13, 0x555: 0x2913, 0x557: 0xbc52, + 0x558: 0xbf52, 0x559: 0xc252, 0x55a: 0xbf52, 0x55b: 0xc552, 0x55c: 0xbf52, 0x55d: 0xc252, + 0x55e: 0xbf52, 0x55f: 0xbc52, 0x560: 0xc852, 0x561: 0xcb52, 0x563: 0xce52, + 0x564: 0xc852, 0x565: 0xcb52, 0x566: 0xc852, 0x567: 0x2712, 0x568: 0x2912, 0x569: 0x2b12, + 0x56a: 0x2912, 0x56b: 0x2f12, 0x56c: 0x2912, 0x56d: 0x2b12, 0x56e: 0x2912, 0x56f: 0x2712, + 0x570: 0x3912, 0x571: 0x3b12, 0x573: 0x3f12, 0x574: 0x3912, 0x575: 0x3b12, + 0x576: 0x3912, 0x577: 0x2712, 0x578: 0x2912, 0x579: 0x2b12, 0x57b: 0x2f12, + 0x57c: 0x2912, + // Block 0x16, offset 0x580 + 0x580: 0x2213, 0x581: 0x2213, 0x582: 0x2613, 0x583: 0x2613, 0x584: 0x2213, 0x585: 0x2213, + 0x586: 0x2e13, 0x587: 0x2e13, 0x588: 0x2213, 0x589: 0x2213, 0x58a: 0x2613, 0x58b: 0x2613, + 0x58c: 0x2213, 0x58d: 0x2213, 0x58e: 0x3e13, 0x58f: 0x3e13, 0x590: 0x2213, 0x591: 0x2213, + 0x592: 0x2613, 0x593: 0x2613, 0x594: 0x2213, 0x595: 0x2213, 0x596: 0x2e13, 0x597: 0x2e13, + 0x598: 0x2213, 0x599: 0x2213, 0x59a: 0x2613, 0x59b: 0x2613, 0x59c: 0x2213, 0x59d: 0x2213, + 0x59e: 0xd153, 0x59f: 0xd153, 0x5a0: 0xd453, 0x5a1: 0xd453, 0x5a2: 0x2212, 0x5a3: 0x2212, + 0x5a4: 0x2612, 0x5a5: 0x2612, 0x5a6: 0x2212, 0x5a7: 0x2212, 0x5a8: 0x2e12, 0x5a9: 0x2e12, + 0x5aa: 0x2212, 0x5ab: 0x2212, 0x5ac: 0x2612, 0x5ad: 0x2612, 0x5ae: 0x2212, 0x5af: 0x2212, + 0x5b0: 0x3e12, 0x5b1: 0x3e12, 0x5b2: 0x2212, 0x5b3: 0x2212, 0x5b4: 0x2612, 0x5b5: 0x2612, + 0x5b6: 0x2212, 0x5b7: 0x2212, 0x5b8: 0x2e12, 0x5b9: 0x2e12, 0x5ba: 0x2212, 0x5bb: 0x2212, + 0x5bc: 0x2612, 0x5bd: 0x2612, 0x5be: 0x2212, 0x5bf: 0x2212, + // Block 0x17, offset 0x5c0 + 0x5c2: 0x0010, + 0x5c7: 0x0010, 0x5c9: 0x0010, 0x5cb: 0x0010, + 0x5cd: 0x0010, 0x5ce: 0x0010, 0x5cf: 0x0010, 0x5d1: 0x0010, + 0x5d2: 0x0010, 0x5d4: 0x0010, 0x5d7: 0x0010, + 0x5d9: 0x0010, 0x5db: 0x0010, 0x5dd: 0x0010, + 0x5df: 0x0010, 0x5e1: 0x0010, 0x5e2: 0x0010, + 0x5e4: 0x0010, 0x5e7: 0x0010, 0x5e8: 0x0010, 0x5e9: 0x0010, + 0x5ea: 0x0010, 0x5ec: 0x0010, 0x5ed: 0x0010, 0x5ee: 0x0010, 0x5ef: 0x0010, + 0x5f0: 0x0010, 0x5f1: 0x0010, 0x5f2: 0x0010, 0x5f4: 0x0010, 0x5f5: 0x0010, + 0x5f6: 0x0010, 0x5f7: 0x0010, 0x5f9: 0x0010, 0x5fa: 0x0010, 0x5fb: 0x0010, + 0x5fc: 0x0010, 0x5fe: 0x0010, +} + +// caseIndex: 27 blocks, 1728 entries, 3456 bytes +// Block 0 is the zero block. +var caseIndex = [1728]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x16, 0xc3: 0x17, 0xc4: 0x18, 0xc5: 0x19, 0xc6: 0x01, 0xc7: 0x02, + 0xc8: 0x1a, 0xc9: 0x03, 0xca: 0x04, 0xcb: 0x1b, 0xcc: 0x1c, 0xcd: 0x05, 0xce: 0x06, 0xcf: 0x07, + 0xd0: 0x1d, 0xd1: 0x1e, 0xd2: 0x1f, 0xd3: 0x20, 0xd4: 0x21, 0xd5: 0x22, 0xd6: 0x08, 0xd7: 0x23, + 0xd8: 0x24, 0xd9: 0x25, 0xda: 0x26, 0xdb: 0x27, 0xdc: 0x28, 0xdd: 0x29, 0xde: 0x2a, 0xdf: 0x2b, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x08, 0xef: 0x09, + 0xf0: 0x16, 0xf3: 0x18, + // Block 0x4, offset 0x100 + 0x120: 0x2c, 0x121: 0x2d, 0x122: 0x2e, 0x123: 0x09, 0x124: 0x2f, 0x125: 0x30, 0x126: 0x31, 0x127: 0x32, + 0x128: 0x33, 0x129: 0x34, 0x12a: 0x35, 0x12b: 0x36, 0x12c: 0x37, 0x12d: 0x38, 0x12e: 0x39, 0x12f: 0x3a, + 0x130: 0x3b, 0x131: 0x3c, 0x132: 0x3d, 0x133: 0x3e, 0x134: 0x3f, 0x135: 0x40, 0x136: 0x41, 0x137: 0x42, + 0x138: 0x43, 0x139: 0x44, 0x13a: 0x45, 0x13b: 0x46, 0x13c: 0x47, 0x13d: 0x48, 0x13e: 0x49, 0x13f: 0x4a, + // Block 0x5, offset 0x140 + 0x140: 0x4b, 0x141: 0x4c, 0x142: 0x4d, 0x143: 0x0a, 0x144: 0x26, 0x145: 0x26, 0x146: 0x26, 0x147: 0x26, + 0x148: 0x26, 0x149: 0x4e, 0x14a: 0x4f, 0x14b: 0x50, 0x14c: 0x51, 0x14d: 0x52, 0x14e: 0x53, 0x14f: 0x54, + 0x150: 0x55, 0x151: 0x26, 0x152: 0x26, 0x153: 0x26, 0x154: 0x26, 0x155: 0x26, 0x156: 0x26, 0x157: 0x26, + 0x158: 0x26, 0x159: 0x56, 0x15a: 0x57, 0x15b: 0x58, 0x15c: 0x59, 0x15d: 0x5a, 0x15e: 0x5b, 0x15f: 0x5c, + 0x160: 0x5d, 0x161: 0x5e, 0x162: 0x5f, 0x163: 0x60, 0x164: 0x61, 0x165: 0x62, 0x167: 0x63, + 0x168: 0x64, 0x169: 0x65, 0x16a: 0x66, 0x16b: 0x67, 0x16c: 0x68, 0x16d: 0x69, 0x16e: 0x6a, 0x16f: 0x6b, + 0x170: 0x6c, 0x171: 0x6d, 0x172: 0x6e, 0x173: 0x6f, 0x174: 0x70, 0x175: 0x71, 0x176: 0x72, 0x177: 0x73, + 0x178: 0x74, 0x179: 0x74, 0x17a: 0x75, 0x17b: 0x74, 0x17c: 0x76, 0x17d: 0x0b, 0x17e: 0x0c, 0x17f: 0x0d, + // Block 0x6, offset 0x180 + 0x180: 0x77, 0x181: 0x78, 0x182: 0x79, 0x183: 0x7a, 0x184: 0x0e, 0x185: 0x7b, 0x186: 0x7c, + 0x192: 0x7d, 0x193: 0x0f, + 0x1b0: 0x7e, 0x1b1: 0x10, 0x1b2: 0x74, 0x1b3: 0x7f, 0x1b4: 0x80, 0x1b5: 0x81, 0x1b6: 0x82, 0x1b7: 0x83, + 0x1b8: 0x84, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x85, 0x1c2: 0x86, 0x1c3: 0x87, 0x1c4: 0x88, 0x1c5: 0x26, 0x1c6: 0x89, + // Block 0x8, offset 0x200 + 0x200: 0x8a, 0x201: 0x26, 0x202: 0x26, 0x203: 0x26, 0x204: 0x26, 0x205: 0x26, 0x206: 0x26, 0x207: 0x26, + 0x208: 0x26, 0x209: 0x26, 0x20a: 0x26, 0x20b: 0x26, 0x20c: 0x26, 0x20d: 0x26, 0x20e: 0x26, 0x20f: 0x26, + 0x210: 0x26, 0x211: 0x26, 0x212: 0x8b, 0x213: 0x8c, 0x214: 0x26, 0x215: 0x26, 0x216: 0x26, 0x217: 0x26, + 0x218: 0x8d, 0x219: 0x8e, 0x21a: 0x8f, 0x21b: 0x90, 0x21c: 0x91, 0x21d: 0x92, 0x21e: 0x11, 0x21f: 0x93, + 0x220: 0x94, 0x221: 0x95, 0x222: 0x26, 0x223: 0x96, 0x224: 0x97, 0x225: 0x98, 0x226: 0x99, 0x227: 0x9a, + 0x228: 0x9b, 0x229: 0x9c, 0x22a: 0x9d, 0x22b: 0x9e, 0x22c: 0x9f, 0x22d: 0xa0, 0x22e: 0xa1, 0x22f: 0xa2, + 0x230: 0x26, 0x231: 0x26, 0x232: 0x26, 0x233: 0x26, 0x234: 0x26, 0x235: 0x26, 0x236: 0x26, 0x237: 0x26, + 0x238: 0x26, 0x239: 0x26, 0x23a: 0x26, 0x23b: 0x26, 0x23c: 0x26, 0x23d: 0x26, 0x23e: 0x26, 0x23f: 0x26, + // Block 0x9, offset 0x240 + 0x240: 0x26, 0x241: 0x26, 0x242: 0x26, 0x243: 0x26, 0x244: 0x26, 0x245: 0x26, 0x246: 0x26, 0x247: 0x26, + 0x248: 0x26, 0x249: 0x26, 0x24a: 0x26, 0x24b: 0x26, 0x24c: 0x26, 0x24d: 0x26, 0x24e: 0x26, 0x24f: 0x26, + 0x250: 0x26, 0x251: 0x26, 0x252: 0x26, 0x253: 0x26, 0x254: 0x26, 0x255: 0x26, 0x256: 0x26, 0x257: 0x26, + 0x258: 0x26, 0x259: 0x26, 0x25a: 0x26, 0x25b: 0x26, 0x25c: 0x26, 0x25d: 0x26, 0x25e: 0x26, 0x25f: 0x26, + 0x260: 0x26, 0x261: 0x26, 0x262: 0x26, 0x263: 0x26, 0x264: 0x26, 0x265: 0x26, 0x266: 0x26, 0x267: 0x26, + 0x268: 0x26, 0x269: 0x26, 0x26a: 0x26, 0x26b: 0x26, 0x26c: 0x26, 0x26d: 0x26, 0x26e: 0x26, 0x26f: 0x26, + 0x270: 0x26, 0x271: 0x26, 0x272: 0x26, 0x273: 0x26, 0x274: 0x26, 0x275: 0x26, 0x276: 0x26, 0x277: 0x26, + 0x278: 0x26, 0x279: 0x26, 0x27a: 0x26, 0x27b: 0x26, 0x27c: 0x26, 0x27d: 0x26, 0x27e: 0x26, 0x27f: 0x26, + // Block 0xa, offset 0x280 + 0x280: 0x26, 0x281: 0x26, 0x282: 0x26, 0x283: 0x26, 0x284: 0x26, 0x285: 0x26, 0x286: 0x26, 0x287: 0x26, + 0x288: 0x26, 0x289: 0x26, 0x28a: 0x26, 0x28b: 0x26, 0x28c: 0x26, 0x28d: 0x26, 0x28e: 0x26, 0x28f: 0x26, + 0x290: 0x26, 0x291: 0x26, 0x292: 0x26, 0x293: 0x26, 0x294: 0x26, 0x295: 0x26, 0x296: 0x26, 0x297: 0x26, + 0x298: 0x26, 0x299: 0x26, 0x29a: 0x26, 0x29b: 0x26, 0x29c: 0x26, 0x29d: 0x26, 0x29e: 0xa3, 0x29f: 0xa4, + // Block 0xb, offset 0x2c0 + 0x2ec: 0x12, 0x2ed: 0xa5, 0x2ee: 0xa6, 0x2ef: 0xa7, + 0x2f0: 0x26, 0x2f1: 0x26, 0x2f2: 0x26, 0x2f3: 0x26, 0x2f4: 0xa8, 0x2f5: 0xa9, 0x2f6: 0xaa, 0x2f7: 0xab, + 0x2f8: 0xac, 0x2f9: 0xad, 0x2fa: 0x26, 0x2fb: 0xae, 0x2fc: 0xaf, 0x2fd: 0xb0, 0x2fe: 0xb1, 0x2ff: 0xb2, + // Block 0xc, offset 0x300 + 0x300: 0xb3, 0x301: 0xb4, 0x302: 0x26, 0x303: 0xb5, 0x305: 0xb6, 0x307: 0xb7, + 0x30a: 0xb8, 0x30b: 0xb9, 0x30c: 0xba, 0x30d: 0xbb, 0x30e: 0xbc, 0x30f: 0xbd, + 0x310: 0xbe, 0x311: 0xbf, 0x312: 0xc0, 0x313: 0xc1, 0x314: 0xc2, 0x315: 0xc3, 0x316: 0x13, + 0x318: 0x26, 0x319: 0x26, 0x31a: 0x26, 0x31b: 0x26, 0x31c: 0xc4, 0x31d: 0xc5, 0x31e: 0xc6, + 0x320: 0xc7, 0x321: 0xc8, 0x322: 0xc9, 0x323: 0xca, 0x324: 0xcb, 0x326: 0xcc, + 0x328: 0xcd, 0x329: 0xce, 0x32a: 0xcf, 0x32b: 0xd0, 0x32c: 0x60, 0x32d: 0xd1, 0x32e: 0xd2, + 0x330: 0x26, 0x331: 0xd3, 0x332: 0xd4, 0x333: 0xd5, 0x334: 0xd6, + 0x33a: 0xd7, 0x33b: 0xd8, 0x33c: 0xd9, 0x33d: 0xda, 0x33e: 0xdb, 0x33f: 0xdc, + // Block 0xd, offset 0x340 + 0x340: 0xdd, 0x341: 0xde, 0x342: 0xdf, 0x343: 0xe0, 0x344: 0xe1, 0x345: 0xe2, 0x346: 0xe3, 0x347: 0xe4, + 0x348: 0xe5, 0x349: 0xe6, 0x34a: 0xe7, 0x34b: 0xe8, 0x34c: 0xe9, 0x34d: 0xea, + 0x350: 0xeb, 0x351: 0xec, 0x352: 0xed, 0x353: 0xee, 0x356: 0xef, 0x357: 0xf0, + 0x358: 0xf1, 0x359: 0xf2, 0x35a: 0xf3, 0x35b: 0xf4, 0x35c: 0xf5, + 0x360: 0xf6, 0x362: 0xf7, 0x363: 0xf8, 0x364: 0xf9, 0x365: 0xfa, 0x366: 0xfb, 0x367: 0xfc, + 0x368: 0xfd, 0x369: 0xfe, 0x36a: 0xff, 0x36b: 0x100, + 0x370: 0x101, 0x371: 0x102, 0x372: 0x103, 0x374: 0x104, 0x375: 0x105, 0x376: 0x106, + 0x37b: 0x107, 0x37c: 0x108, 0x37d: 0x109, 0x37e: 0x10a, + // Block 0xe, offset 0x380 + 0x380: 0x26, 0x381: 0x26, 0x382: 0x26, 0x383: 0x26, 0x384: 0x26, 0x385: 0x26, 0x386: 0x26, 0x387: 0x26, + 0x388: 0x26, 0x389: 0x26, 0x38a: 0x26, 0x38b: 0x26, 0x38c: 0x26, 0x38d: 0x26, 0x38e: 0x10b, + 0x390: 0x26, 0x391: 0x10c, 0x392: 0x26, 0x393: 0x26, 0x394: 0x26, 0x395: 0x10d, + 0x3be: 0xa9, 0x3bf: 0x10e, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x26, 0x3c1: 0x26, 0x3c2: 0x26, 0x3c3: 0x26, 0x3c4: 0x26, 0x3c5: 0x26, 0x3c6: 0x26, 0x3c7: 0x26, + 0x3c8: 0x26, 0x3c9: 0x26, 0x3ca: 0x26, 0x3cb: 0x26, 0x3cc: 0x26, 0x3cd: 0x26, 0x3ce: 0x26, 0x3cf: 0x26, + 0x3d0: 0x10f, 0x3d1: 0x110, + // Block 0x10, offset 0x400 + 0x410: 0x26, 0x411: 0x26, 0x412: 0x26, 0x413: 0x26, 0x414: 0x26, 0x415: 0x26, 0x416: 0x26, 0x417: 0x26, + 0x418: 0x26, 0x419: 0x111, + // Block 0x11, offset 0x440 + 0x460: 0x26, 0x461: 0x26, 0x462: 0x26, 0x463: 0x26, 0x464: 0x26, 0x465: 0x26, 0x466: 0x26, 0x467: 0x26, + 0x468: 0x100, 0x469: 0x112, 0x46a: 0x113, 0x46b: 0x114, 0x46c: 0x115, 0x46d: 0x116, 0x46e: 0x117, + 0x479: 0x118, 0x47c: 0x26, 0x47d: 0x119, 0x47e: 0x11a, 0x47f: 0x11b, + // Block 0x12, offset 0x480 + 0x4bf: 0x11c, + // Block 0x13, offset 0x4c0 + 0x4f0: 0x26, 0x4f1: 0x11d, 0x4f2: 0x11e, + // Block 0x14, offset 0x500 + 0x53c: 0x11f, 0x53d: 0x120, + // Block 0x15, offset 0x540 + 0x545: 0x121, 0x546: 0x122, + 0x549: 0x123, + 0x550: 0x124, 0x551: 0x125, 0x552: 0x126, 0x553: 0x127, 0x554: 0x128, 0x555: 0x129, 0x556: 0x12a, 0x557: 0x12b, + 0x558: 0x12c, 0x559: 0x12d, 0x55a: 0x12e, 0x55b: 0x12f, 0x55c: 0x130, 0x55d: 0x131, 0x55e: 0x132, 0x55f: 0x133, + 0x568: 0x134, 0x569: 0x135, 0x56a: 0x136, + 0x57c: 0x137, + // Block 0x16, offset 0x580 + 0x580: 0x138, 0x581: 0x139, 0x582: 0x13a, 0x584: 0x13b, 0x585: 0x13c, + 0x58a: 0x13d, 0x58b: 0x13e, + 0x593: 0x13f, + 0x59f: 0x140, + 0x5a0: 0x26, 0x5a1: 0x26, 0x5a2: 0x26, 0x5a3: 0x141, 0x5a4: 0x14, 0x5a5: 0x142, + 0x5b8: 0x143, 0x5b9: 0x15, 0x5ba: 0x144, + // Block 0x17, offset 0x5c0 + 0x5c4: 0x145, 0x5c5: 0x146, 0x5c6: 0x147, + 0x5cf: 0x148, + 0x5ef: 0x149, + // Block 0x18, offset 0x600 + 0x610: 0x0a, 0x611: 0x0b, 0x612: 0x0c, 0x613: 0x0d, 0x614: 0x0e, 0x616: 0x0f, + 0x61a: 0x10, 0x61b: 0x11, 0x61c: 0x12, 0x61d: 0x13, 0x61e: 0x14, 0x61f: 0x15, + // Block 0x19, offset 0x640 + 0x640: 0x14a, 0x641: 0x14b, 0x644: 0x14b, 0x645: 0x14b, 0x646: 0x14b, 0x647: 0x14c, + // Block 0x1a, offset 0x680 + 0x6a0: 0x17, +} + +// sparseOffsets: 312 entries, 624 bytes +var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x34, 0x37, 0x3b, 0x3e, 0x42, 0x4c, 0x4e, 0x57, 0x5e, 0x63, 0x71, 0x72, 0x80, 0x8f, 0x99, 0x9c, 0xa3, 0xab, 0xaf, 0xb7, 0xbd, 0xcb, 0xd6, 0xe3, 0xee, 0xfa, 0x104, 0x110, 0x11b, 0x127, 0x133, 0x13b, 0x145, 0x150, 0x15b, 0x167, 0x16d, 0x178, 0x17e, 0x186, 0x189, 0x18e, 0x192, 0x196, 0x19d, 0x1a6, 0x1ae, 0x1af, 0x1b8, 0x1bf, 0x1c7, 0x1cd, 0x1d2, 0x1d6, 0x1d9, 0x1db, 0x1de, 0x1e3, 0x1e4, 0x1e6, 0x1e8, 0x1ea, 0x1f1, 0x1f6, 0x1fa, 0x203, 0x206, 0x209, 0x20f, 0x210, 0x21b, 0x21c, 0x21d, 0x222, 0x22f, 0x238, 0x23e, 0x246, 0x24f, 0x258, 0x261, 0x266, 0x269, 0x274, 0x282, 0x284, 0x28b, 0x28f, 0x29b, 0x29c, 0x2a7, 0x2af, 0x2b7, 0x2bd, 0x2be, 0x2cc, 0x2d1, 0x2d4, 0x2d9, 0x2dd, 0x2e3, 0x2e8, 0x2eb, 0x2f0, 0x2f5, 0x2f6, 0x2fc, 0x2fe, 0x2ff, 0x301, 0x303, 0x306, 0x307, 0x309, 0x30c, 0x312, 0x316, 0x318, 0x31d, 0x324, 0x334, 0x33e, 0x33f, 0x348, 0x34c, 0x351, 0x359, 0x35f, 0x365, 0x36f, 0x374, 0x37d, 0x383, 0x38c, 0x390, 0x398, 0x39a, 0x39c, 0x39f, 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x3a7, 0x3a9, 0x3af, 0x3b4, 0x3b6, 0x3bd, 0x3c0, 0x3c2, 0x3c8, 0x3cd, 0x3cf, 0x3d0, 0x3d1, 0x3d2, 0x3d4, 0x3d6, 0x3d8, 0x3db, 0x3dd, 0x3e0, 0x3e8, 0x3eb, 0x3ef, 0x3f7, 0x3f9, 0x409, 0x40a, 0x40c, 0x411, 0x417, 0x419, 0x41a, 0x41c, 0x41e, 0x420, 0x42d, 0x42e, 0x42f, 0x433, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43c, 0x43f, 0x440, 0x443, 0x44a, 0x450, 0x452, 0x456, 0x45e, 0x464, 0x468, 0x46f, 0x473, 0x477, 0x480, 0x48a, 0x48c, 0x492, 0x498, 0x4a2, 0x4ac, 0x4ae, 0x4b7, 0x4bd, 0x4c3, 0x4c9, 0x4cc, 0x4d2, 0x4d5, 0x4de, 0x4df, 0x4e6, 0x4ea, 0x4eb, 0x4ee, 0x4f8, 0x4fb, 0x4fd, 0x504, 0x50c, 0x512, 0x519, 0x51a, 0x520, 0x523, 0x52b, 0x532, 0x53c, 0x544, 0x547, 0x54c, 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x557, 0x55a, 0x55b, 0x55e, 0x55f, 0x562, 0x564, 0x568, 0x569, 0x56b, 0x56e, 0x570, 0x573, 0x576, 0x578, 0x57d, 0x57f, 0x580, 0x585, 0x589, 0x58a, 0x58d, 0x591, 0x59c, 0x5a0, 0x5a8, 0x5ad, 0x5b1, 0x5b4, 0x5b8, 0x5bb, 0x5be, 0x5c3, 0x5c7, 0x5cb, 0x5cf, 0x5d3, 0x5d5, 0x5d7, 0x5da, 0x5de, 0x5e4, 0x5e5, 0x5e6, 0x5e9, 0x5eb, 0x5ed, 0x5f0, 0x5f5, 0x5f9, 0x5fb, 0x601, 0x60a, 0x60f, 0x610, 0x613, 0x614, 0x615, 0x616, 0x618, 0x619, 0x61a} + +// sparseValues: 1562 entries, 6248 bytes +var sparseValues = [1562]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0004, lo: 0xa8, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xaa}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0004, lo: 0xaf, hi: 0xaf}, + {value: 0x0004, lo: 0xb4, hi: 0xb4}, + {value: 0x001a, lo: 0xb5, hi: 0xb5}, + {value: 0x0054, lo: 0xb7, hi: 0xb7}, + {value: 0x0004, lo: 0xb8, hi: 0xb8}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + // Block 0x1, offset 0x9 + {value: 0x2013, lo: 0x80, hi: 0x96}, + {value: 0x2013, lo: 0x98, hi: 0x9e}, + {value: 0x009a, lo: 0x9f, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xb6}, + {value: 0x2012, lo: 0xb8, hi: 0xbe}, + {value: 0x0252, lo: 0xbf, hi: 0xbf}, + // Block 0x2, offset 0xf + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x011b, lo: 0xb0, hi: 0xb0}, + {value: 0x019a, lo: 0xb1, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb7}, + {value: 0x0012, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x0553, lo: 0xbf, hi: 0xbf}, + // Block 0x3, offset 0x18 + {value: 0x0552, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x01da, lo: 0x89, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xb7}, + {value: 0x0253, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x028a, lo: 0xbf, hi: 0xbf}, + // Block 0x4, offset 0x24 + {value: 0x0117, lo: 0x80, hi: 0x9f}, + {value: 0x2f53, lo: 0xa0, hi: 0xa0}, + {value: 0x0012, lo: 0xa1, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xb3}, + {value: 0x0012, lo: 0xb4, hi: 0xb9}, + {value: 0x090b, lo: 0xba, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x2953, lo: 0xbd, hi: 0xbd}, + {value: 0x098b, lo: 0xbe, hi: 0xbe}, + {value: 0x0a0a, lo: 0xbf, hi: 0xbf}, + // Block 0x5, offset 0x2e + {value: 0x0015, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x97}, + {value: 0x0004, lo: 0x98, hi: 0x9d}, + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0015, lo: 0xa0, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0024, lo: 0x80, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbf}, + // Block 0x7, offset 0x37 + {value: 0x6553, lo: 0x80, hi: 0x8f}, + {value: 0x2013, lo: 0x90, hi: 0x9f}, + {value: 0x5f53, lo: 0xa0, hi: 0xaf}, + {value: 0x2012, lo: 0xb0, hi: 0xbf}, + // Block 0x8, offset 0x3b + {value: 0x5f52, lo: 0x80, hi: 0x8f}, + {value: 0x6552, lo: 0x90, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x9, offset 0x3e + {value: 0x0117, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x83, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xbf}, + // Block 0xa, offset 0x42 + {value: 0x0f13, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0716, lo: 0x8b, hi: 0x8c}, + {value: 0x0316, lo: 0x8d, hi: 0x8e}, + {value: 0x0f12, lo: 0x8f, hi: 0x8f}, + {value: 0x0117, lo: 0x90, hi: 0xbf}, + // Block 0xb, offset 0x4c + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x6553, lo: 0xb1, hi: 0xbf}, + // Block 0xc, offset 0x4e + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6853, lo: 0x90, hi: 0x96}, + {value: 0x0014, lo: 0x99, hi: 0x99}, + {value: 0x0010, lo: 0x9a, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0054, lo: 0x9f, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa0}, + {value: 0x6552, lo: 0xa1, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0xd, offset 0x57 + {value: 0x0034, lo: 0x81, hi: 0x82}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0010, lo: 0xaf, hi: 0xb3}, + {value: 0x0054, lo: 0xb4, hi: 0xb4}, + // Block 0xe, offset 0x5e + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0024, lo: 0x90, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0014, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xf, offset 0x63 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9c}, + {value: 0x0024, lo: 0x9d, hi: 0x9e}, + {value: 0x0034, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x10, offset 0x71 + {value: 0x0010, lo: 0x80, hi: 0xbf}, + // Block 0x11, offset 0x72 + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0024, lo: 0x9f, hi: 0xa2}, + {value: 0x0034, lo: 0xa3, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa8}, + {value: 0x0034, lo: 0xaa, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x12, offset 0x80 + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0034, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0034, lo: 0xb1, hi: 0xb1}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0024, lo: 0xbf, hi: 0xbf}, + // Block 0x13, offset 0x8f + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0024, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x88}, + {value: 0x0024, lo: 0x89, hi: 0x8a}, + {value: 0x0010, lo: 0x8d, hi: 0xbf}, + // Block 0x14, offset 0x99 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x15, offset 0x9c + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xb1}, + {value: 0x0034, lo: 0xb2, hi: 0xb2}, + {value: 0x0024, lo: 0xb3, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0x16, offset 0xa3 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x99}, + {value: 0x0014, lo: 0x9a, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0xa3}, + {value: 0x0014, lo: 0xa4, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xad}, + // Block 0x17, offset 0xab + {value: 0x0010, lo: 0x80, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + {value: 0x0010, lo: 0xa0, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x18, offset 0xaf + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0004, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8e}, + {value: 0x0014, lo: 0x90, hi: 0x91}, + {value: 0x0024, lo: 0x98, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + {value: 0x0024, lo: 0x9c, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x19, offset 0xb7 + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1a, offset 0xbd + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0x1b, offset 0xcb + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb6, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1c, offset 0xd6 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xb1}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + // Block 0x1d, offset 0xe3 + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x1e, offset 0xee + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x99, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x1f, offset 0xfa + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x20, offset 0x104 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x85}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xbf}, + // Block 0x21, offset 0x110 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x22, offset 0x11b + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x23, offset 0x127 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0010, lo: 0xa8, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x24, offset 0x133 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x25, offset 0x13b + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbf}, + // Block 0x26, offset 0x145 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x88}, + {value: 0x0014, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9a}, + {value: 0x0010, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x27, offset 0x150 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x28, offset 0x15b + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x9d, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb3}, + // Block 0x29, offset 0x167 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x2a, offset 0x16d + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x94, hi: 0x97}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xba, hi: 0xbf}, + // Block 0x2b, offset 0x178 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x96}, + {value: 0x0010, lo: 0x9a, hi: 0xb1}, + {value: 0x0010, lo: 0xb3, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x2c, offset 0x17e + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x94}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9f}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + // Block 0x2d, offset 0x186 + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + // Block 0x2e, offset 0x189 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x2f, offset 0x18e + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + // Block 0x30, offset 0x192 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x31, offset 0x196 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0034, lo: 0x98, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0034, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x32, offset 0x19d + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xac}, + {value: 0x0034, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xba, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x33, offset 0x1a6 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x86, hi: 0x87}, + {value: 0x0010, lo: 0x88, hi: 0x8c}, + {value: 0x0014, lo: 0x8d, hi: 0x97}, + {value: 0x0014, lo: 0x99, hi: 0xbc}, + // Block 0x34, offset 0x1ae + {value: 0x0034, lo: 0x86, hi: 0x86}, + // Block 0x35, offset 0x1af + {value: 0x0010, lo: 0xab, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbe}, + // Block 0x36, offset 0x1b8 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x96, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x99}, + {value: 0x0014, lo: 0x9e, hi: 0xa0}, + {value: 0x0010, lo: 0xa2, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xad}, + {value: 0x0014, lo: 0xb1, hi: 0xb4}, + // Block 0x37, offset 0x1bf + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x6c53, lo: 0xa0, hi: 0xbf}, + // Block 0x38, offset 0x1c7 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x9a, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x39, offset 0x1cd + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x3a, offset 0x1d2 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x82, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3b, offset 0x1d6 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3c, offset 0x1d9 + {value: 0x0010, lo: 0x80, hi: 0x9a}, + {value: 0x0024, lo: 0x9d, hi: 0x9f}, + // Block 0x3d, offset 0x1db + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x7453, lo: 0xa0, hi: 0xaf}, + {value: 0x7853, lo: 0xb0, hi: 0xbf}, + // Block 0x3e, offset 0x1de + {value: 0x7c53, lo: 0x80, hi: 0x8f}, + {value: 0x8053, lo: 0x90, hi: 0x9f}, + {value: 0x7c53, lo: 0xa0, hi: 0xaf}, + {value: 0x0813, lo: 0xb0, hi: 0xb5}, + {value: 0x0892, lo: 0xb8, hi: 0xbd}, + // Block 0x3f, offset 0x1e3 + {value: 0x0010, lo: 0x81, hi: 0xbf}, + // Block 0x40, offset 0x1e4 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0010, lo: 0xaf, hi: 0xbf}, + // Block 0x41, offset 0x1e6 + {value: 0x0010, lo: 0x81, hi: 0x9a}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x42, offset 0x1e8 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb8}, + // Block 0x43, offset 0x1ea + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0034, lo: 0x94, hi: 0x94}, + {value: 0x0030, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x9f, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0030, lo: 0xb4, hi: 0xb4}, + // Block 0x44, offset 0x1f1 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xac}, + {value: 0x0010, lo: 0xae, hi: 0xb0}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + // Block 0x45, offset 0x1f6 + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x46, offset 0x1fa + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x89, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0014, lo: 0x93, hi: 0x93}, + {value: 0x0004, lo: 0x97, hi: 0x97}, + {value: 0x0024, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0x47, offset 0x203 + {value: 0x0014, lo: 0x8b, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x48, offset 0x206 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb8}, + // Block 0x49, offset 0x209 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x4a, offset 0x20f + {value: 0x0010, lo: 0x80, hi: 0xb5}, + // Block 0x4b, offset 0x210 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbb}, + // Block 0x4c, offset 0x21b + {value: 0x0010, lo: 0x86, hi: 0x8f}, + // Block 0x4d, offset 0x21c + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x4e, offset 0x21d + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + // Block 0x4f, offset 0x222 + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x9e}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xac}, + {value: 0x0010, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xbc}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x50, offset 0x22f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xa7, hi: 0xa7}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + {value: 0x0034, lo: 0xb5, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbc}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x51, offset 0x238 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0024, lo: 0x81, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8e}, + // Block 0x52, offset 0x23e + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x53, offset 0x246 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0030, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + {value: 0x0024, lo: 0xad, hi: 0xb3}, + // Block 0x54, offset 0x24f + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0030, lo: 0xaa, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbf}, + // Block 0x55, offset 0x258 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0030, lo: 0xb2, hi: 0xb3}, + // Block 0x56, offset 0x261 + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + // Block 0x57, offset 0x266 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8d, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x58, offset 0x269 + {value: 0x31ea, lo: 0x80, hi: 0x80}, + {value: 0x326a, lo: 0x81, hi: 0x81}, + {value: 0x32ea, lo: 0x82, hi: 0x82}, + {value: 0x336a, lo: 0x83, hi: 0x83}, + {value: 0x33ea, lo: 0x84, hi: 0x84}, + {value: 0x346a, lo: 0x85, hi: 0x85}, + {value: 0x34ea, lo: 0x86, hi: 0x86}, + {value: 0x356a, lo: 0x87, hi: 0x87}, + {value: 0x35ea, lo: 0x88, hi: 0x88}, + {value: 0x8353, lo: 0x90, hi: 0xba}, + {value: 0x8353, lo: 0xbd, hi: 0xbf}, + // Block 0x59, offset 0x274 + {value: 0x0024, lo: 0x90, hi: 0x92}, + {value: 0x0034, lo: 0x94, hi: 0x99}, + {value: 0x0024, lo: 0x9a, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9f}, + {value: 0x0024, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0034, lo: 0xa2, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xb3}, + {value: 0x0024, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb7}, + {value: 0x0024, lo: 0xb8, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xba}, + // Block 0x5a, offset 0x282 + {value: 0x0012, lo: 0x80, hi: 0xab}, + {value: 0x0015, lo: 0xac, hi: 0xbf}, + // Block 0x5b, offset 0x284 + {value: 0x0015, lo: 0x80, hi: 0xaa}, + {value: 0x0012, lo: 0xab, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb8}, + {value: 0x8752, lo: 0xb9, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbc}, + {value: 0x8b52, lo: 0xbd, hi: 0xbd}, + {value: 0x0012, lo: 0xbe, hi: 0xbf}, + // Block 0x5c, offset 0x28b + {value: 0x0012, lo: 0x80, hi: 0x8d}, + {value: 0x8f52, lo: 0x8e, hi: 0x8e}, + {value: 0x0012, lo: 0x8f, hi: 0x9a}, + {value: 0x0015, lo: 0x9b, hi: 0xbf}, + // Block 0x5d, offset 0x28f + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbd}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x5e, offset 0x29b + {value: 0x0117, lo: 0x80, hi: 0xbf}, + // Block 0x5f, offset 0x29c + {value: 0x0117, lo: 0x80, hi: 0x95}, + {value: 0x369a, lo: 0x96, hi: 0x96}, + {value: 0x374a, lo: 0x97, hi: 0x97}, + {value: 0x37fa, lo: 0x98, hi: 0x98}, + {value: 0x38aa, lo: 0x99, hi: 0x99}, + {value: 0x395a, lo: 0x9a, hi: 0x9a}, + {value: 0x3a0a, lo: 0x9b, hi: 0x9b}, + {value: 0x0012, lo: 0x9c, hi: 0x9d}, + {value: 0x3abb, lo: 0x9e, hi: 0x9e}, + {value: 0x0012, lo: 0x9f, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x60, offset 0x2a7 + {value: 0x0812, lo: 0x80, hi: 0x87}, + {value: 0x0813, lo: 0x88, hi: 0x8f}, + {value: 0x0812, lo: 0x90, hi: 0x95}, + {value: 0x0813, lo: 0x98, hi: 0x9d}, + {value: 0x0812, lo: 0xa0, hi: 0xa7}, + {value: 0x0813, lo: 0xa8, hi: 0xaf}, + {value: 0x0812, lo: 0xb0, hi: 0xb7}, + {value: 0x0813, lo: 0xb8, hi: 0xbf}, + // Block 0x61, offset 0x2af + {value: 0x0004, lo: 0x8b, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8f}, + {value: 0x0054, lo: 0x98, hi: 0x99}, + {value: 0x0054, lo: 0xa4, hi: 0xa4}, + {value: 0x0054, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xaa, hi: 0xae}, + {value: 0x0010, lo: 0xaf, hi: 0xaf}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x62, offset 0x2b7 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x94, hi: 0x94}, + {value: 0x0014, lo: 0xa0, hi: 0xa4}, + {value: 0x0014, lo: 0xa6, hi: 0xaf}, + {value: 0x0015, lo: 0xb1, hi: 0xb1}, + {value: 0x0015, lo: 0xbf, hi: 0xbf}, + // Block 0x63, offset 0x2bd + {value: 0x0015, lo: 0x90, hi: 0x9c}, + // Block 0x64, offset 0x2be + {value: 0x0024, lo: 0x90, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x93}, + {value: 0x0024, lo: 0x94, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0xa0}, + {value: 0x0024, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa4}, + {value: 0x0034, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xa9}, + {value: 0x0034, lo: 0xaa, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + // Block 0x65, offset 0x2cc + {value: 0x0016, lo: 0x85, hi: 0x86}, + {value: 0x0012, lo: 0x87, hi: 0x89}, + {value: 0xa452, lo: 0x8e, hi: 0x8e}, + {value: 0x1013, lo: 0xa0, hi: 0xaf}, + {value: 0x1012, lo: 0xb0, hi: 0xbf}, + // Block 0x66, offset 0x2d1 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x88}, + // Block 0x67, offset 0x2d4 + {value: 0xa753, lo: 0xb6, hi: 0xb7}, + {value: 0xaa53, lo: 0xb8, hi: 0xb9}, + {value: 0xad53, lo: 0xba, hi: 0xbb}, + {value: 0xaa53, lo: 0xbc, hi: 0xbd}, + {value: 0xa753, lo: 0xbe, hi: 0xbf}, + // Block 0x68, offset 0x2d9 + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6553, lo: 0x90, hi: 0x9f}, + {value: 0xb053, lo: 0xa0, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0x69, offset 0x2dd + {value: 0x0117, lo: 0x80, hi: 0xa3}, + {value: 0x0012, lo: 0xa4, hi: 0xa4}, + {value: 0x0716, lo: 0xab, hi: 0xac}, + {value: 0x0316, lo: 0xad, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb3}, + // Block 0x6a, offset 0x2e3 + {value: 0x6c52, lo: 0x80, hi: 0x9f}, + {value: 0x7052, lo: 0xa0, hi: 0xa5}, + {value: 0x7052, lo: 0xa7, hi: 0xa7}, + {value: 0x7052, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x6b, offset 0x2e8 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x6c, offset 0x2eb + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xae}, + {value: 0x0010, lo: 0xb0, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x6d, offset 0x2f0 + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9e}, + {value: 0x0024, lo: 0xa0, hi: 0xbf}, + // Block 0x6e, offset 0x2f5 + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + // Block 0x6f, offset 0x2f6 + {value: 0x0014, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0xaa, hi: 0xad}, + {value: 0x0030, lo: 0xae, hi: 0xaf}, + {value: 0x0004, lo: 0xb1, hi: 0xb5}, + {value: 0x0014, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + // Block 0x70, offset 0x2fc + {value: 0x0034, lo: 0x99, hi: 0x9a}, + {value: 0x0004, lo: 0x9b, hi: 0x9e}, + // Block 0x71, offset 0x2fe + {value: 0x0004, lo: 0xbc, hi: 0xbe}, + // Block 0x72, offset 0x2ff + {value: 0x0010, lo: 0x85, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x73, offset 0x301 + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x74, offset 0x303 + {value: 0x0010, lo: 0x80, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0xbf}, + // Block 0x75, offset 0x306 + {value: 0x0010, lo: 0x80, hi: 0x8c}, + // Block 0x76, offset 0x307 + {value: 0x0010, lo: 0x90, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x77, offset 0x309 + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0xab}, + // Block 0x78, offset 0x30c + {value: 0x0117, lo: 0x80, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb2}, + {value: 0x0024, lo: 0xb4, hi: 0xbd}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x79, offset 0x312 + {value: 0x0117, lo: 0x80, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9d}, + {value: 0x0024, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x7a, offset 0x316 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb1}, + // Block 0x7b, offset 0x318 + {value: 0x0004, lo: 0x80, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xaf}, + {value: 0x0012, lo: 0xb0, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xbf}, + // Block 0x7c, offset 0x31d + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x0015, lo: 0xb0, hi: 0xb0}, + {value: 0x0012, lo: 0xb1, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x8753, lo: 0xbd, hi: 0xbd}, + {value: 0x0117, lo: 0xbe, hi: 0xbf}, + // Block 0x7d, offset 0x324 + {value: 0x0117, lo: 0x80, hi: 0x83}, + {value: 0x6553, lo: 0x84, hi: 0x84}, + {value: 0x908b, lo: 0x85, hi: 0x85}, + {value: 0x8f53, lo: 0x86, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0117, lo: 0x90, hi: 0x91}, + {value: 0x0012, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x95, hi: 0x95}, + {value: 0x0117, lo: 0x96, hi: 0x99}, + {value: 0x0015, lo: 0xb2, hi: 0xb4}, + {value: 0x0316, lo: 0xb5, hi: 0xb6}, + {value: 0x0010, lo: 0xb7, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbf}, + // Block 0x7e, offset 0x334 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x8c, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + // Block 0x7f, offset 0x33e + {value: 0x0010, lo: 0x80, hi: 0xb3}, + // Block 0x80, offset 0x33f + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x85}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xa0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb7}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x81, offset 0x348 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x82, offset 0x34c + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0x92}, + {value: 0x0030, lo: 0x93, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0x83, offset 0x351 + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x84, offset 0x359 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0004, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x85, offset 0x35f + {value: 0x0010, lo: 0x80, hi: 0xa8}, + {value: 0x0014, lo: 0xa9, hi: 0xae}, + {value: 0x0010, lo: 0xaf, hi: 0xb0}, + {value: 0x0014, lo: 0xb1, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb6}, + // Block 0x86, offset 0x365 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x87, offset 0x36f + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb7, hi: 0xb8}, + {value: 0x0024, lo: 0xbe, hi: 0xbf}, + // Block 0x88, offset 0x374 + {value: 0x0024, lo: 0x81, hi: 0x81}, + {value: 0x0004, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + // Block 0x89, offset 0x37d + {value: 0x0010, lo: 0x81, hi: 0x86}, + {value: 0x0010, lo: 0x89, hi: 0x8e}, + {value: 0x0010, lo: 0x91, hi: 0x96}, + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xae}, + {value: 0x0012, lo: 0xb0, hi: 0xbf}, + // Block 0x8a, offset 0x383 + {value: 0x0012, lo: 0x80, hi: 0x92}, + {value: 0xb352, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x94, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa8}, + {value: 0x0015, lo: 0xa9, hi: 0xa9}, + {value: 0x0004, lo: 0xaa, hi: 0xab}, + {value: 0x74d2, lo: 0xb0, hi: 0xbf}, + // Block 0x8b, offset 0x38c + {value: 0x78d2, lo: 0x80, hi: 0x8f}, + {value: 0x7cd2, lo: 0x90, hi: 0x9f}, + {value: 0x80d2, lo: 0xa0, hi: 0xaf}, + {value: 0x7cd2, lo: 0xb0, hi: 0xbf}, + // Block 0x8c, offset 0x390 + {value: 0x0010, lo: 0x80, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x8d, offset 0x398 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x8e, offset 0x39a + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x8b, hi: 0xbb}, + // Block 0x8f, offset 0x39c + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0xbf}, + // Block 0x90, offset 0x39f + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0004, lo: 0xb2, hi: 0xbf}, + // Block 0x91, offset 0x3a1 + {value: 0x0004, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x93, hi: 0xbf}, + // Block 0x92, offset 0x3a3 + {value: 0x0010, lo: 0x80, hi: 0xbd}, + // Block 0x93, offset 0x3a4 + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x94, offset 0x3a5 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0xbf}, + // Block 0x95, offset 0x3a7 + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0xb0, hi: 0xbb}, + // Block 0x96, offset 0x3a9 + {value: 0x0014, lo: 0x80, hi: 0x8f}, + {value: 0x0054, lo: 0x93, hi: 0x93}, + {value: 0x0024, lo: 0xa0, hi: 0xa6}, + {value: 0x0034, lo: 0xa7, hi: 0xad}, + {value: 0x0024, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb3, hi: 0xb4}, + // Block 0x97, offset 0x3af + {value: 0x0010, lo: 0x8d, hi: 0x8f}, + {value: 0x0054, lo: 0x92, hi: 0x92}, + {value: 0x0054, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0xb0, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0x98, offset 0x3b4 + {value: 0x0010, lo: 0x80, hi: 0xbc}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x3b6 + {value: 0x0054, lo: 0x87, hi: 0x87}, + {value: 0x0054, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0054, lo: 0x9a, hi: 0x9a}, + {value: 0x5f53, lo: 0xa1, hi: 0xba}, + {value: 0x0004, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x9a, offset 0x3bd + {value: 0x0004, lo: 0x80, hi: 0x80}, + {value: 0x5f52, lo: 0x81, hi: 0x9a}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + // Block 0x9b, offset 0x3c0 + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbe}, + // Block 0x9c, offset 0x3c2 + {value: 0x0010, lo: 0x82, hi: 0x87}, + {value: 0x0010, lo: 0x8a, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0x97}, + {value: 0x0010, lo: 0x9a, hi: 0x9c}, + {value: 0x0004, lo: 0xa3, hi: 0xa3}, + {value: 0x0014, lo: 0xb9, hi: 0xbb}, + // Block 0x9d, offset 0x3c8 + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0010, lo: 0x8d, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xba}, + {value: 0x0010, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x3cd + {value: 0x0010, lo: 0x80, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x9d}, + // Block 0x9f, offset 0x3cf + {value: 0x0010, lo: 0x80, hi: 0xba}, + // Block 0xa0, offset 0x3d0 + {value: 0x0010, lo: 0x80, hi: 0xb4}, + // Block 0xa1, offset 0x3d1 + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0xa2, offset 0x3d2 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa3, offset 0x3d4 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + // Block 0xa4, offset 0x3d6 + {value: 0x0010, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xad, hi: 0xbf}, + // Block 0xa5, offset 0x3d8 + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0xb5}, + {value: 0x0024, lo: 0xb6, hi: 0xba}, + // Block 0xa6, offset 0x3db + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa7, offset 0x3dd + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x91, hi: 0x95}, + // Block 0xa8, offset 0x3e0 + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x97}, + {value: 0xb653, lo: 0x98, hi: 0x9f}, + {value: 0xb953, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbf}, + // Block 0xa9, offset 0x3e8 + {value: 0xb652, lo: 0x80, hi: 0x87}, + {value: 0xb952, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0xaa, offset 0x3eb + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0xb953, lo: 0xb0, hi: 0xb7}, + {value: 0xb653, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x3ef + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x93}, + {value: 0xb952, lo: 0x98, hi: 0x9f}, + {value: 0xb652, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbb}, + // Block 0xac, offset 0x3f7 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xad, offset 0x3f9 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0xbc53, lo: 0xb0, hi: 0xb0}, + {value: 0xbf53, lo: 0xb1, hi: 0xb1}, + {value: 0xc253, lo: 0xb2, hi: 0xb2}, + {value: 0xbf53, lo: 0xb3, hi: 0xb3}, + {value: 0xc553, lo: 0xb4, hi: 0xb4}, + {value: 0xbf53, lo: 0xb5, hi: 0xb5}, + {value: 0xc253, lo: 0xb6, hi: 0xb6}, + {value: 0xbf53, lo: 0xb7, hi: 0xb7}, + {value: 0xbc53, lo: 0xb8, hi: 0xb8}, + {value: 0xc853, lo: 0xb9, hi: 0xb9}, + {value: 0xcb53, lo: 0xba, hi: 0xba}, + {value: 0xce53, lo: 0xbc, hi: 0xbc}, + {value: 0xc853, lo: 0xbd, hi: 0xbd}, + {value: 0xcb53, lo: 0xbe, hi: 0xbe}, + {value: 0xc853, lo: 0xbf, hi: 0xbf}, + // Block 0xae, offset 0x409 + {value: 0x0010, lo: 0x80, hi: 0xb6}, + // Block 0xaf, offset 0x40a + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + // Block 0xb0, offset 0x40c + {value: 0x0015, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0015, lo: 0x83, hi: 0x85}, + {value: 0x0015, lo: 0x87, hi: 0xb0}, + {value: 0x0015, lo: 0xb2, hi: 0xba}, + // Block 0xb1, offset 0x411 + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0xb5}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xb2, offset 0x417 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xb3, offset 0x419 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + // Block 0xb4, offset 0x41a + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + // Block 0xb5, offset 0x41c + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb9}, + // Block 0xb6, offset 0x41e + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xb7, offset 0x420 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x8e, hi: 0x8e}, + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x99, hi: 0xb5}, + {value: 0x0024, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x42d + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0xb9, offset 0x42e + {value: 0x0010, lo: 0x80, hi: 0x9c}, + // Block 0xba, offset 0x42f + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + // Block 0xbb, offset 0x433 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + // Block 0xbc, offset 0x435 + {value: 0x0010, lo: 0x80, hi: 0x91}, + // Block 0xbd, offset 0x436 + {value: 0x0010, lo: 0x80, hi: 0x88}, + // Block 0xbe, offset 0x437 + {value: 0x5653, lo: 0x80, hi: 0xb2}, + // Block 0xbf, offset 0x438 + {value: 0x5652, lo: 0x80, hi: 0xb2}, + // Block 0xc0, offset 0x439 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xc1, offset 0x43c + {value: 0x0010, lo: 0x80, hi: 0xa9}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + // Block 0xc2, offset 0x43f + {value: 0x0034, lo: 0xbd, hi: 0xbf}, + // Block 0xc3, offset 0x440 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc4, offset 0x443 + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x87}, + {value: 0x0024, lo: 0x88, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x8b}, + {value: 0x0024, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc5, offset 0x44a + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x83}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc6, offset 0x450 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xc7, offset 0x452 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbf}, + // Block 0xc8, offset 0x456 + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xc9, offset 0x45e + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb6}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0014, lo: 0xbd, hi: 0xbd}, + // Block 0xca, offset 0x464 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xcb, offset 0x468 + {value: 0x0024, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0xcc, offset 0x46f + {value: 0x0010, lo: 0x84, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + // Block 0xcd, offset 0x473 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xce, offset 0x477 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x89, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + // Block 0xcf, offset 0x480 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb4}, + {value: 0x0030, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xb7}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xd0, offset 0x48a + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + // Block 0xd1, offset 0x48c + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xd2, offset 0x492 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa2}, + {value: 0x0014, lo: 0xa3, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xd3, offset 0x498 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0xd4, offset 0x4a2 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0030, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9d, hi: 0xa3}, + {value: 0x0024, lo: 0xa6, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + // Block 0xd5, offset 0x4ac + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbf}, + // Block 0xd6, offset 0x4ae + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + // Block 0xd7, offset 0x4b7 + {value: 0x0010, lo: 0x80, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb8}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0xd8, offset 0x4bd + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x85}, + {value: 0x0010, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xd9, offset 0x4c3 + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xda, offset 0x4c9 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x98, hi: 0x9b}, + {value: 0x0014, lo: 0x9c, hi: 0x9d}, + // Block 0xdb, offset 0x4cc + {value: 0x0010, lo: 0x80, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xdc, offset 0x4d2 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xdd, offset 0x4d5 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb5}, + {value: 0x0030, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + // Block 0xde, offset 0x4de + {value: 0x0010, lo: 0x80, hi: 0x89}, + // Block 0xdf, offset 0x4df + {value: 0x0014, lo: 0x9d, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xe0, offset 0x4e6 + {value: 0x0010, lo: 0x80, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + // Block 0xe1, offset 0x4ea + {value: 0x5f53, lo: 0xa0, hi: 0xbf}, + // Block 0xe2, offset 0x4eb + {value: 0x5f52, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xe3, offset 0x4ee + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8c, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xb5}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + {value: 0x0030, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xe4, offset 0x4f8 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xe5, offset 0x4fb + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + {value: 0x0010, lo: 0xaa, hi: 0xbf}, + // Block 0xe6, offset 0x4fd + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0014, lo: 0x94, hi: 0x97}, + {value: 0x0014, lo: 0x9a, hi: 0x9b}, + {value: 0x0010, lo: 0x9c, hi: 0x9f}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + // Block 0xe7, offset 0x504 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x8a}, + {value: 0x0010, lo: 0x8b, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb8}, + {value: 0x0010, lo: 0xb9, hi: 0xba}, + {value: 0x0014, lo: 0xbb, hi: 0xbe}, + // Block 0xe8, offset 0x50c + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0014, lo: 0x91, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x98}, + {value: 0x0014, lo: 0x99, hi: 0x9b}, + {value: 0x0010, lo: 0x9c, hi: 0xbf}, + // Block 0xe9, offset 0x512 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0014, lo: 0x8a, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x99}, + {value: 0x0010, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xea, offset 0x519 + {value: 0x0010, lo: 0x80, hi: 0xb8}, + // Block 0xeb, offset 0x51a + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb6}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xec, offset 0x520 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0xed, offset 0x523 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0014, lo: 0x92, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xa9}, + {value: 0x0014, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb6}, + // Block 0xee, offset 0x52b + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0xb0}, + {value: 0x0014, lo: 0xb1, hi: 0xb6}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0xef, offset 0x532 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x85}, + {value: 0x0010, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa5}, + {value: 0x0010, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xbf}, + // Block 0xf0, offset 0x53c + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0014, lo: 0x90, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0x96}, + {value: 0x0034, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0xf1, offset 0x544 + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + // Block 0xf2, offset 0x547 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xf3, offset 0x54c + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0030, lo: 0x81, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xf4, offset 0x550 + {value: 0x0010, lo: 0xb0, hi: 0xb0}, + // Block 0xf5, offset 0x551 + {value: 0x0010, lo: 0x80, hi: 0x99}, + // Block 0xf6, offset 0x552 + {value: 0x0010, lo: 0x80, hi: 0xae}, + // Block 0xf7, offset 0x553 + {value: 0x0010, lo: 0x80, hi: 0x83}, + // Block 0xf8, offset 0x554 + {value: 0x0010, lo: 0x80, hi: 0xb0}, + // Block 0xf9, offset 0x555 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xbf}, + // Block 0xfa, offset 0x557 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x95}, + // Block 0xfb, offset 0x55a + {value: 0x0010, lo: 0x80, hi: 0x86}, + // Block 0xfc, offset 0x55b + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xfd, offset 0x55e + {value: 0x0010, lo: 0x80, hi: 0xbe}, + // Block 0xfe, offset 0x55f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0034, lo: 0xb0, hi: 0xb4}, + // Block 0xff, offset 0x562 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + // Block 0x100, offset 0x564 + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa3, hi: 0xb7}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x101, offset 0x568 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + // Block 0x102, offset 0x569 + {value: 0x2013, lo: 0x80, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xbf}, + // Block 0x103, offset 0x56b + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x104, offset 0x56e + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0014, lo: 0x8f, hi: 0x9f}, + // Block 0x105, offset 0x570 + {value: 0x0014, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa3, hi: 0xa4}, + {value: 0x0030, lo: 0xb0, hi: 0xb1}, + // Block 0x106, offset 0x573 + {value: 0x0004, lo: 0xb0, hi: 0xb3}, + {value: 0x0004, lo: 0xb5, hi: 0xbb}, + {value: 0x0004, lo: 0xbd, hi: 0xbe}, + // Block 0x107, offset 0x576 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbc}, + // Block 0x108, offset 0x578 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0034, lo: 0x9e, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa3}, + // Block 0x109, offset 0x57d + {value: 0x0014, lo: 0x80, hi: 0xad}, + {value: 0x0014, lo: 0xb0, hi: 0xbf}, + // Block 0x10a, offset 0x57f + {value: 0x0014, lo: 0x80, hi: 0x86}, + // Block 0x10b, offset 0x580 + {value: 0x0030, lo: 0xa5, hi: 0xa6}, + {value: 0x0034, lo: 0xa7, hi: 0xa9}, + {value: 0x0030, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbf}, + // Block 0x10c, offset 0x585 + {value: 0x0034, lo: 0x80, hi: 0x82}, + {value: 0x0024, lo: 0x85, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8b}, + {value: 0x0024, lo: 0xaa, hi: 0xad}, + // Block 0x10d, offset 0x589 + {value: 0x0024, lo: 0x82, hi: 0x84}, + // Block 0x10e, offset 0x58a + {value: 0x0013, lo: 0x80, hi: 0x99}, + {value: 0x0012, lo: 0x9a, hi: 0xb3}, + {value: 0x0013, lo: 0xb4, hi: 0xbf}, + // Block 0x10f, offset 0x58d + {value: 0x0013, lo: 0x80, hi: 0x8d}, + {value: 0x0012, lo: 0x8e, hi: 0x94}, + {value: 0x0012, lo: 0x96, hi: 0xa7}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0x110, offset 0x591 + {value: 0x0013, lo: 0x80, hi: 0x81}, + {value: 0x0012, lo: 0x82, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0x9c}, + {value: 0x0013, lo: 0x9e, hi: 0x9f}, + {value: 0x0013, lo: 0xa2, hi: 0xa2}, + {value: 0x0013, lo: 0xa5, hi: 0xa6}, + {value: 0x0013, lo: 0xa9, hi: 0xac}, + {value: 0x0013, lo: 0xae, hi: 0xb5}, + {value: 0x0012, lo: 0xb6, hi: 0xb9}, + {value: 0x0012, lo: 0xbb, hi: 0xbb}, + {value: 0x0012, lo: 0xbd, hi: 0xbf}, + // Block 0x111, offset 0x59c + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0012, lo: 0x85, hi: 0x8f}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0012, lo: 0xaa, hi: 0xbf}, + // Block 0x112, offset 0x5a0 + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0013, lo: 0x84, hi: 0x85}, + {value: 0x0013, lo: 0x87, hi: 0x8a}, + {value: 0x0013, lo: 0x8d, hi: 0x94}, + {value: 0x0013, lo: 0x96, hi: 0x9c}, + {value: 0x0012, lo: 0x9e, hi: 0xb7}, + {value: 0x0013, lo: 0xb8, hi: 0xb9}, + {value: 0x0013, lo: 0xbb, hi: 0xbe}, + // Block 0x113, offset 0x5a8 + {value: 0x0013, lo: 0x80, hi: 0x84}, + {value: 0x0013, lo: 0x86, hi: 0x86}, + {value: 0x0013, lo: 0x8a, hi: 0x90}, + {value: 0x0012, lo: 0x92, hi: 0xab}, + {value: 0x0013, lo: 0xac, hi: 0xbf}, + // Block 0x114, offset 0x5ad + {value: 0x0013, lo: 0x80, hi: 0x85}, + {value: 0x0012, lo: 0x86, hi: 0x9f}, + {value: 0x0013, lo: 0xa0, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbf}, + // Block 0x115, offset 0x5b1 + {value: 0x0012, lo: 0x80, hi: 0x93}, + {value: 0x0013, lo: 0x94, hi: 0xad}, + {value: 0x0012, lo: 0xae, hi: 0xbf}, + // Block 0x116, offset 0x5b4 + {value: 0x0012, lo: 0x80, hi: 0x87}, + {value: 0x0013, lo: 0x88, hi: 0xa1}, + {value: 0x0012, lo: 0xa2, hi: 0xbb}, + {value: 0x0013, lo: 0xbc, hi: 0xbf}, + // Block 0x117, offset 0x5b8 + {value: 0x0013, lo: 0x80, hi: 0x95}, + {value: 0x0012, lo: 0x96, hi: 0xaf}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x118, offset 0x5bb + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0012, lo: 0x8a, hi: 0xa5}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0x119, offset 0x5be + {value: 0x0013, lo: 0x80, hi: 0x80}, + {value: 0x0012, lo: 0x82, hi: 0x9a}, + {value: 0x0012, lo: 0x9c, hi: 0xa1}, + {value: 0x0013, lo: 0xa2, hi: 0xba}, + {value: 0x0012, lo: 0xbc, hi: 0xbf}, + // Block 0x11a, offset 0x5c3 + {value: 0x0012, lo: 0x80, hi: 0x94}, + {value: 0x0012, lo: 0x96, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0xb4}, + {value: 0x0012, lo: 0xb6, hi: 0xbf}, + // Block 0x11b, offset 0x5c7 + {value: 0x0012, lo: 0x80, hi: 0x8e}, + {value: 0x0012, lo: 0x90, hi: 0x95}, + {value: 0x0013, lo: 0x96, hi: 0xae}, + {value: 0x0012, lo: 0xb0, hi: 0xbf}, + // Block 0x11c, offset 0x5cb + {value: 0x0012, lo: 0x80, hi: 0x88}, + {value: 0x0012, lo: 0x8a, hi: 0x8f}, + {value: 0x0013, lo: 0x90, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xbf}, + // Block 0x11d, offset 0x5cf + {value: 0x0012, lo: 0x80, hi: 0x82}, + {value: 0x0012, lo: 0x84, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8b}, + {value: 0x0010, lo: 0x8e, hi: 0xbf}, + // Block 0x11e, offset 0x5d3 + {value: 0x0014, lo: 0x80, hi: 0xb6}, + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0x11f, offset 0x5d5 + {value: 0x0014, lo: 0x80, hi: 0xac}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x120, offset 0x5d7 + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x9b, hi: 0x9f}, + {value: 0x0014, lo: 0xa1, hi: 0xaf}, + // Block 0x121, offset 0x5da + {value: 0x0012, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8a, hi: 0x8a}, + {value: 0x0012, lo: 0x8b, hi: 0x9e}, + {value: 0x0012, lo: 0xa5, hi: 0xaa}, + // Block 0x122, offset 0x5de + {value: 0x0024, lo: 0x80, hi: 0x86}, + {value: 0x0024, lo: 0x88, hi: 0x98}, + {value: 0x0024, lo: 0x9b, hi: 0xa1}, + {value: 0x0024, lo: 0xa3, hi: 0xa4}, + {value: 0x0024, lo: 0xa6, hi: 0xaa}, + {value: 0x0015, lo: 0xb0, hi: 0xbf}, + // Block 0x123, offset 0x5e4 + {value: 0x0015, lo: 0x80, hi: 0xad}, + // Block 0x124, offset 0x5e5 + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + // Block 0x125, offset 0x5e6 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + // Block 0x126, offset 0x5e9 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + // Block 0x127, offset 0x5eb + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0024, lo: 0xae, hi: 0xae}, + // Block 0x128, offset 0x5ed + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0024, lo: 0xac, hi: 0xaf}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x129, offset 0x5f0 + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x12a, offset 0x5f5 + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xab}, + {value: 0x0010, lo: 0xad, hi: 0xae}, + {value: 0x0010, lo: 0xb0, hi: 0xbe}, + // Block 0x12b, offset 0x5f9 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0034, lo: 0x90, hi: 0x96}, + // Block 0x12c, offset 0x5fb + {value: 0xd152, lo: 0x80, hi: 0x81}, + {value: 0xd452, lo: 0x82, hi: 0x83}, + {value: 0x0024, lo: 0x84, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x12d, offset 0x601 + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x9f}, + {value: 0x0010, lo: 0xa1, hi: 0xa2}, + {value: 0x0010, lo: 0xa4, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb7}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + // Block 0x12e, offset 0x60a + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x9b}, + {value: 0x0010, lo: 0xa1, hi: 0xa3}, + {value: 0x0010, lo: 0xa5, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xbb}, + // Block 0x12f, offset 0x60f + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x130, offset 0x610 + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x131, offset 0x613 + {value: 0x0013, lo: 0x80, hi: 0x89}, + // Block 0x132, offset 0x614 + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0x133, offset 0x615 + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x134, offset 0x616 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0014, lo: 0xa0, hi: 0xbf}, + // Block 0x135, offset 0x618 + {value: 0x0014, lo: 0x80, hi: 0xbf}, + // Block 0x136, offset 0x619 + {value: 0x0014, lo: 0x80, hi: 0xaf}, +} + +// Total table size 16093 bytes (15KiB); checksum: EE91C452 diff --git a/vendor/golang.org/x/text/internal/language/compact/tables.go b/vendor/golang.org/x/text/internal/language/compact/tables.go index 32af9de599..a09ed198a5 100644 --- a/vendor/golang.org/x/text/internal/language/compact/tables.go +++ b/vendor/golang.org/x/text/internal/language/compact/tables.go @@ -790,226 +790,226 @@ const ( var coreTags = []language.CompactCoreInfo{ // 773 elements // Entry 0 - 1F - 0x00000000, 0x01600000, 0x016000d2, 0x01600161, - 0x01c00000, 0x01c00052, 0x02100000, 0x02100080, - 0x02700000, 0x0270006f, 0x03a00000, 0x03a00001, - 0x03a00023, 0x03a00039, 0x03a00062, 0x03a00067, - 0x03a0006b, 0x03a0006c, 0x03a0006d, 0x03a00097, - 0x03a0009b, 0x03a000a1, 0x03a000a8, 0x03a000ac, - 0x03a000b0, 0x03a000b9, 0x03a000ba, 0x03a000c9, - 0x03a000e1, 0x03a000ed, 0x03a000f3, 0x03a00108, + 0x00000000, 0x01600000, 0x016000d3, 0x01600162, + 0x01c00000, 0x01c00052, 0x02100000, 0x02100081, + 0x02700000, 0x02700070, 0x03a00000, 0x03a00001, + 0x03a00023, 0x03a00039, 0x03a00063, 0x03a00068, + 0x03a0006c, 0x03a0006d, 0x03a0006e, 0x03a00098, + 0x03a0009c, 0x03a000a2, 0x03a000a9, 0x03a000ad, + 0x03a000b1, 0x03a000ba, 0x03a000bb, 0x03a000ca, + 0x03a000e2, 0x03a000ee, 0x03a000f4, 0x03a00109, // Entry 20 - 3F - 0x03a0010b, 0x03a00115, 0x03a00117, 0x03a0011c, - 0x03a00120, 0x03a00128, 0x03a0015e, 0x04000000, - 0x04300000, 0x04300099, 0x04400000, 0x0440012f, - 0x04800000, 0x0480006e, 0x05800000, 0x05820000, - 0x05820032, 0x0585a000, 0x0585a032, 0x05e00000, + 0x03a0010c, 0x03a00116, 0x03a00118, 0x03a0011d, + 0x03a00121, 0x03a00129, 0x03a0015f, 0x04000000, + 0x04300000, 0x0430009a, 0x04400000, 0x04400130, + 0x04800000, 0x0480006f, 0x05800000, 0x05820000, + 0x05820032, 0x0585b000, 0x0585b032, 0x05e00000, 0x05e00052, 0x07100000, 0x07100047, 0x07500000, - 0x07500162, 0x07900000, 0x0790012f, 0x07e00000, - 0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c3, + 0x07500163, 0x07900000, 0x07900130, 0x07e00000, + 0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c4, // Entry 40 - 5F - 0x0a500000, 0x0a500035, 0x0a500099, 0x0a900000, - 0x0a900053, 0x0a900099, 0x0b200000, 0x0b200078, - 0x0b500000, 0x0b500099, 0x0b700000, 0x0b720000, - 0x0b720033, 0x0b75a000, 0x0b75a033, 0x0d700000, - 0x0d700022, 0x0d70006e, 0x0d700078, 0x0d70009e, - 0x0db00000, 0x0db00035, 0x0db00099, 0x0dc00000, - 0x0dc00106, 0x0df00000, 0x0df00131, 0x0e500000, - 0x0e500135, 0x0e900000, 0x0e90009b, 0x0e90009c, + 0x0a500000, 0x0a500035, 0x0a50009a, 0x0a900000, + 0x0a900053, 0x0a90009a, 0x0b200000, 0x0b200079, + 0x0b500000, 0x0b50009a, 0x0b700000, 0x0b720000, + 0x0b720033, 0x0b75b000, 0x0b75b033, 0x0d700000, + 0x0d700022, 0x0d70006f, 0x0d700079, 0x0d70009f, + 0x0db00000, 0x0db00035, 0x0db0009a, 0x0dc00000, + 0x0dc00107, 0x0df00000, 0x0df00132, 0x0e500000, + 0x0e500136, 0x0e900000, 0x0e90009c, 0x0e90009d, // Entry 60 - 7F - 0x0fa00000, 0x0fa0005e, 0x0fe00000, 0x0fe00106, - 0x10000000, 0x1000007b, 0x10100000, 0x10100063, - 0x10100082, 0x10800000, 0x108000a4, 0x10d00000, - 0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00060, - 0x10d0009e, 0x10d000b2, 0x10d000b7, 0x11700000, - 0x117000d4, 0x11f00000, 0x11f00060, 0x12400000, - 0x12400052, 0x12800000, 0x12b00000, 0x12b00114, - 0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a4, + 0x0fa00000, 0x0fa0005f, 0x0fe00000, 0x0fe00107, + 0x10000000, 0x1000007c, 0x10100000, 0x10100064, + 0x10100083, 0x10800000, 0x108000a5, 0x10d00000, + 0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00061, + 0x10d0009f, 0x10d000b3, 0x10d000b8, 0x11700000, + 0x117000d5, 0x11f00000, 0x11f00061, 0x12400000, + 0x12400052, 0x12800000, 0x12b00000, 0x12b00115, + 0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a5, // Entry 80 - 9F - 0x13000000, 0x13000080, 0x13000122, 0x13600000, - 0x1360005d, 0x13600087, 0x13900000, 0x13900001, + 0x13000000, 0x13000081, 0x13000123, 0x13600000, + 0x1360005e, 0x13600088, 0x13900000, 0x13900001, 0x1390001a, 0x13900025, 0x13900026, 0x1390002d, 0x1390002e, 0x1390002f, 0x13900034, 0x13900036, 0x1390003a, 0x1390003d, 0x13900042, 0x13900046, 0x13900048, 0x13900049, 0x1390004a, 0x1390004e, - 0x13900050, 0x13900052, 0x1390005c, 0x1390005d, - 0x13900060, 0x13900061, 0x13900063, 0x13900064, + 0x13900050, 0x13900052, 0x1390005d, 0x1390005e, + 0x13900061, 0x13900062, 0x13900064, 0x13900065, // Entry A0 - BF - 0x1390006d, 0x13900072, 0x13900073, 0x13900074, - 0x13900075, 0x1390007b, 0x1390007c, 0x1390007f, - 0x13900080, 0x13900081, 0x13900083, 0x1390008a, - 0x1390008c, 0x1390008d, 0x13900096, 0x13900097, - 0x13900098, 0x13900099, 0x1390009a, 0x1390009f, - 0x139000a0, 0x139000a4, 0x139000a7, 0x139000a9, - 0x139000ad, 0x139000b1, 0x139000b4, 0x139000b5, - 0x139000bf, 0x139000c0, 0x139000c6, 0x139000c7, + 0x1390006e, 0x13900073, 0x13900074, 0x13900075, + 0x13900076, 0x1390007c, 0x1390007d, 0x13900080, + 0x13900081, 0x13900082, 0x13900084, 0x1390008b, + 0x1390008d, 0x1390008e, 0x13900097, 0x13900098, + 0x13900099, 0x1390009a, 0x1390009b, 0x139000a0, + 0x139000a1, 0x139000a5, 0x139000a8, 0x139000aa, + 0x139000ae, 0x139000b2, 0x139000b5, 0x139000b6, + 0x139000c0, 0x139000c1, 0x139000c7, 0x139000c8, // Entry C0 - DF - 0x139000ca, 0x139000cb, 0x139000cc, 0x139000ce, - 0x139000d0, 0x139000d2, 0x139000d5, 0x139000d6, - 0x139000d9, 0x139000dd, 0x139000df, 0x139000e0, - 0x139000e6, 0x139000e7, 0x139000e8, 0x139000eb, - 0x139000ec, 0x139000f0, 0x13900107, 0x13900109, - 0x1390010a, 0x1390010b, 0x1390010c, 0x1390010d, - 0x1390010e, 0x1390010f, 0x13900112, 0x13900117, - 0x1390011b, 0x1390011d, 0x1390011f, 0x13900125, + 0x139000cb, 0x139000cc, 0x139000cd, 0x139000cf, + 0x139000d1, 0x139000d3, 0x139000d6, 0x139000d7, + 0x139000da, 0x139000de, 0x139000e0, 0x139000e1, + 0x139000e7, 0x139000e8, 0x139000e9, 0x139000ec, + 0x139000ed, 0x139000f1, 0x13900108, 0x1390010a, + 0x1390010b, 0x1390010c, 0x1390010d, 0x1390010e, + 0x1390010f, 0x13900110, 0x13900113, 0x13900118, + 0x1390011c, 0x1390011e, 0x13900120, 0x13900126, // Entry E0 - FF - 0x13900129, 0x1390012c, 0x1390012d, 0x1390012f, - 0x13900131, 0x13900133, 0x13900135, 0x13900139, - 0x1390013c, 0x1390013d, 0x1390013f, 0x13900142, - 0x13900161, 0x13900162, 0x13900164, 0x13c00000, + 0x1390012a, 0x1390012d, 0x1390012e, 0x13900130, + 0x13900132, 0x13900134, 0x13900136, 0x1390013a, + 0x1390013d, 0x1390013e, 0x13900140, 0x13900143, + 0x13900162, 0x13900163, 0x13900165, 0x13c00000, 0x13c00001, 0x13e00000, 0x13e0001f, 0x13e0002c, 0x13e0003f, 0x13e00041, 0x13e00048, 0x13e00051, - 0x13e00054, 0x13e00056, 0x13e00059, 0x13e00065, - 0x13e00068, 0x13e00069, 0x13e0006e, 0x13e00086, + 0x13e00054, 0x13e00057, 0x13e0005a, 0x13e00066, + 0x13e00069, 0x13e0006a, 0x13e0006f, 0x13e00087, // Entry 100 - 11F - 0x13e00089, 0x13e0008f, 0x13e00094, 0x13e000cf, - 0x13e000d8, 0x13e000e2, 0x13e000e4, 0x13e000e7, - 0x13e000ec, 0x13e000f1, 0x13e0011a, 0x13e00135, - 0x13e00136, 0x13e0013b, 0x14000000, 0x1400006a, - 0x14500000, 0x1450006e, 0x14600000, 0x14600052, - 0x14800000, 0x14800024, 0x1480009c, 0x14e00000, - 0x14e00052, 0x14e00084, 0x14e000c9, 0x14e00114, - 0x15100000, 0x15100072, 0x15300000, 0x153000e7, + 0x13e0008a, 0x13e00090, 0x13e00095, 0x13e000d0, + 0x13e000d9, 0x13e000e3, 0x13e000e5, 0x13e000e8, + 0x13e000ed, 0x13e000f2, 0x13e0011b, 0x13e00136, + 0x13e00137, 0x13e0013c, 0x14000000, 0x1400006b, + 0x14500000, 0x1450006f, 0x14600000, 0x14600052, + 0x14800000, 0x14800024, 0x1480009d, 0x14e00000, + 0x14e00052, 0x14e00085, 0x14e000ca, 0x14e00115, + 0x15100000, 0x15100073, 0x15300000, 0x153000e8, // Entry 120 - 13F - 0x15800000, 0x15800063, 0x15800076, 0x15e00000, + 0x15800000, 0x15800064, 0x15800077, 0x15e00000, 0x15e00036, 0x15e00037, 0x15e0003a, 0x15e0003b, 0x15e0003c, 0x15e00049, 0x15e0004b, 0x15e0004c, 0x15e0004d, 0x15e0004e, 0x15e0004f, 0x15e00052, - 0x15e00062, 0x15e00067, 0x15e00078, 0x15e0007a, - 0x15e0007e, 0x15e00084, 0x15e00085, 0x15e00086, - 0x15e00091, 0x15e000a8, 0x15e000b7, 0x15e000ba, - 0x15e000bb, 0x15e000be, 0x15e000bf, 0x15e000c3, + 0x15e00063, 0x15e00068, 0x15e00079, 0x15e0007b, + 0x15e0007f, 0x15e00085, 0x15e00086, 0x15e00087, + 0x15e00092, 0x15e000a9, 0x15e000b8, 0x15e000bb, + 0x15e000bc, 0x15e000bf, 0x15e000c0, 0x15e000c4, // Entry 140 - 15F - 0x15e000c8, 0x15e000c9, 0x15e000cc, 0x15e000d3, - 0x15e000d4, 0x15e000e5, 0x15e000ea, 0x15e00102, - 0x15e00107, 0x15e0010a, 0x15e00114, 0x15e0011c, - 0x15e00120, 0x15e00122, 0x15e00128, 0x15e0013f, - 0x15e00140, 0x15e0015f, 0x16900000, 0x1690009e, - 0x16d00000, 0x16d000d9, 0x16e00000, 0x16e00096, - 0x17e00000, 0x17e0007b, 0x19000000, 0x1900006e, - 0x1a300000, 0x1a30004e, 0x1a300078, 0x1a3000b2, + 0x15e000c9, 0x15e000ca, 0x15e000cd, 0x15e000d4, + 0x15e000d5, 0x15e000e6, 0x15e000eb, 0x15e00103, + 0x15e00108, 0x15e0010b, 0x15e00115, 0x15e0011d, + 0x15e00121, 0x15e00123, 0x15e00129, 0x15e00140, + 0x15e00141, 0x15e00160, 0x16900000, 0x1690009f, + 0x16d00000, 0x16d000da, 0x16e00000, 0x16e00097, + 0x17e00000, 0x17e0007c, 0x19000000, 0x1900006f, + 0x1a300000, 0x1a30004e, 0x1a300079, 0x1a3000b3, // Entry 160 - 17F - 0x1a400000, 0x1a400099, 0x1a900000, 0x1ab00000, - 0x1ab000a4, 0x1ac00000, 0x1ac00098, 0x1b400000, - 0x1b400080, 0x1b4000d4, 0x1b4000d6, 0x1b800000, - 0x1b800135, 0x1bc00000, 0x1bc00097, 0x1be00000, - 0x1be00099, 0x1d100000, 0x1d100033, 0x1d100090, - 0x1d200000, 0x1d200060, 0x1d500000, 0x1d500092, - 0x1d700000, 0x1d700028, 0x1e100000, 0x1e100095, - 0x1e700000, 0x1e7000d6, 0x1ea00000, 0x1ea00053, + 0x1a400000, 0x1a40009a, 0x1a900000, 0x1ab00000, + 0x1ab000a5, 0x1ac00000, 0x1ac00099, 0x1b400000, + 0x1b400081, 0x1b4000d5, 0x1b4000d7, 0x1b800000, + 0x1b800136, 0x1bc00000, 0x1bc00098, 0x1be00000, + 0x1be0009a, 0x1d100000, 0x1d100033, 0x1d100091, + 0x1d200000, 0x1d200061, 0x1d500000, 0x1d500093, + 0x1d700000, 0x1d700028, 0x1e100000, 0x1e100096, + 0x1e700000, 0x1e7000d7, 0x1ea00000, 0x1ea00053, // Entry 180 - 19F - 0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009d, - 0x1f900000, 0x1f90004e, 0x1f90009e, 0x1f900113, - 0x1f900138, 0x1fa00000, 0x1fb00000, 0x20000000, - 0x200000a2, 0x20300000, 0x20700000, 0x20700052, - 0x20800000, 0x20a00000, 0x20a0012f, 0x20e00000, - 0x20f00000, 0x21000000, 0x2100007d, 0x21200000, - 0x21200067, 0x21600000, 0x21700000, 0x217000a4, - 0x21f00000, 0x22300000, 0x2230012f, 0x22700000, + 0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009e, + 0x1f900000, 0x1f90004e, 0x1f90009f, 0x1f900114, + 0x1f900139, 0x1fa00000, 0x1fb00000, 0x20000000, + 0x200000a3, 0x20300000, 0x20700000, 0x20700052, + 0x20800000, 0x20a00000, 0x20a00130, 0x20e00000, + 0x20f00000, 0x21000000, 0x2100007e, 0x21200000, + 0x21200068, 0x21600000, 0x21700000, 0x217000a5, + 0x21f00000, 0x22300000, 0x22300130, 0x22700000, // Entry 1A0 - 1BF - 0x2270005a, 0x23400000, 0x234000c3, 0x23900000, - 0x239000a4, 0x24200000, 0x242000ae, 0x24400000, - 0x24400052, 0x24500000, 0x24500082, 0x24600000, - 0x246000a4, 0x24a00000, 0x24a000a6, 0x25100000, - 0x25100099, 0x25400000, 0x254000aa, 0x254000ab, - 0x25600000, 0x25600099, 0x26a00000, 0x26a00099, - 0x26b00000, 0x26b0012f, 0x26d00000, 0x26d00052, - 0x26e00000, 0x26e00060, 0x27400000, 0x28100000, + 0x2270005b, 0x23400000, 0x234000c4, 0x23900000, + 0x239000a5, 0x24200000, 0x242000af, 0x24400000, + 0x24400052, 0x24500000, 0x24500083, 0x24600000, + 0x246000a5, 0x24a00000, 0x24a000a7, 0x25100000, + 0x2510009a, 0x25400000, 0x254000ab, 0x254000ac, + 0x25600000, 0x2560009a, 0x26a00000, 0x26a0009a, + 0x26b00000, 0x26b00130, 0x26d00000, 0x26d00052, + 0x26e00000, 0x26e00061, 0x27400000, 0x28100000, // Entry 1C0 - 1DF - 0x2810007b, 0x28a00000, 0x28a000a5, 0x29100000, - 0x2910012f, 0x29500000, 0x295000b7, 0x2a300000, - 0x2a300131, 0x2af00000, 0x2af00135, 0x2b500000, + 0x2810007c, 0x28a00000, 0x28a000a6, 0x29100000, + 0x29100130, 0x29500000, 0x295000b8, 0x2a300000, + 0x2a300132, 0x2af00000, 0x2af00136, 0x2b500000, 0x2b50002a, 0x2b50004b, 0x2b50004c, 0x2b50004d, - 0x2b800000, 0x2b8000af, 0x2bf00000, 0x2bf0009b, - 0x2bf0009c, 0x2c000000, 0x2c0000b6, 0x2c200000, - 0x2c20004b, 0x2c400000, 0x2c4000a4, 0x2c500000, - 0x2c5000a4, 0x2c700000, 0x2c7000b8, 0x2d100000, + 0x2b800000, 0x2b8000b0, 0x2bf00000, 0x2bf0009c, + 0x2bf0009d, 0x2c000000, 0x2c0000b7, 0x2c200000, + 0x2c20004b, 0x2c400000, 0x2c4000a5, 0x2c500000, + 0x2c5000a5, 0x2c700000, 0x2c7000b9, 0x2d100000, // Entry 1E0 - 1FF - 0x2d1000a4, 0x2d10012f, 0x2e900000, 0x2e9000a4, - 0x2ed00000, 0x2ed000cc, 0x2f100000, 0x2f1000bf, - 0x2f200000, 0x2f2000d1, 0x2f400000, 0x2f400052, - 0x2ff00000, 0x2ff000c2, 0x30400000, 0x30400099, - 0x30b00000, 0x30b000c5, 0x31000000, 0x31b00000, - 0x31b00099, 0x31f00000, 0x31f0003e, 0x31f000d0, - 0x31f0010d, 0x32000000, 0x320000cb, 0x32500000, - 0x32500052, 0x33100000, 0x331000c4, 0x33a00000, + 0x2d1000a5, 0x2d100130, 0x2e900000, 0x2e9000a5, + 0x2ed00000, 0x2ed000cd, 0x2f100000, 0x2f1000c0, + 0x2f200000, 0x2f2000d2, 0x2f400000, 0x2f400052, + 0x2ff00000, 0x2ff000c3, 0x30400000, 0x3040009a, + 0x30b00000, 0x30b000c6, 0x31000000, 0x31b00000, + 0x31b0009a, 0x31f00000, 0x31f0003e, 0x31f000d1, + 0x31f0010e, 0x32000000, 0x320000cc, 0x32500000, + 0x32500052, 0x33100000, 0x331000c5, 0x33a00000, // Entry 200 - 21F - 0x33a0009c, 0x34100000, 0x34500000, 0x345000d2, - 0x34700000, 0x347000da, 0x34700110, 0x34e00000, - 0x34e00164, 0x35000000, 0x35000060, 0x350000d9, - 0x35100000, 0x35100099, 0x351000db, 0x36700000, - 0x36700030, 0x36700036, 0x36700040, 0x3670005b, - 0x367000d9, 0x36700116, 0x3670011b, 0x36800000, - 0x36800052, 0x36a00000, 0x36a000da, 0x36c00000, + 0x33a0009d, 0x34100000, 0x34500000, 0x345000d3, + 0x34700000, 0x347000db, 0x34700111, 0x34e00000, + 0x34e00165, 0x35000000, 0x35000061, 0x350000da, + 0x35100000, 0x3510009a, 0x351000dc, 0x36700000, + 0x36700030, 0x36700036, 0x36700040, 0x3670005c, + 0x367000da, 0x36700117, 0x3670011c, 0x36800000, + 0x36800052, 0x36a00000, 0x36a000db, 0x36c00000, 0x36c00052, 0x36f00000, 0x37500000, 0x37600000, // Entry 220 - 23F - 0x37a00000, 0x38000000, 0x38000117, 0x38700000, - 0x38900000, 0x38900131, 0x39000000, 0x3900006f, - 0x390000a4, 0x39500000, 0x39500099, 0x39800000, - 0x3980007d, 0x39800106, 0x39d00000, 0x39d05000, - 0x39d050e8, 0x39d36000, 0x39d36099, 0x3a100000, - 0x3b300000, 0x3b3000e9, 0x3bd00000, 0x3bd00001, + 0x37a00000, 0x38000000, 0x38000118, 0x38700000, + 0x38900000, 0x38900132, 0x39000000, 0x39000070, + 0x390000a5, 0x39500000, 0x3950009a, 0x39800000, + 0x3980007e, 0x39800107, 0x39d00000, 0x39d05000, + 0x39d050e9, 0x39d36000, 0x39d3609a, 0x3a100000, + 0x3b300000, 0x3b3000ea, 0x3bd00000, 0x3bd00001, 0x3be00000, 0x3be00024, 0x3c000000, 0x3c00002a, - 0x3c000041, 0x3c00004e, 0x3c00005a, 0x3c000086, + 0x3c000041, 0x3c00004e, 0x3c00005b, 0x3c000087, // Entry 240 - 25F - 0x3c00008b, 0x3c0000b7, 0x3c0000c6, 0x3c0000d1, - 0x3c0000ee, 0x3c000118, 0x3c000126, 0x3c400000, - 0x3c40003f, 0x3c400069, 0x3c4000e4, 0x3d400000, + 0x3c00008c, 0x3c0000b8, 0x3c0000c7, 0x3c0000d2, + 0x3c0000ef, 0x3c000119, 0x3c000127, 0x3c400000, + 0x3c40003f, 0x3c40006a, 0x3c4000e5, 0x3d400000, 0x3d40004e, 0x3d900000, 0x3d90003a, 0x3dc00000, - 0x3dc000bc, 0x3dc00104, 0x3de00000, 0x3de0012f, - 0x3e200000, 0x3e200047, 0x3e2000a5, 0x3e2000ae, - 0x3e2000bc, 0x3e200106, 0x3e200130, 0x3e500000, - 0x3e500107, 0x3e600000, 0x3e60012f, 0x3eb00000, + 0x3dc000bd, 0x3dc00105, 0x3de00000, 0x3de00130, + 0x3e200000, 0x3e200047, 0x3e2000a6, 0x3e2000af, + 0x3e2000bd, 0x3e200107, 0x3e200131, 0x3e500000, + 0x3e500108, 0x3e600000, 0x3e600130, 0x3eb00000, // Entry 260 - 27F - 0x3eb00106, 0x3ec00000, 0x3ec000a4, 0x3f300000, - 0x3f30012f, 0x3fa00000, 0x3fa000e8, 0x3fc00000, - 0x3fd00000, 0x3fd00072, 0x3fd000da, 0x3fd0010c, - 0x3ff00000, 0x3ff000d1, 0x40100000, 0x401000c3, + 0x3eb00107, 0x3ec00000, 0x3ec000a5, 0x3f300000, + 0x3f300130, 0x3fa00000, 0x3fa000e9, 0x3fc00000, + 0x3fd00000, 0x3fd00073, 0x3fd000db, 0x3fd0010d, + 0x3ff00000, 0x3ff000d2, 0x40100000, 0x401000c4, 0x40200000, 0x4020004c, 0x40700000, 0x40800000, - 0x4085a000, 0x4085a0ba, 0x408e8000, 0x408e80ba, - 0x40c00000, 0x40c000b3, 0x41200000, 0x41200111, - 0x41600000, 0x4160010f, 0x41c00000, 0x41d00000, + 0x4085b000, 0x4085b0bb, 0x408eb000, 0x408eb0bb, + 0x40c00000, 0x40c000b4, 0x41200000, 0x41200112, + 0x41600000, 0x41600110, 0x41c00000, 0x41d00000, // Entry 280 - 29F - 0x41e00000, 0x41f00000, 0x41f00072, 0x42200000, - 0x42300000, 0x42300164, 0x42900000, 0x42900062, - 0x4290006f, 0x429000a4, 0x42900115, 0x43100000, - 0x43100027, 0x431000c2, 0x4310014d, 0x43200000, - 0x43220000, 0x43220033, 0x432200bd, 0x43220105, - 0x4322014d, 0x4325a000, 0x4325a033, 0x4325a0bd, - 0x4325a105, 0x4325a14d, 0x43700000, 0x43a00000, - 0x43b00000, 0x44400000, 0x44400031, 0x44400072, + 0x41e00000, 0x41f00000, 0x41f00073, 0x42200000, + 0x42300000, 0x42300165, 0x42900000, 0x42900063, + 0x42900070, 0x429000a5, 0x42900116, 0x43100000, + 0x43100027, 0x431000c3, 0x4310014e, 0x43200000, + 0x43220000, 0x43220033, 0x432200be, 0x43220106, + 0x4322014e, 0x4325b000, 0x4325b033, 0x4325b0be, + 0x4325b106, 0x4325b14e, 0x43700000, 0x43a00000, + 0x43b00000, 0x44400000, 0x44400031, 0x44400073, // Entry 2A0 - 2BF - 0x4440010c, 0x44500000, 0x4450004b, 0x445000a4, - 0x4450012f, 0x44500131, 0x44e00000, 0x45000000, - 0x45000099, 0x450000b3, 0x450000d0, 0x4500010d, - 0x46100000, 0x46100099, 0x46400000, 0x464000a4, - 0x46400131, 0x46700000, 0x46700124, 0x46b00000, - 0x46b00123, 0x46f00000, 0x46f0006d, 0x46f0006f, - 0x47100000, 0x47600000, 0x47600127, 0x47a00000, - 0x48000000, 0x48200000, 0x48200129, 0x48a00000, + 0x4440010d, 0x44500000, 0x4450004b, 0x445000a5, + 0x44500130, 0x44500132, 0x44e00000, 0x45000000, + 0x4500009a, 0x450000b4, 0x450000d1, 0x4500010e, + 0x46100000, 0x4610009a, 0x46400000, 0x464000a5, + 0x46400132, 0x46700000, 0x46700125, 0x46b00000, + 0x46b00124, 0x46f00000, 0x46f0006e, 0x46f00070, + 0x47100000, 0x47600000, 0x47600128, 0x47a00000, + 0x48000000, 0x48200000, 0x4820012a, 0x48a00000, // Entry 2C0 - 2DF - 0x48a0005d, 0x48a0012b, 0x48e00000, 0x49400000, - 0x49400106, 0x4a400000, 0x4a4000d4, 0x4a900000, - 0x4a9000ba, 0x4ac00000, 0x4ac00053, 0x4ae00000, - 0x4ae00130, 0x4b400000, 0x4b400099, 0x4b4000e8, + 0x48a0005e, 0x48a0012c, 0x48e00000, 0x49400000, + 0x49400107, 0x4a400000, 0x4a4000d5, 0x4a900000, + 0x4a9000bb, 0x4ac00000, 0x4ac00053, 0x4ae00000, + 0x4ae00131, 0x4b400000, 0x4b40009a, 0x4b4000e9, 0x4bc00000, 0x4bc05000, 0x4bc05024, 0x4bc20000, - 0x4bc20137, 0x4bc5a000, 0x4bc5a137, 0x4be00000, - 0x4be5a000, 0x4be5a0b4, 0x4bef1000, 0x4bef10b4, - 0x4c000000, 0x4c300000, 0x4c30013e, 0x4c900000, + 0x4bc20138, 0x4bc5b000, 0x4bc5b138, 0x4be00000, + 0x4be5b000, 0x4be5b0b5, 0x4bef4000, 0x4bef40b5, + 0x4c000000, 0x4c300000, 0x4c30013f, 0x4c900000, // Entry 2E0 - 2FF - 0x4c900001, 0x4cc00000, 0x4cc0012f, 0x4ce00000, - 0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500114, - 0x4f200000, 0x4fb00000, 0x4fb00131, 0x50900000, + 0x4c900001, 0x4cc00000, 0x4cc00130, 0x4ce00000, + 0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500115, + 0x4f200000, 0x4fb00000, 0x4fb00132, 0x50900000, 0x50900052, 0x51200000, 0x51200001, 0x51800000, - 0x5180003b, 0x518000d6, 0x51f00000, 0x51f3b000, - 0x51f3b053, 0x51f3c000, 0x51f3c08d, 0x52800000, - 0x528000ba, 0x52900000, 0x5293b000, 0x5293b053, - 0x5293b08d, 0x5293b0c6, 0x5293b10d, 0x5293c000, + 0x5180003b, 0x518000d7, 0x51f00000, 0x51f3b000, + 0x51f3b053, 0x51f3c000, 0x51f3c08e, 0x52800000, + 0x528000bb, 0x52900000, 0x5293b000, 0x5293b053, + 0x5293b08e, 0x5293b0c7, 0x5293b10e, 0x5293c000, // Entry 300 - 31F - 0x5293c08d, 0x5293c0c6, 0x5293c12e, 0x52f00000, - 0x52f00161, + 0x5293c08e, 0x5293c0c7, 0x5293c12f, 0x52f00000, + 0x52f00162, } // Size: 3116 bytes const specialTagsStr string = "ca-ES-valencia en-US-u-va-posix" -// Total table size 3147 bytes (3KiB); checksum: 6772C83C +// Total table size 3147 bytes (3KiB); checksum: 5A8FFFA5 diff --git a/vendor/golang.org/x/text/internal/language/tables.go b/vendor/golang.org/x/text/internal/language/tables.go index fb6b58378b..14167e74e4 100644 --- a/vendor/golang.org/x/text/internal/language/tables.go +++ b/vendor/golang.org/x/text/internal/language/tables.go @@ -7,11 +7,11 @@ import "golang.org/x/text/internal/tag" // CLDRVersion is the CLDR version from which the tables in this package are derived. const CLDRVersion = "32" -const NumLanguages = 8752 +const NumLanguages = 8798 -const NumScripts = 258 +const NumScripts = 261 -const NumRegions = 357 +const NumRegions = 358 type FromTo struct { From uint16 @@ -263,7 +263,7 @@ var langNoIndex = [2197]uint8{ 0xff, 0xf8, 0xed, 0xfe, 0xeb, 0xd3, 0x3b, 0xd2, 0xfb, 0xbf, 0x7a, 0xfa, 0x37, 0x1d, 0x3c, 0x57, 0x6e, 0x97, 0x73, 0x38, 0xfb, 0xea, 0xbf, 0x70, - 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x62, + 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x72, 0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77, 0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2, 0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xbc, 0x0a, 0x6a, @@ -278,7 +278,7 @@ var langNoIndex = [2197]uint8{ 0xa8, 0xff, 0x1f, 0x67, 0x7d, 0xeb, 0xef, 0xce, 0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf, // Entry 80 - BF - 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x6f, 0xff, 0xff, + 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x7f, 0xff, 0xff, 0xbb, 0xee, 0xf7, 0xbd, 0xdb, 0xff, 0x5f, 0xf7, 0xfd, 0xf2, 0xfd, 0xff, 0x5e, 0x2f, 0x3b, 0xba, 0x7e, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xdd, 0xff, @@ -289,11 +289,11 @@ var langNoIndex = [2197]uint8{ // Entry C0 - FF 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, 0x1b, 0x14, 0x08, 0xf3, 0x2b, 0xe7, 0x17, 0x56, - 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x7b, 0xf3, 0xef, + 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x7f, 0xf3, 0xef, 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, 0xbc, 0x85, 0xaf, 0xdf, 0xff, 0xff, 0x7b, 0x35, 0x3e, 0xc7, 0xc7, 0xdf, 0xff, 0x01, 0x81, 0x00, - 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xb0, 0x05, 0x80, 0x00, 0x20, 0x00, 0x00, 0x03, 0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d, // Entry 100 - 13F 0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64, @@ -303,20 +303,20 @@ var langNoIndex = [2197]uint8{ 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc7, 0x67, 0x5f, 0x56, 0x99, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56, - 0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb, + 0x90, 0x6d, 0x01, 0x2e, 0x96, 0x69, 0x20, 0xfb, // Entry 140 - 17F 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x16, - 0x03, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06, + 0x03, 0x00, 0x00, 0xb0, 0x14, 0x23, 0x50, 0x06, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x10, 0x11, 0x09, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x05, 0x08, 0x00, 0x00, 0x05, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, 0x40, 0xd5, 0x2d, 0x00, 0x64, 0x35, 0x24, 0x52, 0xf4, 0xd5, 0xbf, 0x62, 0xc9, 0x03, // Entry 180 - 1BF 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98, - 0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82, + 0x21, 0x18, 0x81, 0x08, 0x00, 0x01, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea, 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, @@ -337,7 +337,7 @@ var langNoIndex = [2197]uint8{ 0xa4, 0x45, 0x25, 0x9b, 0x02, 0xdf, 0xe1, 0xdf, 0x03, 0x44, 0x08, 0x90, 0x01, 0x04, 0x81, 0xe3, 0x92, 0x54, 0xdb, 0x28, 0xd3, 0x5f, 0xfe, 0x6d, - 0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, + 0x79, 0xed, 0x1c, 0x7f, 0x04, 0x08, 0x00, 0x01, 0x21, 0x12, 0x64, 0x5f, 0xdd, 0x0e, 0x85, 0x4f, 0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54, // Entry 240 - 27F @@ -359,13 +359,13 @@ var langNoIndex = [2197]uint8{ 0x03, 0x00, 0x00, 0x00, 0x8c, 0x50, 0x40, 0x04, 0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, // Entry 2C0 - 2FF - 0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2, - 0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9, + 0x02, 0x50, 0x80, 0x11, 0x00, 0x99, 0x6c, 0xe2, + 0x50, 0x27, 0x1d, 0x11, 0x29, 0x0e, 0x59, 0xe9, 0x33, 0x08, 0x00, 0x20, 0x04, 0x40, 0x10, 0x00, 0x00, 0x00, 0x50, 0x44, 0x92, 0x49, 0xd6, 0x5d, 0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x04, 0x00, 0x01, - 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x40, 0x08, 0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x8d, 0x12, 0x00, // Entry 300 - 33F 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0, @@ -392,14 +392,14 @@ var langNoIndex = [2197]uint8{ 0xee, 0xdb, 0x6f, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0x5f, 0xd3, 0x3b, 0xfd, 0xd9, 0xdf, 0xeb, 0xbc, 0x08, 0x05, 0x24, 0xff, 0x07, 0x70, 0xfe, - 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x3d, 0x1b, + 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x7d, 0x1f, 0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44, // Entry 3C0 - 3FF 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xbd, 0x7f, 0x57, 0xf2, 0xff, 0x31, 0xff, 0xf2, 0x1e, 0x90, 0xf7, - 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, - 0x40, 0x54, 0x9f, 0x8a, 0xdb, 0xf9, 0x2e, 0x11, - 0x86, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x40, 0x01, + 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x20, + 0x40, 0x54, 0x9f, 0x8a, 0xdf, 0xf9, 0x6e, 0x11, + 0x86, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x40, 0x03, 0x05, 0xd1, 0x50, 0x5c, 0x00, 0x40, 0x00, 0x10, 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, 0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe, @@ -424,12 +424,12 @@ var langNoIndex = [2197]uint8{ // Entry 480 - 4BF 0x93, 0x50, 0x5d, 0xaf, 0xa6, 0xff, 0x99, 0xfb, 0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20, - 0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41, - 0xe2, 0xff, 0xfc, 0xdf, 0x02, 0x05, 0xc5, 0x05, + 0x14, 0x00, 0x55, 0x51, 0xc2, 0x65, 0xf5, 0x41, + 0xe2, 0xff, 0xfc, 0xdf, 0x02, 0x85, 0xc5, 0x05, 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x05, 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00, - 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xf1, + 0x06, 0x11, 0x20, 0x00, 0x18, 0x01, 0x92, 0xf1, // Entry 4C0 - 4FF 0xfd, 0x47, 0x69, 0x06, 0x95, 0x06, 0x57, 0xed, 0xfb, 0x4d, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40, @@ -441,7 +441,7 @@ var langNoIndex = [2197]uint8{ 0xbe, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, // Entry 500 - 53F 0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49, - 0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7, + 0x2d, 0x14, 0x27, 0x5f, 0xed, 0xf1, 0x3f, 0xe7, 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8, 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe7, 0xf7, 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10, @@ -449,7 +449,7 @@ var langNoIndex = [2197]uint8{ 0x5b, 0x05, 0x86, 0xed, 0xf5, 0x77, 0xbd, 0x3c, 0x00, 0x00, 0x00, 0x42, 0x71, 0x42, 0x00, 0x40, // Entry 540 - 57F - 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x01, 0x43, 0x19, 0x24, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -464,13 +464,13 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81, + 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x20, 0x81, 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, // Entry 5C0 - 5FF - 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02, + 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0xbe, 0x02, 0xaa, 0x10, 0x5d, 0x98, 0x52, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02, - 0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, + 0x3d, 0x40, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, 0x31, 0x00, 0x00, 0x00, 0x01, 0x18, 0x02, 0x20, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xdf, 0xd2, 0xb9, 0xff, 0xfd, 0x3f, @@ -491,20 +491,20 @@ var langNoIndex = [2197]uint8{ 0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff, 0xb9, 0xda, 0x7d, 0xd0, 0x3e, 0x15, 0x7b, 0xb4, 0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7, - 0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9, + 0x5f, 0xff, 0xff, 0x9e, 0xdf, 0xf6, 0xd7, 0xb9, 0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3, // Entry 680 - 6BF 0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37, - 0xce, 0x7f, 0x04, 0x1d, 0x73, 0x7f, 0xf8, 0xda, + 0xce, 0x7f, 0x44, 0x1d, 0x73, 0x7f, 0xf8, 0xda, 0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x79, 0xa0, 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x08, 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x09, 0x06, 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x10, 0xdc, 0x58, 0xd7, 0x0d, 0x0f, // Entry 6C0 - 6FF - 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd5, 0x42, 0x08, - 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, + 0x54, 0x4d, 0xf1, 0x16, 0x44, 0xd5, 0x42, 0x08, + 0x40, 0x02, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x48, 0x41, 0x24, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -513,7 +513,7 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, // Entry 700 - 73F 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x86, 0xc2, 0x00, 0x00, 0x01, 0x00, 0x01, 0xff, 0x18, 0x02, 0x00, 0x02, 0xf0, 0xfd, 0x79, 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, @@ -522,7 +522,7 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 740 - 77F 0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e, - 0xb0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44, + 0xb0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x46, 0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04, 0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a, 0x01, 0x00, 0x00, 0xb0, 0x80, 0x20, 0x55, 0x75, @@ -530,12 +530,12 @@ var langNoIndex = [2197]uint8{ 0xd5, 0x57, 0x27, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xf7, 0xcb, 0x1f, 0x14, 0x60, // Entry 780 - 7BF - 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, + 0x83, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, 0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00, - 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, + 0x10, 0x03, 0x31, 0x02, 0x01, 0x00, 0x00, 0xf0, 0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78, - 0x78, 0x15, 0x50, 0x01, 0xa4, 0x84, 0xa9, 0x41, - 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, + 0x78, 0x15, 0x50, 0x05, 0xa4, 0x84, 0xa9, 0x41, + 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x40, 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, 0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed, // Entry 7C0 - 7FF @@ -545,11 +545,11 @@ var langNoIndex = [2197]uint8{ 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d, 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, 0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60, - 0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01, + 0xfe, 0x01, 0x02, 0x88, 0x2a, 0x40, 0x16, 0x01, 0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10, // Entry 800 - 83F 0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf, - 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1, + 0xbf, 0x03, 0x00, 0x00, 0x10, 0xdc, 0xa3, 0xd1, 0x40, 0x9c, 0x44, 0xdf, 0xf5, 0x8f, 0x66, 0xb3, 0x55, 0x20, 0xd4, 0xc1, 0xd8, 0x30, 0x3d, 0x80, 0x00, 0x00, 0x00, 0x04, 0xd4, 0x11, 0xc5, 0x84, @@ -557,11 +557,11 @@ var langNoIndex = [2197]uint8{ 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, // Entry 840 - 87F - 0xf0, 0xfb, 0xfd, 0x7f, 0x05, 0x00, 0x16, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, + 0xf0, 0xfb, 0xfd, 0x7f, 0x05, 0x00, 0x16, 0x89, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, 0x84, 0x00, 0x21, 0xc0, 0x23, 0x24, 0x00, 0x00, - 0x00, 0xcb, 0xe4, 0x3a, 0x46, 0x88, 0x14, 0xf1, + 0x00, 0xcb, 0xe4, 0x3a, 0x46, 0x88, 0x54, 0xf1, 0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50, 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40, 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1, @@ -583,8 +583,8 @@ var altLangIndex = [6]uint16{ } // AliasMap maps langIDs to their suggested replacements. -// Size: 716 bytes, 179 elements -var AliasMap = [179]FromTo{ +// Size: 772 bytes, 193 elements +var AliasMap = [193]FromTo{ 0: {From: 0x82, To: 0x88}, 1: {From: 0x187, To: 0x1ae}, 2: {From: 0x1f3, To: 0x1e1}, @@ -599,223 +599,239 @@ var AliasMap = [179]FromTo{ 11: {From: 0x4a2, To: 0x21}, 12: {From: 0x53e, To: 0x544}, 13: {From: 0x58f, To: 0x12d}, - 14: {From: 0x630, To: 0x1eb1}, - 15: {From: 0x651, To: 0x431}, - 16: {From: 0x662, To: 0x431}, - 17: {From: 0x6ed, To: 0x3a}, - 18: {From: 0x6f8, To: 0x1d7}, - 19: {From: 0x709, To: 0x3625}, - 20: {From: 0x73e, To: 0x21a1}, - 21: {From: 0x7b3, To: 0x56}, - 22: {From: 0x7b9, To: 0x299b}, - 23: {From: 0x7c5, To: 0x58}, - 24: {From: 0x7e6, To: 0x145}, - 25: {From: 0x80c, To: 0x5a}, - 26: {From: 0x815, To: 0x8d}, - 27: {From: 0x87e, To: 0x810}, - 28: {From: 0x8a8, To: 0x8b7}, - 29: {From: 0x8c3, To: 0xee3}, - 30: {From: 0x8fa, To: 0x1dc}, - 31: {From: 0x9ef, To: 0x331}, - 32: {From: 0xa36, To: 0x2c5}, - 33: {From: 0xa3d, To: 0xbf}, - 34: {From: 0xabe, To: 0x3322}, - 35: {From: 0xb38, To: 0x529}, - 36: {From: 0xb75, To: 0x265a}, - 37: {From: 0xb7e, To: 0xbc3}, - 38: {From: 0xb9b, To: 0x44e}, - 39: {From: 0xbbc, To: 0x4229}, - 40: {From: 0xbbf, To: 0x529}, - 41: {From: 0xbfe, To: 0x2da7}, - 42: {From: 0xc2e, To: 0x3181}, - 43: {From: 0xcb9, To: 0xf3}, - 44: {From: 0xd08, To: 0xfa}, - 45: {From: 0xdc8, To: 0x11a}, - 46: {From: 0xdd7, To: 0x32d}, - 47: {From: 0xdf8, To: 0xdfb}, - 48: {From: 0xdfe, To: 0x531}, - 49: {From: 0xe01, To: 0xdf3}, - 50: {From: 0xedf, To: 0x205a}, - 51: {From: 0xee9, To: 0x222e}, - 52: {From: 0xeee, To: 0x2e9a}, - 53: {From: 0xf39, To: 0x367}, - 54: {From: 0x10d0, To: 0x140}, - 55: {From: 0x1104, To: 0x2d0}, - 56: {From: 0x11a0, To: 0x1ec}, - 57: {From: 0x1279, To: 0x21}, - 58: {From: 0x1424, To: 0x15e}, - 59: {From: 0x1470, To: 0x14e}, - 60: {From: 0x151f, To: 0xd9b}, - 61: {From: 0x1523, To: 0x390}, - 62: {From: 0x1532, To: 0x19f}, - 63: {From: 0x1580, To: 0x210}, - 64: {From: 0x1583, To: 0x10d}, - 65: {From: 0x15a3, To: 0x3caf}, - 66: {From: 0x1630, To: 0x222e}, - 67: {From: 0x166a, To: 0x19b}, - 68: {From: 0x16c8, To: 0x136}, - 69: {From: 0x1700, To: 0x29f8}, - 70: {From: 0x1718, To: 0x194}, - 71: {From: 0x1727, To: 0xf3f}, - 72: {From: 0x177a, To: 0x178}, - 73: {From: 0x1809, To: 0x17b6}, - 74: {From: 0x1816, To: 0x18f3}, - 75: {From: 0x188a, To: 0x436}, - 76: {From: 0x1979, To: 0x1d01}, - 77: {From: 0x1a74, To: 0x2bb0}, - 78: {From: 0x1a8a, To: 0x1f8}, - 79: {From: 0x1b5a, To: 0x1fa}, - 80: {From: 0x1b86, To: 0x1515}, - 81: {From: 0x1d64, To: 0x2c9b}, - 82: {From: 0x2038, To: 0x37b1}, - 83: {From: 0x203d, To: 0x20dd}, - 84: {From: 0x205a, To: 0x30b}, - 85: {From: 0x20e3, To: 0x274}, - 86: {From: 0x20ee, To: 0x263}, - 87: {From: 0x20f2, To: 0x22d}, - 88: {From: 0x20f9, To: 0x256}, - 89: {From: 0x210f, To: 0x21eb}, - 90: {From: 0x2135, To: 0x27d}, - 91: {From: 0x2160, To: 0x913}, - 92: {From: 0x2199, To: 0x121}, - 93: {From: 0x21ce, To: 0x1561}, - 94: {From: 0x21e6, To: 0x504}, - 95: {From: 0x21f4, To: 0x49f}, - 96: {From: 0x21fb, To: 0x269}, - 97: {From: 0x222d, To: 0x121}, - 98: {From: 0x2237, To: 0x121}, - 99: {From: 0x2262, To: 0x92a}, - 100: {From: 0x2316, To: 0x3226}, - 101: {From: 0x236a, To: 0x2835}, - 102: {From: 0x2382, To: 0x3365}, - 103: {From: 0x2472, To: 0x2c7}, - 104: {From: 0x24e4, To: 0x2ff}, - 105: {From: 0x24f0, To: 0x2fa}, - 106: {From: 0x24fa, To: 0x31f}, - 107: {From: 0x2550, To: 0xb5b}, - 108: {From: 0x25a9, To: 0xe2}, - 109: {From: 0x263e, To: 0x2d0}, - 110: {From: 0x26c9, To: 0x26b4}, - 111: {From: 0x26f9, To: 0x3c8}, - 112: {From: 0x2727, To: 0x3caf}, - 113: {From: 0x2755, To: 0x6a4}, - 114: {From: 0x2765, To: 0x26b4}, - 115: {From: 0x2789, To: 0x4358}, - 116: {From: 0x27c9, To: 0x2001}, - 117: {From: 0x28ea, To: 0x27b1}, - 118: {From: 0x28ef, To: 0x2837}, - 119: {From: 0x2914, To: 0x351}, - 120: {From: 0x2986, To: 0x2da7}, - 121: {From: 0x29f0, To: 0x96b}, - 122: {From: 0x2b1a, To: 0x38d}, - 123: {From: 0x2bfc, To: 0x395}, - 124: {From: 0x2c3f, To: 0x3caf}, - 125: {From: 0x2ce1, To: 0x2201}, - 126: {From: 0x2cfc, To: 0x3be}, - 127: {From: 0x2d13, To: 0x597}, - 128: {From: 0x2d47, To: 0x148}, - 129: {From: 0x2d48, To: 0x148}, - 130: {From: 0x2dff, To: 0x2f1}, - 131: {From: 0x2e08, To: 0x19cc}, - 132: {From: 0x2e1a, To: 0x2d95}, - 133: {From: 0x2e21, To: 0x292}, - 134: {From: 0x2e54, To: 0x7d}, - 135: {From: 0x2e65, To: 0x2282}, - 136: {From: 0x2ea0, To: 0x2e9b}, - 137: {From: 0x2eef, To: 0x2ed7}, - 138: {From: 0x3193, To: 0x3c4}, - 139: {From: 0x3366, To: 0x338e}, - 140: {From: 0x342a, To: 0x3dc}, - 141: {From: 0x34ee, To: 0x18d0}, - 142: {From: 0x35c8, To: 0x2c9b}, - 143: {From: 0x35e6, To: 0x412}, - 144: {From: 0x3658, To: 0x246}, - 145: {From: 0x3676, To: 0x3f4}, - 146: {From: 0x36fd, To: 0x445}, - 147: {From: 0x37c0, To: 0x121}, - 148: {From: 0x3816, To: 0x38f2}, - 149: {From: 0x382a, To: 0x2b48}, - 150: {From: 0x382b, To: 0x2c9b}, - 151: {From: 0x382f, To: 0xa9}, - 152: {From: 0x3832, To: 0x3228}, - 153: {From: 0x386c, To: 0x39a6}, - 154: {From: 0x3892, To: 0x3fc0}, - 155: {From: 0x38a5, To: 0x39d7}, - 156: {From: 0x38b4, To: 0x1fa4}, - 157: {From: 0x38b5, To: 0x2e9a}, - 158: {From: 0x395c, To: 0x47e}, - 159: {From: 0x3b4e, To: 0xd91}, - 160: {From: 0x3b78, To: 0x137}, - 161: {From: 0x3c99, To: 0x4bc}, - 162: {From: 0x3fbd, To: 0x100}, - 163: {From: 0x4208, To: 0xa91}, - 164: {From: 0x42be, To: 0x573}, - 165: {From: 0x42f9, To: 0x3f60}, - 166: {From: 0x4378, To: 0x25a}, - 167: {From: 0x43b8, To: 0xe6c}, - 168: {From: 0x43cd, To: 0x10f}, - 169: {From: 0x44af, To: 0x3322}, - 170: {From: 0x44e3, To: 0x512}, - 171: {From: 0x45ca, To: 0x2409}, - 172: {From: 0x45dd, To: 0x26dc}, - 173: {From: 0x4610, To: 0x48ae}, - 174: {From: 0x46ae, To: 0x46a0}, - 175: {From: 0x473e, To: 0x4745}, - 176: {From: 0x4817, To: 0x3503}, - 177: {From: 0x4916, To: 0x31f}, - 178: {From: 0x49a7, To: 0x523}, + 14: {From: 0x62b, To: 0x34}, + 15: {From: 0x62f, To: 0x14}, + 16: {From: 0x630, To: 0x1eb1}, + 17: {From: 0x651, To: 0x431}, + 18: {From: 0x662, To: 0x431}, + 19: {From: 0x6ed, To: 0x3a}, + 20: {From: 0x6f8, To: 0x1d7}, + 21: {From: 0x709, To: 0x3625}, + 22: {From: 0x73e, To: 0x21a1}, + 23: {From: 0x7b3, To: 0x56}, + 24: {From: 0x7b9, To: 0x299b}, + 25: {From: 0x7c5, To: 0x58}, + 26: {From: 0x7e6, To: 0x145}, + 27: {From: 0x80c, To: 0x5a}, + 28: {From: 0x815, To: 0x8d}, + 29: {From: 0x87e, To: 0x810}, + 30: {From: 0x8a8, To: 0x8b7}, + 31: {From: 0x8c3, To: 0xee3}, + 32: {From: 0x8fa, To: 0x1dc}, + 33: {From: 0x9ef, To: 0x331}, + 34: {From: 0xa36, To: 0x2c5}, + 35: {From: 0xa3d, To: 0xbf}, + 36: {From: 0xabe, To: 0x3322}, + 37: {From: 0xb38, To: 0x529}, + 38: {From: 0xb75, To: 0x265a}, + 39: {From: 0xb7e, To: 0xbc3}, + 40: {From: 0xb9b, To: 0x44e}, + 41: {From: 0xbbc, To: 0x4229}, + 42: {From: 0xbbf, To: 0x529}, + 43: {From: 0xbfe, To: 0x2da7}, + 44: {From: 0xc2e, To: 0x3181}, + 45: {From: 0xcb9, To: 0xf3}, + 46: {From: 0xd08, To: 0xfa}, + 47: {From: 0xdc8, To: 0x11a}, + 48: {From: 0xdd7, To: 0x32d}, + 49: {From: 0xdf8, To: 0xdfb}, + 50: {From: 0xdfe, To: 0x531}, + 51: {From: 0xe01, To: 0xdf3}, + 52: {From: 0xedf, To: 0x205a}, + 53: {From: 0xee9, To: 0x222e}, + 54: {From: 0xeee, To: 0x2e9a}, + 55: {From: 0xf39, To: 0x367}, + 56: {From: 0x10d0, To: 0x140}, + 57: {From: 0x1104, To: 0x2d0}, + 58: {From: 0x11a0, To: 0x1ec}, + 59: {From: 0x1279, To: 0x21}, + 60: {From: 0x1424, To: 0x15e}, + 61: {From: 0x1470, To: 0x14e}, + 62: {From: 0x151f, To: 0xd9b}, + 63: {From: 0x1523, To: 0x390}, + 64: {From: 0x1532, To: 0x19f}, + 65: {From: 0x1580, To: 0x210}, + 66: {From: 0x1583, To: 0x10d}, + 67: {From: 0x15a3, To: 0x3caf}, + 68: {From: 0x1630, To: 0x222e}, + 69: {From: 0x166a, To: 0x19b}, + 70: {From: 0x16c8, To: 0x136}, + 71: {From: 0x1700, To: 0x29f8}, + 72: {From: 0x1718, To: 0x194}, + 73: {From: 0x1727, To: 0xf3f}, + 74: {From: 0x177a, To: 0x178}, + 75: {From: 0x1809, To: 0x17b6}, + 76: {From: 0x1816, To: 0x18f3}, + 77: {From: 0x188a, To: 0x436}, + 78: {From: 0x1979, To: 0x1d01}, + 79: {From: 0x1a74, To: 0x2bb0}, + 80: {From: 0x1a8a, To: 0x1f8}, + 81: {From: 0x1b5a, To: 0x1fa}, + 82: {From: 0x1b86, To: 0x1515}, + 83: {From: 0x1d64, To: 0x2c9b}, + 84: {From: 0x2038, To: 0x37b1}, + 85: {From: 0x203d, To: 0x20dd}, + 86: {From: 0x2042, To: 0x2e00}, + 87: {From: 0x205a, To: 0x30b}, + 88: {From: 0x20e3, To: 0x274}, + 89: {From: 0x20ee, To: 0x263}, + 90: {From: 0x20f2, To: 0x22d}, + 91: {From: 0x20f9, To: 0x256}, + 92: {From: 0x210f, To: 0x21eb}, + 93: {From: 0x2135, To: 0x27d}, + 94: {From: 0x2160, To: 0x913}, + 95: {From: 0x2199, To: 0x121}, + 96: {From: 0x21ce, To: 0x1561}, + 97: {From: 0x21e6, To: 0x504}, + 98: {From: 0x21f4, To: 0x49f}, + 99: {From: 0x21fb, To: 0x269}, + 100: {From: 0x222d, To: 0x121}, + 101: {From: 0x2237, To: 0x121}, + 102: {From: 0x2248, To: 0x217d}, + 103: {From: 0x2262, To: 0x92a}, + 104: {From: 0x2316, To: 0x3226}, + 105: {From: 0x236a, To: 0x2835}, + 106: {From: 0x2382, To: 0x3365}, + 107: {From: 0x2472, To: 0x2c7}, + 108: {From: 0x24e4, To: 0x2ff}, + 109: {From: 0x24f0, To: 0x2fa}, + 110: {From: 0x24fa, To: 0x31f}, + 111: {From: 0x2550, To: 0xb5b}, + 112: {From: 0x25a9, To: 0xe2}, + 113: {From: 0x263e, To: 0x2d0}, + 114: {From: 0x26c9, To: 0x26b4}, + 115: {From: 0x26f9, To: 0x3c8}, + 116: {From: 0x2727, To: 0x3caf}, + 117: {From: 0x2755, To: 0x6a4}, + 118: {From: 0x2765, To: 0x26b4}, + 119: {From: 0x2789, To: 0x4358}, + 120: {From: 0x27c9, To: 0x2001}, + 121: {From: 0x28ea, To: 0x27b1}, + 122: {From: 0x28ef, To: 0x2837}, + 123: {From: 0x28fe, To: 0xaa5}, + 124: {From: 0x2914, To: 0x351}, + 125: {From: 0x2986, To: 0x2da7}, + 126: {From: 0x29f0, To: 0x96b}, + 127: {From: 0x2b1a, To: 0x38d}, + 128: {From: 0x2bfc, To: 0x395}, + 129: {From: 0x2c3f, To: 0x3caf}, + 130: {From: 0x2ce1, To: 0x2201}, + 131: {From: 0x2cfc, To: 0x3be}, + 132: {From: 0x2d13, To: 0x597}, + 133: {From: 0x2d47, To: 0x148}, + 134: {From: 0x2d48, To: 0x148}, + 135: {From: 0x2dff, To: 0x2f1}, + 136: {From: 0x2e08, To: 0x19cc}, + 137: {From: 0x2e10, To: 0xc45}, + 138: {From: 0x2e1a, To: 0x2d95}, + 139: {From: 0x2e21, To: 0x292}, + 140: {From: 0x2e54, To: 0x7d}, + 141: {From: 0x2e65, To: 0x2282}, + 142: {From: 0x2e97, To: 0x1a4}, + 143: {From: 0x2ea0, To: 0x2e9b}, + 144: {From: 0x2eef, To: 0x2ed7}, + 145: {From: 0x3193, To: 0x3c4}, + 146: {From: 0x3366, To: 0x338e}, + 147: {From: 0x342a, To: 0x3dc}, + 148: {From: 0x34ee, To: 0x18d0}, + 149: {From: 0x35c8, To: 0x2c9b}, + 150: {From: 0x35e6, To: 0x412}, + 151: {From: 0x35f5, To: 0x24b}, + 152: {From: 0x360d, To: 0x1dc}, + 153: {From: 0x3658, To: 0x246}, + 154: {From: 0x3676, To: 0x3f4}, + 155: {From: 0x36fd, To: 0x445}, + 156: {From: 0x3747, To: 0x3b42}, + 157: {From: 0x37c0, To: 0x121}, + 158: {From: 0x3816, To: 0x38f2}, + 159: {From: 0x382a, To: 0x2b48}, + 160: {From: 0x382b, To: 0x2c9b}, + 161: {From: 0x382f, To: 0xa9}, + 162: {From: 0x3832, To: 0x3228}, + 163: {From: 0x386c, To: 0x39a6}, + 164: {From: 0x3892, To: 0x3fc0}, + 165: {From: 0x38a0, To: 0x45f}, + 166: {From: 0x38a5, To: 0x39d7}, + 167: {From: 0x38b4, To: 0x1fa4}, + 168: {From: 0x38b5, To: 0x2e9a}, + 169: {From: 0x38fa, To: 0x38f1}, + 170: {From: 0x395c, To: 0x47e}, + 171: {From: 0x3b4e, To: 0xd91}, + 172: {From: 0x3b78, To: 0x137}, + 173: {From: 0x3c99, To: 0x4bc}, + 174: {From: 0x3fbd, To: 0x100}, + 175: {From: 0x4208, To: 0xa91}, + 176: {From: 0x42be, To: 0x573}, + 177: {From: 0x42f9, To: 0x3f60}, + 178: {From: 0x4378, To: 0x25a}, + 179: {From: 0x43b8, To: 0xe6c}, + 180: {From: 0x43cd, To: 0x10f}, + 181: {From: 0x43d4, To: 0x4848}, + 182: {From: 0x44af, To: 0x3322}, + 183: {From: 0x44e3, To: 0x512}, + 184: {From: 0x45ca, To: 0x2409}, + 185: {From: 0x45dd, To: 0x26dc}, + 186: {From: 0x4610, To: 0x48ae}, + 187: {From: 0x46ae, To: 0x46a0}, + 188: {From: 0x473e, To: 0x4745}, + 189: {From: 0x4817, To: 0x3503}, + 190: {From: 0x483b, To: 0x208b}, + 191: {From: 0x4916, To: 0x31f}, + 192: {From: 0x49a7, To: 0x523}, } -// Size: 179 bytes, 179 elements -var AliasTypes = [179]AliasType{ +// Size: 193 bytes, 193 elements +var AliasTypes = [193]AliasType{ // Entry 0 - 3F - 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, - 1, 1, 2, 0, 0, 1, 0, 1, 2, 1, 1, 0, 0, 0, 0, 2, - 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, - 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, + 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 0, 0, + 1, 2, 1, 1, 2, 0, 0, 1, 0, 1, 2, 1, 1, 0, 0, 0, + 0, 2, 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, + 1, 1, 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, // Entry 40 - 7F - 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 0, 0, 2, 1, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 1, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, + 1, 2, 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 0, 0, + 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, // Entry 80 - BF - 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 0, 2, - 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, - 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, - 0, 1, 1, + 1, 0, 0, 1, 0, 2, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 2, 0, 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 0, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + // Entry C0 - FF + 1, } const ( - _Latn = 90 + _Latn = 91 _Hani = 57 _Hans = 59 _Hant = 60 - _Qaaa = 147 - _Qaai = 155 - _Qabx = 196 - _Zinh = 252 - _Zyyy = 257 - _Zzzz = 258 + _Qaaa = 149 + _Qaai = 157 + _Qabx = 198 + _Zinh = 255 + _Zyyy = 260 + _Zzzz = 261 ) // script is an alphabetically sorted list of ISO 15924 codes. The index // of the script in the string, divided by 4, is the internal scriptID. -const script tag.Index = "" + // Size: 1040 bytes +const script tag.Index = "" + // Size: 1052 bytes "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" + "BrahBraiBugiBuhdCakmCansCariChamCherChrsCirtCoptCpmnCprtCyrlCyrsDevaDiak" + "DogrDsrtDuplEgydEgyhEgypElbaElymEthiGeokGeorGlagGongGonmGothGranGrekGujr" + "GuruHanbHangHaniHanoHansHantHatrHebrHiraHluwHmngHmnpHrktHungIndsItalJamo" + - "JavaJpanJurcKaliKanaKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatfLatg" + - "LatnLekeLepcLimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedfMend" + - "MercMeroMlymModiMongMoonMrooMteiMultMymrNandNarbNbatNewaNkdbNkgbNkooNshu" + - "OgamOlckOrkhOryaOsgeOsmaOugrPalmPaucPcunPelmPermPhagPhliPhlpPhlvPhnxPiqd" + - "PlrdPrtiPsinQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaamQaanQaao" + - "QaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabeQabfQabg" + - "QabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabwQabxRanj" + - "RjngRohgRoroRunrSamrSaraSarbSaurSgnwShawShrdShuiSiddSindSinhSogdSogoSora" + - "SoyoSundSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglg" + - "ThaaThaiTibtTirhTnsaTotoUgarVaiiVispVithWaraWchoWoleXpeoXsuxYeziYiiiZanb" + - "ZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff" + "JavaJpanJurcKaliKanaKawiKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatf" + + "LatgLatnLekeLepcLimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedf" + + "MendMercMeroMlymModiMongMoonMrooMteiMultMymrNagmNandNarbNbatNewaNkdbNkgb" + + "NkooNshuOgamOlckOrkhOryaOsgeOsmaOugrPalmPaucPcunPelmPermPhagPhliPhlpPhlv" + + "PhnxPiqdPlrdPrtiPsinQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam" + + "QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe" + + "QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw" + + "QabxRanjRjngRohgRoroRunrSamrSaraSarbSaurSgnwShawShrdShuiSiddSindSinhSogd" + + "SogoSoraSoyoSundSunuSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTelu" + + "TengTfngTglgThaaThaiTibtTirhTnsaTotoUgarVaiiVispVithWaraWchoWoleXpeoXsux" + + "YeziYiiiZanbZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff" // suppressScript is an index from langID to the dominant script for that language, // if it exists. If a script is given, it should be suppressed from the language tag. @@ -824,7 +840,7 @@ var suppressScript = [1330]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -833,7 +849,7 @@ var suppressScript = [1330]uint8{ // Entry 40 - 7F 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -846,53 +862,53 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry C0 - FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 100 - 13F - 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xea, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, + 0xed, 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x5a, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x5b, 0x00, // Entry 140 - 17F - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 180 - 1BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x35, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x22, 0x00, // Entry 1C0 - 1FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x5a, 0x00, 0x5a, 0x5a, 0x00, 0x08, + 0x00, 0x5b, 0x5b, 0x00, 0x5b, 0x5b, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x5a, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x5b, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, // Entry 200 - 23F 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -903,9 +919,9 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 240 - 27F - 0x00, 0x00, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x53, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x00, 0x00, 0x54, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -913,93 +929,93 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 280 - 2BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 2C0 - 2FF - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, // Entry 300 - 33F - 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x5a, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x5b, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, // Entry 340 - 37F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x5a, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x5a, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x5b, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x5b, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 380 - 3BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, // Entry 3C0 - 3FF - 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 400 - 43F - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, // Entry 440 - 47F - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe6, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x2c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0xe9, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x2c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, // Entry 480 - 4BF - 0x5a, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x5b, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 4C0 - 4FF - 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 500 - 53F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1007,7 +1023,7 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, } @@ -1016,16 +1032,16 @@ const ( _419 = 31 _BR = 65 _CA = 73 - _ES = 110 - _GB = 123 - _MD = 188 - _PT = 238 - _UK = 306 - _US = 309 - _ZZ = 357 - _XA = 323 - _XC = 325 - _XK = 333 + _ES = 111 + _GB = 124 + _MD = 189 + _PT = 239 + _UK = 307 + _US = 310 + _ZZ = 358 + _XA = 324 + _XC = 326 + _XK = 334 ) // isoRegionOffset needs to be added to the index of regionISO to obtain the regionID @@ -1034,8 +1050,8 @@ const ( const isoRegionOffset = 32 // regionTypes defines the status of a region for various standards. -// Size: 358 bytes, 358 elements -var regionTypes = [358]uint8{ +// Size: 359 bytes, 359 elements +var regionTypes = [359]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1048,45 +1064,45 @@ var regionTypes = [358]uint8{ // Entry 40 - 7F 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, - 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, - 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, - 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 80 - BF 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry C0 - FF - 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, // Entry 100 - 13F - 0x05, 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x05, 0x05, 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, // Entry 140 - 17F - 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, 0x06, - 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, } // regionISO holds a list of alphabetically sorted 2-letter ISO region codes. @@ -1094,27 +1110,27 @@ var regionTypes = [358]uint8{ // - [A-Z}{2}: the first letter of the 2-letter code plus these two // letters form the 3-letter ISO code. // - 0, n: index into altRegionISO3. -const regionISO tag.Index = "" + // Size: 1308 bytes +const regionISO tag.Index = "" + // Size: 1312 bytes "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + - "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + - "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSMFORO" + - "FQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGR" + - "RCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSR" + - "IMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00" + - "\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTU" + - "LUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQ" + - "MRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOOR" + - "NPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00" + - "\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTT" + - "QU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYC" + - "SDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYR" + - "SZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTV" + - "UVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVU" + - "UTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXO" + - "OOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAF" + - "ZMMBZRARZWWEZZZZ\xff\xff\xff\xff" + "CQ CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADO" + + "OMDYHYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSM" + + "FOROFQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQ" + + "NQGRRCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERL" + + "ILSRIMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM" + + "\x00\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSO" + + "LTTULUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNP" + + "MQTQMRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLD" + + "NOORNPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM" + + "\x00\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSS" + + "QTTTQU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLB" + + "SCYCSDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXM" + + "SYYRSZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTT" + + "TOTVUVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVN" + + "NMVUUTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXN" + + "NNXOOOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUG" + + "ZAAFZMMBZRARZWWEZZZZ\xff\xff\xff\xff" // altRegionISO3 holds a list of 3-letter region codes that cannot be // mapped to 2-letter codes using the default algorithm. This is a short list. @@ -1124,38 +1140,38 @@ const altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" // of the 3-letter ISO codes in altRegionISO3. // Size: 22 bytes, 11 elements var altRegionIDs = [11]uint16{ - 0x0057, 0x0070, 0x0088, 0x00a8, 0x00aa, 0x00ad, 0x00ea, 0x0105, - 0x0121, 0x015f, 0x00dc, + 0x0058, 0x0071, 0x0089, 0x00a9, 0x00ab, 0x00ae, 0x00eb, 0x0106, + 0x0122, 0x0160, 0x00dd, } // Size: 80 bytes, 20 elements var regionOldMap = [20]FromTo{ - 0: {From: 0x44, To: 0xc4}, - 1: {From: 0x58, To: 0xa7}, - 2: {From: 0x5f, To: 0x60}, - 3: {From: 0x66, To: 0x3b}, - 4: {From: 0x79, To: 0x78}, - 5: {From: 0x93, To: 0x37}, - 6: {From: 0xa3, To: 0x133}, - 7: {From: 0xc1, To: 0x133}, - 8: {From: 0xd7, To: 0x13f}, - 9: {From: 0xdc, To: 0x2b}, - 10: {From: 0xef, To: 0x133}, - 11: {From: 0xf2, To: 0xe2}, - 12: {From: 0xfc, To: 0x70}, - 13: {From: 0x103, To: 0x164}, - 14: {From: 0x12a, To: 0x126}, - 15: {From: 0x132, To: 0x7b}, - 16: {From: 0x13a, To: 0x13e}, - 17: {From: 0x141, To: 0x133}, - 18: {From: 0x15d, To: 0x15e}, - 19: {From: 0x163, To: 0x4b}, + 0: {From: 0x44, To: 0xc5}, + 1: {From: 0x59, To: 0xa8}, + 2: {From: 0x60, To: 0x61}, + 3: {From: 0x67, To: 0x3b}, + 4: {From: 0x7a, To: 0x79}, + 5: {From: 0x94, To: 0x37}, + 6: {From: 0xa4, To: 0x134}, + 7: {From: 0xc2, To: 0x134}, + 8: {From: 0xd8, To: 0x140}, + 9: {From: 0xdd, To: 0x2b}, + 10: {From: 0xf0, To: 0x134}, + 11: {From: 0xf3, To: 0xe3}, + 12: {From: 0xfd, To: 0x71}, + 13: {From: 0x104, To: 0x165}, + 14: {From: 0x12b, To: 0x127}, + 15: {From: 0x133, To: 0x7c}, + 16: {From: 0x13b, To: 0x13f}, + 17: {From: 0x142, To: 0x134}, + 18: {From: 0x15e, To: 0x15f}, + 19: {From: 0x164, To: 0x4b}, } // m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are // codes indicating collections of regions. -// Size: 716 bytes, 358 elements -var m49 = [358]int16{ +// Size: 718 bytes, 359 elements +var m49 = [359]int16{ // Entry 0 - 3F 0, 1, 2, 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 21, 29, 30, @@ -1168,45 +1184,45 @@ var m49 = [358]int16{ // Entry 40 - 7F 535, 76, 44, 64, 104, 74, 72, 112, 84, 124, 166, 180, 140, 178, 756, 384, - 184, 152, 120, 156, 170, 0, 188, 891, - 296, 192, 132, 531, 162, 196, 203, 278, - 276, 0, 262, 208, 212, 214, 204, 12, - 0, 218, 233, 818, 732, 232, 724, 231, - 967, 0, 246, 242, 238, 583, 234, 0, - 250, 249, 266, 826, 308, 268, 254, 831, + 184, 152, 120, 156, 170, 0, 0, 188, + 891, 296, 192, 132, 531, 162, 196, 203, + 278, 276, 0, 262, 208, 212, 214, 204, + 12, 0, 218, 233, 818, 732, 232, 724, + 231, 967, 0, 246, 242, 238, 583, 234, + 0, 250, 249, 266, 826, 308, 268, 254, // Entry 80 - BF - 288, 292, 304, 270, 324, 312, 226, 300, - 239, 320, 316, 624, 328, 344, 334, 340, - 191, 332, 348, 854, 0, 360, 372, 376, - 833, 356, 86, 368, 364, 352, 380, 832, - 388, 400, 392, 581, 404, 417, 116, 296, - 174, 659, 408, 410, 414, 136, 398, 418, - 422, 662, 438, 144, 430, 426, 440, 442, - 428, 434, 504, 492, 498, 499, 663, 450, + 831, 288, 292, 304, 270, 324, 312, 226, + 300, 239, 320, 316, 624, 328, 344, 334, + 340, 191, 332, 348, 854, 0, 360, 372, + 376, 833, 356, 86, 368, 364, 352, 380, + 832, 388, 400, 392, 581, 404, 417, 116, + 296, 174, 659, 408, 410, 414, 136, 398, + 418, 422, 662, 438, 144, 430, 426, 440, + 442, 428, 434, 504, 492, 498, 499, 663, // Entry C0 - FF - 584, 581, 807, 466, 104, 496, 446, 580, - 474, 478, 500, 470, 480, 462, 454, 484, - 458, 508, 516, 540, 562, 574, 566, 548, - 558, 528, 578, 524, 10, 520, 536, 570, - 554, 512, 591, 0, 604, 258, 598, 608, - 586, 616, 666, 612, 630, 275, 620, 581, - 585, 600, 591, 634, 959, 960, 961, 962, - 963, 964, 965, 966, 967, 968, 969, 970, + 450, 584, 581, 807, 466, 104, 496, 446, + 580, 474, 478, 500, 470, 480, 462, 454, + 484, 458, 508, 516, 540, 562, 574, 566, + 548, 558, 528, 578, 524, 10, 520, 536, + 570, 554, 512, 591, 0, 604, 258, 598, + 608, 586, 616, 666, 612, 630, 275, 620, + 581, 585, 600, 591, 634, 959, 960, 961, + 962, 963, 964, 965, 966, 967, 968, 969, // Entry 100 - 13F - 971, 972, 638, 716, 642, 688, 643, 646, - 682, 90, 690, 729, 752, 702, 654, 705, - 744, 703, 694, 674, 686, 706, 740, 728, - 678, 810, 222, 534, 760, 748, 0, 796, - 148, 260, 768, 764, 762, 772, 626, 795, - 788, 776, 626, 792, 780, 798, 158, 834, - 804, 800, 826, 581, 0, 840, 858, 860, - 336, 670, 704, 862, 92, 850, 704, 548, + 970, 971, 972, 638, 716, 642, 688, 643, + 646, 682, 90, 690, 729, 752, 702, 654, + 705, 744, 703, 694, 674, 686, 706, 740, + 728, 678, 810, 222, 534, 760, 748, 0, + 796, 148, 260, 768, 764, 762, 772, 626, + 795, 788, 776, 626, 792, 780, 798, 158, + 834, 804, 800, 826, 581, 0, 840, 858, + 860, 336, 670, 704, 862, 92, 850, 704, // Entry 140 - 17F - 876, 581, 882, 973, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 983, 984, 985, - 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 720, 887, 175, - 891, 710, 894, 180, 716, 999, + 548, 876, 581, 882, 973, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 984, + 985, 986, 987, 988, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 720, 887, + 175, 891, 710, 894, 180, 716, 999, } // m49Index gives indexes into fromM49 based on the three most significant bits @@ -1227,65 +1243,65 @@ var m49Index = [9]int16{ var fromM49 = [333]uint16{ // Entry 0 - 3F 0x0201, 0x0402, 0x0603, 0x0824, 0x0a04, 0x1027, 0x1205, 0x142b, - 0x1606, 0x1867, 0x1a07, 0x1c08, 0x1e09, 0x202d, 0x220a, 0x240b, + 0x1606, 0x1868, 0x1a07, 0x1c08, 0x1e09, 0x202d, 0x220a, 0x240b, 0x260c, 0x2822, 0x2a0d, 0x302a, 0x3825, 0x3a0e, 0x3c0f, 0x3e32, 0x402c, 0x4410, 0x4611, 0x482f, 0x4e12, 0x502e, 0x5842, 0x6039, 0x6435, 0x6628, 0x6834, 0x6a13, 0x6c14, 0x7036, 0x7215, 0x783d, 0x7a16, 0x8043, 0x883f, 0x8c33, 0x9046, 0x9445, 0x9841, 0xa848, - 0xac9a, 0xb509, 0xb93c, 0xc03e, 0xc838, 0xd0c4, 0xd83a, 0xe047, - 0xe8a6, 0xf052, 0xf849, 0x085a, 0x10ad, 0x184c, 0x1c17, 0x1e18, + 0xac9b, 0xb50a, 0xb93d, 0xc03e, 0xc838, 0xd0c5, 0xd83a, 0xe047, + 0xe8a7, 0xf052, 0xf849, 0x085b, 0x10ae, 0x184c, 0x1c17, 0x1e18, // Entry 40 - 7F - 0x20b3, 0x2219, 0x2920, 0x2c1a, 0x2e1b, 0x3051, 0x341c, 0x361d, - 0x3853, 0x3d2e, 0x445c, 0x4c4a, 0x5454, 0x5ca8, 0x5f5f, 0x644d, - 0x684b, 0x7050, 0x7856, 0x7e90, 0x8059, 0x885d, 0x941e, 0x965e, - 0x983b, 0xa063, 0xa864, 0xac65, 0xb469, 0xbd1a, 0xc486, 0xcc6f, - 0xce6f, 0xd06d, 0xd26a, 0xd476, 0xdc74, 0xde88, 0xe473, 0xec72, - 0xf031, 0xf279, 0xf478, 0xfc7e, 0x04e5, 0x0921, 0x0c62, 0x147a, - 0x187d, 0x1c83, 0x26ed, 0x2860, 0x2c5f, 0x3060, 0x4080, 0x4881, - 0x50a7, 0x5887, 0x6082, 0x687c, 0x7085, 0x788a, 0x8089, 0x8884, + 0x20b4, 0x2219, 0x2921, 0x2c1a, 0x2e1b, 0x3051, 0x341c, 0x361d, + 0x3853, 0x3d2f, 0x445d, 0x4c4a, 0x5454, 0x5ca9, 0x5f60, 0x644d, + 0x684b, 0x7050, 0x7857, 0x7e91, 0x805a, 0x885e, 0x941e, 0x965f, + 0x983b, 0xa064, 0xa865, 0xac66, 0xb46a, 0xbd1b, 0xc487, 0xcc70, + 0xce70, 0xd06e, 0xd26b, 0xd477, 0xdc75, 0xde89, 0xe474, 0xec73, + 0xf031, 0xf27a, 0xf479, 0xfc7f, 0x04e6, 0x0922, 0x0c63, 0x147b, + 0x187e, 0x1c84, 0x26ee, 0x2861, 0x2c60, 0x3061, 0x4081, 0x4882, + 0x50a8, 0x5888, 0x6083, 0x687d, 0x7086, 0x788b, 0x808a, 0x8885, // Entry 80 - BF - 0x908c, 0x9891, 0x9c8e, 0xa138, 0xa88f, 0xb08d, 0xb892, 0xc09d, - 0xc899, 0xd095, 0xd89c, 0xe09b, 0xe896, 0xf097, 0xf89e, 0x004f, - 0x08a0, 0x10a2, 0x1cae, 0x20a1, 0x28a4, 0x30aa, 0x34ab, 0x3cac, - 0x42a5, 0x44af, 0x461f, 0x4cb0, 0x54b5, 0x58b8, 0x5cb4, 0x64b9, - 0x6cb2, 0x70b6, 0x74b7, 0x7cc6, 0x84bf, 0x8cce, 0x94d0, 0x9ccd, - 0xa4c3, 0xaccb, 0xb4c8, 0xbcc9, 0xc0cc, 0xc8cf, 0xd8bb, 0xe0c5, - 0xe4bc, 0xe6bd, 0xe8ca, 0xf0ba, 0xf8d1, 0x00e1, 0x08d2, 0x10dd, - 0x18db, 0x20d9, 0x2429, 0x265b, 0x2a30, 0x2d1b, 0x2e40, 0x30de, + 0x908d, 0x9892, 0x9c8f, 0xa139, 0xa890, 0xb08e, 0xb893, 0xc09e, + 0xc89a, 0xd096, 0xd89d, 0xe09c, 0xe897, 0xf098, 0xf89f, 0x004f, + 0x08a1, 0x10a3, 0x1caf, 0x20a2, 0x28a5, 0x30ab, 0x34ac, 0x3cad, + 0x42a6, 0x44b0, 0x461f, 0x4cb1, 0x54b6, 0x58b9, 0x5cb5, 0x64ba, + 0x6cb3, 0x70b7, 0x74b8, 0x7cc7, 0x84c0, 0x8ccf, 0x94d1, 0x9cce, + 0xa4c4, 0xaccc, 0xb4c9, 0xbcca, 0xc0cd, 0xc8d0, 0xd8bc, 0xe0c6, + 0xe4bd, 0xe6be, 0xe8cb, 0xf0bb, 0xf8d2, 0x00e2, 0x08d3, 0x10de, + 0x18dc, 0x20da, 0x2429, 0x265c, 0x2a30, 0x2d1c, 0x2e40, 0x30df, // Entry C0 - FF - 0x38d3, 0x493f, 0x54e0, 0x5cd8, 0x64d4, 0x6cd6, 0x74df, 0x7cd5, - 0x84da, 0x88c7, 0x8b33, 0x8e75, 0x90c0, 0x92f0, 0x94e8, 0x9ee2, - 0xace6, 0xb0f1, 0xb8e4, 0xc0e7, 0xc8eb, 0xd0e9, 0xd8ee, 0xe08b, - 0xe526, 0xecec, 0xf4f3, 0xfd02, 0x0504, 0x0706, 0x0d07, 0x183c, - 0x1d0e, 0x26a9, 0x2826, 0x2cb1, 0x2ebe, 0x34ea, 0x3d39, 0x4513, - 0x4d18, 0x5508, 0x5d14, 0x6105, 0x650a, 0x6d12, 0x7d0d, 0x7f11, - 0x813e, 0x830f, 0x8515, 0x8d61, 0x9964, 0xa15d, 0xa86e, 0xb117, - 0xb30b, 0xb86c, 0xc10b, 0xc916, 0xd110, 0xd91d, 0xe10c, 0xe84e, + 0x38d4, 0x4940, 0x54e1, 0x5cd9, 0x64d5, 0x6cd7, 0x74e0, 0x7cd6, + 0x84db, 0x88c8, 0x8b34, 0x8e76, 0x90c1, 0x92f1, 0x94e9, 0x9ee3, + 0xace7, 0xb0f2, 0xb8e5, 0xc0e8, 0xc8ec, 0xd0ea, 0xd8ef, 0xe08c, + 0xe527, 0xeced, 0xf4f4, 0xfd03, 0x0505, 0x0707, 0x0d08, 0x183c, + 0x1d0f, 0x26aa, 0x2826, 0x2cb2, 0x2ebf, 0x34eb, 0x3d3a, 0x4514, + 0x4d19, 0x5509, 0x5d15, 0x6106, 0x650b, 0x6d13, 0x7d0e, 0x7f12, + 0x813f, 0x8310, 0x8516, 0x8d62, 0x9965, 0xa15e, 0xa86f, 0xb118, + 0xb30c, 0xb86d, 0xc10c, 0xc917, 0xd111, 0xd91e, 0xe10d, 0xe84e, // Entry 100 - 13F - 0xf11c, 0xf524, 0xf923, 0x0122, 0x0925, 0x1129, 0x192c, 0x2023, - 0x2928, 0x312b, 0x3727, 0x391f, 0x3d2d, 0x4131, 0x4930, 0x4ec2, - 0x5519, 0x646b, 0x747b, 0x7e7f, 0x809f, 0x8298, 0x852f, 0x9135, - 0xa53d, 0xac37, 0xb536, 0xb937, 0xbd3b, 0xd940, 0xe542, 0xed5e, - 0xef5e, 0xf657, 0xfd62, 0x7c20, 0x7ef4, 0x80f5, 0x82f6, 0x84f7, - 0x86f8, 0x88f9, 0x8afa, 0x8cfb, 0x8e70, 0x90fd, 0x92fe, 0x94ff, - 0x9700, 0x9901, 0x9b43, 0x9d44, 0x9f45, 0xa146, 0xa347, 0xa548, - 0xa749, 0xa94a, 0xab4b, 0xad4c, 0xaf4d, 0xb14e, 0xb34f, 0xb550, + 0xf11d, 0xf525, 0xf924, 0x0123, 0x0926, 0x112a, 0x192d, 0x2023, + 0x2929, 0x312c, 0x3728, 0x3920, 0x3d2e, 0x4132, 0x4931, 0x4ec3, + 0x551a, 0x646c, 0x747c, 0x7e80, 0x80a0, 0x8299, 0x8530, 0x9136, + 0xa53e, 0xac37, 0xb537, 0xb938, 0xbd3c, 0xd941, 0xe543, 0xed5f, + 0xef5f, 0xf658, 0xfd63, 0x7c20, 0x7ef5, 0x80f6, 0x82f7, 0x84f8, + 0x86f9, 0x88fa, 0x8afb, 0x8cfc, 0x8e71, 0x90fe, 0x92ff, 0x9500, + 0x9701, 0x9902, 0x9b44, 0x9d45, 0x9f46, 0xa147, 0xa348, 0xa549, + 0xa74a, 0xa94b, 0xab4c, 0xad4d, 0xaf4e, 0xb14f, 0xb350, 0xb551, // Entry 140 - 17F - 0xb751, 0xb952, 0xbb53, 0xbd54, 0xbf55, 0xc156, 0xc357, 0xc558, - 0xc759, 0xc95a, 0xcb5b, 0xcd5c, 0xcf65, + 0xb752, 0xb953, 0xbb54, 0xbd55, 0xbf56, 0xc157, 0xc358, 0xc559, + 0xc75a, 0xc95b, 0xcb5c, 0xcd5d, 0xcf66, } -// Size: 2014 bytes +// Size: 2128 bytes var variantIndex = map[string]uint8{ "1606nict": 0x0, "1694acad": 0x1, "1901": 0x2, "1959acad": 0x3, - "1994": 0x61, + "1994": 0x67, "1996": 0x4, "abl1943": 0x5, "akuapem": 0x6, - "alalc97": 0x63, + "alalc97": 0x69, "aluku": 0x7, "ao1990": 0x8, "aranes": 0x9, @@ -1299,94 +1315,100 @@ var variantIndex = map[string]uint8{ "barla": 0x11, "basiceng": 0x12, "bauddha": 0x13, - "biscayan": 0x14, - "biske": 0x5c, - "bohoric": 0x15, - "boont": 0x16, - "bornholm": 0x17, - "cisaup": 0x18, - "colb1945": 0x19, - "cornu": 0x1a, - "creiss": 0x1b, - "dajnko": 0x1c, - "ekavsk": 0x1d, - "emodeng": 0x1e, - "fonipa": 0x64, - "fonkirsh": 0x65, - "fonnapa": 0x66, - "fonupa": 0x67, - "fonxsamp": 0x68, - "gascon": 0x1f, - "grclass": 0x20, - "grital": 0x21, - "grmistr": 0x22, - "hepburn": 0x23, - "heploc": 0x62, - "hognorsk": 0x24, - "hsistemo": 0x25, - "ijekavsk": 0x26, - "itihasa": 0x27, - "ivanchov": 0x28, - "jauer": 0x29, - "jyutping": 0x2a, - "kkcor": 0x2b, - "kociewie": 0x2c, - "kscor": 0x2d, - "laukika": 0x2e, - "lemosin": 0x2f, - "lengadoc": 0x30, - "lipaw": 0x5d, - "luna1918": 0x31, - "metelko": 0x32, - "monoton": 0x33, - "ndyuka": 0x34, - "nedis": 0x35, - "newfound": 0x36, - "nicard": 0x37, - "njiva": 0x5e, - "nulik": 0x38, - "osojs": 0x5f, - "oxendict": 0x39, - "pahawh2": 0x3a, - "pahawh3": 0x3b, - "pahawh4": 0x3c, - "pamaka": 0x3d, - "peano": 0x3e, - "petr1708": 0x3f, - "pinyin": 0x40, - "polyton": 0x41, - "provenc": 0x42, - "puter": 0x43, - "rigik": 0x44, - "rozaj": 0x45, - "rumgr": 0x46, - "scotland": 0x47, - "scouse": 0x48, - "simple": 0x69, - "solba": 0x60, - "sotav": 0x49, - "spanglis": 0x4a, - "surmiran": 0x4b, - "sursilv": 0x4c, - "sutsilv": 0x4d, - "tarask": 0x4e, - "tongyong": 0x4f, - "tunumiit": 0x50, - "uccor": 0x51, - "ucrcor": 0x52, - "ulster": 0x53, - "unifon": 0x54, - "vaidika": 0x55, - "valencia": 0x56, - "vallader": 0x57, - "vecdruka": 0x58, - "vivaraup": 0x59, - "wadegile": 0x5a, - "xsistemo": 0x5b, + "bciav": 0x14, + "bcizbl": 0x15, + "biscayan": 0x16, + "biske": 0x62, + "bohoric": 0x17, + "boont": 0x18, + "bornholm": 0x19, + "cisaup": 0x1a, + "colb1945": 0x1b, + "cornu": 0x1c, + "creiss": 0x1d, + "dajnko": 0x1e, + "ekavsk": 0x1f, + "emodeng": 0x20, + "fonipa": 0x6a, + "fonkirsh": 0x6b, + "fonnapa": 0x6c, + "fonupa": 0x6d, + "fonxsamp": 0x6e, + "gallo": 0x21, + "gascon": 0x22, + "grclass": 0x23, + "grital": 0x24, + "grmistr": 0x25, + "hepburn": 0x26, + "heploc": 0x68, + "hognorsk": 0x27, + "hsistemo": 0x28, + "ijekavsk": 0x29, + "itihasa": 0x2a, + "ivanchov": 0x2b, + "jauer": 0x2c, + "jyutping": 0x2d, + "kkcor": 0x2e, + "kociewie": 0x2f, + "kscor": 0x30, + "laukika": 0x31, + "lemosin": 0x32, + "lengadoc": 0x33, + "lipaw": 0x63, + "ltg1929": 0x34, + "ltg2007": 0x35, + "luna1918": 0x36, + "metelko": 0x37, + "monoton": 0x38, + "ndyuka": 0x39, + "nedis": 0x3a, + "newfound": 0x3b, + "nicard": 0x3c, + "njiva": 0x64, + "nulik": 0x3d, + "osojs": 0x65, + "oxendict": 0x3e, + "pahawh2": 0x3f, + "pahawh3": 0x40, + "pahawh4": 0x41, + "pamaka": 0x42, + "peano": 0x43, + "petr1708": 0x44, + "pinyin": 0x45, + "polyton": 0x46, + "provenc": 0x47, + "puter": 0x48, + "rigik": 0x49, + "rozaj": 0x4a, + "rumgr": 0x4b, + "scotland": 0x4c, + "scouse": 0x4d, + "simple": 0x6f, + "solba": 0x66, + "sotav": 0x4e, + "spanglis": 0x4f, + "surmiran": 0x50, + "sursilv": 0x51, + "sutsilv": 0x52, + "synnejyl": 0x53, + "tarask": 0x54, + "tongyong": 0x55, + "tunumiit": 0x56, + "uccor": 0x57, + "ucrcor": 0x58, + "ulster": 0x59, + "unifon": 0x5a, + "vaidika": 0x5b, + "valencia": 0x5c, + "vallader": 0x5d, + "vecdruka": 0x5e, + "vivaraup": 0x5f, + "wadegile": 0x60, + "xsistemo": 0x61, } // variantNumSpecialized is the number of specialized variants in variants. -const variantNumSpecialized = 99 +const variantNumSpecialized = 105 // nRegionGroups is the number of region groups. const nRegionGroups = 33 @@ -1398,151 +1420,151 @@ type likelyLangRegion struct { // likelyScript is a lookup table, indexed by scriptID, for the most likely // languages and regions given a script. -// Size: 1040 bytes, 260 elements -var likelyScript = [260]likelyLangRegion{ - 1: {lang: 0x14e, region: 0x84}, - 3: {lang: 0x2a2, region: 0x106}, - 4: {lang: 0x1f, region: 0x99}, - 5: {lang: 0x3a, region: 0x6b}, - 7: {lang: 0x3b, region: 0x9c}, +// Size: 1052 bytes, 263 elements +var likelyScript = [263]likelyLangRegion{ + 1: {lang: 0x14e, region: 0x85}, + 3: {lang: 0x2a2, region: 0x107}, + 4: {lang: 0x1f, region: 0x9a}, + 5: {lang: 0x3a, region: 0x6c}, + 7: {lang: 0x3b, region: 0x9d}, 8: {lang: 0x1d7, region: 0x28}, - 9: {lang: 0x13, region: 0x9c}, - 10: {lang: 0x5b, region: 0x95}, + 9: {lang: 0x13, region: 0x9d}, + 10: {lang: 0x5b, region: 0x96}, 11: {lang: 0x60, region: 0x52}, - 12: {lang: 0xb9, region: 0xb4}, - 13: {lang: 0x63, region: 0x95}, + 12: {lang: 0xb9, region: 0xb5}, + 13: {lang: 0x63, region: 0x96}, 14: {lang: 0xa5, region: 0x35}, - 15: {lang: 0x3e9, region: 0x99}, - 17: {lang: 0x529, region: 0x12e}, - 18: {lang: 0x3b1, region: 0x99}, - 19: {lang: 0x15e, region: 0x78}, - 20: {lang: 0xc2, region: 0x95}, - 21: {lang: 0x9d, region: 0xe7}, + 15: {lang: 0x3e9, region: 0x9a}, + 17: {lang: 0x529, region: 0x12f}, + 18: {lang: 0x3b1, region: 0x9a}, + 19: {lang: 0x15e, region: 0x79}, + 20: {lang: 0xc2, region: 0x96}, + 21: {lang: 0x9d, region: 0xe8}, 22: {lang: 0xdb, region: 0x35}, 23: {lang: 0xf3, region: 0x49}, - 24: {lang: 0x4f0, region: 0x12b}, - 25: {lang: 0xe7, region: 0x13e}, - 26: {lang: 0xe5, region: 0x135}, - 29: {lang: 0xf1, region: 0x6b}, - 31: {lang: 0x1a0, region: 0x5d}, - 32: {lang: 0x3e2, region: 0x106}, - 34: {lang: 0x1be, region: 0x99}, - 38: {lang: 0x15e, region: 0x78}, - 41: {lang: 0x133, region: 0x6b}, + 24: {lang: 0x4f0, region: 0x12c}, + 25: {lang: 0xe7, region: 0x13f}, + 26: {lang: 0xe5, region: 0x136}, + 29: {lang: 0xf1, region: 0x6c}, + 31: {lang: 0x1a0, region: 0x5e}, + 32: {lang: 0x3e2, region: 0x107}, + 34: {lang: 0x1be, region: 0x9a}, + 38: {lang: 0x15e, region: 0x79}, + 41: {lang: 0x133, region: 0x6c}, 42: {lang: 0x431, region: 0x27}, - 44: {lang: 0x27, region: 0x6f}, - 46: {lang: 0x210, region: 0x7d}, + 44: {lang: 0x27, region: 0x70}, + 46: {lang: 0x210, region: 0x7e}, 47: {lang: 0xfe, region: 0x38}, - 49: {lang: 0x19b, region: 0x99}, - 50: {lang: 0x19e, region: 0x130}, - 51: {lang: 0x3e9, region: 0x99}, - 52: {lang: 0x136, region: 0x87}, - 53: {lang: 0x1a4, region: 0x99}, - 54: {lang: 0x39d, region: 0x99}, - 55: {lang: 0x529, region: 0x12e}, - 56: {lang: 0x254, region: 0xab}, + 49: {lang: 0x19b, region: 0x9a}, + 50: {lang: 0x19e, region: 0x131}, + 51: {lang: 0x3e9, region: 0x9a}, + 52: {lang: 0x136, region: 0x88}, + 53: {lang: 0x1a4, region: 0x9a}, + 54: {lang: 0x39d, region: 0x9a}, + 55: {lang: 0x529, region: 0x12f}, + 56: {lang: 0x254, region: 0xac}, 57: {lang: 0x529, region: 0x53}, - 58: {lang: 0x1cb, region: 0xe7}, + 58: {lang: 0x1cb, region: 0xe8}, 59: {lang: 0x529, region: 0x53}, - 60: {lang: 0x529, region: 0x12e}, - 61: {lang: 0x2fd, region: 0x9b}, - 62: {lang: 0x1bc, region: 0x97}, - 63: {lang: 0x200, region: 0xa2}, - 64: {lang: 0x1c5, region: 0x12b}, - 65: {lang: 0x1ca, region: 0xaf}, - 68: {lang: 0x1d5, region: 0x92}, - 70: {lang: 0x142, region: 0x9e}, - 71: {lang: 0x254, region: 0xab}, - 72: {lang: 0x20e, region: 0x95}, - 73: {lang: 0x200, region: 0xa2}, - 75: {lang: 0x135, region: 0xc4}, - 76: {lang: 0x200, region: 0xa2}, - 77: {lang: 0x3bb, region: 0xe8}, - 78: {lang: 0x24a, region: 0xa6}, - 79: {lang: 0x3fa, region: 0x99}, - 82: {lang: 0x251, region: 0x99}, - 83: {lang: 0x254, region: 0xab}, - 85: {lang: 0x88, region: 0x99}, - 86: {lang: 0x370, region: 0x123}, - 87: {lang: 0x2b8, region: 0xaf}, - 92: {lang: 0x29f, region: 0x99}, - 93: {lang: 0x2a8, region: 0x99}, - 94: {lang: 0x28f, region: 0x87}, - 95: {lang: 0x1a0, region: 0x87}, - 96: {lang: 0x2ac, region: 0x53}, - 98: {lang: 0x4f4, region: 0x12b}, - 99: {lang: 0x4f5, region: 0x12b}, - 100: {lang: 0x1be, region: 0x99}, - 102: {lang: 0x337, region: 0x9c}, - 103: {lang: 0x4f7, region: 0x53}, - 104: {lang: 0xa9, region: 0x53}, - 107: {lang: 0x2e8, region: 0x112}, - 108: {lang: 0x4f8, region: 0x10b}, - 109: {lang: 0x4f8, region: 0x10b}, - 110: {lang: 0x304, region: 0x99}, - 111: {lang: 0x31b, region: 0x99}, - 112: {lang: 0x30b, region: 0x53}, - 114: {lang: 0x31e, region: 0x35}, - 115: {lang: 0x30e, region: 0x99}, - 116: {lang: 0x414, region: 0xe8}, - 117: {lang: 0x331, region: 0xc4}, - 119: {lang: 0x4f9, region: 0x108}, - 120: {lang: 0x3b, region: 0xa1}, - 121: {lang: 0x353, region: 0xdb}, - 124: {lang: 0x2d0, region: 0x84}, - 125: {lang: 0x52a, region: 0x53}, - 126: {lang: 0x403, region: 0x96}, - 127: {lang: 0x3ee, region: 0x99}, - 128: {lang: 0x39b, region: 0xc5}, - 129: {lang: 0x395, region: 0x99}, - 130: {lang: 0x399, region: 0x135}, - 131: {lang: 0x429, region: 0x115}, - 133: {lang: 0x3b, region: 0x11c}, - 134: {lang: 0xfd, region: 0xc4}, - 137: {lang: 0x27d, region: 0x106}, - 138: {lang: 0x2c9, region: 0x53}, - 139: {lang: 0x39f, region: 0x9c}, - 140: {lang: 0x39f, region: 0x53}, - 142: {lang: 0x3ad, region: 0xb0}, - 144: {lang: 0x1c6, region: 0x53}, - 145: {lang: 0x4fd, region: 0x9c}, - 198: {lang: 0x3cb, region: 0x95}, - 201: {lang: 0x372, region: 0x10c}, - 202: {lang: 0x420, region: 0x97}, - 204: {lang: 0x4ff, region: 0x15e}, - 205: {lang: 0x3f0, region: 0x99}, - 206: {lang: 0x45, region: 0x135}, - 207: {lang: 0x139, region: 0x7b}, - 208: {lang: 0x3e9, region: 0x99}, - 210: {lang: 0x3e9, region: 0x99}, - 211: {lang: 0x3fa, region: 0x99}, - 212: {lang: 0x40c, region: 0xb3}, - 215: {lang: 0x433, region: 0x99}, - 216: {lang: 0xef, region: 0xc5}, - 217: {lang: 0x43e, region: 0x95}, - 218: {lang: 0x44d, region: 0x35}, - 219: {lang: 0x44e, region: 0x9b}, - 223: {lang: 0x45a, region: 0xe7}, - 224: {lang: 0x11a, region: 0x99}, - 225: {lang: 0x45e, region: 0x53}, - 226: {lang: 0x232, region: 0x53}, - 227: {lang: 0x450, region: 0x99}, - 228: {lang: 0x4a5, region: 0x53}, - 229: {lang: 0x9f, region: 0x13e}, - 230: {lang: 0x461, region: 0x99}, - 232: {lang: 0x528, region: 0xba}, - 233: {lang: 0x153, region: 0xe7}, - 234: {lang: 0x128, region: 0xcd}, - 235: {lang: 0x46b, region: 0x123}, - 236: {lang: 0xa9, region: 0x53}, - 237: {lang: 0x2ce, region: 0x99}, - 240: {lang: 0x4ad, region: 0x11c}, - 241: {lang: 0x4be, region: 0xb4}, - 244: {lang: 0x1ce, region: 0x99}, - 247: {lang: 0x3a9, region: 0x9c}, - 248: {lang: 0x22, region: 0x9b}, - 250: {lang: 0x1ea, region: 0x53}, - 251: {lang: 0xef, region: 0xc5}, + 60: {lang: 0x529, region: 0x12f}, + 61: {lang: 0x2fd, region: 0x9c}, + 62: {lang: 0x1bc, region: 0x98}, + 63: {lang: 0x200, region: 0xa3}, + 64: {lang: 0x1c5, region: 0x12c}, + 65: {lang: 0x1ca, region: 0xb0}, + 68: {lang: 0x1d5, region: 0x93}, + 70: {lang: 0x142, region: 0x9f}, + 71: {lang: 0x254, region: 0xac}, + 72: {lang: 0x20e, region: 0x96}, + 73: {lang: 0x200, region: 0xa3}, + 75: {lang: 0x135, region: 0xc5}, + 76: {lang: 0x200, region: 0xa3}, + 78: {lang: 0x3bb, region: 0xe9}, + 79: {lang: 0x24a, region: 0xa7}, + 80: {lang: 0x3fa, region: 0x9a}, + 83: {lang: 0x251, region: 0x9a}, + 84: {lang: 0x254, region: 0xac}, + 86: {lang: 0x88, region: 0x9a}, + 87: {lang: 0x370, region: 0x124}, + 88: {lang: 0x2b8, region: 0xb0}, + 93: {lang: 0x29f, region: 0x9a}, + 94: {lang: 0x2a8, region: 0x9a}, + 95: {lang: 0x28f, region: 0x88}, + 96: {lang: 0x1a0, region: 0x88}, + 97: {lang: 0x2ac, region: 0x53}, + 99: {lang: 0x4f4, region: 0x12c}, + 100: {lang: 0x4f5, region: 0x12c}, + 101: {lang: 0x1be, region: 0x9a}, + 103: {lang: 0x337, region: 0x9d}, + 104: {lang: 0x4f7, region: 0x53}, + 105: {lang: 0xa9, region: 0x53}, + 108: {lang: 0x2e8, region: 0x113}, + 109: {lang: 0x4f8, region: 0x10c}, + 110: {lang: 0x4f8, region: 0x10c}, + 111: {lang: 0x304, region: 0x9a}, + 112: {lang: 0x31b, region: 0x9a}, + 113: {lang: 0x30b, region: 0x53}, + 115: {lang: 0x31e, region: 0x35}, + 116: {lang: 0x30e, region: 0x9a}, + 117: {lang: 0x414, region: 0xe9}, + 118: {lang: 0x331, region: 0xc5}, + 121: {lang: 0x4f9, region: 0x109}, + 122: {lang: 0x3b, region: 0xa2}, + 123: {lang: 0x353, region: 0xdc}, + 126: {lang: 0x2d0, region: 0x85}, + 127: {lang: 0x52a, region: 0x53}, + 128: {lang: 0x403, region: 0x97}, + 129: {lang: 0x3ee, region: 0x9a}, + 130: {lang: 0x39b, region: 0xc6}, + 131: {lang: 0x395, region: 0x9a}, + 132: {lang: 0x399, region: 0x136}, + 133: {lang: 0x429, region: 0x116}, + 135: {lang: 0x3b, region: 0x11d}, + 136: {lang: 0xfd, region: 0xc5}, + 139: {lang: 0x27d, region: 0x107}, + 140: {lang: 0x2c9, region: 0x53}, + 141: {lang: 0x39f, region: 0x9d}, + 142: {lang: 0x39f, region: 0x53}, + 144: {lang: 0x3ad, region: 0xb1}, + 146: {lang: 0x1c6, region: 0x53}, + 147: {lang: 0x4fd, region: 0x9d}, + 200: {lang: 0x3cb, region: 0x96}, + 203: {lang: 0x372, region: 0x10d}, + 204: {lang: 0x420, region: 0x98}, + 206: {lang: 0x4ff, region: 0x15f}, + 207: {lang: 0x3f0, region: 0x9a}, + 208: {lang: 0x45, region: 0x136}, + 209: {lang: 0x139, region: 0x7c}, + 210: {lang: 0x3e9, region: 0x9a}, + 212: {lang: 0x3e9, region: 0x9a}, + 213: {lang: 0x3fa, region: 0x9a}, + 214: {lang: 0x40c, region: 0xb4}, + 217: {lang: 0x433, region: 0x9a}, + 218: {lang: 0xef, region: 0xc6}, + 219: {lang: 0x43e, region: 0x96}, + 221: {lang: 0x44d, region: 0x35}, + 222: {lang: 0x44e, region: 0x9c}, + 226: {lang: 0x45a, region: 0xe8}, + 227: {lang: 0x11a, region: 0x9a}, + 228: {lang: 0x45e, region: 0x53}, + 229: {lang: 0x232, region: 0x53}, + 230: {lang: 0x450, region: 0x9a}, + 231: {lang: 0x4a5, region: 0x53}, + 232: {lang: 0x9f, region: 0x13f}, + 233: {lang: 0x461, region: 0x9a}, + 235: {lang: 0x528, region: 0xbb}, + 236: {lang: 0x153, region: 0xe8}, + 237: {lang: 0x128, region: 0xce}, + 238: {lang: 0x46b, region: 0x124}, + 239: {lang: 0xa9, region: 0x53}, + 240: {lang: 0x2ce, region: 0x9a}, + 243: {lang: 0x4ad, region: 0x11d}, + 244: {lang: 0x4be, region: 0xb5}, + 247: {lang: 0x1ce, region: 0x9a}, + 250: {lang: 0x3a9, region: 0x9d}, + 251: {lang: 0x22, region: 0x9c}, + 253: {lang: 0x1ea, region: 0x53}, + 254: {lang: 0xef, region: 0xc6}, } type likelyScriptRegion struct { @@ -1557,1423 +1579,1423 @@ type likelyScriptRegion struct { // of the list in likelyLangList. // Size: 7980 bytes, 1330 elements var likelyLang = [1330]likelyScriptRegion{ - 0: {region: 0x135, script: 0x5a, flags: 0x0}, - 1: {region: 0x6f, script: 0x5a, flags: 0x0}, - 2: {region: 0x165, script: 0x5a, flags: 0x0}, - 3: {region: 0x165, script: 0x5a, flags: 0x0}, - 4: {region: 0x165, script: 0x5a, flags: 0x0}, - 5: {region: 0x7d, script: 0x20, flags: 0x0}, - 6: {region: 0x165, script: 0x5a, flags: 0x0}, - 7: {region: 0x165, script: 0x20, flags: 0x0}, - 8: {region: 0x80, script: 0x5a, flags: 0x0}, - 9: {region: 0x165, script: 0x5a, flags: 0x0}, - 10: {region: 0x165, script: 0x5a, flags: 0x0}, - 11: {region: 0x165, script: 0x5a, flags: 0x0}, - 12: {region: 0x95, script: 0x5a, flags: 0x0}, - 13: {region: 0x131, script: 0x5a, flags: 0x0}, - 14: {region: 0x80, script: 0x5a, flags: 0x0}, - 15: {region: 0x165, script: 0x5a, flags: 0x0}, - 16: {region: 0x165, script: 0x5a, flags: 0x0}, - 17: {region: 0x106, script: 0x20, flags: 0x0}, - 18: {region: 0x165, script: 0x5a, flags: 0x0}, - 19: {region: 0x9c, script: 0x9, flags: 0x0}, - 20: {region: 0x128, script: 0x5, flags: 0x0}, - 21: {region: 0x165, script: 0x5a, flags: 0x0}, - 22: {region: 0x161, script: 0x5a, flags: 0x0}, - 23: {region: 0x165, script: 0x5a, flags: 0x0}, - 24: {region: 0x165, script: 0x5a, flags: 0x0}, - 25: {region: 0x165, script: 0x5a, flags: 0x0}, - 26: {region: 0x165, script: 0x5a, flags: 0x0}, - 27: {region: 0x165, script: 0x5a, flags: 0x0}, - 28: {region: 0x52, script: 0x5a, flags: 0x0}, - 29: {region: 0x165, script: 0x5a, flags: 0x0}, - 30: {region: 0x165, script: 0x5a, flags: 0x0}, - 31: {region: 0x99, script: 0x4, flags: 0x0}, - 32: {region: 0x165, script: 0x5a, flags: 0x0}, - 33: {region: 0x80, script: 0x5a, flags: 0x0}, - 34: {region: 0x9b, script: 0xf8, flags: 0x0}, - 35: {region: 0x165, script: 0x5a, flags: 0x0}, - 36: {region: 0x165, script: 0x5a, flags: 0x0}, - 37: {region: 0x14d, script: 0x5a, flags: 0x0}, - 38: {region: 0x106, script: 0x20, flags: 0x0}, - 39: {region: 0x6f, script: 0x2c, flags: 0x0}, - 40: {region: 0x165, script: 0x5a, flags: 0x0}, - 41: {region: 0x165, script: 0x5a, flags: 0x0}, - 42: {region: 0xd6, script: 0x5a, flags: 0x0}, - 43: {region: 0x165, script: 0x5a, flags: 0x0}, - 45: {region: 0x165, script: 0x5a, flags: 0x0}, - 46: {region: 0x165, script: 0x5a, flags: 0x0}, - 47: {region: 0x165, script: 0x5a, flags: 0x0}, - 48: {region: 0x165, script: 0x5a, flags: 0x0}, - 49: {region: 0x165, script: 0x5a, flags: 0x0}, - 50: {region: 0x165, script: 0x5a, flags: 0x0}, - 51: {region: 0x95, script: 0x5a, flags: 0x0}, - 52: {region: 0x165, script: 0x5, flags: 0x0}, - 53: {region: 0x122, script: 0x5, flags: 0x0}, - 54: {region: 0x165, script: 0x5a, flags: 0x0}, - 55: {region: 0x165, script: 0x5a, flags: 0x0}, - 56: {region: 0x165, script: 0x5a, flags: 0x0}, - 57: {region: 0x165, script: 0x5a, flags: 0x0}, - 58: {region: 0x6b, script: 0x5, flags: 0x0}, + 0: {region: 0x136, script: 0x5b, flags: 0x0}, + 1: {region: 0x70, script: 0x5b, flags: 0x0}, + 2: {region: 0x166, script: 0x5b, flags: 0x0}, + 3: {region: 0x166, script: 0x5b, flags: 0x0}, + 4: {region: 0x166, script: 0x5b, flags: 0x0}, + 5: {region: 0x7e, script: 0x20, flags: 0x0}, + 6: {region: 0x166, script: 0x5b, flags: 0x0}, + 7: {region: 0x166, script: 0x20, flags: 0x0}, + 8: {region: 0x81, script: 0x5b, flags: 0x0}, + 9: {region: 0x166, script: 0x5b, flags: 0x0}, + 10: {region: 0x166, script: 0x5b, flags: 0x0}, + 11: {region: 0x166, script: 0x5b, flags: 0x0}, + 12: {region: 0x96, script: 0x5b, flags: 0x0}, + 13: {region: 0x132, script: 0x5b, flags: 0x0}, + 14: {region: 0x81, script: 0x5b, flags: 0x0}, + 15: {region: 0x166, script: 0x5b, flags: 0x0}, + 16: {region: 0x166, script: 0x5b, flags: 0x0}, + 17: {region: 0x107, script: 0x20, flags: 0x0}, + 18: {region: 0x166, script: 0x5b, flags: 0x0}, + 19: {region: 0x9d, script: 0x9, flags: 0x0}, + 20: {region: 0x129, script: 0x5, flags: 0x0}, + 21: {region: 0x166, script: 0x5b, flags: 0x0}, + 22: {region: 0x162, script: 0x5b, flags: 0x0}, + 23: {region: 0x166, script: 0x5b, flags: 0x0}, + 24: {region: 0x166, script: 0x5b, flags: 0x0}, + 25: {region: 0x166, script: 0x5b, flags: 0x0}, + 26: {region: 0x166, script: 0x5b, flags: 0x0}, + 27: {region: 0x166, script: 0x5b, flags: 0x0}, + 28: {region: 0x52, script: 0x5b, flags: 0x0}, + 29: {region: 0x166, script: 0x5b, flags: 0x0}, + 30: {region: 0x166, script: 0x5b, flags: 0x0}, + 31: {region: 0x9a, script: 0x4, flags: 0x0}, + 32: {region: 0x166, script: 0x5b, flags: 0x0}, + 33: {region: 0x81, script: 0x5b, flags: 0x0}, + 34: {region: 0x9c, script: 0xfb, flags: 0x0}, + 35: {region: 0x166, script: 0x5b, flags: 0x0}, + 36: {region: 0x166, script: 0x5b, flags: 0x0}, + 37: {region: 0x14e, script: 0x5b, flags: 0x0}, + 38: {region: 0x107, script: 0x20, flags: 0x0}, + 39: {region: 0x70, script: 0x2c, flags: 0x0}, + 40: {region: 0x166, script: 0x5b, flags: 0x0}, + 41: {region: 0x166, script: 0x5b, flags: 0x0}, + 42: {region: 0xd7, script: 0x5b, flags: 0x0}, + 43: {region: 0x166, script: 0x5b, flags: 0x0}, + 45: {region: 0x166, script: 0x5b, flags: 0x0}, + 46: {region: 0x166, script: 0x5b, flags: 0x0}, + 47: {region: 0x166, script: 0x5b, flags: 0x0}, + 48: {region: 0x166, script: 0x5b, flags: 0x0}, + 49: {region: 0x166, script: 0x5b, flags: 0x0}, + 50: {region: 0x166, script: 0x5b, flags: 0x0}, + 51: {region: 0x96, script: 0x5b, flags: 0x0}, + 52: {region: 0x166, script: 0x5, flags: 0x0}, + 53: {region: 0x123, script: 0x5, flags: 0x0}, + 54: {region: 0x166, script: 0x5b, flags: 0x0}, + 55: {region: 0x166, script: 0x5b, flags: 0x0}, + 56: {region: 0x166, script: 0x5b, flags: 0x0}, + 57: {region: 0x166, script: 0x5b, flags: 0x0}, + 58: {region: 0x6c, script: 0x5, flags: 0x0}, 59: {region: 0x0, script: 0x3, flags: 0x1}, - 60: {region: 0x165, script: 0x5a, flags: 0x0}, - 61: {region: 0x51, script: 0x5a, flags: 0x0}, - 62: {region: 0x3f, script: 0x5a, flags: 0x0}, - 63: {region: 0x67, script: 0x5, flags: 0x0}, - 65: {region: 0xba, script: 0x5, flags: 0x0}, - 66: {region: 0x6b, script: 0x5, flags: 0x0}, - 67: {region: 0x99, script: 0xe, flags: 0x0}, - 68: {region: 0x12f, script: 0x5a, flags: 0x0}, - 69: {region: 0x135, script: 0xce, flags: 0x0}, - 70: {region: 0x165, script: 0x5a, flags: 0x0}, - 71: {region: 0x165, script: 0x5a, flags: 0x0}, - 72: {region: 0x6e, script: 0x5a, flags: 0x0}, - 73: {region: 0x165, script: 0x5a, flags: 0x0}, - 74: {region: 0x165, script: 0x5a, flags: 0x0}, - 75: {region: 0x49, script: 0x5a, flags: 0x0}, - 76: {region: 0x165, script: 0x5a, flags: 0x0}, - 77: {region: 0x106, script: 0x20, flags: 0x0}, - 78: {region: 0x165, script: 0x5, flags: 0x0}, - 79: {region: 0x165, script: 0x5a, flags: 0x0}, - 80: {region: 0x165, script: 0x5a, flags: 0x0}, - 81: {region: 0x165, script: 0x5a, flags: 0x0}, - 82: {region: 0x99, script: 0x22, flags: 0x0}, - 83: {region: 0x165, script: 0x5a, flags: 0x0}, - 84: {region: 0x165, script: 0x5a, flags: 0x0}, - 85: {region: 0x165, script: 0x5a, flags: 0x0}, - 86: {region: 0x3f, script: 0x5a, flags: 0x0}, - 87: {region: 0x165, script: 0x5a, flags: 0x0}, + 60: {region: 0x166, script: 0x5b, flags: 0x0}, + 61: {region: 0x51, script: 0x5b, flags: 0x0}, + 62: {region: 0x3f, script: 0x5b, flags: 0x0}, + 63: {region: 0x68, script: 0x5, flags: 0x0}, + 65: {region: 0xbb, script: 0x5, flags: 0x0}, + 66: {region: 0x6c, script: 0x5, flags: 0x0}, + 67: {region: 0x9a, script: 0xe, flags: 0x0}, + 68: {region: 0x130, script: 0x5b, flags: 0x0}, + 69: {region: 0x136, script: 0xd0, flags: 0x0}, + 70: {region: 0x166, script: 0x5b, flags: 0x0}, + 71: {region: 0x166, script: 0x5b, flags: 0x0}, + 72: {region: 0x6f, script: 0x5b, flags: 0x0}, + 73: {region: 0x166, script: 0x5b, flags: 0x0}, + 74: {region: 0x166, script: 0x5b, flags: 0x0}, + 75: {region: 0x49, script: 0x5b, flags: 0x0}, + 76: {region: 0x166, script: 0x5b, flags: 0x0}, + 77: {region: 0x107, script: 0x20, flags: 0x0}, + 78: {region: 0x166, script: 0x5, flags: 0x0}, + 79: {region: 0x166, script: 0x5b, flags: 0x0}, + 80: {region: 0x166, script: 0x5b, flags: 0x0}, + 81: {region: 0x166, script: 0x5b, flags: 0x0}, + 82: {region: 0x9a, script: 0x22, flags: 0x0}, + 83: {region: 0x166, script: 0x5b, flags: 0x0}, + 84: {region: 0x166, script: 0x5b, flags: 0x0}, + 85: {region: 0x166, script: 0x5b, flags: 0x0}, + 86: {region: 0x3f, script: 0x5b, flags: 0x0}, + 87: {region: 0x166, script: 0x5b, flags: 0x0}, 88: {region: 0x3, script: 0x5, flags: 0x1}, - 89: {region: 0x106, script: 0x20, flags: 0x0}, - 90: {region: 0xe8, script: 0x5, flags: 0x0}, - 91: {region: 0x95, script: 0x5a, flags: 0x0}, - 92: {region: 0xdb, script: 0x22, flags: 0x0}, - 93: {region: 0x2e, script: 0x5a, flags: 0x0}, - 94: {region: 0x52, script: 0x5a, flags: 0x0}, - 95: {region: 0x165, script: 0x5a, flags: 0x0}, + 89: {region: 0x107, script: 0x20, flags: 0x0}, + 90: {region: 0xe9, script: 0x5, flags: 0x0}, + 91: {region: 0x96, script: 0x5b, flags: 0x0}, + 92: {region: 0xdc, script: 0x22, flags: 0x0}, + 93: {region: 0x2e, script: 0x5b, flags: 0x0}, + 94: {region: 0x52, script: 0x5b, flags: 0x0}, + 95: {region: 0x166, script: 0x5b, flags: 0x0}, 96: {region: 0x52, script: 0xb, flags: 0x0}, - 97: {region: 0x165, script: 0x5a, flags: 0x0}, - 98: {region: 0x165, script: 0x5a, flags: 0x0}, - 99: {region: 0x95, script: 0x5a, flags: 0x0}, - 100: {region: 0x165, script: 0x5a, flags: 0x0}, - 101: {region: 0x52, script: 0x5a, flags: 0x0}, - 102: {region: 0x165, script: 0x5a, flags: 0x0}, - 103: {region: 0x165, script: 0x5a, flags: 0x0}, - 104: {region: 0x165, script: 0x5a, flags: 0x0}, - 105: {region: 0x165, script: 0x5a, flags: 0x0}, - 106: {region: 0x4f, script: 0x5a, flags: 0x0}, - 107: {region: 0x165, script: 0x5a, flags: 0x0}, - 108: {region: 0x165, script: 0x5a, flags: 0x0}, - 109: {region: 0x165, script: 0x5a, flags: 0x0}, - 110: {region: 0x165, script: 0x2c, flags: 0x0}, - 111: {region: 0x165, script: 0x5a, flags: 0x0}, - 112: {region: 0x165, script: 0x5a, flags: 0x0}, + 97: {region: 0x166, script: 0x5b, flags: 0x0}, + 98: {region: 0x166, script: 0x5b, flags: 0x0}, + 99: {region: 0x96, script: 0x5b, flags: 0x0}, + 100: {region: 0x166, script: 0x5b, flags: 0x0}, + 101: {region: 0x52, script: 0x5b, flags: 0x0}, + 102: {region: 0x166, script: 0x5b, flags: 0x0}, + 103: {region: 0x166, script: 0x5b, flags: 0x0}, + 104: {region: 0x166, script: 0x5b, flags: 0x0}, + 105: {region: 0x166, script: 0x5b, flags: 0x0}, + 106: {region: 0x4f, script: 0x5b, flags: 0x0}, + 107: {region: 0x166, script: 0x5b, flags: 0x0}, + 108: {region: 0x166, script: 0x5b, flags: 0x0}, + 109: {region: 0x166, script: 0x5b, flags: 0x0}, + 110: {region: 0x166, script: 0x2c, flags: 0x0}, + 111: {region: 0x166, script: 0x5b, flags: 0x0}, + 112: {region: 0x166, script: 0x5b, flags: 0x0}, 113: {region: 0x47, script: 0x20, flags: 0x0}, - 114: {region: 0x165, script: 0x5a, flags: 0x0}, - 115: {region: 0x165, script: 0x5a, flags: 0x0}, - 116: {region: 0x10b, script: 0x5, flags: 0x0}, - 117: {region: 0x162, script: 0x5a, flags: 0x0}, - 118: {region: 0x165, script: 0x5a, flags: 0x0}, - 119: {region: 0x95, script: 0x5a, flags: 0x0}, - 120: {region: 0x165, script: 0x5a, flags: 0x0}, - 121: {region: 0x12f, script: 0x5a, flags: 0x0}, - 122: {region: 0x52, script: 0x5a, flags: 0x0}, - 123: {region: 0x99, script: 0xe3, flags: 0x0}, - 124: {region: 0xe8, script: 0x5, flags: 0x0}, - 125: {region: 0x99, script: 0x22, flags: 0x0}, + 114: {region: 0x166, script: 0x5b, flags: 0x0}, + 115: {region: 0x166, script: 0x5b, flags: 0x0}, + 116: {region: 0x10c, script: 0x5, flags: 0x0}, + 117: {region: 0x163, script: 0x5b, flags: 0x0}, + 118: {region: 0x166, script: 0x5b, flags: 0x0}, + 119: {region: 0x96, script: 0x5b, flags: 0x0}, + 120: {region: 0x166, script: 0x5b, flags: 0x0}, + 121: {region: 0x130, script: 0x5b, flags: 0x0}, + 122: {region: 0x52, script: 0x5b, flags: 0x0}, + 123: {region: 0x9a, script: 0xe6, flags: 0x0}, + 124: {region: 0xe9, script: 0x5, flags: 0x0}, + 125: {region: 0x9a, script: 0x22, flags: 0x0}, 126: {region: 0x38, script: 0x20, flags: 0x0}, - 127: {region: 0x99, script: 0x22, flags: 0x0}, - 128: {region: 0xe8, script: 0x5, flags: 0x0}, - 129: {region: 0x12b, script: 0x34, flags: 0x0}, - 131: {region: 0x99, script: 0x22, flags: 0x0}, - 132: {region: 0x165, script: 0x5a, flags: 0x0}, - 133: {region: 0x99, script: 0x22, flags: 0x0}, - 134: {region: 0xe7, script: 0x5a, flags: 0x0}, - 135: {region: 0x165, script: 0x5a, flags: 0x0}, - 136: {region: 0x99, script: 0x22, flags: 0x0}, - 137: {region: 0x165, script: 0x5a, flags: 0x0}, - 138: {region: 0x13f, script: 0x5a, flags: 0x0}, - 139: {region: 0x165, script: 0x5a, flags: 0x0}, - 140: {region: 0x165, script: 0x5a, flags: 0x0}, - 141: {region: 0xe7, script: 0x5a, flags: 0x0}, - 142: {region: 0x165, script: 0x5a, flags: 0x0}, - 143: {region: 0xd6, script: 0x5a, flags: 0x0}, - 144: {region: 0x165, script: 0x5a, flags: 0x0}, - 145: {region: 0x165, script: 0x5a, flags: 0x0}, - 146: {region: 0x165, script: 0x5a, flags: 0x0}, - 147: {region: 0x165, script: 0x2c, flags: 0x0}, - 148: {region: 0x99, script: 0x22, flags: 0x0}, - 149: {region: 0x95, script: 0x5a, flags: 0x0}, - 150: {region: 0x165, script: 0x5a, flags: 0x0}, - 151: {region: 0x165, script: 0x5a, flags: 0x0}, - 152: {region: 0x114, script: 0x5a, flags: 0x0}, - 153: {region: 0x165, script: 0x5a, flags: 0x0}, - 154: {region: 0x165, script: 0x5a, flags: 0x0}, - 155: {region: 0x52, script: 0x5a, flags: 0x0}, - 156: {region: 0x165, script: 0x5a, flags: 0x0}, - 157: {region: 0xe7, script: 0x5a, flags: 0x0}, - 158: {region: 0x165, script: 0x5a, flags: 0x0}, - 159: {region: 0x13e, script: 0xe5, flags: 0x0}, - 160: {region: 0xc3, script: 0x5a, flags: 0x0}, - 161: {region: 0x165, script: 0x5a, flags: 0x0}, - 162: {region: 0x165, script: 0x5a, flags: 0x0}, - 163: {region: 0xc3, script: 0x5a, flags: 0x0}, - 164: {region: 0x165, script: 0x5a, flags: 0x0}, + 127: {region: 0x9a, script: 0x22, flags: 0x0}, + 128: {region: 0xe9, script: 0x5, flags: 0x0}, + 129: {region: 0x12c, script: 0x34, flags: 0x0}, + 131: {region: 0x9a, script: 0x22, flags: 0x0}, + 132: {region: 0x166, script: 0x5b, flags: 0x0}, + 133: {region: 0x9a, script: 0x22, flags: 0x0}, + 134: {region: 0xe8, script: 0x5b, flags: 0x0}, + 135: {region: 0x166, script: 0x5b, flags: 0x0}, + 136: {region: 0x9a, script: 0x22, flags: 0x0}, + 137: {region: 0x166, script: 0x5b, flags: 0x0}, + 138: {region: 0x140, script: 0x5b, flags: 0x0}, + 139: {region: 0x166, script: 0x5b, flags: 0x0}, + 140: {region: 0x166, script: 0x5b, flags: 0x0}, + 141: {region: 0xe8, script: 0x5b, flags: 0x0}, + 142: {region: 0x166, script: 0x5b, flags: 0x0}, + 143: {region: 0xd7, script: 0x5b, flags: 0x0}, + 144: {region: 0x166, script: 0x5b, flags: 0x0}, + 145: {region: 0x166, script: 0x5b, flags: 0x0}, + 146: {region: 0x166, script: 0x5b, flags: 0x0}, + 147: {region: 0x166, script: 0x2c, flags: 0x0}, + 148: {region: 0x9a, script: 0x22, flags: 0x0}, + 149: {region: 0x96, script: 0x5b, flags: 0x0}, + 150: {region: 0x166, script: 0x5b, flags: 0x0}, + 151: {region: 0x166, script: 0x5b, flags: 0x0}, + 152: {region: 0x115, script: 0x5b, flags: 0x0}, + 153: {region: 0x166, script: 0x5b, flags: 0x0}, + 154: {region: 0x166, script: 0x5b, flags: 0x0}, + 155: {region: 0x52, script: 0x5b, flags: 0x0}, + 156: {region: 0x166, script: 0x5b, flags: 0x0}, + 157: {region: 0xe8, script: 0x5b, flags: 0x0}, + 158: {region: 0x166, script: 0x5b, flags: 0x0}, + 159: {region: 0x13f, script: 0xe8, flags: 0x0}, + 160: {region: 0xc4, script: 0x5b, flags: 0x0}, + 161: {region: 0x166, script: 0x5b, flags: 0x0}, + 162: {region: 0x166, script: 0x5b, flags: 0x0}, + 163: {region: 0xc4, script: 0x5b, flags: 0x0}, + 164: {region: 0x166, script: 0x5b, flags: 0x0}, 165: {region: 0x35, script: 0xe, flags: 0x0}, - 166: {region: 0x165, script: 0x5a, flags: 0x0}, - 167: {region: 0x165, script: 0x5a, flags: 0x0}, - 168: {region: 0x165, script: 0x5a, flags: 0x0}, - 169: {region: 0x53, script: 0xec, flags: 0x0}, - 170: {region: 0x165, script: 0x5a, flags: 0x0}, - 171: {region: 0x165, script: 0x5a, flags: 0x0}, - 172: {region: 0x165, script: 0x5a, flags: 0x0}, - 173: {region: 0x99, script: 0xe, flags: 0x0}, - 174: {region: 0x165, script: 0x5a, flags: 0x0}, - 175: {region: 0x9c, script: 0x5, flags: 0x0}, - 176: {region: 0x165, script: 0x5a, flags: 0x0}, - 177: {region: 0x4f, script: 0x5a, flags: 0x0}, - 178: {region: 0x78, script: 0x5a, flags: 0x0}, - 179: {region: 0x99, script: 0x22, flags: 0x0}, - 180: {region: 0xe8, script: 0x5, flags: 0x0}, - 181: {region: 0x99, script: 0x22, flags: 0x0}, - 182: {region: 0x165, script: 0x5a, flags: 0x0}, - 183: {region: 0x33, script: 0x5a, flags: 0x0}, - 184: {region: 0x165, script: 0x5a, flags: 0x0}, - 185: {region: 0xb4, script: 0xc, flags: 0x0}, - 186: {region: 0x52, script: 0x5a, flags: 0x0}, - 187: {region: 0x165, script: 0x2c, flags: 0x0}, - 188: {region: 0xe7, script: 0x5a, flags: 0x0}, - 189: {region: 0x165, script: 0x5a, flags: 0x0}, - 190: {region: 0xe8, script: 0x22, flags: 0x0}, - 191: {region: 0x106, script: 0x20, flags: 0x0}, - 192: {region: 0x15f, script: 0x5a, flags: 0x0}, - 193: {region: 0x165, script: 0x5a, flags: 0x0}, - 194: {region: 0x95, script: 0x5a, flags: 0x0}, - 195: {region: 0x165, script: 0x5a, flags: 0x0}, - 196: {region: 0x52, script: 0x5a, flags: 0x0}, - 197: {region: 0x165, script: 0x5a, flags: 0x0}, - 198: {region: 0x165, script: 0x5a, flags: 0x0}, - 199: {region: 0x165, script: 0x5a, flags: 0x0}, - 200: {region: 0x86, script: 0x5a, flags: 0x0}, - 201: {region: 0x165, script: 0x5a, flags: 0x0}, - 202: {region: 0x165, script: 0x5a, flags: 0x0}, - 203: {region: 0x165, script: 0x5a, flags: 0x0}, - 204: {region: 0x165, script: 0x5a, flags: 0x0}, - 205: {region: 0x6d, script: 0x2c, flags: 0x0}, - 206: {region: 0x165, script: 0x5a, flags: 0x0}, - 207: {region: 0x165, script: 0x5a, flags: 0x0}, - 208: {region: 0x52, script: 0x5a, flags: 0x0}, - 209: {region: 0x165, script: 0x5a, flags: 0x0}, - 210: {region: 0x165, script: 0x5a, flags: 0x0}, - 211: {region: 0xc3, script: 0x5a, flags: 0x0}, - 212: {region: 0x165, script: 0x5a, flags: 0x0}, - 213: {region: 0x165, script: 0x5a, flags: 0x0}, - 214: {region: 0x165, script: 0x5a, flags: 0x0}, - 215: {region: 0x6e, script: 0x5a, flags: 0x0}, - 216: {region: 0x165, script: 0x5a, flags: 0x0}, - 217: {region: 0x165, script: 0x5a, flags: 0x0}, - 218: {region: 0xd6, script: 0x5a, flags: 0x0}, + 166: {region: 0x166, script: 0x5b, flags: 0x0}, + 167: {region: 0x166, script: 0x5b, flags: 0x0}, + 168: {region: 0x166, script: 0x5b, flags: 0x0}, + 169: {region: 0x53, script: 0xef, flags: 0x0}, + 170: {region: 0x166, script: 0x5b, flags: 0x0}, + 171: {region: 0x166, script: 0x5b, flags: 0x0}, + 172: {region: 0x166, script: 0x5b, flags: 0x0}, + 173: {region: 0x9a, script: 0xe, flags: 0x0}, + 174: {region: 0x166, script: 0x5b, flags: 0x0}, + 175: {region: 0x9d, script: 0x5, flags: 0x0}, + 176: {region: 0x166, script: 0x5b, flags: 0x0}, + 177: {region: 0x4f, script: 0x5b, flags: 0x0}, + 178: {region: 0x79, script: 0x5b, flags: 0x0}, + 179: {region: 0x9a, script: 0x22, flags: 0x0}, + 180: {region: 0xe9, script: 0x5, flags: 0x0}, + 181: {region: 0x9a, script: 0x22, flags: 0x0}, + 182: {region: 0x166, script: 0x5b, flags: 0x0}, + 183: {region: 0x33, script: 0x5b, flags: 0x0}, + 184: {region: 0x166, script: 0x5b, flags: 0x0}, + 185: {region: 0xb5, script: 0xc, flags: 0x0}, + 186: {region: 0x52, script: 0x5b, flags: 0x0}, + 187: {region: 0x166, script: 0x2c, flags: 0x0}, + 188: {region: 0xe8, script: 0x5b, flags: 0x0}, + 189: {region: 0x166, script: 0x5b, flags: 0x0}, + 190: {region: 0xe9, script: 0x22, flags: 0x0}, + 191: {region: 0x107, script: 0x20, flags: 0x0}, + 192: {region: 0x160, script: 0x5b, flags: 0x0}, + 193: {region: 0x166, script: 0x5b, flags: 0x0}, + 194: {region: 0x96, script: 0x5b, flags: 0x0}, + 195: {region: 0x166, script: 0x5b, flags: 0x0}, + 196: {region: 0x52, script: 0x5b, flags: 0x0}, + 197: {region: 0x166, script: 0x5b, flags: 0x0}, + 198: {region: 0x166, script: 0x5b, flags: 0x0}, + 199: {region: 0x166, script: 0x5b, flags: 0x0}, + 200: {region: 0x87, script: 0x5b, flags: 0x0}, + 201: {region: 0x166, script: 0x5b, flags: 0x0}, + 202: {region: 0x166, script: 0x5b, flags: 0x0}, + 203: {region: 0x166, script: 0x5b, flags: 0x0}, + 204: {region: 0x166, script: 0x5b, flags: 0x0}, + 205: {region: 0x6e, script: 0x2c, flags: 0x0}, + 206: {region: 0x166, script: 0x5b, flags: 0x0}, + 207: {region: 0x166, script: 0x5b, flags: 0x0}, + 208: {region: 0x52, script: 0x5b, flags: 0x0}, + 209: {region: 0x166, script: 0x5b, flags: 0x0}, + 210: {region: 0x166, script: 0x5b, flags: 0x0}, + 211: {region: 0xc4, script: 0x5b, flags: 0x0}, + 212: {region: 0x166, script: 0x5b, flags: 0x0}, + 213: {region: 0x166, script: 0x5b, flags: 0x0}, + 214: {region: 0x166, script: 0x5b, flags: 0x0}, + 215: {region: 0x6f, script: 0x5b, flags: 0x0}, + 216: {region: 0x166, script: 0x5b, flags: 0x0}, + 217: {region: 0x166, script: 0x5b, flags: 0x0}, + 218: {region: 0xd7, script: 0x5b, flags: 0x0}, 219: {region: 0x35, script: 0x16, flags: 0x0}, - 220: {region: 0x106, script: 0x20, flags: 0x0}, - 221: {region: 0xe7, script: 0x5a, flags: 0x0}, - 222: {region: 0x165, script: 0x5a, flags: 0x0}, - 223: {region: 0x131, script: 0x5a, flags: 0x0}, - 224: {region: 0x8a, script: 0x5a, flags: 0x0}, - 225: {region: 0x75, script: 0x5a, flags: 0x0}, - 226: {region: 0x106, script: 0x20, flags: 0x0}, - 227: {region: 0x135, script: 0x5a, flags: 0x0}, - 228: {region: 0x49, script: 0x5a, flags: 0x0}, - 229: {region: 0x135, script: 0x1a, flags: 0x0}, - 230: {region: 0xa6, script: 0x5, flags: 0x0}, - 231: {region: 0x13e, script: 0x19, flags: 0x0}, - 232: {region: 0x165, script: 0x5a, flags: 0x0}, - 233: {region: 0x9b, script: 0x5, flags: 0x0}, - 234: {region: 0x165, script: 0x5a, flags: 0x0}, - 235: {region: 0x165, script: 0x5a, flags: 0x0}, - 236: {region: 0x165, script: 0x5a, flags: 0x0}, - 237: {region: 0x165, script: 0x5a, flags: 0x0}, - 238: {region: 0x165, script: 0x5a, flags: 0x0}, - 239: {region: 0xc5, script: 0xd8, flags: 0x0}, - 240: {region: 0x78, script: 0x5a, flags: 0x0}, - 241: {region: 0x6b, script: 0x1d, flags: 0x0}, - 242: {region: 0xe7, script: 0x5a, flags: 0x0}, + 220: {region: 0x107, script: 0x20, flags: 0x0}, + 221: {region: 0xe8, script: 0x5b, flags: 0x0}, + 222: {region: 0x166, script: 0x5b, flags: 0x0}, + 223: {region: 0x132, script: 0x5b, flags: 0x0}, + 224: {region: 0x8b, script: 0x5b, flags: 0x0}, + 225: {region: 0x76, script: 0x5b, flags: 0x0}, + 226: {region: 0x107, script: 0x20, flags: 0x0}, + 227: {region: 0x136, script: 0x5b, flags: 0x0}, + 228: {region: 0x49, script: 0x5b, flags: 0x0}, + 229: {region: 0x136, script: 0x1a, flags: 0x0}, + 230: {region: 0xa7, script: 0x5, flags: 0x0}, + 231: {region: 0x13f, script: 0x19, flags: 0x0}, + 232: {region: 0x166, script: 0x5b, flags: 0x0}, + 233: {region: 0x9c, script: 0x5, flags: 0x0}, + 234: {region: 0x166, script: 0x5b, flags: 0x0}, + 235: {region: 0x166, script: 0x5b, flags: 0x0}, + 236: {region: 0x166, script: 0x5b, flags: 0x0}, + 237: {region: 0x166, script: 0x5b, flags: 0x0}, + 238: {region: 0x166, script: 0x5b, flags: 0x0}, + 239: {region: 0xc6, script: 0xda, flags: 0x0}, + 240: {region: 0x79, script: 0x5b, flags: 0x0}, + 241: {region: 0x6c, script: 0x1d, flags: 0x0}, + 242: {region: 0xe8, script: 0x5b, flags: 0x0}, 243: {region: 0x49, script: 0x17, flags: 0x0}, - 244: {region: 0x130, script: 0x20, flags: 0x0}, + 244: {region: 0x131, script: 0x20, flags: 0x0}, 245: {region: 0x49, script: 0x17, flags: 0x0}, 246: {region: 0x49, script: 0x17, flags: 0x0}, 247: {region: 0x49, script: 0x17, flags: 0x0}, 248: {region: 0x49, script: 0x17, flags: 0x0}, - 249: {region: 0x10a, script: 0x5a, flags: 0x0}, - 250: {region: 0x5e, script: 0x5a, flags: 0x0}, - 251: {region: 0xe9, script: 0x5a, flags: 0x0}, + 249: {region: 0x10b, script: 0x5b, flags: 0x0}, + 250: {region: 0x5f, script: 0x5b, flags: 0x0}, + 251: {region: 0xea, script: 0x5b, flags: 0x0}, 252: {region: 0x49, script: 0x17, flags: 0x0}, - 253: {region: 0xc4, script: 0x86, flags: 0x0}, + 253: {region: 0xc5, script: 0x88, flags: 0x0}, 254: {region: 0x8, script: 0x2, flags: 0x1}, - 255: {region: 0x106, script: 0x20, flags: 0x0}, - 256: {region: 0x7b, script: 0x5a, flags: 0x0}, - 257: {region: 0x63, script: 0x5a, flags: 0x0}, - 258: {region: 0x165, script: 0x5a, flags: 0x0}, - 259: {region: 0x165, script: 0x5a, flags: 0x0}, - 260: {region: 0x165, script: 0x5a, flags: 0x0}, - 261: {region: 0x165, script: 0x5a, flags: 0x0}, - 262: {region: 0x135, script: 0x5a, flags: 0x0}, - 263: {region: 0x106, script: 0x20, flags: 0x0}, - 264: {region: 0xa4, script: 0x5a, flags: 0x0}, - 265: {region: 0x165, script: 0x5a, flags: 0x0}, - 266: {region: 0x165, script: 0x5a, flags: 0x0}, - 267: {region: 0x99, script: 0x5, flags: 0x0}, - 268: {region: 0x165, script: 0x5a, flags: 0x0}, - 269: {region: 0x60, script: 0x5a, flags: 0x0}, - 270: {region: 0x165, script: 0x5a, flags: 0x0}, - 271: {region: 0x49, script: 0x5a, flags: 0x0}, - 272: {region: 0x165, script: 0x5a, flags: 0x0}, - 273: {region: 0x165, script: 0x5a, flags: 0x0}, - 274: {region: 0x165, script: 0x5a, flags: 0x0}, - 275: {region: 0x165, script: 0x5, flags: 0x0}, - 276: {region: 0x49, script: 0x5a, flags: 0x0}, - 277: {region: 0x165, script: 0x5a, flags: 0x0}, - 278: {region: 0x165, script: 0x5a, flags: 0x0}, - 279: {region: 0xd4, script: 0x5a, flags: 0x0}, - 280: {region: 0x4f, script: 0x5a, flags: 0x0}, - 281: {region: 0x165, script: 0x5a, flags: 0x0}, - 282: {region: 0x99, script: 0x5, flags: 0x0}, - 283: {region: 0x165, script: 0x5a, flags: 0x0}, - 284: {region: 0x165, script: 0x5a, flags: 0x0}, - 285: {region: 0x165, script: 0x5a, flags: 0x0}, - 286: {region: 0x165, script: 0x2c, flags: 0x0}, - 287: {region: 0x60, script: 0x5a, flags: 0x0}, - 288: {region: 0xc3, script: 0x5a, flags: 0x0}, - 289: {region: 0xd0, script: 0x5a, flags: 0x0}, - 290: {region: 0x165, script: 0x5a, flags: 0x0}, - 291: {region: 0xdb, script: 0x22, flags: 0x0}, - 292: {region: 0x52, script: 0x5a, flags: 0x0}, - 293: {region: 0x165, script: 0x5a, flags: 0x0}, - 294: {region: 0x165, script: 0x5a, flags: 0x0}, - 295: {region: 0x165, script: 0x5a, flags: 0x0}, - 296: {region: 0xcd, script: 0xea, flags: 0x0}, - 297: {region: 0x165, script: 0x5a, flags: 0x0}, - 298: {region: 0x165, script: 0x5a, flags: 0x0}, - 299: {region: 0x114, script: 0x5a, flags: 0x0}, - 300: {region: 0x37, script: 0x5a, flags: 0x0}, - 301: {region: 0x43, script: 0xec, flags: 0x0}, - 302: {region: 0x165, script: 0x5a, flags: 0x0}, - 303: {region: 0xa4, script: 0x5a, flags: 0x0}, - 304: {region: 0x80, script: 0x5a, flags: 0x0}, - 305: {region: 0xd6, script: 0x5a, flags: 0x0}, - 306: {region: 0x9e, script: 0x5a, flags: 0x0}, - 307: {region: 0x6b, script: 0x29, flags: 0x0}, - 308: {region: 0x165, script: 0x5a, flags: 0x0}, - 309: {region: 0xc4, script: 0x4b, flags: 0x0}, - 310: {region: 0x87, script: 0x34, flags: 0x0}, - 311: {region: 0x165, script: 0x5a, flags: 0x0}, - 312: {region: 0x165, script: 0x5a, flags: 0x0}, + 255: {region: 0x107, script: 0x20, flags: 0x0}, + 256: {region: 0x7c, script: 0x5b, flags: 0x0}, + 257: {region: 0x64, script: 0x5b, flags: 0x0}, + 258: {region: 0x166, script: 0x5b, flags: 0x0}, + 259: {region: 0x166, script: 0x5b, flags: 0x0}, + 260: {region: 0x166, script: 0x5b, flags: 0x0}, + 261: {region: 0x166, script: 0x5b, flags: 0x0}, + 262: {region: 0x136, script: 0x5b, flags: 0x0}, + 263: {region: 0x107, script: 0x20, flags: 0x0}, + 264: {region: 0xa5, script: 0x5b, flags: 0x0}, + 265: {region: 0x166, script: 0x5b, flags: 0x0}, + 266: {region: 0x166, script: 0x5b, flags: 0x0}, + 267: {region: 0x9a, script: 0x5, flags: 0x0}, + 268: {region: 0x166, script: 0x5b, flags: 0x0}, + 269: {region: 0x61, script: 0x5b, flags: 0x0}, + 270: {region: 0x166, script: 0x5b, flags: 0x0}, + 271: {region: 0x49, script: 0x5b, flags: 0x0}, + 272: {region: 0x166, script: 0x5b, flags: 0x0}, + 273: {region: 0x166, script: 0x5b, flags: 0x0}, + 274: {region: 0x166, script: 0x5b, flags: 0x0}, + 275: {region: 0x166, script: 0x5, flags: 0x0}, + 276: {region: 0x49, script: 0x5b, flags: 0x0}, + 277: {region: 0x166, script: 0x5b, flags: 0x0}, + 278: {region: 0x166, script: 0x5b, flags: 0x0}, + 279: {region: 0xd5, script: 0x5b, flags: 0x0}, + 280: {region: 0x4f, script: 0x5b, flags: 0x0}, + 281: {region: 0x166, script: 0x5b, flags: 0x0}, + 282: {region: 0x9a, script: 0x5, flags: 0x0}, + 283: {region: 0x166, script: 0x5b, flags: 0x0}, + 284: {region: 0x166, script: 0x5b, flags: 0x0}, + 285: {region: 0x166, script: 0x5b, flags: 0x0}, + 286: {region: 0x166, script: 0x2c, flags: 0x0}, + 287: {region: 0x61, script: 0x5b, flags: 0x0}, + 288: {region: 0xc4, script: 0x5b, flags: 0x0}, + 289: {region: 0xd1, script: 0x5b, flags: 0x0}, + 290: {region: 0x166, script: 0x5b, flags: 0x0}, + 291: {region: 0xdc, script: 0x22, flags: 0x0}, + 292: {region: 0x52, script: 0x5b, flags: 0x0}, + 293: {region: 0x166, script: 0x5b, flags: 0x0}, + 294: {region: 0x166, script: 0x5b, flags: 0x0}, + 295: {region: 0x166, script: 0x5b, flags: 0x0}, + 296: {region: 0xce, script: 0xed, flags: 0x0}, + 297: {region: 0x166, script: 0x5b, flags: 0x0}, + 298: {region: 0x166, script: 0x5b, flags: 0x0}, + 299: {region: 0x115, script: 0x5b, flags: 0x0}, + 300: {region: 0x37, script: 0x5b, flags: 0x0}, + 301: {region: 0x43, script: 0xef, flags: 0x0}, + 302: {region: 0x166, script: 0x5b, flags: 0x0}, + 303: {region: 0xa5, script: 0x5b, flags: 0x0}, + 304: {region: 0x81, script: 0x5b, flags: 0x0}, + 305: {region: 0xd7, script: 0x5b, flags: 0x0}, + 306: {region: 0x9f, script: 0x5b, flags: 0x0}, + 307: {region: 0x6c, script: 0x29, flags: 0x0}, + 308: {region: 0x166, script: 0x5b, flags: 0x0}, + 309: {region: 0xc5, script: 0x4b, flags: 0x0}, + 310: {region: 0x88, script: 0x34, flags: 0x0}, + 311: {region: 0x166, script: 0x5b, flags: 0x0}, + 312: {region: 0x166, script: 0x5b, flags: 0x0}, 313: {region: 0xa, script: 0x2, flags: 0x1}, - 314: {region: 0x165, script: 0x5a, flags: 0x0}, - 315: {region: 0x165, script: 0x5a, flags: 0x0}, - 316: {region: 0x1, script: 0x5a, flags: 0x0}, - 317: {region: 0x165, script: 0x5a, flags: 0x0}, - 318: {region: 0x6e, script: 0x5a, flags: 0x0}, - 319: {region: 0x135, script: 0x5a, flags: 0x0}, - 320: {region: 0x6a, script: 0x5a, flags: 0x0}, - 321: {region: 0x165, script: 0x5a, flags: 0x0}, - 322: {region: 0x9e, script: 0x46, flags: 0x0}, - 323: {region: 0x165, script: 0x5a, flags: 0x0}, - 324: {region: 0x165, script: 0x5a, flags: 0x0}, - 325: {region: 0x6e, script: 0x5a, flags: 0x0}, - 326: {region: 0x52, script: 0x5a, flags: 0x0}, - 327: {region: 0x6e, script: 0x5a, flags: 0x0}, - 328: {region: 0x9c, script: 0x5, flags: 0x0}, - 329: {region: 0x165, script: 0x5a, flags: 0x0}, - 330: {region: 0x165, script: 0x5a, flags: 0x0}, - 331: {region: 0x165, script: 0x5a, flags: 0x0}, - 332: {region: 0x165, script: 0x5a, flags: 0x0}, - 333: {region: 0x86, script: 0x5a, flags: 0x0}, + 314: {region: 0x166, script: 0x5b, flags: 0x0}, + 315: {region: 0x166, script: 0x5b, flags: 0x0}, + 316: {region: 0x1, script: 0x5b, flags: 0x0}, + 317: {region: 0x166, script: 0x5b, flags: 0x0}, + 318: {region: 0x6f, script: 0x5b, flags: 0x0}, + 319: {region: 0x136, script: 0x5b, flags: 0x0}, + 320: {region: 0x6b, script: 0x5b, flags: 0x0}, + 321: {region: 0x166, script: 0x5b, flags: 0x0}, + 322: {region: 0x9f, script: 0x46, flags: 0x0}, + 323: {region: 0x166, script: 0x5b, flags: 0x0}, + 324: {region: 0x166, script: 0x5b, flags: 0x0}, + 325: {region: 0x6f, script: 0x5b, flags: 0x0}, + 326: {region: 0x52, script: 0x5b, flags: 0x0}, + 327: {region: 0x6f, script: 0x5b, flags: 0x0}, + 328: {region: 0x9d, script: 0x5, flags: 0x0}, + 329: {region: 0x166, script: 0x5b, flags: 0x0}, + 330: {region: 0x166, script: 0x5b, flags: 0x0}, + 331: {region: 0x166, script: 0x5b, flags: 0x0}, + 332: {region: 0x166, script: 0x5b, flags: 0x0}, + 333: {region: 0x87, script: 0x5b, flags: 0x0}, 334: {region: 0xc, script: 0x2, flags: 0x1}, - 335: {region: 0x165, script: 0x5a, flags: 0x0}, - 336: {region: 0xc3, script: 0x5a, flags: 0x0}, - 337: {region: 0x72, script: 0x5a, flags: 0x0}, - 338: {region: 0x10b, script: 0x5, flags: 0x0}, - 339: {region: 0xe7, script: 0x5a, flags: 0x0}, - 340: {region: 0x10c, script: 0x5a, flags: 0x0}, - 341: {region: 0x73, script: 0x5a, flags: 0x0}, - 342: {region: 0x165, script: 0x5a, flags: 0x0}, - 343: {region: 0x165, script: 0x5a, flags: 0x0}, - 344: {region: 0x76, script: 0x5a, flags: 0x0}, - 345: {region: 0x165, script: 0x5a, flags: 0x0}, - 346: {region: 0x3b, script: 0x5a, flags: 0x0}, - 347: {region: 0x165, script: 0x5a, flags: 0x0}, - 348: {region: 0x165, script: 0x5a, flags: 0x0}, - 349: {region: 0x165, script: 0x5a, flags: 0x0}, - 350: {region: 0x78, script: 0x5a, flags: 0x0}, - 351: {region: 0x135, script: 0x5a, flags: 0x0}, - 352: {region: 0x78, script: 0x5a, flags: 0x0}, - 353: {region: 0x60, script: 0x5a, flags: 0x0}, - 354: {region: 0x60, script: 0x5a, flags: 0x0}, + 335: {region: 0x166, script: 0x5b, flags: 0x0}, + 336: {region: 0xc4, script: 0x5b, flags: 0x0}, + 337: {region: 0x73, script: 0x5b, flags: 0x0}, + 338: {region: 0x10c, script: 0x5, flags: 0x0}, + 339: {region: 0xe8, script: 0x5b, flags: 0x0}, + 340: {region: 0x10d, script: 0x5b, flags: 0x0}, + 341: {region: 0x74, script: 0x5b, flags: 0x0}, + 342: {region: 0x166, script: 0x5b, flags: 0x0}, + 343: {region: 0x166, script: 0x5b, flags: 0x0}, + 344: {region: 0x77, script: 0x5b, flags: 0x0}, + 345: {region: 0x166, script: 0x5b, flags: 0x0}, + 346: {region: 0x3b, script: 0x5b, flags: 0x0}, + 347: {region: 0x166, script: 0x5b, flags: 0x0}, + 348: {region: 0x166, script: 0x5b, flags: 0x0}, + 349: {region: 0x166, script: 0x5b, flags: 0x0}, + 350: {region: 0x79, script: 0x5b, flags: 0x0}, + 351: {region: 0x136, script: 0x5b, flags: 0x0}, + 352: {region: 0x79, script: 0x5b, flags: 0x0}, + 353: {region: 0x61, script: 0x5b, flags: 0x0}, + 354: {region: 0x61, script: 0x5b, flags: 0x0}, 355: {region: 0x52, script: 0x5, flags: 0x0}, - 356: {region: 0x140, script: 0x5a, flags: 0x0}, - 357: {region: 0x165, script: 0x5a, flags: 0x0}, - 358: {region: 0x84, script: 0x5a, flags: 0x0}, - 359: {region: 0x165, script: 0x5a, flags: 0x0}, - 360: {region: 0xd4, script: 0x5a, flags: 0x0}, - 361: {region: 0x9e, script: 0x5a, flags: 0x0}, - 362: {region: 0xd6, script: 0x5a, flags: 0x0}, - 363: {region: 0x165, script: 0x5a, flags: 0x0}, - 364: {region: 0x10b, script: 0x5a, flags: 0x0}, - 365: {region: 0xd9, script: 0x5a, flags: 0x0}, - 366: {region: 0x96, script: 0x5a, flags: 0x0}, - 367: {region: 0x80, script: 0x5a, flags: 0x0}, - 368: {region: 0x165, script: 0x5a, flags: 0x0}, - 369: {region: 0xbc, script: 0x5a, flags: 0x0}, - 370: {region: 0x165, script: 0x5a, flags: 0x0}, - 371: {region: 0x165, script: 0x5a, flags: 0x0}, - 372: {region: 0x165, script: 0x5a, flags: 0x0}, + 356: {region: 0x141, script: 0x5b, flags: 0x0}, + 357: {region: 0x166, script: 0x5b, flags: 0x0}, + 358: {region: 0x85, script: 0x5b, flags: 0x0}, + 359: {region: 0x166, script: 0x5b, flags: 0x0}, + 360: {region: 0xd5, script: 0x5b, flags: 0x0}, + 361: {region: 0x9f, script: 0x5b, flags: 0x0}, + 362: {region: 0xd7, script: 0x5b, flags: 0x0}, + 363: {region: 0x166, script: 0x5b, flags: 0x0}, + 364: {region: 0x10c, script: 0x5b, flags: 0x0}, + 365: {region: 0xda, script: 0x5b, flags: 0x0}, + 366: {region: 0x97, script: 0x5b, flags: 0x0}, + 367: {region: 0x81, script: 0x5b, flags: 0x0}, + 368: {region: 0x166, script: 0x5b, flags: 0x0}, + 369: {region: 0xbd, script: 0x5b, flags: 0x0}, + 370: {region: 0x166, script: 0x5b, flags: 0x0}, + 371: {region: 0x166, script: 0x5b, flags: 0x0}, + 372: {region: 0x166, script: 0x5b, flags: 0x0}, 373: {region: 0x53, script: 0x3b, flags: 0x0}, - 374: {region: 0x165, script: 0x5a, flags: 0x0}, - 375: {region: 0x95, script: 0x5a, flags: 0x0}, - 376: {region: 0x165, script: 0x5a, flags: 0x0}, - 377: {region: 0x165, script: 0x5a, flags: 0x0}, - 378: {region: 0x99, script: 0x22, flags: 0x0}, - 379: {region: 0x165, script: 0x5a, flags: 0x0}, - 380: {region: 0x9c, script: 0x5, flags: 0x0}, - 381: {region: 0x7e, script: 0x5a, flags: 0x0}, - 382: {region: 0x7b, script: 0x5a, flags: 0x0}, - 383: {region: 0x165, script: 0x5a, flags: 0x0}, - 384: {region: 0x165, script: 0x5a, flags: 0x0}, - 385: {region: 0x165, script: 0x5a, flags: 0x0}, - 386: {region: 0x165, script: 0x5a, flags: 0x0}, - 387: {region: 0x165, script: 0x5a, flags: 0x0}, - 388: {region: 0x165, script: 0x5a, flags: 0x0}, - 389: {region: 0x6f, script: 0x2c, flags: 0x0}, - 390: {region: 0x165, script: 0x5a, flags: 0x0}, - 391: {region: 0xdb, script: 0x22, flags: 0x0}, - 392: {region: 0x165, script: 0x5a, flags: 0x0}, - 393: {region: 0xa7, script: 0x5a, flags: 0x0}, - 394: {region: 0x165, script: 0x5a, flags: 0x0}, - 395: {region: 0xe8, script: 0x5, flags: 0x0}, - 396: {region: 0x165, script: 0x5a, flags: 0x0}, - 397: {region: 0xe8, script: 0x5, flags: 0x0}, - 398: {region: 0x165, script: 0x5a, flags: 0x0}, - 399: {region: 0x165, script: 0x5a, flags: 0x0}, - 400: {region: 0x6e, script: 0x5a, flags: 0x0}, - 401: {region: 0x9c, script: 0x5, flags: 0x0}, - 402: {region: 0x165, script: 0x5a, flags: 0x0}, - 403: {region: 0x165, script: 0x2c, flags: 0x0}, - 404: {region: 0xf1, script: 0x5a, flags: 0x0}, - 405: {region: 0x165, script: 0x5a, flags: 0x0}, - 406: {region: 0x165, script: 0x5a, flags: 0x0}, - 407: {region: 0x165, script: 0x5a, flags: 0x0}, - 408: {region: 0x165, script: 0x2c, flags: 0x0}, - 409: {region: 0x165, script: 0x5a, flags: 0x0}, - 410: {region: 0x99, script: 0x22, flags: 0x0}, - 411: {region: 0x99, script: 0xe6, flags: 0x0}, - 412: {region: 0x95, script: 0x5a, flags: 0x0}, - 413: {region: 0xd9, script: 0x5a, flags: 0x0}, - 414: {region: 0x130, script: 0x32, flags: 0x0}, - 415: {region: 0x165, script: 0x5a, flags: 0x0}, + 374: {region: 0x166, script: 0x5b, flags: 0x0}, + 375: {region: 0x96, script: 0x5b, flags: 0x0}, + 376: {region: 0x166, script: 0x5b, flags: 0x0}, + 377: {region: 0x166, script: 0x5b, flags: 0x0}, + 378: {region: 0x9a, script: 0x22, flags: 0x0}, + 379: {region: 0x166, script: 0x5b, flags: 0x0}, + 380: {region: 0x9d, script: 0x5, flags: 0x0}, + 381: {region: 0x7f, script: 0x5b, flags: 0x0}, + 382: {region: 0x7c, script: 0x5b, flags: 0x0}, + 383: {region: 0x166, script: 0x5b, flags: 0x0}, + 384: {region: 0x166, script: 0x5b, flags: 0x0}, + 385: {region: 0x166, script: 0x5b, flags: 0x0}, + 386: {region: 0x166, script: 0x5b, flags: 0x0}, + 387: {region: 0x166, script: 0x5b, flags: 0x0}, + 388: {region: 0x166, script: 0x5b, flags: 0x0}, + 389: {region: 0x70, script: 0x2c, flags: 0x0}, + 390: {region: 0x166, script: 0x5b, flags: 0x0}, + 391: {region: 0xdc, script: 0x22, flags: 0x0}, + 392: {region: 0x166, script: 0x5b, flags: 0x0}, + 393: {region: 0xa8, script: 0x5b, flags: 0x0}, + 394: {region: 0x166, script: 0x5b, flags: 0x0}, + 395: {region: 0xe9, script: 0x5, flags: 0x0}, + 396: {region: 0x166, script: 0x5b, flags: 0x0}, + 397: {region: 0xe9, script: 0x5, flags: 0x0}, + 398: {region: 0x166, script: 0x5b, flags: 0x0}, + 399: {region: 0x166, script: 0x5b, flags: 0x0}, + 400: {region: 0x6f, script: 0x5b, flags: 0x0}, + 401: {region: 0x9d, script: 0x5, flags: 0x0}, + 402: {region: 0x166, script: 0x5b, flags: 0x0}, + 403: {region: 0x166, script: 0x2c, flags: 0x0}, + 404: {region: 0xf2, script: 0x5b, flags: 0x0}, + 405: {region: 0x166, script: 0x5b, flags: 0x0}, + 406: {region: 0x166, script: 0x5b, flags: 0x0}, + 407: {region: 0x166, script: 0x5b, flags: 0x0}, + 408: {region: 0x166, script: 0x2c, flags: 0x0}, + 409: {region: 0x166, script: 0x5b, flags: 0x0}, + 410: {region: 0x9a, script: 0x22, flags: 0x0}, + 411: {region: 0x9a, script: 0xe9, flags: 0x0}, + 412: {region: 0x96, script: 0x5b, flags: 0x0}, + 413: {region: 0xda, script: 0x5b, flags: 0x0}, + 414: {region: 0x131, script: 0x32, flags: 0x0}, + 415: {region: 0x166, script: 0x5b, flags: 0x0}, 416: {region: 0xe, script: 0x2, flags: 0x1}, - 417: {region: 0x99, script: 0xe, flags: 0x0}, - 418: {region: 0x165, script: 0x5a, flags: 0x0}, - 419: {region: 0x4e, script: 0x5a, flags: 0x0}, - 420: {region: 0x99, script: 0x35, flags: 0x0}, - 421: {region: 0x41, script: 0x5a, flags: 0x0}, - 422: {region: 0x54, script: 0x5a, flags: 0x0}, - 423: {region: 0x165, script: 0x5a, flags: 0x0}, - 424: {region: 0x80, script: 0x5a, flags: 0x0}, - 425: {region: 0x165, script: 0x5a, flags: 0x0}, - 426: {region: 0x165, script: 0x5a, flags: 0x0}, - 427: {region: 0xa4, script: 0x5a, flags: 0x0}, - 428: {region: 0x98, script: 0x5a, flags: 0x0}, - 429: {region: 0x165, script: 0x5a, flags: 0x0}, - 430: {region: 0xdb, script: 0x22, flags: 0x0}, - 431: {region: 0x165, script: 0x5a, flags: 0x0}, - 432: {region: 0x165, script: 0x5, flags: 0x0}, - 433: {region: 0x49, script: 0x5a, flags: 0x0}, - 434: {region: 0x165, script: 0x5, flags: 0x0}, - 435: {region: 0x165, script: 0x5a, flags: 0x0}, + 417: {region: 0x9a, script: 0xe, flags: 0x0}, + 418: {region: 0x166, script: 0x5b, flags: 0x0}, + 419: {region: 0x4e, script: 0x5b, flags: 0x0}, + 420: {region: 0x9a, script: 0x35, flags: 0x0}, + 421: {region: 0x41, script: 0x5b, flags: 0x0}, + 422: {region: 0x54, script: 0x5b, flags: 0x0}, + 423: {region: 0x166, script: 0x5b, flags: 0x0}, + 424: {region: 0x81, script: 0x5b, flags: 0x0}, + 425: {region: 0x166, script: 0x5b, flags: 0x0}, + 426: {region: 0x166, script: 0x5b, flags: 0x0}, + 427: {region: 0xa5, script: 0x5b, flags: 0x0}, + 428: {region: 0x99, script: 0x5b, flags: 0x0}, + 429: {region: 0x166, script: 0x5b, flags: 0x0}, + 430: {region: 0xdc, script: 0x22, flags: 0x0}, + 431: {region: 0x166, script: 0x5b, flags: 0x0}, + 432: {region: 0x166, script: 0x5, flags: 0x0}, + 433: {region: 0x49, script: 0x5b, flags: 0x0}, + 434: {region: 0x166, script: 0x5, flags: 0x0}, + 435: {region: 0x166, script: 0x5b, flags: 0x0}, 436: {region: 0x10, script: 0x3, flags: 0x1}, - 437: {region: 0x165, script: 0x5a, flags: 0x0}, + 437: {region: 0x166, script: 0x5b, flags: 0x0}, 438: {region: 0x53, script: 0x3b, flags: 0x0}, - 439: {region: 0x165, script: 0x5a, flags: 0x0}, - 440: {region: 0x135, script: 0x5a, flags: 0x0}, + 439: {region: 0x166, script: 0x5b, flags: 0x0}, + 440: {region: 0x136, script: 0x5b, flags: 0x0}, 441: {region: 0x24, script: 0x5, flags: 0x0}, - 442: {region: 0x165, script: 0x5a, flags: 0x0}, - 443: {region: 0x165, script: 0x2c, flags: 0x0}, - 444: {region: 0x97, script: 0x3e, flags: 0x0}, - 445: {region: 0x165, script: 0x5a, flags: 0x0}, - 446: {region: 0x99, script: 0x22, flags: 0x0}, - 447: {region: 0x165, script: 0x5a, flags: 0x0}, - 448: {region: 0x73, script: 0x5a, flags: 0x0}, - 449: {region: 0x165, script: 0x5a, flags: 0x0}, - 450: {region: 0x165, script: 0x5a, flags: 0x0}, - 451: {region: 0xe7, script: 0x5a, flags: 0x0}, - 452: {region: 0x165, script: 0x5a, flags: 0x0}, - 453: {region: 0x12b, script: 0x40, flags: 0x0}, - 454: {region: 0x53, script: 0x90, flags: 0x0}, - 455: {region: 0x165, script: 0x5a, flags: 0x0}, - 456: {region: 0xe8, script: 0x5, flags: 0x0}, - 457: {region: 0x99, script: 0x22, flags: 0x0}, - 458: {region: 0xaf, script: 0x41, flags: 0x0}, - 459: {region: 0xe7, script: 0x5a, flags: 0x0}, - 460: {region: 0xe8, script: 0x5, flags: 0x0}, - 461: {region: 0xe6, script: 0x5a, flags: 0x0}, - 462: {region: 0x99, script: 0x22, flags: 0x0}, - 463: {region: 0x99, script: 0x22, flags: 0x0}, - 464: {region: 0x165, script: 0x5a, flags: 0x0}, - 465: {region: 0x90, script: 0x5a, flags: 0x0}, - 466: {region: 0x60, script: 0x5a, flags: 0x0}, + 442: {region: 0x166, script: 0x5b, flags: 0x0}, + 443: {region: 0x166, script: 0x2c, flags: 0x0}, + 444: {region: 0x98, script: 0x3e, flags: 0x0}, + 445: {region: 0x166, script: 0x5b, flags: 0x0}, + 446: {region: 0x9a, script: 0x22, flags: 0x0}, + 447: {region: 0x166, script: 0x5b, flags: 0x0}, + 448: {region: 0x74, script: 0x5b, flags: 0x0}, + 449: {region: 0x166, script: 0x5b, flags: 0x0}, + 450: {region: 0x166, script: 0x5b, flags: 0x0}, + 451: {region: 0xe8, script: 0x5b, flags: 0x0}, + 452: {region: 0x166, script: 0x5b, flags: 0x0}, + 453: {region: 0x12c, script: 0x40, flags: 0x0}, + 454: {region: 0x53, script: 0x92, flags: 0x0}, + 455: {region: 0x166, script: 0x5b, flags: 0x0}, + 456: {region: 0xe9, script: 0x5, flags: 0x0}, + 457: {region: 0x9a, script: 0x22, flags: 0x0}, + 458: {region: 0xb0, script: 0x41, flags: 0x0}, + 459: {region: 0xe8, script: 0x5b, flags: 0x0}, + 460: {region: 0xe9, script: 0x5, flags: 0x0}, + 461: {region: 0xe7, script: 0x5b, flags: 0x0}, + 462: {region: 0x9a, script: 0x22, flags: 0x0}, + 463: {region: 0x9a, script: 0x22, flags: 0x0}, + 464: {region: 0x166, script: 0x5b, flags: 0x0}, + 465: {region: 0x91, script: 0x5b, flags: 0x0}, + 466: {region: 0x61, script: 0x5b, flags: 0x0}, 467: {region: 0x53, script: 0x3b, flags: 0x0}, - 468: {region: 0x91, script: 0x5a, flags: 0x0}, - 469: {region: 0x92, script: 0x5a, flags: 0x0}, - 470: {region: 0x165, script: 0x5a, flags: 0x0}, + 468: {region: 0x92, script: 0x5b, flags: 0x0}, + 469: {region: 0x93, script: 0x5b, flags: 0x0}, + 470: {region: 0x166, script: 0x5b, flags: 0x0}, 471: {region: 0x28, script: 0x8, flags: 0x0}, - 472: {region: 0xd2, script: 0x5a, flags: 0x0}, - 473: {region: 0x78, script: 0x5a, flags: 0x0}, - 474: {region: 0x165, script: 0x5a, flags: 0x0}, - 475: {region: 0x165, script: 0x5a, flags: 0x0}, - 476: {region: 0xd0, script: 0x5a, flags: 0x0}, - 477: {region: 0xd6, script: 0x5a, flags: 0x0}, - 478: {region: 0x165, script: 0x5a, flags: 0x0}, - 479: {region: 0x165, script: 0x5a, flags: 0x0}, - 480: {region: 0x165, script: 0x5a, flags: 0x0}, - 481: {region: 0x95, script: 0x5a, flags: 0x0}, - 482: {region: 0x165, script: 0x5a, flags: 0x0}, - 483: {region: 0x165, script: 0x5a, flags: 0x0}, - 484: {region: 0x165, script: 0x5a, flags: 0x0}, - 486: {region: 0x122, script: 0x5a, flags: 0x0}, - 487: {region: 0xd6, script: 0x5a, flags: 0x0}, - 488: {region: 0x165, script: 0x5a, flags: 0x0}, - 489: {region: 0x165, script: 0x5a, flags: 0x0}, - 490: {region: 0x53, script: 0xfa, flags: 0x0}, - 491: {region: 0x165, script: 0x5a, flags: 0x0}, - 492: {region: 0x135, script: 0x5a, flags: 0x0}, - 493: {region: 0x165, script: 0x5a, flags: 0x0}, - 494: {region: 0x49, script: 0x5a, flags: 0x0}, - 495: {region: 0x165, script: 0x5a, flags: 0x0}, - 496: {region: 0x165, script: 0x5a, flags: 0x0}, - 497: {region: 0xe7, script: 0x5a, flags: 0x0}, - 498: {region: 0x165, script: 0x5a, flags: 0x0}, - 499: {region: 0x95, script: 0x5a, flags: 0x0}, - 500: {region: 0x106, script: 0x20, flags: 0x0}, - 501: {region: 0x1, script: 0x5a, flags: 0x0}, - 502: {region: 0x165, script: 0x5a, flags: 0x0}, - 503: {region: 0x165, script: 0x5a, flags: 0x0}, - 504: {region: 0x9d, script: 0x5a, flags: 0x0}, - 505: {region: 0x9e, script: 0x5a, flags: 0x0}, + 472: {region: 0xd3, script: 0x5b, flags: 0x0}, + 473: {region: 0x79, script: 0x5b, flags: 0x0}, + 474: {region: 0x166, script: 0x5b, flags: 0x0}, + 475: {region: 0x166, script: 0x5b, flags: 0x0}, + 476: {region: 0xd1, script: 0x5b, flags: 0x0}, + 477: {region: 0xd7, script: 0x5b, flags: 0x0}, + 478: {region: 0x166, script: 0x5b, flags: 0x0}, + 479: {region: 0x166, script: 0x5b, flags: 0x0}, + 480: {region: 0x166, script: 0x5b, flags: 0x0}, + 481: {region: 0x96, script: 0x5b, flags: 0x0}, + 482: {region: 0x166, script: 0x5b, flags: 0x0}, + 483: {region: 0x166, script: 0x5b, flags: 0x0}, + 484: {region: 0x166, script: 0x5b, flags: 0x0}, + 486: {region: 0x123, script: 0x5b, flags: 0x0}, + 487: {region: 0xd7, script: 0x5b, flags: 0x0}, + 488: {region: 0x166, script: 0x5b, flags: 0x0}, + 489: {region: 0x166, script: 0x5b, flags: 0x0}, + 490: {region: 0x53, script: 0xfd, flags: 0x0}, + 491: {region: 0x166, script: 0x5b, flags: 0x0}, + 492: {region: 0x136, script: 0x5b, flags: 0x0}, + 493: {region: 0x166, script: 0x5b, flags: 0x0}, + 494: {region: 0x49, script: 0x5b, flags: 0x0}, + 495: {region: 0x166, script: 0x5b, flags: 0x0}, + 496: {region: 0x166, script: 0x5b, flags: 0x0}, + 497: {region: 0xe8, script: 0x5b, flags: 0x0}, + 498: {region: 0x166, script: 0x5b, flags: 0x0}, + 499: {region: 0x96, script: 0x5b, flags: 0x0}, + 500: {region: 0x107, script: 0x20, flags: 0x0}, + 501: {region: 0x1, script: 0x5b, flags: 0x0}, + 502: {region: 0x166, script: 0x5b, flags: 0x0}, + 503: {region: 0x166, script: 0x5b, flags: 0x0}, + 504: {region: 0x9e, script: 0x5b, flags: 0x0}, + 505: {region: 0x9f, script: 0x5b, flags: 0x0}, 506: {region: 0x49, script: 0x17, flags: 0x0}, - 507: {region: 0x97, script: 0x3e, flags: 0x0}, - 508: {region: 0x165, script: 0x5a, flags: 0x0}, - 509: {region: 0x165, script: 0x5a, flags: 0x0}, - 510: {region: 0x106, script: 0x5a, flags: 0x0}, - 511: {region: 0x165, script: 0x5a, flags: 0x0}, - 512: {region: 0xa2, script: 0x49, flags: 0x0}, - 513: {region: 0x165, script: 0x5a, flags: 0x0}, - 514: {region: 0xa0, script: 0x5a, flags: 0x0}, - 515: {region: 0x1, script: 0x5a, flags: 0x0}, - 516: {region: 0x165, script: 0x5a, flags: 0x0}, - 517: {region: 0x165, script: 0x5a, flags: 0x0}, - 518: {region: 0x165, script: 0x5a, flags: 0x0}, - 519: {region: 0x52, script: 0x5a, flags: 0x0}, - 520: {region: 0x130, script: 0x3e, flags: 0x0}, - 521: {region: 0x165, script: 0x5a, flags: 0x0}, - 522: {region: 0x12f, script: 0x5a, flags: 0x0}, - 523: {region: 0xdb, script: 0x22, flags: 0x0}, - 524: {region: 0x165, script: 0x5a, flags: 0x0}, - 525: {region: 0x63, script: 0x5a, flags: 0x0}, - 526: {region: 0x95, script: 0x5a, flags: 0x0}, - 527: {region: 0x95, script: 0x5a, flags: 0x0}, - 528: {region: 0x7d, script: 0x2e, flags: 0x0}, - 529: {region: 0x137, script: 0x20, flags: 0x0}, - 530: {region: 0x67, script: 0x5a, flags: 0x0}, - 531: {region: 0xc4, script: 0x5a, flags: 0x0}, - 532: {region: 0x165, script: 0x5a, flags: 0x0}, - 533: {region: 0x165, script: 0x5a, flags: 0x0}, - 534: {region: 0xd6, script: 0x5a, flags: 0x0}, - 535: {region: 0xa4, script: 0x5a, flags: 0x0}, - 536: {region: 0xc3, script: 0x5a, flags: 0x0}, - 537: {region: 0x106, script: 0x20, flags: 0x0}, - 538: {region: 0x165, script: 0x5a, flags: 0x0}, - 539: {region: 0x165, script: 0x5a, flags: 0x0}, - 540: {region: 0x165, script: 0x5a, flags: 0x0}, - 541: {region: 0x165, script: 0x5a, flags: 0x0}, - 542: {region: 0xd4, script: 0x5, flags: 0x0}, - 543: {region: 0xd6, script: 0x5a, flags: 0x0}, - 544: {region: 0x164, script: 0x5a, flags: 0x0}, - 545: {region: 0x165, script: 0x5a, flags: 0x0}, - 546: {region: 0x165, script: 0x5a, flags: 0x0}, - 547: {region: 0x12f, script: 0x5a, flags: 0x0}, - 548: {region: 0x122, script: 0x5, flags: 0x0}, - 549: {region: 0x165, script: 0x5a, flags: 0x0}, - 550: {region: 0x123, script: 0xeb, flags: 0x0}, - 551: {region: 0x5a, script: 0x5a, flags: 0x0}, - 552: {region: 0x52, script: 0x5a, flags: 0x0}, - 553: {region: 0x165, script: 0x5a, flags: 0x0}, - 554: {region: 0x4f, script: 0x5a, flags: 0x0}, - 555: {region: 0x99, script: 0x22, flags: 0x0}, - 556: {region: 0x99, script: 0x22, flags: 0x0}, - 557: {region: 0x4b, script: 0x5a, flags: 0x0}, - 558: {region: 0x95, script: 0x5a, flags: 0x0}, - 559: {region: 0x165, script: 0x5a, flags: 0x0}, - 560: {region: 0x41, script: 0x5a, flags: 0x0}, - 561: {region: 0x99, script: 0x5a, flags: 0x0}, - 562: {region: 0x53, script: 0xe2, flags: 0x0}, - 563: {region: 0x99, script: 0x22, flags: 0x0}, - 564: {region: 0xc3, script: 0x5a, flags: 0x0}, - 565: {region: 0x165, script: 0x5a, flags: 0x0}, - 566: {region: 0x99, script: 0x75, flags: 0x0}, - 567: {region: 0xe8, script: 0x5, flags: 0x0}, - 568: {region: 0x165, script: 0x5a, flags: 0x0}, - 569: {region: 0xa4, script: 0x5a, flags: 0x0}, - 570: {region: 0x165, script: 0x5a, flags: 0x0}, - 571: {region: 0x12b, script: 0x5a, flags: 0x0}, - 572: {region: 0x165, script: 0x5a, flags: 0x0}, - 573: {region: 0xd2, script: 0x5a, flags: 0x0}, - 574: {region: 0x165, script: 0x5a, flags: 0x0}, - 575: {region: 0xaf, script: 0x57, flags: 0x0}, - 576: {region: 0x165, script: 0x5a, flags: 0x0}, - 577: {region: 0x165, script: 0x5a, flags: 0x0}, + 507: {region: 0x98, script: 0x3e, flags: 0x0}, + 508: {region: 0x166, script: 0x5b, flags: 0x0}, + 509: {region: 0x166, script: 0x5b, flags: 0x0}, + 510: {region: 0x107, script: 0x5b, flags: 0x0}, + 511: {region: 0x166, script: 0x5b, flags: 0x0}, + 512: {region: 0xa3, script: 0x49, flags: 0x0}, + 513: {region: 0x166, script: 0x5b, flags: 0x0}, + 514: {region: 0xa1, script: 0x5b, flags: 0x0}, + 515: {region: 0x1, script: 0x5b, flags: 0x0}, + 516: {region: 0x166, script: 0x5b, flags: 0x0}, + 517: {region: 0x166, script: 0x5b, flags: 0x0}, + 518: {region: 0x166, script: 0x5b, flags: 0x0}, + 519: {region: 0x52, script: 0x5b, flags: 0x0}, + 520: {region: 0x131, script: 0x3e, flags: 0x0}, + 521: {region: 0x166, script: 0x5b, flags: 0x0}, + 522: {region: 0x130, script: 0x5b, flags: 0x0}, + 523: {region: 0xdc, script: 0x22, flags: 0x0}, + 524: {region: 0x166, script: 0x5b, flags: 0x0}, + 525: {region: 0x64, script: 0x5b, flags: 0x0}, + 526: {region: 0x96, script: 0x5b, flags: 0x0}, + 527: {region: 0x96, script: 0x5b, flags: 0x0}, + 528: {region: 0x7e, script: 0x2e, flags: 0x0}, + 529: {region: 0x138, script: 0x20, flags: 0x0}, + 530: {region: 0x68, script: 0x5b, flags: 0x0}, + 531: {region: 0xc5, script: 0x5b, flags: 0x0}, + 532: {region: 0x166, script: 0x5b, flags: 0x0}, + 533: {region: 0x166, script: 0x5b, flags: 0x0}, + 534: {region: 0xd7, script: 0x5b, flags: 0x0}, + 535: {region: 0xa5, script: 0x5b, flags: 0x0}, + 536: {region: 0xc4, script: 0x5b, flags: 0x0}, + 537: {region: 0x107, script: 0x20, flags: 0x0}, + 538: {region: 0x166, script: 0x5b, flags: 0x0}, + 539: {region: 0x166, script: 0x5b, flags: 0x0}, + 540: {region: 0x166, script: 0x5b, flags: 0x0}, + 541: {region: 0x166, script: 0x5b, flags: 0x0}, + 542: {region: 0xd5, script: 0x5, flags: 0x0}, + 543: {region: 0xd7, script: 0x5b, flags: 0x0}, + 544: {region: 0x165, script: 0x5b, flags: 0x0}, + 545: {region: 0x166, script: 0x5b, flags: 0x0}, + 546: {region: 0x166, script: 0x5b, flags: 0x0}, + 547: {region: 0x130, script: 0x5b, flags: 0x0}, + 548: {region: 0x123, script: 0x5, flags: 0x0}, + 549: {region: 0x166, script: 0x5b, flags: 0x0}, + 550: {region: 0x124, script: 0xee, flags: 0x0}, + 551: {region: 0x5b, script: 0x5b, flags: 0x0}, + 552: {region: 0x52, script: 0x5b, flags: 0x0}, + 553: {region: 0x166, script: 0x5b, flags: 0x0}, + 554: {region: 0x4f, script: 0x5b, flags: 0x0}, + 555: {region: 0x9a, script: 0x22, flags: 0x0}, + 556: {region: 0x9a, script: 0x22, flags: 0x0}, + 557: {region: 0x4b, script: 0x5b, flags: 0x0}, + 558: {region: 0x96, script: 0x5b, flags: 0x0}, + 559: {region: 0x166, script: 0x5b, flags: 0x0}, + 560: {region: 0x41, script: 0x5b, flags: 0x0}, + 561: {region: 0x9a, script: 0x5b, flags: 0x0}, + 562: {region: 0x53, script: 0xe5, flags: 0x0}, + 563: {region: 0x9a, script: 0x22, flags: 0x0}, + 564: {region: 0xc4, script: 0x5b, flags: 0x0}, + 565: {region: 0x166, script: 0x5b, flags: 0x0}, + 566: {region: 0x9a, script: 0x76, flags: 0x0}, + 567: {region: 0xe9, script: 0x5, flags: 0x0}, + 568: {region: 0x166, script: 0x5b, flags: 0x0}, + 569: {region: 0xa5, script: 0x5b, flags: 0x0}, + 570: {region: 0x166, script: 0x5b, flags: 0x0}, + 571: {region: 0x12c, script: 0x5b, flags: 0x0}, + 572: {region: 0x166, script: 0x5b, flags: 0x0}, + 573: {region: 0xd3, script: 0x5b, flags: 0x0}, + 574: {region: 0x166, script: 0x5b, flags: 0x0}, + 575: {region: 0xb0, script: 0x58, flags: 0x0}, + 576: {region: 0x166, script: 0x5b, flags: 0x0}, + 577: {region: 0x166, script: 0x5b, flags: 0x0}, 578: {region: 0x13, script: 0x6, flags: 0x1}, - 579: {region: 0x165, script: 0x5a, flags: 0x0}, - 580: {region: 0x52, script: 0x5a, flags: 0x0}, - 581: {region: 0x82, script: 0x5a, flags: 0x0}, - 582: {region: 0xa4, script: 0x5a, flags: 0x0}, - 583: {region: 0x165, script: 0x5a, flags: 0x0}, - 584: {region: 0x165, script: 0x5a, flags: 0x0}, - 585: {region: 0x165, script: 0x5a, flags: 0x0}, - 586: {region: 0xa6, script: 0x4e, flags: 0x0}, - 587: {region: 0x2a, script: 0x5a, flags: 0x0}, - 588: {region: 0x165, script: 0x5a, flags: 0x0}, - 589: {region: 0x165, script: 0x5a, flags: 0x0}, - 590: {region: 0x165, script: 0x5a, flags: 0x0}, - 591: {region: 0x165, script: 0x5a, flags: 0x0}, - 592: {region: 0x165, script: 0x5a, flags: 0x0}, - 593: {region: 0x99, script: 0x52, flags: 0x0}, - 594: {region: 0x8b, script: 0x5a, flags: 0x0}, - 595: {region: 0x165, script: 0x5a, flags: 0x0}, - 596: {region: 0xab, script: 0x53, flags: 0x0}, - 597: {region: 0x106, script: 0x20, flags: 0x0}, - 598: {region: 0x99, script: 0x22, flags: 0x0}, - 599: {region: 0x165, script: 0x5a, flags: 0x0}, - 600: {region: 0x75, script: 0x5a, flags: 0x0}, - 601: {region: 0x165, script: 0x5a, flags: 0x0}, - 602: {region: 0xb4, script: 0x5a, flags: 0x0}, - 603: {region: 0x165, script: 0x5a, flags: 0x0}, - 604: {region: 0x165, script: 0x5a, flags: 0x0}, - 605: {region: 0x165, script: 0x5a, flags: 0x0}, - 606: {region: 0x165, script: 0x5a, flags: 0x0}, - 607: {region: 0x165, script: 0x5a, flags: 0x0}, - 608: {region: 0x165, script: 0x5a, flags: 0x0}, - 609: {region: 0x165, script: 0x5a, flags: 0x0}, - 610: {region: 0x165, script: 0x2c, flags: 0x0}, - 611: {region: 0x165, script: 0x5a, flags: 0x0}, - 612: {region: 0x106, script: 0x20, flags: 0x0}, - 613: {region: 0x112, script: 0x5a, flags: 0x0}, - 614: {region: 0xe7, script: 0x5a, flags: 0x0}, - 615: {region: 0x106, script: 0x5a, flags: 0x0}, - 616: {region: 0x165, script: 0x5a, flags: 0x0}, - 617: {region: 0x99, script: 0x22, flags: 0x0}, - 618: {region: 0x99, script: 0x5, flags: 0x0}, - 619: {region: 0x12f, script: 0x5a, flags: 0x0}, - 620: {region: 0x165, script: 0x5a, flags: 0x0}, - 621: {region: 0x52, script: 0x5a, flags: 0x0}, - 622: {region: 0x60, script: 0x5a, flags: 0x0}, - 623: {region: 0x165, script: 0x5a, flags: 0x0}, - 624: {region: 0x165, script: 0x5a, flags: 0x0}, - 625: {region: 0x165, script: 0x2c, flags: 0x0}, - 626: {region: 0x165, script: 0x5a, flags: 0x0}, - 627: {region: 0x165, script: 0x5a, flags: 0x0}, + 579: {region: 0x166, script: 0x5b, flags: 0x0}, + 580: {region: 0x52, script: 0x5b, flags: 0x0}, + 581: {region: 0x83, script: 0x5b, flags: 0x0}, + 582: {region: 0xa5, script: 0x5b, flags: 0x0}, + 583: {region: 0x166, script: 0x5b, flags: 0x0}, + 584: {region: 0x166, script: 0x5b, flags: 0x0}, + 585: {region: 0x166, script: 0x5b, flags: 0x0}, + 586: {region: 0xa7, script: 0x4f, flags: 0x0}, + 587: {region: 0x2a, script: 0x5b, flags: 0x0}, + 588: {region: 0x166, script: 0x5b, flags: 0x0}, + 589: {region: 0x166, script: 0x5b, flags: 0x0}, + 590: {region: 0x166, script: 0x5b, flags: 0x0}, + 591: {region: 0x166, script: 0x5b, flags: 0x0}, + 592: {region: 0x166, script: 0x5b, flags: 0x0}, + 593: {region: 0x9a, script: 0x53, flags: 0x0}, + 594: {region: 0x8c, script: 0x5b, flags: 0x0}, + 595: {region: 0x166, script: 0x5b, flags: 0x0}, + 596: {region: 0xac, script: 0x54, flags: 0x0}, + 597: {region: 0x107, script: 0x20, flags: 0x0}, + 598: {region: 0x9a, script: 0x22, flags: 0x0}, + 599: {region: 0x166, script: 0x5b, flags: 0x0}, + 600: {region: 0x76, script: 0x5b, flags: 0x0}, + 601: {region: 0x166, script: 0x5b, flags: 0x0}, + 602: {region: 0xb5, script: 0x5b, flags: 0x0}, + 603: {region: 0x166, script: 0x5b, flags: 0x0}, + 604: {region: 0x166, script: 0x5b, flags: 0x0}, + 605: {region: 0x166, script: 0x5b, flags: 0x0}, + 606: {region: 0x166, script: 0x5b, flags: 0x0}, + 607: {region: 0x166, script: 0x5b, flags: 0x0}, + 608: {region: 0x166, script: 0x5b, flags: 0x0}, + 609: {region: 0x166, script: 0x5b, flags: 0x0}, + 610: {region: 0x166, script: 0x2c, flags: 0x0}, + 611: {region: 0x166, script: 0x5b, flags: 0x0}, + 612: {region: 0x107, script: 0x20, flags: 0x0}, + 613: {region: 0x113, script: 0x5b, flags: 0x0}, + 614: {region: 0xe8, script: 0x5b, flags: 0x0}, + 615: {region: 0x107, script: 0x5b, flags: 0x0}, + 616: {region: 0x166, script: 0x5b, flags: 0x0}, + 617: {region: 0x9a, script: 0x22, flags: 0x0}, + 618: {region: 0x9a, script: 0x5, flags: 0x0}, + 619: {region: 0x130, script: 0x5b, flags: 0x0}, + 620: {region: 0x166, script: 0x5b, flags: 0x0}, + 621: {region: 0x52, script: 0x5b, flags: 0x0}, + 622: {region: 0x61, script: 0x5b, flags: 0x0}, + 623: {region: 0x166, script: 0x5b, flags: 0x0}, + 624: {region: 0x166, script: 0x5b, flags: 0x0}, + 625: {region: 0x166, script: 0x2c, flags: 0x0}, + 626: {region: 0x166, script: 0x5b, flags: 0x0}, + 627: {region: 0x166, script: 0x5b, flags: 0x0}, 628: {region: 0x19, script: 0x3, flags: 0x1}, - 629: {region: 0x165, script: 0x5a, flags: 0x0}, - 630: {region: 0x165, script: 0x5a, flags: 0x0}, - 631: {region: 0x165, script: 0x5a, flags: 0x0}, - 632: {region: 0x165, script: 0x5a, flags: 0x0}, - 633: {region: 0x106, script: 0x20, flags: 0x0}, - 634: {region: 0x165, script: 0x5a, flags: 0x0}, - 635: {region: 0x165, script: 0x5a, flags: 0x0}, - 636: {region: 0x165, script: 0x5a, flags: 0x0}, - 637: {region: 0x106, script: 0x20, flags: 0x0}, - 638: {region: 0x165, script: 0x5a, flags: 0x0}, - 639: {region: 0x95, script: 0x5a, flags: 0x0}, - 640: {region: 0xe8, script: 0x5, flags: 0x0}, - 641: {region: 0x7b, script: 0x5a, flags: 0x0}, - 642: {region: 0x165, script: 0x5a, flags: 0x0}, - 643: {region: 0x165, script: 0x5a, flags: 0x0}, - 644: {region: 0x165, script: 0x5a, flags: 0x0}, - 645: {region: 0x165, script: 0x2c, flags: 0x0}, - 646: {region: 0x123, script: 0xeb, flags: 0x0}, - 647: {region: 0xe8, script: 0x5, flags: 0x0}, - 648: {region: 0x165, script: 0x5a, flags: 0x0}, - 649: {region: 0x165, script: 0x5a, flags: 0x0}, + 629: {region: 0x166, script: 0x5b, flags: 0x0}, + 630: {region: 0x166, script: 0x5b, flags: 0x0}, + 631: {region: 0x166, script: 0x5b, flags: 0x0}, + 632: {region: 0x166, script: 0x5b, flags: 0x0}, + 633: {region: 0x107, script: 0x20, flags: 0x0}, + 634: {region: 0x166, script: 0x5b, flags: 0x0}, + 635: {region: 0x166, script: 0x5b, flags: 0x0}, + 636: {region: 0x166, script: 0x5b, flags: 0x0}, + 637: {region: 0x107, script: 0x20, flags: 0x0}, + 638: {region: 0x166, script: 0x5b, flags: 0x0}, + 639: {region: 0x96, script: 0x5b, flags: 0x0}, + 640: {region: 0xe9, script: 0x5, flags: 0x0}, + 641: {region: 0x7c, script: 0x5b, flags: 0x0}, + 642: {region: 0x166, script: 0x5b, flags: 0x0}, + 643: {region: 0x166, script: 0x5b, flags: 0x0}, + 644: {region: 0x166, script: 0x5b, flags: 0x0}, + 645: {region: 0x166, script: 0x2c, flags: 0x0}, + 646: {region: 0x124, script: 0xee, flags: 0x0}, + 647: {region: 0xe9, script: 0x5, flags: 0x0}, + 648: {region: 0x166, script: 0x5b, flags: 0x0}, + 649: {region: 0x166, script: 0x5b, flags: 0x0}, 650: {region: 0x1c, script: 0x5, flags: 0x1}, - 651: {region: 0x165, script: 0x5a, flags: 0x0}, - 652: {region: 0x165, script: 0x5a, flags: 0x0}, - 653: {region: 0x165, script: 0x5a, flags: 0x0}, - 654: {region: 0x138, script: 0x5a, flags: 0x0}, - 655: {region: 0x87, script: 0x5e, flags: 0x0}, - 656: {region: 0x97, script: 0x3e, flags: 0x0}, - 657: {region: 0x12f, script: 0x5a, flags: 0x0}, - 658: {region: 0xe8, script: 0x5, flags: 0x0}, - 659: {region: 0x131, script: 0x5a, flags: 0x0}, - 660: {region: 0x165, script: 0x5a, flags: 0x0}, - 661: {region: 0xb7, script: 0x5a, flags: 0x0}, - 662: {region: 0x106, script: 0x20, flags: 0x0}, - 663: {region: 0x165, script: 0x5a, flags: 0x0}, - 664: {region: 0x95, script: 0x5a, flags: 0x0}, - 665: {region: 0x165, script: 0x5a, flags: 0x0}, - 666: {region: 0x53, script: 0xeb, flags: 0x0}, - 667: {region: 0x165, script: 0x5a, flags: 0x0}, - 668: {region: 0x165, script: 0x5a, flags: 0x0}, - 669: {region: 0x165, script: 0x5a, flags: 0x0}, - 670: {region: 0x165, script: 0x5a, flags: 0x0}, - 671: {region: 0x99, script: 0x5c, flags: 0x0}, - 672: {region: 0x165, script: 0x5a, flags: 0x0}, - 673: {region: 0x165, script: 0x5a, flags: 0x0}, - 674: {region: 0x106, script: 0x20, flags: 0x0}, - 675: {region: 0x131, script: 0x5a, flags: 0x0}, - 676: {region: 0x165, script: 0x5a, flags: 0x0}, - 677: {region: 0xd9, script: 0x5a, flags: 0x0}, - 678: {region: 0x165, script: 0x5a, flags: 0x0}, - 679: {region: 0x165, script: 0x5a, flags: 0x0}, + 651: {region: 0x166, script: 0x5b, flags: 0x0}, + 652: {region: 0x166, script: 0x5b, flags: 0x0}, + 653: {region: 0x166, script: 0x5b, flags: 0x0}, + 654: {region: 0x139, script: 0x5b, flags: 0x0}, + 655: {region: 0x88, script: 0x5f, flags: 0x0}, + 656: {region: 0x98, script: 0x3e, flags: 0x0}, + 657: {region: 0x130, script: 0x5b, flags: 0x0}, + 658: {region: 0xe9, script: 0x5, flags: 0x0}, + 659: {region: 0x132, script: 0x5b, flags: 0x0}, + 660: {region: 0x166, script: 0x5b, flags: 0x0}, + 661: {region: 0xb8, script: 0x5b, flags: 0x0}, + 662: {region: 0x107, script: 0x20, flags: 0x0}, + 663: {region: 0x166, script: 0x5b, flags: 0x0}, + 664: {region: 0x96, script: 0x5b, flags: 0x0}, + 665: {region: 0x166, script: 0x5b, flags: 0x0}, + 666: {region: 0x53, script: 0xee, flags: 0x0}, + 667: {region: 0x166, script: 0x5b, flags: 0x0}, + 668: {region: 0x166, script: 0x5b, flags: 0x0}, + 669: {region: 0x166, script: 0x5b, flags: 0x0}, + 670: {region: 0x166, script: 0x5b, flags: 0x0}, + 671: {region: 0x9a, script: 0x5d, flags: 0x0}, + 672: {region: 0x166, script: 0x5b, flags: 0x0}, + 673: {region: 0x166, script: 0x5b, flags: 0x0}, + 674: {region: 0x107, script: 0x20, flags: 0x0}, + 675: {region: 0x132, script: 0x5b, flags: 0x0}, + 676: {region: 0x166, script: 0x5b, flags: 0x0}, + 677: {region: 0xda, script: 0x5b, flags: 0x0}, + 678: {region: 0x166, script: 0x5b, flags: 0x0}, + 679: {region: 0x166, script: 0x5b, flags: 0x0}, 680: {region: 0x21, script: 0x2, flags: 0x1}, - 681: {region: 0x165, script: 0x5a, flags: 0x0}, - 682: {region: 0x165, script: 0x5a, flags: 0x0}, - 683: {region: 0x9e, script: 0x5a, flags: 0x0}, - 684: {region: 0x53, script: 0x60, flags: 0x0}, - 685: {region: 0x95, script: 0x5a, flags: 0x0}, - 686: {region: 0x9c, script: 0x5, flags: 0x0}, - 687: {region: 0x135, script: 0x5a, flags: 0x0}, - 688: {region: 0x165, script: 0x5a, flags: 0x0}, - 689: {region: 0x165, script: 0x5a, flags: 0x0}, - 690: {region: 0x99, script: 0xe6, flags: 0x0}, - 691: {region: 0x9e, script: 0x5a, flags: 0x0}, - 692: {region: 0x165, script: 0x5a, flags: 0x0}, - 693: {region: 0x4b, script: 0x5a, flags: 0x0}, - 694: {region: 0x165, script: 0x5a, flags: 0x0}, - 695: {region: 0x165, script: 0x5a, flags: 0x0}, - 696: {region: 0xaf, script: 0x57, flags: 0x0}, - 697: {region: 0x165, script: 0x5a, flags: 0x0}, - 698: {region: 0x165, script: 0x5a, flags: 0x0}, - 699: {region: 0x4b, script: 0x5a, flags: 0x0}, - 700: {region: 0x165, script: 0x5a, flags: 0x0}, - 701: {region: 0x165, script: 0x5a, flags: 0x0}, - 702: {region: 0x162, script: 0x5a, flags: 0x0}, - 703: {region: 0x9c, script: 0x5, flags: 0x0}, - 704: {region: 0xb6, script: 0x5a, flags: 0x0}, - 705: {region: 0xb8, script: 0x5a, flags: 0x0}, - 706: {region: 0x4b, script: 0x5a, flags: 0x0}, - 707: {region: 0x4b, script: 0x5a, flags: 0x0}, - 708: {region: 0xa4, script: 0x5a, flags: 0x0}, - 709: {region: 0xa4, script: 0x5a, flags: 0x0}, - 710: {region: 0x9c, script: 0x5, flags: 0x0}, - 711: {region: 0xb8, script: 0x5a, flags: 0x0}, - 712: {region: 0x123, script: 0xeb, flags: 0x0}, + 681: {region: 0x166, script: 0x5b, flags: 0x0}, + 682: {region: 0x166, script: 0x5b, flags: 0x0}, + 683: {region: 0x9f, script: 0x5b, flags: 0x0}, + 684: {region: 0x53, script: 0x61, flags: 0x0}, + 685: {region: 0x96, script: 0x5b, flags: 0x0}, + 686: {region: 0x9d, script: 0x5, flags: 0x0}, + 687: {region: 0x136, script: 0x5b, flags: 0x0}, + 688: {region: 0x166, script: 0x5b, flags: 0x0}, + 689: {region: 0x166, script: 0x5b, flags: 0x0}, + 690: {region: 0x9a, script: 0xe9, flags: 0x0}, + 691: {region: 0x9f, script: 0x5b, flags: 0x0}, + 692: {region: 0x166, script: 0x5b, flags: 0x0}, + 693: {region: 0x4b, script: 0x5b, flags: 0x0}, + 694: {region: 0x166, script: 0x5b, flags: 0x0}, + 695: {region: 0x166, script: 0x5b, flags: 0x0}, + 696: {region: 0xb0, script: 0x58, flags: 0x0}, + 697: {region: 0x166, script: 0x5b, flags: 0x0}, + 698: {region: 0x166, script: 0x5b, flags: 0x0}, + 699: {region: 0x4b, script: 0x5b, flags: 0x0}, + 700: {region: 0x166, script: 0x5b, flags: 0x0}, + 701: {region: 0x166, script: 0x5b, flags: 0x0}, + 702: {region: 0x163, script: 0x5b, flags: 0x0}, + 703: {region: 0x9d, script: 0x5, flags: 0x0}, + 704: {region: 0xb7, script: 0x5b, flags: 0x0}, + 705: {region: 0xb9, script: 0x5b, flags: 0x0}, + 706: {region: 0x4b, script: 0x5b, flags: 0x0}, + 707: {region: 0x4b, script: 0x5b, flags: 0x0}, + 708: {region: 0xa5, script: 0x5b, flags: 0x0}, + 709: {region: 0xa5, script: 0x5b, flags: 0x0}, + 710: {region: 0x9d, script: 0x5, flags: 0x0}, + 711: {region: 0xb9, script: 0x5b, flags: 0x0}, + 712: {region: 0x124, script: 0xee, flags: 0x0}, 713: {region: 0x53, script: 0x3b, flags: 0x0}, - 714: {region: 0x12b, script: 0x5a, flags: 0x0}, - 715: {region: 0x95, script: 0x5a, flags: 0x0}, - 716: {region: 0x52, script: 0x5a, flags: 0x0}, - 717: {region: 0x99, script: 0x22, flags: 0x0}, - 718: {region: 0x99, script: 0x22, flags: 0x0}, - 719: {region: 0x95, script: 0x5a, flags: 0x0}, + 714: {region: 0x12c, script: 0x5b, flags: 0x0}, + 715: {region: 0x96, script: 0x5b, flags: 0x0}, + 716: {region: 0x52, script: 0x5b, flags: 0x0}, + 717: {region: 0x9a, script: 0x22, flags: 0x0}, + 718: {region: 0x9a, script: 0x22, flags: 0x0}, + 719: {region: 0x96, script: 0x5b, flags: 0x0}, 720: {region: 0x23, script: 0x3, flags: 0x1}, - 721: {region: 0xa4, script: 0x5a, flags: 0x0}, - 722: {region: 0x165, script: 0x5a, flags: 0x0}, - 723: {region: 0xcf, script: 0x5a, flags: 0x0}, - 724: {region: 0x165, script: 0x5a, flags: 0x0}, - 725: {region: 0x165, script: 0x5a, flags: 0x0}, - 726: {region: 0x165, script: 0x5a, flags: 0x0}, - 727: {region: 0x165, script: 0x5a, flags: 0x0}, - 728: {region: 0x165, script: 0x5a, flags: 0x0}, - 729: {region: 0x165, script: 0x5a, flags: 0x0}, - 730: {region: 0x165, script: 0x5a, flags: 0x0}, - 731: {region: 0x165, script: 0x5a, flags: 0x0}, - 732: {region: 0x165, script: 0x5a, flags: 0x0}, - 733: {region: 0x165, script: 0x5a, flags: 0x0}, - 734: {region: 0x165, script: 0x5a, flags: 0x0}, - 735: {region: 0x165, script: 0x5, flags: 0x0}, - 736: {region: 0x106, script: 0x20, flags: 0x0}, - 737: {region: 0xe7, script: 0x5a, flags: 0x0}, - 738: {region: 0x165, script: 0x5a, flags: 0x0}, - 739: {region: 0x95, script: 0x5a, flags: 0x0}, - 740: {region: 0x165, script: 0x2c, flags: 0x0}, - 741: {region: 0x165, script: 0x5a, flags: 0x0}, - 742: {region: 0x165, script: 0x5a, flags: 0x0}, - 743: {region: 0x165, script: 0x5a, flags: 0x0}, - 744: {region: 0x112, script: 0x5a, flags: 0x0}, - 745: {region: 0xa4, script: 0x5a, flags: 0x0}, - 746: {region: 0x165, script: 0x5a, flags: 0x0}, - 747: {region: 0x165, script: 0x5a, flags: 0x0}, - 748: {region: 0x123, script: 0x5, flags: 0x0}, - 749: {region: 0xcc, script: 0x5a, flags: 0x0}, - 750: {region: 0x165, script: 0x5a, flags: 0x0}, - 751: {region: 0x165, script: 0x5a, flags: 0x0}, - 752: {region: 0x165, script: 0x5a, flags: 0x0}, - 753: {region: 0xbf, script: 0x5a, flags: 0x0}, - 754: {region: 0xd1, script: 0x5a, flags: 0x0}, - 755: {region: 0x165, script: 0x5a, flags: 0x0}, - 756: {region: 0x52, script: 0x5a, flags: 0x0}, - 757: {region: 0xdb, script: 0x22, flags: 0x0}, - 758: {region: 0x12f, script: 0x5a, flags: 0x0}, - 759: {region: 0xc0, script: 0x5a, flags: 0x0}, - 760: {region: 0x165, script: 0x5a, flags: 0x0}, - 761: {region: 0x165, script: 0x5a, flags: 0x0}, - 762: {region: 0xe0, script: 0x5a, flags: 0x0}, - 763: {region: 0x165, script: 0x5a, flags: 0x0}, - 764: {region: 0x95, script: 0x5a, flags: 0x0}, - 765: {region: 0x9b, script: 0x3d, flags: 0x0}, - 766: {region: 0x165, script: 0x5a, flags: 0x0}, - 767: {region: 0xc2, script: 0x20, flags: 0x0}, - 768: {region: 0x165, script: 0x5, flags: 0x0}, - 769: {region: 0x165, script: 0x5a, flags: 0x0}, - 770: {region: 0x165, script: 0x5a, flags: 0x0}, - 771: {region: 0x165, script: 0x5a, flags: 0x0}, - 772: {region: 0x99, script: 0x6e, flags: 0x0}, - 773: {region: 0x165, script: 0x5a, flags: 0x0}, - 774: {region: 0x165, script: 0x5a, flags: 0x0}, - 775: {region: 0x10b, script: 0x5a, flags: 0x0}, - 776: {region: 0x165, script: 0x5a, flags: 0x0}, - 777: {region: 0x165, script: 0x5a, flags: 0x0}, - 778: {region: 0x165, script: 0x5a, flags: 0x0}, + 721: {region: 0xa5, script: 0x5b, flags: 0x0}, + 722: {region: 0x166, script: 0x5b, flags: 0x0}, + 723: {region: 0xd0, script: 0x5b, flags: 0x0}, + 724: {region: 0x166, script: 0x5b, flags: 0x0}, + 725: {region: 0x166, script: 0x5b, flags: 0x0}, + 726: {region: 0x166, script: 0x5b, flags: 0x0}, + 727: {region: 0x166, script: 0x5b, flags: 0x0}, + 728: {region: 0x166, script: 0x5b, flags: 0x0}, + 729: {region: 0x166, script: 0x5b, flags: 0x0}, + 730: {region: 0x166, script: 0x5b, flags: 0x0}, + 731: {region: 0x166, script: 0x5b, flags: 0x0}, + 732: {region: 0x166, script: 0x5b, flags: 0x0}, + 733: {region: 0x166, script: 0x5b, flags: 0x0}, + 734: {region: 0x166, script: 0x5b, flags: 0x0}, + 735: {region: 0x166, script: 0x5, flags: 0x0}, + 736: {region: 0x107, script: 0x20, flags: 0x0}, + 737: {region: 0xe8, script: 0x5b, flags: 0x0}, + 738: {region: 0x166, script: 0x5b, flags: 0x0}, + 739: {region: 0x96, script: 0x5b, flags: 0x0}, + 740: {region: 0x166, script: 0x2c, flags: 0x0}, + 741: {region: 0x166, script: 0x5b, flags: 0x0}, + 742: {region: 0x166, script: 0x5b, flags: 0x0}, + 743: {region: 0x166, script: 0x5b, flags: 0x0}, + 744: {region: 0x113, script: 0x5b, flags: 0x0}, + 745: {region: 0xa5, script: 0x5b, flags: 0x0}, + 746: {region: 0x166, script: 0x5b, flags: 0x0}, + 747: {region: 0x166, script: 0x5b, flags: 0x0}, + 748: {region: 0x124, script: 0x5, flags: 0x0}, + 749: {region: 0xcd, script: 0x5b, flags: 0x0}, + 750: {region: 0x166, script: 0x5b, flags: 0x0}, + 751: {region: 0x166, script: 0x5b, flags: 0x0}, + 752: {region: 0x166, script: 0x5b, flags: 0x0}, + 753: {region: 0xc0, script: 0x5b, flags: 0x0}, + 754: {region: 0xd2, script: 0x5b, flags: 0x0}, + 755: {region: 0x166, script: 0x5b, flags: 0x0}, + 756: {region: 0x52, script: 0x5b, flags: 0x0}, + 757: {region: 0xdc, script: 0x22, flags: 0x0}, + 758: {region: 0x130, script: 0x5b, flags: 0x0}, + 759: {region: 0xc1, script: 0x5b, flags: 0x0}, + 760: {region: 0x166, script: 0x5b, flags: 0x0}, + 761: {region: 0x166, script: 0x5b, flags: 0x0}, + 762: {region: 0xe1, script: 0x5b, flags: 0x0}, + 763: {region: 0x166, script: 0x5b, flags: 0x0}, + 764: {region: 0x96, script: 0x5b, flags: 0x0}, + 765: {region: 0x9c, script: 0x3d, flags: 0x0}, + 766: {region: 0x166, script: 0x5b, flags: 0x0}, + 767: {region: 0xc3, script: 0x20, flags: 0x0}, + 768: {region: 0x166, script: 0x5, flags: 0x0}, + 769: {region: 0x166, script: 0x5b, flags: 0x0}, + 770: {region: 0x166, script: 0x5b, flags: 0x0}, + 771: {region: 0x166, script: 0x5b, flags: 0x0}, + 772: {region: 0x9a, script: 0x6f, flags: 0x0}, + 773: {region: 0x166, script: 0x5b, flags: 0x0}, + 774: {region: 0x166, script: 0x5b, flags: 0x0}, + 775: {region: 0x10c, script: 0x5b, flags: 0x0}, + 776: {region: 0x166, script: 0x5b, flags: 0x0}, + 777: {region: 0x166, script: 0x5b, flags: 0x0}, + 778: {region: 0x166, script: 0x5b, flags: 0x0}, 779: {region: 0x26, script: 0x3, flags: 0x1}, - 780: {region: 0x165, script: 0x5a, flags: 0x0}, - 781: {region: 0x165, script: 0x5a, flags: 0x0}, - 782: {region: 0x99, script: 0xe, flags: 0x0}, - 783: {region: 0xc4, script: 0x75, flags: 0x0}, - 785: {region: 0x165, script: 0x5a, flags: 0x0}, - 786: {region: 0x49, script: 0x5a, flags: 0x0}, - 787: {region: 0x49, script: 0x5a, flags: 0x0}, - 788: {region: 0x37, script: 0x5a, flags: 0x0}, - 789: {region: 0x165, script: 0x5a, flags: 0x0}, - 790: {region: 0x165, script: 0x5a, flags: 0x0}, - 791: {region: 0x165, script: 0x5a, flags: 0x0}, - 792: {region: 0x165, script: 0x5a, flags: 0x0}, - 793: {region: 0x165, script: 0x5a, flags: 0x0}, - 794: {region: 0x165, script: 0x5a, flags: 0x0}, - 795: {region: 0x99, script: 0x22, flags: 0x0}, - 796: {region: 0xdb, script: 0x22, flags: 0x0}, - 797: {region: 0x106, script: 0x20, flags: 0x0}, - 798: {region: 0x35, script: 0x72, flags: 0x0}, + 780: {region: 0x166, script: 0x5b, flags: 0x0}, + 781: {region: 0x166, script: 0x5b, flags: 0x0}, + 782: {region: 0x9a, script: 0xe, flags: 0x0}, + 783: {region: 0xc5, script: 0x76, flags: 0x0}, + 785: {region: 0x166, script: 0x5b, flags: 0x0}, + 786: {region: 0x49, script: 0x5b, flags: 0x0}, + 787: {region: 0x49, script: 0x5b, flags: 0x0}, + 788: {region: 0x37, script: 0x5b, flags: 0x0}, + 789: {region: 0x166, script: 0x5b, flags: 0x0}, + 790: {region: 0x166, script: 0x5b, flags: 0x0}, + 791: {region: 0x166, script: 0x5b, flags: 0x0}, + 792: {region: 0x166, script: 0x5b, flags: 0x0}, + 793: {region: 0x166, script: 0x5b, flags: 0x0}, + 794: {region: 0x166, script: 0x5b, flags: 0x0}, + 795: {region: 0x9a, script: 0x22, flags: 0x0}, + 796: {region: 0xdc, script: 0x22, flags: 0x0}, + 797: {region: 0x107, script: 0x20, flags: 0x0}, + 798: {region: 0x35, script: 0x73, flags: 0x0}, 799: {region: 0x29, script: 0x3, flags: 0x1}, - 800: {region: 0xcb, script: 0x5a, flags: 0x0}, - 801: {region: 0x165, script: 0x5a, flags: 0x0}, - 802: {region: 0x165, script: 0x5a, flags: 0x0}, - 803: {region: 0x165, script: 0x5a, flags: 0x0}, - 804: {region: 0x99, script: 0x22, flags: 0x0}, - 805: {region: 0x52, script: 0x5a, flags: 0x0}, - 807: {region: 0x165, script: 0x5a, flags: 0x0}, - 808: {region: 0x135, script: 0x5a, flags: 0x0}, - 809: {region: 0x165, script: 0x5a, flags: 0x0}, - 810: {region: 0x165, script: 0x5a, flags: 0x0}, - 811: {region: 0xe8, script: 0x5, flags: 0x0}, - 812: {region: 0xc3, script: 0x5a, flags: 0x0}, - 813: {region: 0x99, script: 0x22, flags: 0x0}, - 814: {region: 0x95, script: 0x5a, flags: 0x0}, - 815: {region: 0x164, script: 0x5a, flags: 0x0}, - 816: {region: 0x165, script: 0x5a, flags: 0x0}, - 817: {region: 0xc4, script: 0x75, flags: 0x0}, - 818: {region: 0x165, script: 0x5a, flags: 0x0}, - 819: {region: 0x165, script: 0x2c, flags: 0x0}, - 820: {region: 0x106, script: 0x20, flags: 0x0}, - 821: {region: 0x165, script: 0x5a, flags: 0x0}, - 822: {region: 0x131, script: 0x5a, flags: 0x0}, - 823: {region: 0x9c, script: 0x66, flags: 0x0}, - 824: {region: 0x165, script: 0x5a, flags: 0x0}, - 825: {region: 0x165, script: 0x5a, flags: 0x0}, - 826: {region: 0x9c, script: 0x5, flags: 0x0}, - 827: {region: 0x165, script: 0x5a, flags: 0x0}, - 828: {region: 0x165, script: 0x5a, flags: 0x0}, - 829: {region: 0x165, script: 0x5a, flags: 0x0}, - 830: {region: 0xdd, script: 0x5a, flags: 0x0}, - 831: {region: 0x165, script: 0x5a, flags: 0x0}, - 832: {region: 0x165, script: 0x5a, flags: 0x0}, - 834: {region: 0x165, script: 0x5a, flags: 0x0}, + 800: {region: 0xcc, script: 0x5b, flags: 0x0}, + 801: {region: 0x166, script: 0x5b, flags: 0x0}, + 802: {region: 0x166, script: 0x5b, flags: 0x0}, + 803: {region: 0x166, script: 0x5b, flags: 0x0}, + 804: {region: 0x9a, script: 0x22, flags: 0x0}, + 805: {region: 0x52, script: 0x5b, flags: 0x0}, + 807: {region: 0x166, script: 0x5b, flags: 0x0}, + 808: {region: 0x136, script: 0x5b, flags: 0x0}, + 809: {region: 0x166, script: 0x5b, flags: 0x0}, + 810: {region: 0x166, script: 0x5b, flags: 0x0}, + 811: {region: 0xe9, script: 0x5, flags: 0x0}, + 812: {region: 0xc4, script: 0x5b, flags: 0x0}, + 813: {region: 0x9a, script: 0x22, flags: 0x0}, + 814: {region: 0x96, script: 0x5b, flags: 0x0}, + 815: {region: 0x165, script: 0x5b, flags: 0x0}, + 816: {region: 0x166, script: 0x5b, flags: 0x0}, + 817: {region: 0xc5, script: 0x76, flags: 0x0}, + 818: {region: 0x166, script: 0x5b, flags: 0x0}, + 819: {region: 0x166, script: 0x2c, flags: 0x0}, + 820: {region: 0x107, script: 0x20, flags: 0x0}, + 821: {region: 0x166, script: 0x5b, flags: 0x0}, + 822: {region: 0x132, script: 0x5b, flags: 0x0}, + 823: {region: 0x9d, script: 0x67, flags: 0x0}, + 824: {region: 0x166, script: 0x5b, flags: 0x0}, + 825: {region: 0x166, script: 0x5b, flags: 0x0}, + 826: {region: 0x9d, script: 0x5, flags: 0x0}, + 827: {region: 0x166, script: 0x5b, flags: 0x0}, + 828: {region: 0x166, script: 0x5b, flags: 0x0}, + 829: {region: 0x166, script: 0x5b, flags: 0x0}, + 830: {region: 0xde, script: 0x5b, flags: 0x0}, + 831: {region: 0x166, script: 0x5b, flags: 0x0}, + 832: {region: 0x166, script: 0x5b, flags: 0x0}, + 834: {region: 0x166, script: 0x5b, flags: 0x0}, 835: {region: 0x53, script: 0x3b, flags: 0x0}, - 836: {region: 0x9e, script: 0x5a, flags: 0x0}, - 837: {region: 0xd2, script: 0x5a, flags: 0x0}, - 838: {region: 0x165, script: 0x5a, flags: 0x0}, - 839: {region: 0xda, script: 0x5a, flags: 0x0}, - 840: {region: 0x165, script: 0x5a, flags: 0x0}, - 841: {region: 0x165, script: 0x5a, flags: 0x0}, - 842: {region: 0x165, script: 0x5a, flags: 0x0}, - 843: {region: 0xcf, script: 0x5a, flags: 0x0}, - 844: {region: 0x165, script: 0x5a, flags: 0x0}, - 845: {region: 0x165, script: 0x5a, flags: 0x0}, - 846: {region: 0x164, script: 0x5a, flags: 0x0}, - 847: {region: 0xd1, script: 0x5a, flags: 0x0}, - 848: {region: 0x60, script: 0x5a, flags: 0x0}, - 849: {region: 0xdb, script: 0x22, flags: 0x0}, - 850: {region: 0x165, script: 0x5a, flags: 0x0}, - 851: {region: 0xdb, script: 0x22, flags: 0x0}, - 852: {region: 0x165, script: 0x5a, flags: 0x0}, - 853: {region: 0x165, script: 0x5a, flags: 0x0}, - 854: {region: 0xd2, script: 0x5a, flags: 0x0}, - 855: {region: 0x165, script: 0x5a, flags: 0x0}, - 856: {region: 0x165, script: 0x5a, flags: 0x0}, - 857: {region: 0xd1, script: 0x5a, flags: 0x0}, - 858: {region: 0x165, script: 0x5a, flags: 0x0}, - 859: {region: 0xcf, script: 0x5a, flags: 0x0}, - 860: {region: 0xcf, script: 0x5a, flags: 0x0}, - 861: {region: 0x165, script: 0x5a, flags: 0x0}, - 862: {region: 0x165, script: 0x5a, flags: 0x0}, - 863: {region: 0x95, script: 0x5a, flags: 0x0}, - 864: {region: 0x165, script: 0x5a, flags: 0x0}, - 865: {region: 0xdf, script: 0x5a, flags: 0x0}, - 866: {region: 0x165, script: 0x5a, flags: 0x0}, - 867: {region: 0x165, script: 0x5a, flags: 0x0}, - 868: {region: 0x99, script: 0x5a, flags: 0x0}, - 869: {region: 0x165, script: 0x5a, flags: 0x0}, - 870: {region: 0x165, script: 0x5a, flags: 0x0}, - 871: {region: 0xd9, script: 0x5a, flags: 0x0}, - 872: {region: 0x52, script: 0x5a, flags: 0x0}, - 873: {region: 0x165, script: 0x5a, flags: 0x0}, - 874: {region: 0xda, script: 0x5a, flags: 0x0}, - 875: {region: 0x165, script: 0x5a, flags: 0x0}, - 876: {region: 0x52, script: 0x5a, flags: 0x0}, - 877: {region: 0x165, script: 0x5a, flags: 0x0}, - 878: {region: 0x165, script: 0x5a, flags: 0x0}, - 879: {region: 0xda, script: 0x5a, flags: 0x0}, - 880: {region: 0x123, script: 0x56, flags: 0x0}, - 881: {region: 0x99, script: 0x22, flags: 0x0}, - 882: {region: 0x10c, script: 0xc9, flags: 0x0}, - 883: {region: 0x165, script: 0x5a, flags: 0x0}, - 884: {region: 0x165, script: 0x5a, flags: 0x0}, - 885: {region: 0x84, script: 0x7c, flags: 0x0}, - 886: {region: 0x161, script: 0x5a, flags: 0x0}, - 887: {region: 0x165, script: 0x5a, flags: 0x0}, + 836: {region: 0x9f, script: 0x5b, flags: 0x0}, + 837: {region: 0xd3, script: 0x5b, flags: 0x0}, + 838: {region: 0x166, script: 0x5b, flags: 0x0}, + 839: {region: 0xdb, script: 0x5b, flags: 0x0}, + 840: {region: 0x166, script: 0x5b, flags: 0x0}, + 841: {region: 0x166, script: 0x5b, flags: 0x0}, + 842: {region: 0x166, script: 0x5b, flags: 0x0}, + 843: {region: 0xd0, script: 0x5b, flags: 0x0}, + 844: {region: 0x166, script: 0x5b, flags: 0x0}, + 845: {region: 0x166, script: 0x5b, flags: 0x0}, + 846: {region: 0x165, script: 0x5b, flags: 0x0}, + 847: {region: 0xd2, script: 0x5b, flags: 0x0}, + 848: {region: 0x61, script: 0x5b, flags: 0x0}, + 849: {region: 0xdc, script: 0x22, flags: 0x0}, + 850: {region: 0x166, script: 0x5b, flags: 0x0}, + 851: {region: 0xdc, script: 0x22, flags: 0x0}, + 852: {region: 0x166, script: 0x5b, flags: 0x0}, + 853: {region: 0x166, script: 0x5b, flags: 0x0}, + 854: {region: 0xd3, script: 0x5b, flags: 0x0}, + 855: {region: 0x166, script: 0x5b, flags: 0x0}, + 856: {region: 0x166, script: 0x5b, flags: 0x0}, + 857: {region: 0xd2, script: 0x5b, flags: 0x0}, + 858: {region: 0x166, script: 0x5b, flags: 0x0}, + 859: {region: 0xd0, script: 0x5b, flags: 0x0}, + 860: {region: 0xd0, script: 0x5b, flags: 0x0}, + 861: {region: 0x166, script: 0x5b, flags: 0x0}, + 862: {region: 0x166, script: 0x5b, flags: 0x0}, + 863: {region: 0x96, script: 0x5b, flags: 0x0}, + 864: {region: 0x166, script: 0x5b, flags: 0x0}, + 865: {region: 0xe0, script: 0x5b, flags: 0x0}, + 866: {region: 0x166, script: 0x5b, flags: 0x0}, + 867: {region: 0x166, script: 0x5b, flags: 0x0}, + 868: {region: 0x9a, script: 0x5b, flags: 0x0}, + 869: {region: 0x166, script: 0x5b, flags: 0x0}, + 870: {region: 0x166, script: 0x5b, flags: 0x0}, + 871: {region: 0xda, script: 0x5b, flags: 0x0}, + 872: {region: 0x52, script: 0x5b, flags: 0x0}, + 873: {region: 0x166, script: 0x5b, flags: 0x0}, + 874: {region: 0xdb, script: 0x5b, flags: 0x0}, + 875: {region: 0x166, script: 0x5b, flags: 0x0}, + 876: {region: 0x52, script: 0x5b, flags: 0x0}, + 877: {region: 0x166, script: 0x5b, flags: 0x0}, + 878: {region: 0x166, script: 0x5b, flags: 0x0}, + 879: {region: 0xdb, script: 0x5b, flags: 0x0}, + 880: {region: 0x124, script: 0x57, flags: 0x0}, + 881: {region: 0x9a, script: 0x22, flags: 0x0}, + 882: {region: 0x10d, script: 0xcb, flags: 0x0}, + 883: {region: 0x166, script: 0x5b, flags: 0x0}, + 884: {region: 0x166, script: 0x5b, flags: 0x0}, + 885: {region: 0x85, script: 0x7e, flags: 0x0}, + 886: {region: 0x162, script: 0x5b, flags: 0x0}, + 887: {region: 0x166, script: 0x5b, flags: 0x0}, 888: {region: 0x49, script: 0x17, flags: 0x0}, - 889: {region: 0x165, script: 0x5a, flags: 0x0}, - 890: {region: 0x161, script: 0x5a, flags: 0x0}, - 891: {region: 0x165, script: 0x5a, flags: 0x0}, - 892: {region: 0x165, script: 0x5a, flags: 0x0}, - 893: {region: 0x165, script: 0x5a, flags: 0x0}, - 894: {region: 0x165, script: 0x5a, flags: 0x0}, - 895: {region: 0x165, script: 0x5a, flags: 0x0}, - 896: {region: 0x117, script: 0x5a, flags: 0x0}, - 897: {region: 0x165, script: 0x5a, flags: 0x0}, - 898: {region: 0x165, script: 0x5a, flags: 0x0}, - 899: {region: 0x135, script: 0x5a, flags: 0x0}, - 900: {region: 0x165, script: 0x5a, flags: 0x0}, - 901: {region: 0x53, script: 0x5a, flags: 0x0}, - 902: {region: 0x165, script: 0x5a, flags: 0x0}, - 903: {region: 0xce, script: 0x5a, flags: 0x0}, - 904: {region: 0x12f, script: 0x5a, flags: 0x0}, - 905: {region: 0x131, script: 0x5a, flags: 0x0}, - 906: {region: 0x80, script: 0x5a, flags: 0x0}, - 907: {region: 0x78, script: 0x5a, flags: 0x0}, - 908: {region: 0x165, script: 0x5a, flags: 0x0}, - 910: {region: 0x165, script: 0x5a, flags: 0x0}, - 911: {region: 0x165, script: 0x5a, flags: 0x0}, - 912: {region: 0x6f, script: 0x5a, flags: 0x0}, - 913: {region: 0x165, script: 0x5a, flags: 0x0}, - 914: {region: 0x165, script: 0x5a, flags: 0x0}, - 915: {region: 0x165, script: 0x5a, flags: 0x0}, - 916: {region: 0x165, script: 0x5a, flags: 0x0}, - 917: {region: 0x99, script: 0x81, flags: 0x0}, - 918: {region: 0x165, script: 0x5a, flags: 0x0}, - 919: {region: 0x165, script: 0x5, flags: 0x0}, - 920: {region: 0x7d, script: 0x20, flags: 0x0}, - 921: {region: 0x135, script: 0x82, flags: 0x0}, - 922: {region: 0x165, script: 0x5, flags: 0x0}, - 923: {region: 0xc5, script: 0x80, flags: 0x0}, - 924: {region: 0x165, script: 0x5a, flags: 0x0}, + 889: {region: 0x166, script: 0x5b, flags: 0x0}, + 890: {region: 0x162, script: 0x5b, flags: 0x0}, + 891: {region: 0x166, script: 0x5b, flags: 0x0}, + 892: {region: 0x166, script: 0x5b, flags: 0x0}, + 893: {region: 0x166, script: 0x5b, flags: 0x0}, + 894: {region: 0x166, script: 0x5b, flags: 0x0}, + 895: {region: 0x166, script: 0x5b, flags: 0x0}, + 896: {region: 0x118, script: 0x5b, flags: 0x0}, + 897: {region: 0x166, script: 0x5b, flags: 0x0}, + 898: {region: 0x166, script: 0x5b, flags: 0x0}, + 899: {region: 0x136, script: 0x5b, flags: 0x0}, + 900: {region: 0x166, script: 0x5b, flags: 0x0}, + 901: {region: 0x53, script: 0x5b, flags: 0x0}, + 902: {region: 0x166, script: 0x5b, flags: 0x0}, + 903: {region: 0xcf, script: 0x5b, flags: 0x0}, + 904: {region: 0x130, script: 0x5b, flags: 0x0}, + 905: {region: 0x132, script: 0x5b, flags: 0x0}, + 906: {region: 0x81, script: 0x5b, flags: 0x0}, + 907: {region: 0x79, script: 0x5b, flags: 0x0}, + 908: {region: 0x166, script: 0x5b, flags: 0x0}, + 910: {region: 0x166, script: 0x5b, flags: 0x0}, + 911: {region: 0x166, script: 0x5b, flags: 0x0}, + 912: {region: 0x70, script: 0x5b, flags: 0x0}, + 913: {region: 0x166, script: 0x5b, flags: 0x0}, + 914: {region: 0x166, script: 0x5b, flags: 0x0}, + 915: {region: 0x166, script: 0x5b, flags: 0x0}, + 916: {region: 0x166, script: 0x5b, flags: 0x0}, + 917: {region: 0x9a, script: 0x83, flags: 0x0}, + 918: {region: 0x166, script: 0x5b, flags: 0x0}, + 919: {region: 0x166, script: 0x5, flags: 0x0}, + 920: {region: 0x7e, script: 0x20, flags: 0x0}, + 921: {region: 0x136, script: 0x84, flags: 0x0}, + 922: {region: 0x166, script: 0x5, flags: 0x0}, + 923: {region: 0xc6, script: 0x82, flags: 0x0}, + 924: {region: 0x166, script: 0x5b, flags: 0x0}, 925: {region: 0x2c, script: 0x3, flags: 0x1}, - 926: {region: 0xe7, script: 0x5a, flags: 0x0}, + 926: {region: 0xe8, script: 0x5b, flags: 0x0}, 927: {region: 0x2f, script: 0x2, flags: 0x1}, - 928: {region: 0xe7, script: 0x5a, flags: 0x0}, - 929: {region: 0x30, script: 0x5a, flags: 0x0}, - 930: {region: 0xf0, script: 0x5a, flags: 0x0}, - 931: {region: 0x165, script: 0x5a, flags: 0x0}, - 932: {region: 0x78, script: 0x5a, flags: 0x0}, - 933: {region: 0xd6, script: 0x5a, flags: 0x0}, - 934: {region: 0x135, script: 0x5a, flags: 0x0}, - 935: {region: 0x49, script: 0x5a, flags: 0x0}, - 936: {region: 0x165, script: 0x5a, flags: 0x0}, - 937: {region: 0x9c, script: 0xf7, flags: 0x0}, - 938: {region: 0x165, script: 0x5a, flags: 0x0}, - 939: {region: 0x60, script: 0x5a, flags: 0x0}, - 940: {region: 0x165, script: 0x5, flags: 0x0}, - 941: {region: 0xb0, script: 0x8e, flags: 0x0}, - 943: {region: 0x165, script: 0x5a, flags: 0x0}, - 944: {region: 0x165, script: 0x5a, flags: 0x0}, - 945: {region: 0x99, script: 0x12, flags: 0x0}, - 946: {region: 0xa4, script: 0x5a, flags: 0x0}, - 947: {region: 0xe9, script: 0x5a, flags: 0x0}, - 948: {region: 0x165, script: 0x5a, flags: 0x0}, - 949: {region: 0x9e, script: 0x5a, flags: 0x0}, - 950: {region: 0x165, script: 0x5a, flags: 0x0}, - 951: {region: 0x165, script: 0x5a, flags: 0x0}, - 952: {region: 0x87, script: 0x34, flags: 0x0}, - 953: {region: 0x75, script: 0x5a, flags: 0x0}, - 954: {region: 0x165, script: 0x5a, flags: 0x0}, - 955: {region: 0xe8, script: 0x4d, flags: 0x0}, - 956: {region: 0x9c, script: 0x5, flags: 0x0}, - 957: {region: 0x1, script: 0x5a, flags: 0x0}, + 928: {region: 0xe8, script: 0x5b, flags: 0x0}, + 929: {region: 0x30, script: 0x5b, flags: 0x0}, + 930: {region: 0xf1, script: 0x5b, flags: 0x0}, + 931: {region: 0x166, script: 0x5b, flags: 0x0}, + 932: {region: 0x79, script: 0x5b, flags: 0x0}, + 933: {region: 0xd7, script: 0x5b, flags: 0x0}, + 934: {region: 0x136, script: 0x5b, flags: 0x0}, + 935: {region: 0x49, script: 0x5b, flags: 0x0}, + 936: {region: 0x166, script: 0x5b, flags: 0x0}, + 937: {region: 0x9d, script: 0xfa, flags: 0x0}, + 938: {region: 0x166, script: 0x5b, flags: 0x0}, + 939: {region: 0x61, script: 0x5b, flags: 0x0}, + 940: {region: 0x166, script: 0x5, flags: 0x0}, + 941: {region: 0xb1, script: 0x90, flags: 0x0}, + 943: {region: 0x166, script: 0x5b, flags: 0x0}, + 944: {region: 0x166, script: 0x5b, flags: 0x0}, + 945: {region: 0x9a, script: 0x12, flags: 0x0}, + 946: {region: 0xa5, script: 0x5b, flags: 0x0}, + 947: {region: 0xea, script: 0x5b, flags: 0x0}, + 948: {region: 0x166, script: 0x5b, flags: 0x0}, + 949: {region: 0x9f, script: 0x5b, flags: 0x0}, + 950: {region: 0x166, script: 0x5b, flags: 0x0}, + 951: {region: 0x166, script: 0x5b, flags: 0x0}, + 952: {region: 0x88, script: 0x34, flags: 0x0}, + 953: {region: 0x76, script: 0x5b, flags: 0x0}, + 954: {region: 0x166, script: 0x5b, flags: 0x0}, + 955: {region: 0xe9, script: 0x4e, flags: 0x0}, + 956: {region: 0x9d, script: 0x5, flags: 0x0}, + 957: {region: 0x1, script: 0x5b, flags: 0x0}, 958: {region: 0x24, script: 0x5, flags: 0x0}, - 959: {region: 0x165, script: 0x5a, flags: 0x0}, - 960: {region: 0x41, script: 0x5a, flags: 0x0}, - 961: {region: 0x165, script: 0x5a, flags: 0x0}, - 962: {region: 0x7a, script: 0x5a, flags: 0x0}, - 963: {region: 0x165, script: 0x5a, flags: 0x0}, - 964: {region: 0xe4, script: 0x5a, flags: 0x0}, - 965: {region: 0x89, script: 0x5a, flags: 0x0}, - 966: {region: 0x69, script: 0x5a, flags: 0x0}, - 967: {region: 0x165, script: 0x5a, flags: 0x0}, - 968: {region: 0x99, script: 0x22, flags: 0x0}, - 969: {region: 0x165, script: 0x5a, flags: 0x0}, - 970: {region: 0x102, script: 0x5a, flags: 0x0}, - 971: {region: 0x95, script: 0x5a, flags: 0x0}, - 972: {region: 0x165, script: 0x5a, flags: 0x0}, - 973: {region: 0x165, script: 0x5a, flags: 0x0}, - 974: {region: 0x9e, script: 0x5a, flags: 0x0}, - 975: {region: 0x165, script: 0x5, flags: 0x0}, - 976: {region: 0x99, script: 0x5a, flags: 0x0}, + 959: {region: 0x166, script: 0x5b, flags: 0x0}, + 960: {region: 0x41, script: 0x5b, flags: 0x0}, + 961: {region: 0x166, script: 0x5b, flags: 0x0}, + 962: {region: 0x7b, script: 0x5b, flags: 0x0}, + 963: {region: 0x166, script: 0x5b, flags: 0x0}, + 964: {region: 0xe5, script: 0x5b, flags: 0x0}, + 965: {region: 0x8a, script: 0x5b, flags: 0x0}, + 966: {region: 0x6a, script: 0x5b, flags: 0x0}, + 967: {region: 0x166, script: 0x5b, flags: 0x0}, + 968: {region: 0x9a, script: 0x22, flags: 0x0}, + 969: {region: 0x166, script: 0x5b, flags: 0x0}, + 970: {region: 0x103, script: 0x5b, flags: 0x0}, + 971: {region: 0x96, script: 0x5b, flags: 0x0}, + 972: {region: 0x166, script: 0x5b, flags: 0x0}, + 973: {region: 0x166, script: 0x5b, flags: 0x0}, + 974: {region: 0x9f, script: 0x5b, flags: 0x0}, + 975: {region: 0x166, script: 0x5, flags: 0x0}, + 976: {region: 0x9a, script: 0x5b, flags: 0x0}, 977: {region: 0x31, script: 0x2, flags: 0x1}, - 978: {region: 0xdb, script: 0x22, flags: 0x0}, + 978: {region: 0xdc, script: 0x22, flags: 0x0}, 979: {region: 0x35, script: 0xe, flags: 0x0}, - 980: {region: 0x4e, script: 0x5a, flags: 0x0}, - 981: {region: 0x72, script: 0x5a, flags: 0x0}, - 982: {region: 0x4e, script: 0x5a, flags: 0x0}, - 983: {region: 0x9c, script: 0x5, flags: 0x0}, - 984: {region: 0x10c, script: 0x5a, flags: 0x0}, - 985: {region: 0x3a, script: 0x5a, flags: 0x0}, - 986: {region: 0x165, script: 0x5a, flags: 0x0}, - 987: {region: 0xd1, script: 0x5a, flags: 0x0}, - 988: {region: 0x104, script: 0x5a, flags: 0x0}, - 989: {region: 0x95, script: 0x5a, flags: 0x0}, - 990: {region: 0x12f, script: 0x5a, flags: 0x0}, - 991: {region: 0x165, script: 0x5a, flags: 0x0}, - 992: {region: 0x165, script: 0x5a, flags: 0x0}, - 993: {region: 0x73, script: 0x5a, flags: 0x0}, - 994: {region: 0x106, script: 0x20, flags: 0x0}, - 995: {region: 0x130, script: 0x20, flags: 0x0}, - 996: {region: 0x109, script: 0x5a, flags: 0x0}, - 997: {region: 0x107, script: 0x5a, flags: 0x0}, - 998: {region: 0x12f, script: 0x5a, flags: 0x0}, - 999: {region: 0x165, script: 0x5a, flags: 0x0}, - 1000: {region: 0xa2, script: 0x4c, flags: 0x0}, - 1001: {region: 0x99, script: 0x22, flags: 0x0}, - 1002: {region: 0x80, script: 0x5a, flags: 0x0}, - 1003: {region: 0x106, script: 0x20, flags: 0x0}, - 1004: {region: 0xa4, script: 0x5a, flags: 0x0}, - 1005: {region: 0x95, script: 0x5a, flags: 0x0}, - 1006: {region: 0x99, script: 0x5a, flags: 0x0}, - 1007: {region: 0x114, script: 0x5a, flags: 0x0}, - 1008: {region: 0x99, script: 0xcd, flags: 0x0}, - 1009: {region: 0x165, script: 0x5a, flags: 0x0}, - 1010: {region: 0x165, script: 0x5a, flags: 0x0}, - 1011: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1012: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1013: {region: 0x99, script: 0x22, flags: 0x0}, - 1014: {region: 0x165, script: 0x5, flags: 0x0}, - 1015: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1016: {region: 0x7b, script: 0x5a, flags: 0x0}, - 1017: {region: 0x49, script: 0x5a, flags: 0x0}, + 980: {region: 0x4e, script: 0x5b, flags: 0x0}, + 981: {region: 0x73, script: 0x5b, flags: 0x0}, + 982: {region: 0x4e, script: 0x5b, flags: 0x0}, + 983: {region: 0x9d, script: 0x5, flags: 0x0}, + 984: {region: 0x10d, script: 0x5b, flags: 0x0}, + 985: {region: 0x3a, script: 0x5b, flags: 0x0}, + 986: {region: 0x166, script: 0x5b, flags: 0x0}, + 987: {region: 0xd2, script: 0x5b, flags: 0x0}, + 988: {region: 0x105, script: 0x5b, flags: 0x0}, + 989: {region: 0x96, script: 0x5b, flags: 0x0}, + 990: {region: 0x130, script: 0x5b, flags: 0x0}, + 991: {region: 0x166, script: 0x5b, flags: 0x0}, + 992: {region: 0x166, script: 0x5b, flags: 0x0}, + 993: {region: 0x74, script: 0x5b, flags: 0x0}, + 994: {region: 0x107, script: 0x20, flags: 0x0}, + 995: {region: 0x131, script: 0x20, flags: 0x0}, + 996: {region: 0x10a, script: 0x5b, flags: 0x0}, + 997: {region: 0x108, script: 0x5b, flags: 0x0}, + 998: {region: 0x130, script: 0x5b, flags: 0x0}, + 999: {region: 0x166, script: 0x5b, flags: 0x0}, + 1000: {region: 0xa3, script: 0x4c, flags: 0x0}, + 1001: {region: 0x9a, script: 0x22, flags: 0x0}, + 1002: {region: 0x81, script: 0x5b, flags: 0x0}, + 1003: {region: 0x107, script: 0x20, flags: 0x0}, + 1004: {region: 0xa5, script: 0x5b, flags: 0x0}, + 1005: {region: 0x96, script: 0x5b, flags: 0x0}, + 1006: {region: 0x9a, script: 0x5b, flags: 0x0}, + 1007: {region: 0x115, script: 0x5b, flags: 0x0}, + 1008: {region: 0x9a, script: 0xcf, flags: 0x0}, + 1009: {region: 0x166, script: 0x5b, flags: 0x0}, + 1010: {region: 0x166, script: 0x5b, flags: 0x0}, + 1011: {region: 0x130, script: 0x5b, flags: 0x0}, + 1012: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1013: {region: 0x9a, script: 0x22, flags: 0x0}, + 1014: {region: 0x166, script: 0x5, flags: 0x0}, + 1015: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1016: {region: 0x7c, script: 0x5b, flags: 0x0}, + 1017: {region: 0x49, script: 0x5b, flags: 0x0}, 1018: {region: 0x33, script: 0x4, flags: 0x1}, - 1019: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1020: {region: 0x9c, script: 0x5, flags: 0x0}, - 1021: {region: 0xda, script: 0x5a, flags: 0x0}, - 1022: {region: 0x4f, script: 0x5a, flags: 0x0}, - 1023: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1024: {region: 0xcf, script: 0x5a, flags: 0x0}, - 1025: {region: 0xc3, script: 0x5a, flags: 0x0}, - 1026: {region: 0x4c, script: 0x5a, flags: 0x0}, - 1027: {region: 0x96, script: 0x7e, flags: 0x0}, - 1028: {region: 0xb6, script: 0x5a, flags: 0x0}, - 1029: {region: 0x165, script: 0x2c, flags: 0x0}, - 1030: {region: 0x165, script: 0x5a, flags: 0x0}, - 1032: {region: 0xba, script: 0xe8, flags: 0x0}, - 1033: {region: 0x165, script: 0x5a, flags: 0x0}, - 1034: {region: 0xc4, script: 0x75, flags: 0x0}, - 1035: {region: 0x165, script: 0x5, flags: 0x0}, - 1036: {region: 0xb3, script: 0xd4, flags: 0x0}, - 1037: {region: 0x6f, script: 0x5a, flags: 0x0}, - 1038: {region: 0x165, script: 0x5a, flags: 0x0}, - 1039: {region: 0x165, script: 0x5a, flags: 0x0}, - 1040: {region: 0x165, script: 0x5a, flags: 0x0}, - 1041: {region: 0x165, script: 0x5a, flags: 0x0}, - 1042: {region: 0x111, script: 0x5a, flags: 0x0}, - 1043: {region: 0x165, script: 0x5a, flags: 0x0}, - 1044: {region: 0xe8, script: 0x5, flags: 0x0}, - 1045: {region: 0x165, script: 0x5a, flags: 0x0}, - 1046: {region: 0x10f, script: 0x5a, flags: 0x0}, - 1047: {region: 0x165, script: 0x5a, flags: 0x0}, - 1048: {region: 0xe9, script: 0x5a, flags: 0x0}, - 1049: {region: 0x165, script: 0x5a, flags: 0x0}, - 1050: {region: 0x95, script: 0x5a, flags: 0x0}, - 1051: {region: 0x142, script: 0x5a, flags: 0x0}, - 1052: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1054: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1055: {region: 0x72, script: 0x5a, flags: 0x0}, - 1056: {region: 0x97, script: 0xca, flags: 0x0}, - 1057: {region: 0x165, script: 0x5a, flags: 0x0}, - 1058: {region: 0x72, script: 0x5a, flags: 0x0}, - 1059: {region: 0x164, script: 0x5a, flags: 0x0}, - 1060: {region: 0x165, script: 0x5a, flags: 0x0}, - 1061: {region: 0xc3, script: 0x5a, flags: 0x0}, - 1062: {region: 0x165, script: 0x5a, flags: 0x0}, - 1063: {region: 0x165, script: 0x5a, flags: 0x0}, - 1064: {region: 0x165, script: 0x5a, flags: 0x0}, - 1065: {region: 0x115, script: 0x5a, flags: 0x0}, - 1066: {region: 0x165, script: 0x5a, flags: 0x0}, - 1067: {region: 0x165, script: 0x5a, flags: 0x0}, - 1068: {region: 0x123, script: 0xeb, flags: 0x0}, - 1069: {region: 0x165, script: 0x5a, flags: 0x0}, - 1070: {region: 0x165, script: 0x5a, flags: 0x0}, - 1071: {region: 0x165, script: 0x5a, flags: 0x0}, - 1072: {region: 0x165, script: 0x5a, flags: 0x0}, - 1073: {region: 0x27, script: 0x5a, flags: 0x0}, + 1019: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1020: {region: 0x9d, script: 0x5, flags: 0x0}, + 1021: {region: 0xdb, script: 0x5b, flags: 0x0}, + 1022: {region: 0x4f, script: 0x5b, flags: 0x0}, + 1023: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1024: {region: 0xd0, script: 0x5b, flags: 0x0}, + 1025: {region: 0xc4, script: 0x5b, flags: 0x0}, + 1026: {region: 0x4c, script: 0x5b, flags: 0x0}, + 1027: {region: 0x97, script: 0x80, flags: 0x0}, + 1028: {region: 0xb7, script: 0x5b, flags: 0x0}, + 1029: {region: 0x166, script: 0x2c, flags: 0x0}, + 1030: {region: 0x166, script: 0x5b, flags: 0x0}, + 1032: {region: 0xbb, script: 0xeb, flags: 0x0}, + 1033: {region: 0x166, script: 0x5b, flags: 0x0}, + 1034: {region: 0xc5, script: 0x76, flags: 0x0}, + 1035: {region: 0x166, script: 0x5, flags: 0x0}, + 1036: {region: 0xb4, script: 0xd6, flags: 0x0}, + 1037: {region: 0x70, script: 0x5b, flags: 0x0}, + 1038: {region: 0x166, script: 0x5b, flags: 0x0}, + 1039: {region: 0x166, script: 0x5b, flags: 0x0}, + 1040: {region: 0x166, script: 0x5b, flags: 0x0}, + 1041: {region: 0x166, script: 0x5b, flags: 0x0}, + 1042: {region: 0x112, script: 0x5b, flags: 0x0}, + 1043: {region: 0x166, script: 0x5b, flags: 0x0}, + 1044: {region: 0xe9, script: 0x5, flags: 0x0}, + 1045: {region: 0x166, script: 0x5b, flags: 0x0}, + 1046: {region: 0x110, script: 0x5b, flags: 0x0}, + 1047: {region: 0x166, script: 0x5b, flags: 0x0}, + 1048: {region: 0xea, script: 0x5b, flags: 0x0}, + 1049: {region: 0x166, script: 0x5b, flags: 0x0}, + 1050: {region: 0x96, script: 0x5b, flags: 0x0}, + 1051: {region: 0x143, script: 0x5b, flags: 0x0}, + 1052: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1054: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1055: {region: 0x73, script: 0x5b, flags: 0x0}, + 1056: {region: 0x98, script: 0xcc, flags: 0x0}, + 1057: {region: 0x166, script: 0x5b, flags: 0x0}, + 1058: {region: 0x73, script: 0x5b, flags: 0x0}, + 1059: {region: 0x165, script: 0x5b, flags: 0x0}, + 1060: {region: 0x166, script: 0x5b, flags: 0x0}, + 1061: {region: 0xc4, script: 0x5b, flags: 0x0}, + 1062: {region: 0x166, script: 0x5b, flags: 0x0}, + 1063: {region: 0x166, script: 0x5b, flags: 0x0}, + 1064: {region: 0x166, script: 0x5b, flags: 0x0}, + 1065: {region: 0x116, script: 0x5b, flags: 0x0}, + 1066: {region: 0x166, script: 0x5b, flags: 0x0}, + 1067: {region: 0x166, script: 0x5b, flags: 0x0}, + 1068: {region: 0x124, script: 0xee, flags: 0x0}, + 1069: {region: 0x166, script: 0x5b, flags: 0x0}, + 1070: {region: 0x166, script: 0x5b, flags: 0x0}, + 1071: {region: 0x166, script: 0x5b, flags: 0x0}, + 1072: {region: 0x166, script: 0x5b, flags: 0x0}, + 1073: {region: 0x27, script: 0x5b, flags: 0x0}, 1074: {region: 0x37, script: 0x5, flags: 0x1}, - 1075: {region: 0x99, script: 0xd7, flags: 0x0}, - 1076: {region: 0x116, script: 0x5a, flags: 0x0}, - 1077: {region: 0x114, script: 0x5a, flags: 0x0}, - 1078: {region: 0x99, script: 0x22, flags: 0x0}, - 1079: {region: 0x161, script: 0x5a, flags: 0x0}, - 1080: {region: 0x165, script: 0x5a, flags: 0x0}, - 1081: {region: 0x165, script: 0x5a, flags: 0x0}, - 1082: {region: 0x6d, script: 0x5a, flags: 0x0}, - 1083: {region: 0x161, script: 0x5a, flags: 0x0}, - 1084: {region: 0x165, script: 0x5a, flags: 0x0}, - 1085: {region: 0x60, script: 0x5a, flags: 0x0}, - 1086: {region: 0x95, script: 0x5a, flags: 0x0}, - 1087: {region: 0x165, script: 0x5a, flags: 0x0}, - 1088: {region: 0x165, script: 0x5a, flags: 0x0}, - 1089: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1090: {region: 0x165, script: 0x5a, flags: 0x0}, - 1091: {region: 0x84, script: 0x5a, flags: 0x0}, - 1092: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1093: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1094: {region: 0x15f, script: 0x5, flags: 0x0}, - 1095: {region: 0x4b, script: 0x5a, flags: 0x0}, - 1096: {region: 0x60, script: 0x5a, flags: 0x0}, - 1097: {region: 0x165, script: 0x5a, flags: 0x0}, - 1098: {region: 0x99, script: 0x22, flags: 0x0}, - 1099: {region: 0x95, script: 0x5a, flags: 0x0}, - 1100: {region: 0x165, script: 0x5a, flags: 0x0}, + 1075: {region: 0x9a, script: 0xd9, flags: 0x0}, + 1076: {region: 0x117, script: 0x5b, flags: 0x0}, + 1077: {region: 0x115, script: 0x5b, flags: 0x0}, + 1078: {region: 0x9a, script: 0x22, flags: 0x0}, + 1079: {region: 0x162, script: 0x5b, flags: 0x0}, + 1080: {region: 0x166, script: 0x5b, flags: 0x0}, + 1081: {region: 0x166, script: 0x5b, flags: 0x0}, + 1082: {region: 0x6e, script: 0x5b, flags: 0x0}, + 1083: {region: 0x162, script: 0x5b, flags: 0x0}, + 1084: {region: 0x166, script: 0x5b, flags: 0x0}, + 1085: {region: 0x61, script: 0x5b, flags: 0x0}, + 1086: {region: 0x96, script: 0x5b, flags: 0x0}, + 1087: {region: 0x166, script: 0x5b, flags: 0x0}, + 1088: {region: 0x166, script: 0x5b, flags: 0x0}, + 1089: {region: 0x130, script: 0x5b, flags: 0x0}, + 1090: {region: 0x166, script: 0x5b, flags: 0x0}, + 1091: {region: 0x85, script: 0x5b, flags: 0x0}, + 1092: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1093: {region: 0x130, script: 0x5b, flags: 0x0}, + 1094: {region: 0x160, script: 0x5, flags: 0x0}, + 1095: {region: 0x4b, script: 0x5b, flags: 0x0}, + 1096: {region: 0x61, script: 0x5b, flags: 0x0}, + 1097: {region: 0x166, script: 0x5b, flags: 0x0}, + 1098: {region: 0x9a, script: 0x22, flags: 0x0}, + 1099: {region: 0x96, script: 0x5b, flags: 0x0}, + 1100: {region: 0x166, script: 0x5b, flags: 0x0}, 1101: {region: 0x35, script: 0xe, flags: 0x0}, - 1102: {region: 0x9b, script: 0xdb, flags: 0x0}, - 1103: {region: 0xe9, script: 0x5a, flags: 0x0}, - 1104: {region: 0x99, script: 0xe3, flags: 0x0}, - 1105: {region: 0xdb, script: 0x22, flags: 0x0}, - 1106: {region: 0x165, script: 0x5a, flags: 0x0}, - 1107: {region: 0x165, script: 0x5a, flags: 0x0}, - 1108: {region: 0x165, script: 0x5a, flags: 0x0}, - 1109: {region: 0x165, script: 0x5a, flags: 0x0}, - 1110: {region: 0x165, script: 0x5a, flags: 0x0}, - 1111: {region: 0x165, script: 0x5a, flags: 0x0}, - 1112: {region: 0x165, script: 0x5a, flags: 0x0}, - 1113: {region: 0x165, script: 0x5a, flags: 0x0}, - 1114: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1115: {region: 0x165, script: 0x5a, flags: 0x0}, - 1116: {region: 0x165, script: 0x5a, flags: 0x0}, - 1117: {region: 0x99, script: 0x52, flags: 0x0}, - 1118: {region: 0x53, script: 0xe1, flags: 0x0}, - 1119: {region: 0xdb, script: 0x22, flags: 0x0}, - 1120: {region: 0xdb, script: 0x22, flags: 0x0}, - 1121: {region: 0x99, script: 0xe6, flags: 0x0}, - 1122: {region: 0x165, script: 0x5a, flags: 0x0}, - 1123: {region: 0x112, script: 0x5a, flags: 0x0}, - 1124: {region: 0x131, script: 0x5a, flags: 0x0}, - 1125: {region: 0x126, script: 0x5a, flags: 0x0}, - 1126: {region: 0x165, script: 0x5a, flags: 0x0}, + 1102: {region: 0x9c, script: 0xde, flags: 0x0}, + 1103: {region: 0xea, script: 0x5b, flags: 0x0}, + 1104: {region: 0x9a, script: 0xe6, flags: 0x0}, + 1105: {region: 0xdc, script: 0x22, flags: 0x0}, + 1106: {region: 0x166, script: 0x5b, flags: 0x0}, + 1107: {region: 0x166, script: 0x5b, flags: 0x0}, + 1108: {region: 0x166, script: 0x5b, flags: 0x0}, + 1109: {region: 0x166, script: 0x5b, flags: 0x0}, + 1110: {region: 0x166, script: 0x5b, flags: 0x0}, + 1111: {region: 0x166, script: 0x5b, flags: 0x0}, + 1112: {region: 0x166, script: 0x5b, flags: 0x0}, + 1113: {region: 0x166, script: 0x5b, flags: 0x0}, + 1114: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1115: {region: 0x166, script: 0x5b, flags: 0x0}, + 1116: {region: 0x166, script: 0x5b, flags: 0x0}, + 1117: {region: 0x9a, script: 0x53, flags: 0x0}, + 1118: {region: 0x53, script: 0xe4, flags: 0x0}, + 1119: {region: 0xdc, script: 0x22, flags: 0x0}, + 1120: {region: 0xdc, script: 0x22, flags: 0x0}, + 1121: {region: 0x9a, script: 0xe9, flags: 0x0}, + 1122: {region: 0x166, script: 0x5b, flags: 0x0}, + 1123: {region: 0x113, script: 0x5b, flags: 0x0}, + 1124: {region: 0x132, script: 0x5b, flags: 0x0}, + 1125: {region: 0x127, script: 0x5b, flags: 0x0}, + 1126: {region: 0x166, script: 0x5b, flags: 0x0}, 1127: {region: 0x3c, script: 0x3, flags: 0x1}, - 1128: {region: 0x165, script: 0x5a, flags: 0x0}, - 1129: {region: 0x165, script: 0x5a, flags: 0x0}, - 1130: {region: 0x165, script: 0x5a, flags: 0x0}, - 1131: {region: 0x123, script: 0xeb, flags: 0x0}, - 1132: {region: 0xdb, script: 0x22, flags: 0x0}, - 1133: {region: 0xdb, script: 0x22, flags: 0x0}, - 1134: {region: 0xdb, script: 0x22, flags: 0x0}, - 1135: {region: 0x6f, script: 0x2c, flags: 0x0}, - 1136: {region: 0x165, script: 0x5a, flags: 0x0}, - 1137: {region: 0x6d, script: 0x2c, flags: 0x0}, - 1138: {region: 0x165, script: 0x5a, flags: 0x0}, - 1139: {region: 0x165, script: 0x5a, flags: 0x0}, - 1140: {region: 0x165, script: 0x5a, flags: 0x0}, - 1141: {region: 0xd6, script: 0x5a, flags: 0x0}, - 1142: {region: 0x127, script: 0x5a, flags: 0x0}, - 1143: {region: 0x125, script: 0x5a, flags: 0x0}, - 1144: {region: 0x32, script: 0x5a, flags: 0x0}, - 1145: {region: 0xdb, script: 0x22, flags: 0x0}, - 1146: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1147: {region: 0x165, script: 0x5a, flags: 0x0}, - 1148: {region: 0x165, script: 0x5a, flags: 0x0}, - 1149: {region: 0x32, script: 0x5a, flags: 0x0}, - 1150: {region: 0xd4, script: 0x5a, flags: 0x0}, - 1151: {region: 0x165, script: 0x5a, flags: 0x0}, - 1152: {region: 0x161, script: 0x5a, flags: 0x0}, - 1153: {region: 0x165, script: 0x5a, flags: 0x0}, - 1154: {region: 0x129, script: 0x5a, flags: 0x0}, - 1155: {region: 0x165, script: 0x5a, flags: 0x0}, - 1156: {region: 0xce, script: 0x5a, flags: 0x0}, - 1157: {region: 0x165, script: 0x5a, flags: 0x0}, - 1158: {region: 0xe6, script: 0x5a, flags: 0x0}, - 1159: {region: 0x165, script: 0x5a, flags: 0x0}, - 1160: {region: 0x165, script: 0x5a, flags: 0x0}, - 1161: {region: 0x165, script: 0x5a, flags: 0x0}, - 1162: {region: 0x12b, script: 0x5a, flags: 0x0}, - 1163: {region: 0x12b, script: 0x5a, flags: 0x0}, - 1164: {region: 0x12e, script: 0x5a, flags: 0x0}, - 1165: {region: 0x165, script: 0x5, flags: 0x0}, - 1166: {region: 0x161, script: 0x5a, flags: 0x0}, - 1167: {region: 0x87, script: 0x34, flags: 0x0}, - 1168: {region: 0xdb, script: 0x22, flags: 0x0}, - 1169: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1170: {region: 0x43, script: 0xec, flags: 0x0}, - 1171: {region: 0x165, script: 0x5a, flags: 0x0}, - 1172: {region: 0x106, script: 0x20, flags: 0x0}, - 1173: {region: 0x165, script: 0x5a, flags: 0x0}, - 1174: {region: 0x165, script: 0x5a, flags: 0x0}, - 1175: {region: 0x131, script: 0x5a, flags: 0x0}, - 1176: {region: 0x165, script: 0x5a, flags: 0x0}, - 1177: {region: 0x123, script: 0xeb, flags: 0x0}, - 1178: {region: 0x32, script: 0x5a, flags: 0x0}, - 1179: {region: 0x165, script: 0x5a, flags: 0x0}, - 1180: {region: 0x165, script: 0x5a, flags: 0x0}, - 1181: {region: 0xce, script: 0x5a, flags: 0x0}, - 1182: {region: 0x165, script: 0x5a, flags: 0x0}, - 1183: {region: 0x165, script: 0x5a, flags: 0x0}, - 1184: {region: 0x12d, script: 0x5a, flags: 0x0}, - 1185: {region: 0x165, script: 0x5a, flags: 0x0}, - 1187: {region: 0x165, script: 0x5a, flags: 0x0}, - 1188: {region: 0xd4, script: 0x5a, flags: 0x0}, - 1189: {region: 0x53, script: 0xe4, flags: 0x0}, - 1190: {region: 0xe5, script: 0x5a, flags: 0x0}, - 1191: {region: 0x165, script: 0x5a, flags: 0x0}, - 1192: {region: 0x106, script: 0x20, flags: 0x0}, - 1193: {region: 0xba, script: 0x5a, flags: 0x0}, - 1194: {region: 0x165, script: 0x5a, flags: 0x0}, - 1195: {region: 0x106, script: 0x20, flags: 0x0}, + 1128: {region: 0x166, script: 0x5b, flags: 0x0}, + 1129: {region: 0x166, script: 0x5b, flags: 0x0}, + 1130: {region: 0x166, script: 0x5b, flags: 0x0}, + 1131: {region: 0x124, script: 0xee, flags: 0x0}, + 1132: {region: 0xdc, script: 0x22, flags: 0x0}, + 1133: {region: 0xdc, script: 0x22, flags: 0x0}, + 1134: {region: 0xdc, script: 0x22, flags: 0x0}, + 1135: {region: 0x70, script: 0x2c, flags: 0x0}, + 1136: {region: 0x166, script: 0x5b, flags: 0x0}, + 1137: {region: 0x6e, script: 0x2c, flags: 0x0}, + 1138: {region: 0x166, script: 0x5b, flags: 0x0}, + 1139: {region: 0x166, script: 0x5b, flags: 0x0}, + 1140: {region: 0x166, script: 0x5b, flags: 0x0}, + 1141: {region: 0xd7, script: 0x5b, flags: 0x0}, + 1142: {region: 0x128, script: 0x5b, flags: 0x0}, + 1143: {region: 0x126, script: 0x5b, flags: 0x0}, + 1144: {region: 0x32, script: 0x5b, flags: 0x0}, + 1145: {region: 0xdc, script: 0x22, flags: 0x0}, + 1146: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1147: {region: 0x166, script: 0x5b, flags: 0x0}, + 1148: {region: 0x166, script: 0x5b, flags: 0x0}, + 1149: {region: 0x32, script: 0x5b, flags: 0x0}, + 1150: {region: 0xd5, script: 0x5b, flags: 0x0}, + 1151: {region: 0x166, script: 0x5b, flags: 0x0}, + 1152: {region: 0x162, script: 0x5b, flags: 0x0}, + 1153: {region: 0x166, script: 0x5b, flags: 0x0}, + 1154: {region: 0x12a, script: 0x5b, flags: 0x0}, + 1155: {region: 0x166, script: 0x5b, flags: 0x0}, + 1156: {region: 0xcf, script: 0x5b, flags: 0x0}, + 1157: {region: 0x166, script: 0x5b, flags: 0x0}, + 1158: {region: 0xe7, script: 0x5b, flags: 0x0}, + 1159: {region: 0x166, script: 0x5b, flags: 0x0}, + 1160: {region: 0x166, script: 0x5b, flags: 0x0}, + 1161: {region: 0x166, script: 0x5b, flags: 0x0}, + 1162: {region: 0x12c, script: 0x5b, flags: 0x0}, + 1163: {region: 0x12c, script: 0x5b, flags: 0x0}, + 1164: {region: 0x12f, script: 0x5b, flags: 0x0}, + 1165: {region: 0x166, script: 0x5, flags: 0x0}, + 1166: {region: 0x162, script: 0x5b, flags: 0x0}, + 1167: {region: 0x88, script: 0x34, flags: 0x0}, + 1168: {region: 0xdc, script: 0x22, flags: 0x0}, + 1169: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1170: {region: 0x43, script: 0xef, flags: 0x0}, + 1171: {region: 0x166, script: 0x5b, flags: 0x0}, + 1172: {region: 0x107, script: 0x20, flags: 0x0}, + 1173: {region: 0x166, script: 0x5b, flags: 0x0}, + 1174: {region: 0x166, script: 0x5b, flags: 0x0}, + 1175: {region: 0x132, script: 0x5b, flags: 0x0}, + 1176: {region: 0x166, script: 0x5b, flags: 0x0}, + 1177: {region: 0x124, script: 0xee, flags: 0x0}, + 1178: {region: 0x32, script: 0x5b, flags: 0x0}, + 1179: {region: 0x166, script: 0x5b, flags: 0x0}, + 1180: {region: 0x166, script: 0x5b, flags: 0x0}, + 1181: {region: 0xcf, script: 0x5b, flags: 0x0}, + 1182: {region: 0x166, script: 0x5b, flags: 0x0}, + 1183: {region: 0x166, script: 0x5b, flags: 0x0}, + 1184: {region: 0x12e, script: 0x5b, flags: 0x0}, + 1185: {region: 0x166, script: 0x5b, flags: 0x0}, + 1187: {region: 0x166, script: 0x5b, flags: 0x0}, + 1188: {region: 0xd5, script: 0x5b, flags: 0x0}, + 1189: {region: 0x53, script: 0xe7, flags: 0x0}, + 1190: {region: 0xe6, script: 0x5b, flags: 0x0}, + 1191: {region: 0x166, script: 0x5b, flags: 0x0}, + 1192: {region: 0x107, script: 0x20, flags: 0x0}, + 1193: {region: 0xbb, script: 0x5b, flags: 0x0}, + 1194: {region: 0x166, script: 0x5b, flags: 0x0}, + 1195: {region: 0x107, script: 0x20, flags: 0x0}, 1196: {region: 0x3f, script: 0x4, flags: 0x1}, - 1197: {region: 0x11c, script: 0xf0, flags: 0x0}, - 1198: {region: 0x130, script: 0x20, flags: 0x0}, - 1199: {region: 0x75, script: 0x5a, flags: 0x0}, - 1200: {region: 0x2a, script: 0x5a, flags: 0x0}, + 1197: {region: 0x11d, script: 0xf3, flags: 0x0}, + 1198: {region: 0x131, script: 0x20, flags: 0x0}, + 1199: {region: 0x76, script: 0x5b, flags: 0x0}, + 1200: {region: 0x2a, script: 0x5b, flags: 0x0}, 1202: {region: 0x43, script: 0x3, flags: 0x1}, - 1203: {region: 0x99, script: 0xe, flags: 0x0}, - 1204: {region: 0xe8, script: 0x5, flags: 0x0}, - 1205: {region: 0x165, script: 0x5a, flags: 0x0}, - 1206: {region: 0x165, script: 0x5a, flags: 0x0}, - 1207: {region: 0x165, script: 0x5a, flags: 0x0}, - 1208: {region: 0x165, script: 0x5a, flags: 0x0}, - 1209: {region: 0x165, script: 0x5a, flags: 0x0}, - 1210: {region: 0x165, script: 0x5a, flags: 0x0}, - 1211: {region: 0x165, script: 0x5a, flags: 0x0}, + 1203: {region: 0x9a, script: 0xe, flags: 0x0}, + 1204: {region: 0xe9, script: 0x5, flags: 0x0}, + 1205: {region: 0x166, script: 0x5b, flags: 0x0}, + 1206: {region: 0x166, script: 0x5b, flags: 0x0}, + 1207: {region: 0x166, script: 0x5b, flags: 0x0}, + 1208: {region: 0x166, script: 0x5b, flags: 0x0}, + 1209: {region: 0x166, script: 0x5b, flags: 0x0}, + 1210: {region: 0x166, script: 0x5b, flags: 0x0}, + 1211: {region: 0x166, script: 0x5b, flags: 0x0}, 1212: {region: 0x46, script: 0x4, flags: 0x1}, - 1213: {region: 0x165, script: 0x5a, flags: 0x0}, - 1214: {region: 0xb4, script: 0xf1, flags: 0x0}, - 1215: {region: 0x165, script: 0x5a, flags: 0x0}, - 1216: {region: 0x161, script: 0x5a, flags: 0x0}, - 1217: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1218: {region: 0x106, script: 0x5a, flags: 0x0}, - 1219: {region: 0x13e, script: 0x5a, flags: 0x0}, - 1220: {region: 0x11b, script: 0x5a, flags: 0x0}, - 1221: {region: 0x165, script: 0x5a, flags: 0x0}, - 1222: {region: 0x36, script: 0x5a, flags: 0x0}, - 1223: {region: 0x60, script: 0x5a, flags: 0x0}, - 1224: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1225: {region: 0x1, script: 0x5a, flags: 0x0}, - 1226: {region: 0x106, script: 0x5a, flags: 0x0}, - 1227: {region: 0x6a, script: 0x5a, flags: 0x0}, - 1228: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1229: {region: 0x165, script: 0x5a, flags: 0x0}, - 1230: {region: 0x36, script: 0x5a, flags: 0x0}, - 1231: {region: 0x4e, script: 0x5a, flags: 0x0}, - 1232: {region: 0x165, script: 0x5a, flags: 0x0}, - 1233: {region: 0x6f, script: 0x2c, flags: 0x0}, - 1234: {region: 0x165, script: 0x5a, flags: 0x0}, - 1235: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1236: {region: 0x2f, script: 0x5a, flags: 0x0}, - 1237: {region: 0x99, script: 0xe6, flags: 0x0}, - 1238: {region: 0x99, script: 0x22, flags: 0x0}, - 1239: {region: 0x165, script: 0x5a, flags: 0x0}, - 1240: {region: 0x165, script: 0x5a, flags: 0x0}, - 1241: {region: 0x165, script: 0x5a, flags: 0x0}, - 1242: {region: 0x165, script: 0x5a, flags: 0x0}, - 1243: {region: 0x165, script: 0x5a, flags: 0x0}, - 1244: {region: 0x165, script: 0x5a, flags: 0x0}, - 1245: {region: 0x165, script: 0x5a, flags: 0x0}, - 1246: {region: 0x165, script: 0x5a, flags: 0x0}, - 1247: {region: 0x165, script: 0x5a, flags: 0x0}, - 1248: {region: 0x140, script: 0x5a, flags: 0x0}, - 1249: {region: 0x165, script: 0x5a, flags: 0x0}, - 1250: {region: 0x165, script: 0x5a, flags: 0x0}, - 1251: {region: 0xa8, script: 0x5, flags: 0x0}, - 1252: {region: 0x165, script: 0x5a, flags: 0x0}, - 1253: {region: 0x114, script: 0x5a, flags: 0x0}, - 1254: {region: 0x165, script: 0x5a, flags: 0x0}, - 1255: {region: 0x165, script: 0x5a, flags: 0x0}, - 1256: {region: 0x165, script: 0x5a, flags: 0x0}, - 1257: {region: 0x165, script: 0x5a, flags: 0x0}, - 1258: {region: 0x99, script: 0x22, flags: 0x0}, + 1213: {region: 0x166, script: 0x5b, flags: 0x0}, + 1214: {region: 0xb5, script: 0xf4, flags: 0x0}, + 1215: {region: 0x166, script: 0x5b, flags: 0x0}, + 1216: {region: 0x162, script: 0x5b, flags: 0x0}, + 1217: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1218: {region: 0x107, script: 0x5b, flags: 0x0}, + 1219: {region: 0x13f, script: 0x5b, flags: 0x0}, + 1220: {region: 0x11c, script: 0x5b, flags: 0x0}, + 1221: {region: 0x166, script: 0x5b, flags: 0x0}, + 1222: {region: 0x36, script: 0x5b, flags: 0x0}, + 1223: {region: 0x61, script: 0x5b, flags: 0x0}, + 1224: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1225: {region: 0x1, script: 0x5b, flags: 0x0}, + 1226: {region: 0x107, script: 0x5b, flags: 0x0}, + 1227: {region: 0x6b, script: 0x5b, flags: 0x0}, + 1228: {region: 0x130, script: 0x5b, flags: 0x0}, + 1229: {region: 0x166, script: 0x5b, flags: 0x0}, + 1230: {region: 0x36, script: 0x5b, flags: 0x0}, + 1231: {region: 0x4e, script: 0x5b, flags: 0x0}, + 1232: {region: 0x166, script: 0x5b, flags: 0x0}, + 1233: {region: 0x70, script: 0x2c, flags: 0x0}, + 1234: {region: 0x166, script: 0x5b, flags: 0x0}, + 1235: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1236: {region: 0x2f, script: 0x5b, flags: 0x0}, + 1237: {region: 0x9a, script: 0xe9, flags: 0x0}, + 1238: {region: 0x9a, script: 0x22, flags: 0x0}, + 1239: {region: 0x166, script: 0x5b, flags: 0x0}, + 1240: {region: 0x166, script: 0x5b, flags: 0x0}, + 1241: {region: 0x166, script: 0x5b, flags: 0x0}, + 1242: {region: 0x166, script: 0x5b, flags: 0x0}, + 1243: {region: 0x166, script: 0x5b, flags: 0x0}, + 1244: {region: 0x166, script: 0x5b, flags: 0x0}, + 1245: {region: 0x166, script: 0x5b, flags: 0x0}, + 1246: {region: 0x166, script: 0x5b, flags: 0x0}, + 1247: {region: 0x166, script: 0x5b, flags: 0x0}, + 1248: {region: 0x141, script: 0x5b, flags: 0x0}, + 1249: {region: 0x166, script: 0x5b, flags: 0x0}, + 1250: {region: 0x166, script: 0x5b, flags: 0x0}, + 1251: {region: 0xa9, script: 0x5, flags: 0x0}, + 1252: {region: 0x166, script: 0x5b, flags: 0x0}, + 1253: {region: 0x115, script: 0x5b, flags: 0x0}, + 1254: {region: 0x166, script: 0x5b, flags: 0x0}, + 1255: {region: 0x166, script: 0x5b, flags: 0x0}, + 1256: {region: 0x166, script: 0x5b, flags: 0x0}, + 1257: {region: 0x166, script: 0x5b, flags: 0x0}, + 1258: {region: 0x9a, script: 0x22, flags: 0x0}, 1259: {region: 0x53, script: 0x3b, flags: 0x0}, - 1260: {region: 0x165, script: 0x5a, flags: 0x0}, - 1261: {region: 0x165, script: 0x5a, flags: 0x0}, - 1262: {region: 0x41, script: 0x5a, flags: 0x0}, - 1263: {region: 0x165, script: 0x5a, flags: 0x0}, - 1264: {region: 0x12b, script: 0x18, flags: 0x0}, - 1265: {region: 0x165, script: 0x5a, flags: 0x0}, - 1266: {region: 0x161, script: 0x5a, flags: 0x0}, - 1267: {region: 0x165, script: 0x5a, flags: 0x0}, - 1268: {region: 0x12b, script: 0x62, flags: 0x0}, - 1269: {region: 0x12b, script: 0x63, flags: 0x0}, - 1270: {region: 0x7d, script: 0x2e, flags: 0x0}, - 1271: {region: 0x53, script: 0x67, flags: 0x0}, - 1272: {region: 0x10b, script: 0x6c, flags: 0x0}, - 1273: {region: 0x108, script: 0x77, flags: 0x0}, - 1274: {region: 0x99, script: 0x22, flags: 0x0}, - 1275: {region: 0x131, script: 0x5a, flags: 0x0}, - 1276: {region: 0x165, script: 0x5a, flags: 0x0}, - 1277: {region: 0x9c, script: 0x91, flags: 0x0}, - 1278: {region: 0x165, script: 0x5a, flags: 0x0}, - 1279: {region: 0x15e, script: 0xcc, flags: 0x0}, - 1280: {region: 0x165, script: 0x5a, flags: 0x0}, - 1281: {region: 0x165, script: 0x5a, flags: 0x0}, - 1282: {region: 0xdb, script: 0x22, flags: 0x0}, - 1283: {region: 0x165, script: 0x5a, flags: 0x0}, - 1284: {region: 0x165, script: 0x5a, flags: 0x0}, - 1285: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1286: {region: 0x75, script: 0x5a, flags: 0x0}, - 1287: {region: 0x165, script: 0x5a, flags: 0x0}, - 1288: {region: 0x165, script: 0x5a, flags: 0x0}, - 1289: {region: 0x52, script: 0x5a, flags: 0x0}, - 1290: {region: 0x165, script: 0x5a, flags: 0x0}, - 1291: {region: 0x165, script: 0x5a, flags: 0x0}, - 1292: {region: 0x165, script: 0x5a, flags: 0x0}, - 1293: {region: 0x52, script: 0x5a, flags: 0x0}, - 1294: {region: 0x165, script: 0x5a, flags: 0x0}, - 1295: {region: 0x165, script: 0x5a, flags: 0x0}, - 1296: {region: 0x165, script: 0x5a, flags: 0x0}, - 1297: {region: 0x165, script: 0x5a, flags: 0x0}, + 1260: {region: 0x166, script: 0x5b, flags: 0x0}, + 1261: {region: 0x166, script: 0x5b, flags: 0x0}, + 1262: {region: 0x41, script: 0x5b, flags: 0x0}, + 1263: {region: 0x166, script: 0x5b, flags: 0x0}, + 1264: {region: 0x12c, script: 0x18, flags: 0x0}, + 1265: {region: 0x166, script: 0x5b, flags: 0x0}, + 1266: {region: 0x162, script: 0x5b, flags: 0x0}, + 1267: {region: 0x166, script: 0x5b, flags: 0x0}, + 1268: {region: 0x12c, script: 0x63, flags: 0x0}, + 1269: {region: 0x12c, script: 0x64, flags: 0x0}, + 1270: {region: 0x7e, script: 0x2e, flags: 0x0}, + 1271: {region: 0x53, script: 0x68, flags: 0x0}, + 1272: {region: 0x10c, script: 0x6d, flags: 0x0}, + 1273: {region: 0x109, script: 0x79, flags: 0x0}, + 1274: {region: 0x9a, script: 0x22, flags: 0x0}, + 1275: {region: 0x132, script: 0x5b, flags: 0x0}, + 1276: {region: 0x166, script: 0x5b, flags: 0x0}, + 1277: {region: 0x9d, script: 0x93, flags: 0x0}, + 1278: {region: 0x166, script: 0x5b, flags: 0x0}, + 1279: {region: 0x15f, script: 0xce, flags: 0x0}, + 1280: {region: 0x166, script: 0x5b, flags: 0x0}, + 1281: {region: 0x166, script: 0x5b, flags: 0x0}, + 1282: {region: 0xdc, script: 0x22, flags: 0x0}, + 1283: {region: 0x166, script: 0x5b, flags: 0x0}, + 1284: {region: 0x166, script: 0x5b, flags: 0x0}, + 1285: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1286: {region: 0x76, script: 0x5b, flags: 0x0}, + 1287: {region: 0x166, script: 0x5b, flags: 0x0}, + 1288: {region: 0x166, script: 0x5b, flags: 0x0}, + 1289: {region: 0x52, script: 0x5b, flags: 0x0}, + 1290: {region: 0x166, script: 0x5b, flags: 0x0}, + 1291: {region: 0x166, script: 0x5b, flags: 0x0}, + 1292: {region: 0x166, script: 0x5b, flags: 0x0}, + 1293: {region: 0x52, script: 0x5b, flags: 0x0}, + 1294: {region: 0x166, script: 0x5b, flags: 0x0}, + 1295: {region: 0x166, script: 0x5b, flags: 0x0}, + 1296: {region: 0x166, script: 0x5b, flags: 0x0}, + 1297: {region: 0x166, script: 0x5b, flags: 0x0}, 1298: {region: 0x1, script: 0x3e, flags: 0x0}, - 1299: {region: 0x165, script: 0x5a, flags: 0x0}, - 1300: {region: 0x165, script: 0x5a, flags: 0x0}, - 1301: {region: 0x165, script: 0x5a, flags: 0x0}, - 1302: {region: 0x165, script: 0x5a, flags: 0x0}, - 1303: {region: 0x165, script: 0x5a, flags: 0x0}, - 1304: {region: 0xd6, script: 0x5a, flags: 0x0}, - 1305: {region: 0x165, script: 0x5a, flags: 0x0}, - 1306: {region: 0x165, script: 0x5a, flags: 0x0}, - 1307: {region: 0x165, script: 0x5a, flags: 0x0}, - 1308: {region: 0x41, script: 0x5a, flags: 0x0}, - 1309: {region: 0x165, script: 0x5a, flags: 0x0}, - 1310: {region: 0xcf, script: 0x5a, flags: 0x0}, + 1299: {region: 0x166, script: 0x5b, flags: 0x0}, + 1300: {region: 0x166, script: 0x5b, flags: 0x0}, + 1301: {region: 0x166, script: 0x5b, flags: 0x0}, + 1302: {region: 0x166, script: 0x5b, flags: 0x0}, + 1303: {region: 0x166, script: 0x5b, flags: 0x0}, + 1304: {region: 0xd7, script: 0x5b, flags: 0x0}, + 1305: {region: 0x166, script: 0x5b, flags: 0x0}, + 1306: {region: 0x166, script: 0x5b, flags: 0x0}, + 1307: {region: 0x166, script: 0x5b, flags: 0x0}, + 1308: {region: 0x41, script: 0x5b, flags: 0x0}, + 1309: {region: 0x166, script: 0x5b, flags: 0x0}, + 1310: {region: 0xd0, script: 0x5b, flags: 0x0}, 1311: {region: 0x4a, script: 0x3, flags: 0x1}, - 1312: {region: 0x165, script: 0x5a, flags: 0x0}, - 1313: {region: 0x165, script: 0x5a, flags: 0x0}, - 1314: {region: 0x165, script: 0x5a, flags: 0x0}, - 1315: {region: 0x53, script: 0x5a, flags: 0x0}, - 1316: {region: 0x10b, script: 0x5a, flags: 0x0}, - 1318: {region: 0xa8, script: 0x5, flags: 0x0}, - 1319: {region: 0xd9, script: 0x5a, flags: 0x0}, - 1320: {region: 0xba, script: 0xe8, flags: 0x0}, + 1312: {region: 0x166, script: 0x5b, flags: 0x0}, + 1313: {region: 0x166, script: 0x5b, flags: 0x0}, + 1314: {region: 0x166, script: 0x5b, flags: 0x0}, + 1315: {region: 0x53, script: 0x5b, flags: 0x0}, + 1316: {region: 0x10c, script: 0x5b, flags: 0x0}, + 1318: {region: 0xa9, script: 0x5, flags: 0x0}, + 1319: {region: 0xda, script: 0x5b, flags: 0x0}, + 1320: {region: 0xbb, script: 0xeb, flags: 0x0}, 1321: {region: 0x4d, script: 0x14, flags: 0x1}, - 1322: {region: 0x53, script: 0x7d, flags: 0x0}, - 1323: {region: 0x165, script: 0x5a, flags: 0x0}, - 1324: {region: 0x122, script: 0x5a, flags: 0x0}, - 1325: {region: 0xd0, script: 0x5a, flags: 0x0}, - 1326: {region: 0x165, script: 0x5a, flags: 0x0}, - 1327: {region: 0x161, script: 0x5a, flags: 0x0}, - 1329: {region: 0x12b, script: 0x5a, flags: 0x0}, + 1322: {region: 0x53, script: 0x7f, flags: 0x0}, + 1323: {region: 0x166, script: 0x5b, flags: 0x0}, + 1324: {region: 0x123, script: 0x5b, flags: 0x0}, + 1325: {region: 0xd1, script: 0x5b, flags: 0x0}, + 1326: {region: 0x166, script: 0x5b, flags: 0x0}, + 1327: {region: 0x162, script: 0x5b, flags: 0x0}, + 1329: {region: 0x12c, script: 0x5b, flags: 0x0}, } // likelyLangList holds lists info associated with likelyLang. // Size: 582 bytes, 97 elements var likelyLangList = [97]likelyScriptRegion{ - 0: {region: 0x9c, script: 0x7, flags: 0x0}, - 1: {region: 0xa1, script: 0x78, flags: 0x2}, - 2: {region: 0x11c, script: 0x85, flags: 0x2}, - 3: {region: 0x32, script: 0x5a, flags: 0x0}, - 4: {region: 0x9b, script: 0x5, flags: 0x4}, - 5: {region: 0x9c, script: 0x5, flags: 0x4}, - 6: {region: 0x106, script: 0x20, flags: 0x4}, - 7: {region: 0x9c, script: 0x5, flags: 0x2}, - 8: {region: 0x106, script: 0x20, flags: 0x0}, + 0: {region: 0x9d, script: 0x7, flags: 0x0}, + 1: {region: 0xa2, script: 0x7a, flags: 0x2}, + 2: {region: 0x11d, script: 0x87, flags: 0x2}, + 3: {region: 0x32, script: 0x5b, flags: 0x0}, + 4: {region: 0x9c, script: 0x5, flags: 0x4}, + 5: {region: 0x9d, script: 0x5, flags: 0x4}, + 6: {region: 0x107, script: 0x20, flags: 0x4}, + 7: {region: 0x9d, script: 0x5, flags: 0x2}, + 8: {region: 0x107, script: 0x20, flags: 0x0}, 9: {region: 0x38, script: 0x2f, flags: 0x2}, - 10: {region: 0x135, script: 0x5a, flags: 0x0}, - 11: {region: 0x7b, script: 0xcf, flags: 0x2}, - 12: {region: 0x114, script: 0x5a, flags: 0x0}, - 13: {region: 0x84, script: 0x1, flags: 0x2}, - 14: {region: 0x5d, script: 0x1f, flags: 0x0}, - 15: {region: 0x87, script: 0x5f, flags: 0x2}, - 16: {region: 0xd6, script: 0x5a, flags: 0x0}, + 10: {region: 0x136, script: 0x5b, flags: 0x0}, + 11: {region: 0x7c, script: 0xd1, flags: 0x2}, + 12: {region: 0x115, script: 0x5b, flags: 0x0}, + 13: {region: 0x85, script: 0x1, flags: 0x2}, + 14: {region: 0x5e, script: 0x1f, flags: 0x0}, + 15: {region: 0x88, script: 0x60, flags: 0x2}, + 16: {region: 0xd7, script: 0x5b, flags: 0x0}, 17: {region: 0x52, script: 0x5, flags: 0x4}, - 18: {region: 0x10b, script: 0x5, flags: 0x4}, - 19: {region: 0xae, script: 0x20, flags: 0x0}, + 18: {region: 0x10c, script: 0x5, flags: 0x4}, + 19: {region: 0xaf, script: 0x20, flags: 0x0}, 20: {region: 0x24, script: 0x5, flags: 0x4}, 21: {region: 0x53, script: 0x5, flags: 0x4}, - 22: {region: 0x9c, script: 0x5, flags: 0x4}, - 23: {region: 0xc5, script: 0x5, flags: 0x4}, + 22: {region: 0x9d, script: 0x5, flags: 0x4}, + 23: {region: 0xc6, script: 0x5, flags: 0x4}, 24: {region: 0x53, script: 0x5, flags: 0x2}, - 25: {region: 0x12b, script: 0x5a, flags: 0x0}, - 26: {region: 0xb0, script: 0x5, flags: 0x4}, - 27: {region: 0x9b, script: 0x5, flags: 0x2}, - 28: {region: 0xa5, script: 0x20, flags: 0x0}, + 25: {region: 0x12c, script: 0x5b, flags: 0x0}, + 26: {region: 0xb1, script: 0x5, flags: 0x4}, + 27: {region: 0x9c, script: 0x5, flags: 0x2}, + 28: {region: 0xa6, script: 0x20, flags: 0x0}, 29: {region: 0x53, script: 0x5, flags: 0x4}, - 30: {region: 0x12b, script: 0x5a, flags: 0x4}, + 30: {region: 0x12c, script: 0x5b, flags: 0x4}, 31: {region: 0x53, script: 0x5, flags: 0x2}, - 32: {region: 0x12b, script: 0x5a, flags: 0x2}, - 33: {region: 0xdb, script: 0x22, flags: 0x0}, - 34: {region: 0x99, script: 0x5d, flags: 0x2}, - 35: {region: 0x83, script: 0x5a, flags: 0x0}, - 36: {region: 0x84, script: 0x7c, flags: 0x4}, - 37: {region: 0x84, script: 0x7c, flags: 0x2}, - 38: {region: 0xc5, script: 0x20, flags: 0x0}, - 39: {region: 0x53, script: 0x70, flags: 0x4}, - 40: {region: 0x53, script: 0x70, flags: 0x2}, - 41: {region: 0xd0, script: 0x5a, flags: 0x0}, + 32: {region: 0x12c, script: 0x5b, flags: 0x2}, + 33: {region: 0xdc, script: 0x22, flags: 0x0}, + 34: {region: 0x9a, script: 0x5e, flags: 0x2}, + 35: {region: 0x84, script: 0x5b, flags: 0x0}, + 36: {region: 0x85, script: 0x7e, flags: 0x4}, + 37: {region: 0x85, script: 0x7e, flags: 0x2}, + 38: {region: 0xc6, script: 0x20, flags: 0x0}, + 39: {region: 0x53, script: 0x71, flags: 0x4}, + 40: {region: 0x53, script: 0x71, flags: 0x2}, + 41: {region: 0xd1, script: 0x5b, flags: 0x0}, 42: {region: 0x4a, script: 0x5, flags: 0x4}, - 43: {region: 0x95, script: 0x5, flags: 0x4}, - 44: {region: 0x99, script: 0x36, flags: 0x0}, - 45: {region: 0xe8, script: 0x5, flags: 0x4}, - 46: {region: 0xe8, script: 0x5, flags: 0x2}, - 47: {region: 0x9c, script: 0x8b, flags: 0x0}, - 48: {region: 0x53, script: 0x8c, flags: 0x2}, - 49: {region: 0xba, script: 0xe8, flags: 0x0}, - 50: {region: 0xd9, script: 0x5a, flags: 0x4}, - 51: {region: 0xe8, script: 0x5, flags: 0x0}, - 52: {region: 0x99, script: 0x22, flags: 0x2}, - 53: {region: 0x99, script: 0x4f, flags: 0x2}, - 54: {region: 0x99, script: 0xd3, flags: 0x2}, - 55: {region: 0x105, script: 0x20, flags: 0x0}, - 56: {region: 0xbd, script: 0x5a, flags: 0x4}, - 57: {region: 0x104, script: 0x5a, flags: 0x4}, - 58: {region: 0x106, script: 0x5a, flags: 0x4}, - 59: {region: 0x12b, script: 0x5a, flags: 0x4}, - 60: {region: 0x124, script: 0x20, flags: 0x0}, - 61: {region: 0xe8, script: 0x5, flags: 0x4}, - 62: {region: 0xe8, script: 0x5, flags: 0x2}, + 43: {region: 0x96, script: 0x5, flags: 0x4}, + 44: {region: 0x9a, script: 0x36, flags: 0x0}, + 45: {region: 0xe9, script: 0x5, flags: 0x4}, + 46: {region: 0xe9, script: 0x5, flags: 0x2}, + 47: {region: 0x9d, script: 0x8d, flags: 0x0}, + 48: {region: 0x53, script: 0x8e, flags: 0x2}, + 49: {region: 0xbb, script: 0xeb, flags: 0x0}, + 50: {region: 0xda, script: 0x5b, flags: 0x4}, + 51: {region: 0xe9, script: 0x5, flags: 0x0}, + 52: {region: 0x9a, script: 0x22, flags: 0x2}, + 53: {region: 0x9a, script: 0x50, flags: 0x2}, + 54: {region: 0x9a, script: 0xd5, flags: 0x2}, + 55: {region: 0x106, script: 0x20, flags: 0x0}, + 56: {region: 0xbe, script: 0x5b, flags: 0x4}, + 57: {region: 0x105, script: 0x5b, flags: 0x4}, + 58: {region: 0x107, script: 0x5b, flags: 0x4}, + 59: {region: 0x12c, script: 0x5b, flags: 0x4}, + 60: {region: 0x125, script: 0x20, flags: 0x0}, + 61: {region: 0xe9, script: 0x5, flags: 0x4}, + 62: {region: 0xe9, script: 0x5, flags: 0x2}, 63: {region: 0x53, script: 0x5, flags: 0x0}, - 64: {region: 0xae, script: 0x20, flags: 0x4}, - 65: {region: 0xc5, script: 0x20, flags: 0x4}, - 66: {region: 0xae, script: 0x20, flags: 0x2}, - 67: {region: 0x99, script: 0xe, flags: 0x0}, - 68: {region: 0xdb, script: 0x22, flags: 0x4}, - 69: {region: 0xdb, script: 0x22, flags: 0x2}, - 70: {region: 0x137, script: 0x5a, flags: 0x0}, + 64: {region: 0xaf, script: 0x20, flags: 0x4}, + 65: {region: 0xc6, script: 0x20, flags: 0x4}, + 66: {region: 0xaf, script: 0x20, flags: 0x2}, + 67: {region: 0x9a, script: 0xe, flags: 0x0}, + 68: {region: 0xdc, script: 0x22, flags: 0x4}, + 69: {region: 0xdc, script: 0x22, flags: 0x2}, + 70: {region: 0x138, script: 0x5b, flags: 0x0}, 71: {region: 0x24, script: 0x5, flags: 0x4}, 72: {region: 0x53, script: 0x20, flags: 0x4}, 73: {region: 0x24, script: 0x5, flags: 0x2}, - 74: {region: 0x8d, script: 0x3c, flags: 0x0}, + 74: {region: 0x8e, script: 0x3c, flags: 0x0}, 75: {region: 0x53, script: 0x3b, flags: 0x4}, 76: {region: 0x53, script: 0x3b, flags: 0x2}, 77: {region: 0x53, script: 0x3b, flags: 0x0}, 78: {region: 0x2f, script: 0x3c, flags: 0x4}, 79: {region: 0x3e, script: 0x3c, flags: 0x4}, - 80: {region: 0x7b, script: 0x3c, flags: 0x4}, - 81: {region: 0x7e, script: 0x3c, flags: 0x4}, - 82: {region: 0x8d, script: 0x3c, flags: 0x4}, - 83: {region: 0x95, script: 0x3c, flags: 0x4}, - 84: {region: 0xc6, script: 0x3c, flags: 0x4}, - 85: {region: 0xd0, script: 0x3c, flags: 0x4}, - 86: {region: 0xe2, script: 0x3c, flags: 0x4}, - 87: {region: 0xe5, script: 0x3c, flags: 0x4}, - 88: {region: 0xe7, script: 0x3c, flags: 0x4}, - 89: {region: 0x116, script: 0x3c, flags: 0x4}, - 90: {region: 0x123, script: 0x3c, flags: 0x4}, - 91: {region: 0x12e, script: 0x3c, flags: 0x4}, - 92: {region: 0x135, script: 0x3c, flags: 0x4}, - 93: {region: 0x13e, script: 0x3c, flags: 0x4}, - 94: {region: 0x12e, script: 0x11, flags: 0x2}, - 95: {region: 0x12e, script: 0x37, flags: 0x2}, - 96: {region: 0x12e, script: 0x3c, flags: 0x2}, + 80: {region: 0x7c, script: 0x3c, flags: 0x4}, + 81: {region: 0x7f, script: 0x3c, flags: 0x4}, + 82: {region: 0x8e, script: 0x3c, flags: 0x4}, + 83: {region: 0x96, script: 0x3c, flags: 0x4}, + 84: {region: 0xc7, script: 0x3c, flags: 0x4}, + 85: {region: 0xd1, script: 0x3c, flags: 0x4}, + 86: {region: 0xe3, script: 0x3c, flags: 0x4}, + 87: {region: 0xe6, script: 0x3c, flags: 0x4}, + 88: {region: 0xe8, script: 0x3c, flags: 0x4}, + 89: {region: 0x117, script: 0x3c, flags: 0x4}, + 90: {region: 0x124, script: 0x3c, flags: 0x4}, + 91: {region: 0x12f, script: 0x3c, flags: 0x4}, + 92: {region: 0x136, script: 0x3c, flags: 0x4}, + 93: {region: 0x13f, script: 0x3c, flags: 0x4}, + 94: {region: 0x12f, script: 0x11, flags: 0x2}, + 95: {region: 0x12f, script: 0x37, flags: 0x2}, + 96: {region: 0x12f, script: 0x3c, flags: 0x2}, } type likelyLangScript struct { @@ -2987,306 +3009,306 @@ type likelyLangScript struct { // for a given regionID, lang and script are the index and size respectively // of the list in likelyRegionList. // TODO: exclude containers and user-definable regions from the list. -// Size: 2148 bytes, 358 elements -var likelyRegion = [358]likelyLangScript{ - 34: {lang: 0xd7, script: 0x5a, flags: 0x0}, +// Size: 2154 bytes, 359 elements +var likelyRegion = [359]likelyLangScript{ + 34: {lang: 0xd7, script: 0x5b, flags: 0x0}, 35: {lang: 0x3a, script: 0x5, flags: 0x0}, 36: {lang: 0x0, script: 0x2, flags: 0x1}, 39: {lang: 0x2, script: 0x2, flags: 0x1}, 40: {lang: 0x4, script: 0x2, flags: 0x1}, - 42: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 43: {lang: 0x0, script: 0x5a, flags: 0x0}, - 44: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 45: {lang: 0x41b, script: 0x5a, flags: 0x0}, - 46: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 48: {lang: 0x367, script: 0x5a, flags: 0x0}, - 49: {lang: 0x444, script: 0x5a, flags: 0x0}, - 50: {lang: 0x58, script: 0x5a, flags: 0x0}, + 42: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 43: {lang: 0x0, script: 0x5b, flags: 0x0}, + 44: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 45: {lang: 0x41b, script: 0x5b, flags: 0x0}, + 46: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 48: {lang: 0x367, script: 0x5b, flags: 0x0}, + 49: {lang: 0x444, script: 0x5b, flags: 0x0}, + 50: {lang: 0x58, script: 0x5b, flags: 0x0}, 51: {lang: 0x6, script: 0x2, flags: 0x1}, 53: {lang: 0xa5, script: 0xe, flags: 0x0}, - 54: {lang: 0x367, script: 0x5a, flags: 0x0}, - 55: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 54: {lang: 0x367, script: 0x5b, flags: 0x0}, + 55: {lang: 0x15e, script: 0x5b, flags: 0x0}, 56: {lang: 0x7e, script: 0x20, flags: 0x0}, 57: {lang: 0x3a, script: 0x5, flags: 0x0}, - 58: {lang: 0x3d9, script: 0x5a, flags: 0x0}, - 59: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 60: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 62: {lang: 0x31f, script: 0x5a, flags: 0x0}, - 63: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 64: {lang: 0x3a1, script: 0x5a, flags: 0x0}, - 65: {lang: 0x3c0, script: 0x5a, flags: 0x0}, + 58: {lang: 0x3d9, script: 0x5b, flags: 0x0}, + 59: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 60: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 62: {lang: 0x31f, script: 0x5b, flags: 0x0}, + 63: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 64: {lang: 0x3a1, script: 0x5b, flags: 0x0}, + 65: {lang: 0x3c0, script: 0x5b, flags: 0x0}, 67: {lang: 0x8, script: 0x2, flags: 0x1}, - 69: {lang: 0x0, script: 0x5a, flags: 0x0}, + 69: {lang: 0x0, script: 0x5b, flags: 0x0}, 71: {lang: 0x71, script: 0x20, flags: 0x0}, 73: {lang: 0x512, script: 0x3e, flags: 0x2}, 74: {lang: 0x31f, script: 0x5, flags: 0x2}, - 75: {lang: 0x445, script: 0x5a, flags: 0x0}, - 76: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 77: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 78: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 79: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 81: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 82: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 75: {lang: 0x445, script: 0x5b, flags: 0x0}, + 76: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 77: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 78: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 79: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 81: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 82: {lang: 0x15e, script: 0x5b, flags: 0x0}, 83: {lang: 0xa, script: 0x4, flags: 0x1}, - 84: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 85: {lang: 0x0, script: 0x5a, flags: 0x0}, - 86: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 89: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 90: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 91: {lang: 0x3a1, script: 0x5a, flags: 0x0}, - 93: {lang: 0xe, script: 0x2, flags: 0x1}, - 94: {lang: 0xfa, script: 0x5a, flags: 0x0}, - 96: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 98: {lang: 0x1, script: 0x5a, flags: 0x0}, - 99: {lang: 0x101, script: 0x5a, flags: 0x0}, - 101: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 103: {lang: 0x10, script: 0x2, flags: 0x1}, - 104: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 105: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 106: {lang: 0x140, script: 0x5a, flags: 0x0}, - 107: {lang: 0x3a, script: 0x5, flags: 0x0}, + 84: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 85: {lang: 0x0, script: 0x5b, flags: 0x0}, + 87: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 90: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 91: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 92: {lang: 0x3a1, script: 0x5b, flags: 0x0}, + 94: {lang: 0xe, script: 0x2, flags: 0x1}, + 95: {lang: 0xfa, script: 0x5b, flags: 0x0}, + 97: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 99: {lang: 0x1, script: 0x5b, flags: 0x0}, + 100: {lang: 0x101, script: 0x5b, flags: 0x0}, + 102: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 104: {lang: 0x10, script: 0x2, flags: 0x1}, + 105: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 106: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 107: {lang: 0x140, script: 0x5b, flags: 0x0}, 108: {lang: 0x3a, script: 0x5, flags: 0x0}, - 109: {lang: 0x46f, script: 0x2c, flags: 0x0}, - 110: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 111: {lang: 0x12, script: 0x2, flags: 0x1}, - 113: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 114: {lang: 0x151, script: 0x5a, flags: 0x0}, - 115: {lang: 0x1c0, script: 0x22, flags: 0x2}, - 118: {lang: 0x158, script: 0x5a, flags: 0x0}, - 120: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 122: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 123: {lang: 0x14, script: 0x2, flags: 0x1}, - 125: {lang: 0x16, script: 0x3, flags: 0x1}, - 126: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 128: {lang: 0x21, script: 0x5a, flags: 0x0}, - 130: {lang: 0x245, script: 0x5a, flags: 0x0}, - 132: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 133: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 134: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 135: {lang: 0x19, script: 0x2, flags: 0x1}, - 136: {lang: 0x0, script: 0x5a, flags: 0x0}, - 137: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 139: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 141: {lang: 0x529, script: 0x3c, flags: 0x0}, - 142: {lang: 0x0, script: 0x5a, flags: 0x0}, - 143: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 144: {lang: 0x1d1, script: 0x5a, flags: 0x0}, - 145: {lang: 0x1d4, script: 0x5a, flags: 0x0}, - 146: {lang: 0x1d5, script: 0x5a, flags: 0x0}, - 148: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 149: {lang: 0x1b, script: 0x2, flags: 0x1}, - 151: {lang: 0x1bc, script: 0x3e, flags: 0x0}, - 153: {lang: 0x1d, script: 0x3, flags: 0x1}, - 155: {lang: 0x3a, script: 0x5, flags: 0x0}, - 156: {lang: 0x20, script: 0x2, flags: 0x1}, - 157: {lang: 0x1f8, script: 0x5a, flags: 0x0}, - 158: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 161: {lang: 0x3a, script: 0x5, flags: 0x0}, - 162: {lang: 0x200, script: 0x49, flags: 0x0}, - 164: {lang: 0x445, script: 0x5a, flags: 0x0}, - 165: {lang: 0x28a, script: 0x20, flags: 0x0}, - 166: {lang: 0x22, script: 0x3, flags: 0x1}, - 168: {lang: 0x25, script: 0x2, flags: 0x1}, - 170: {lang: 0x254, script: 0x53, flags: 0x0}, - 171: {lang: 0x254, script: 0x53, flags: 0x0}, - 172: {lang: 0x3a, script: 0x5, flags: 0x0}, - 174: {lang: 0x3e2, script: 0x20, flags: 0x0}, - 175: {lang: 0x27, script: 0x2, flags: 0x1}, - 176: {lang: 0x3a, script: 0x5, flags: 0x0}, - 178: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 179: {lang: 0x40c, script: 0xd4, flags: 0x0}, - 181: {lang: 0x43b, script: 0x5a, flags: 0x0}, - 182: {lang: 0x2c0, script: 0x5a, flags: 0x0}, - 183: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 184: {lang: 0x2c7, script: 0x5a, flags: 0x0}, - 185: {lang: 0x3a, script: 0x5, flags: 0x0}, - 186: {lang: 0x29, script: 0x2, flags: 0x1}, - 187: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 188: {lang: 0x2b, script: 0x2, flags: 0x1}, - 189: {lang: 0x432, script: 0x5a, flags: 0x0}, - 190: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 191: {lang: 0x2f1, script: 0x5a, flags: 0x0}, - 194: {lang: 0x2d, script: 0x2, flags: 0x1}, - 195: {lang: 0xa0, script: 0x5a, flags: 0x0}, - 196: {lang: 0x2f, script: 0x2, flags: 0x1}, - 197: {lang: 0x31, script: 0x2, flags: 0x1}, - 198: {lang: 0x33, script: 0x2, flags: 0x1}, - 200: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 201: {lang: 0x35, script: 0x2, flags: 0x1}, - 203: {lang: 0x320, script: 0x5a, flags: 0x0}, - 204: {lang: 0x37, script: 0x3, flags: 0x1}, - 205: {lang: 0x128, script: 0xea, flags: 0x0}, - 207: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 208: {lang: 0x31f, script: 0x5a, flags: 0x0}, - 209: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 210: {lang: 0x16, script: 0x5a, flags: 0x0}, - 211: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 212: {lang: 0x1b4, script: 0x5a, flags: 0x0}, - 214: {lang: 0x1b4, script: 0x5, flags: 0x2}, - 216: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 217: {lang: 0x367, script: 0x5a, flags: 0x0}, - 218: {lang: 0x347, script: 0x5a, flags: 0x0}, - 219: {lang: 0x351, script: 0x22, flags: 0x0}, - 225: {lang: 0x3a, script: 0x5, flags: 0x0}, - 226: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 228: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 229: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 230: {lang: 0x486, script: 0x5a, flags: 0x0}, - 231: {lang: 0x153, script: 0x5a, flags: 0x0}, - 232: {lang: 0x3a, script: 0x3, flags: 0x1}, - 233: {lang: 0x3b3, script: 0x5a, flags: 0x0}, - 234: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 236: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 237: {lang: 0x3a, script: 0x5, flags: 0x0}, - 238: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 240: {lang: 0x3a2, script: 0x5a, flags: 0x0}, - 241: {lang: 0x194, script: 0x5a, flags: 0x0}, - 243: {lang: 0x3a, script: 0x5, flags: 0x0}, - 258: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 260: {lang: 0x3d, script: 0x2, flags: 0x1}, - 261: {lang: 0x432, script: 0x20, flags: 0x0}, - 262: {lang: 0x3f, script: 0x2, flags: 0x1}, - 263: {lang: 0x3e5, script: 0x5a, flags: 0x0}, - 264: {lang: 0x3a, script: 0x5, flags: 0x0}, - 266: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 267: {lang: 0x3a, script: 0x5, flags: 0x0}, - 268: {lang: 0x41, script: 0x2, flags: 0x1}, - 271: {lang: 0x416, script: 0x5a, flags: 0x0}, - 272: {lang: 0x347, script: 0x5a, flags: 0x0}, - 273: {lang: 0x43, script: 0x2, flags: 0x1}, - 275: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 276: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 277: {lang: 0x429, script: 0x5a, flags: 0x0}, - 278: {lang: 0x367, script: 0x5a, flags: 0x0}, - 280: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 282: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 284: {lang: 0x45, script: 0x2, flags: 0x1}, - 288: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 289: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 290: {lang: 0x47, script: 0x2, flags: 0x1}, - 291: {lang: 0x49, script: 0x3, flags: 0x1}, - 292: {lang: 0x4c, script: 0x2, flags: 0x1}, - 293: {lang: 0x477, script: 0x5a, flags: 0x0}, - 294: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 295: {lang: 0x476, script: 0x5a, flags: 0x0}, - 296: {lang: 0x4e, script: 0x2, flags: 0x1}, - 297: {lang: 0x482, script: 0x5a, flags: 0x0}, - 299: {lang: 0x50, script: 0x4, flags: 0x1}, - 301: {lang: 0x4a0, script: 0x5a, flags: 0x0}, - 302: {lang: 0x54, script: 0x2, flags: 0x1}, - 303: {lang: 0x445, script: 0x5a, flags: 0x0}, - 304: {lang: 0x56, script: 0x3, flags: 0x1}, - 305: {lang: 0x445, script: 0x5a, flags: 0x0}, - 309: {lang: 0x512, script: 0x3e, flags: 0x2}, - 310: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 311: {lang: 0x4bc, script: 0x5a, flags: 0x0}, - 312: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 315: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 318: {lang: 0x4c3, script: 0x5a, flags: 0x0}, - 319: {lang: 0x8a, script: 0x5a, flags: 0x0}, - 320: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 322: {lang: 0x41b, script: 0x5a, flags: 0x0}, - 333: {lang: 0x59, script: 0x2, flags: 0x1}, - 350: {lang: 0x3a, script: 0x5, flags: 0x0}, - 351: {lang: 0x5b, script: 0x2, flags: 0x1}, - 356: {lang: 0x423, script: 0x5a, flags: 0x0}, + 109: {lang: 0x3a, script: 0x5, flags: 0x0}, + 110: {lang: 0x46f, script: 0x2c, flags: 0x0}, + 111: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 112: {lang: 0x12, script: 0x2, flags: 0x1}, + 114: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 115: {lang: 0x151, script: 0x5b, flags: 0x0}, + 116: {lang: 0x1c0, script: 0x22, flags: 0x2}, + 119: {lang: 0x158, script: 0x5b, flags: 0x0}, + 121: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 123: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 124: {lang: 0x14, script: 0x2, flags: 0x1}, + 126: {lang: 0x16, script: 0x3, flags: 0x1}, + 127: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 129: {lang: 0x21, script: 0x5b, flags: 0x0}, + 131: {lang: 0x245, script: 0x5b, flags: 0x0}, + 133: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 134: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 135: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 136: {lang: 0x19, script: 0x2, flags: 0x1}, + 137: {lang: 0x0, script: 0x5b, flags: 0x0}, + 138: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 140: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 142: {lang: 0x529, script: 0x3c, flags: 0x0}, + 143: {lang: 0x0, script: 0x5b, flags: 0x0}, + 144: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 145: {lang: 0x1d1, script: 0x5b, flags: 0x0}, + 146: {lang: 0x1d4, script: 0x5b, flags: 0x0}, + 147: {lang: 0x1d5, script: 0x5b, flags: 0x0}, + 149: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 150: {lang: 0x1b, script: 0x2, flags: 0x1}, + 152: {lang: 0x1bc, script: 0x3e, flags: 0x0}, + 154: {lang: 0x1d, script: 0x3, flags: 0x1}, + 156: {lang: 0x3a, script: 0x5, flags: 0x0}, + 157: {lang: 0x20, script: 0x2, flags: 0x1}, + 158: {lang: 0x1f8, script: 0x5b, flags: 0x0}, + 159: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 162: {lang: 0x3a, script: 0x5, flags: 0x0}, + 163: {lang: 0x200, script: 0x49, flags: 0x0}, + 165: {lang: 0x445, script: 0x5b, flags: 0x0}, + 166: {lang: 0x28a, script: 0x20, flags: 0x0}, + 167: {lang: 0x22, script: 0x3, flags: 0x1}, + 169: {lang: 0x25, script: 0x2, flags: 0x1}, + 171: {lang: 0x254, script: 0x54, flags: 0x0}, + 172: {lang: 0x254, script: 0x54, flags: 0x0}, + 173: {lang: 0x3a, script: 0x5, flags: 0x0}, + 175: {lang: 0x3e2, script: 0x20, flags: 0x0}, + 176: {lang: 0x27, script: 0x2, flags: 0x1}, + 177: {lang: 0x3a, script: 0x5, flags: 0x0}, + 179: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 180: {lang: 0x40c, script: 0xd6, flags: 0x0}, + 182: {lang: 0x43b, script: 0x5b, flags: 0x0}, + 183: {lang: 0x2c0, script: 0x5b, flags: 0x0}, + 184: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 185: {lang: 0x2c7, script: 0x5b, flags: 0x0}, + 186: {lang: 0x3a, script: 0x5, flags: 0x0}, + 187: {lang: 0x29, script: 0x2, flags: 0x1}, + 188: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 189: {lang: 0x2b, script: 0x2, flags: 0x1}, + 190: {lang: 0x432, script: 0x5b, flags: 0x0}, + 191: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 192: {lang: 0x2f1, script: 0x5b, flags: 0x0}, + 195: {lang: 0x2d, script: 0x2, flags: 0x1}, + 196: {lang: 0xa0, script: 0x5b, flags: 0x0}, + 197: {lang: 0x2f, script: 0x2, flags: 0x1}, + 198: {lang: 0x31, script: 0x2, flags: 0x1}, + 199: {lang: 0x33, script: 0x2, flags: 0x1}, + 201: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 202: {lang: 0x35, script: 0x2, flags: 0x1}, + 204: {lang: 0x320, script: 0x5b, flags: 0x0}, + 205: {lang: 0x37, script: 0x3, flags: 0x1}, + 206: {lang: 0x128, script: 0xed, flags: 0x0}, + 208: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 209: {lang: 0x31f, script: 0x5b, flags: 0x0}, + 210: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 211: {lang: 0x16, script: 0x5b, flags: 0x0}, + 212: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 213: {lang: 0x1b4, script: 0x5b, flags: 0x0}, + 215: {lang: 0x1b4, script: 0x5, flags: 0x2}, + 217: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 218: {lang: 0x367, script: 0x5b, flags: 0x0}, + 219: {lang: 0x347, script: 0x5b, flags: 0x0}, + 220: {lang: 0x351, script: 0x22, flags: 0x0}, + 226: {lang: 0x3a, script: 0x5, flags: 0x0}, + 227: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 229: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 230: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 231: {lang: 0x486, script: 0x5b, flags: 0x0}, + 232: {lang: 0x153, script: 0x5b, flags: 0x0}, + 233: {lang: 0x3a, script: 0x3, flags: 0x1}, + 234: {lang: 0x3b3, script: 0x5b, flags: 0x0}, + 235: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 237: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 238: {lang: 0x3a, script: 0x5, flags: 0x0}, + 239: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 241: {lang: 0x3a2, script: 0x5b, flags: 0x0}, + 242: {lang: 0x194, script: 0x5b, flags: 0x0}, + 244: {lang: 0x3a, script: 0x5, flags: 0x0}, + 259: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 261: {lang: 0x3d, script: 0x2, flags: 0x1}, + 262: {lang: 0x432, script: 0x20, flags: 0x0}, + 263: {lang: 0x3f, script: 0x2, flags: 0x1}, + 264: {lang: 0x3e5, script: 0x5b, flags: 0x0}, + 265: {lang: 0x3a, script: 0x5, flags: 0x0}, + 267: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 268: {lang: 0x3a, script: 0x5, flags: 0x0}, + 269: {lang: 0x41, script: 0x2, flags: 0x1}, + 272: {lang: 0x416, script: 0x5b, flags: 0x0}, + 273: {lang: 0x347, script: 0x5b, flags: 0x0}, + 274: {lang: 0x43, script: 0x2, flags: 0x1}, + 276: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 277: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 278: {lang: 0x429, script: 0x5b, flags: 0x0}, + 279: {lang: 0x367, script: 0x5b, flags: 0x0}, + 281: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 283: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 285: {lang: 0x45, script: 0x2, flags: 0x1}, + 289: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 290: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 291: {lang: 0x47, script: 0x2, flags: 0x1}, + 292: {lang: 0x49, script: 0x3, flags: 0x1}, + 293: {lang: 0x4c, script: 0x2, flags: 0x1}, + 294: {lang: 0x477, script: 0x5b, flags: 0x0}, + 295: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 296: {lang: 0x476, script: 0x5b, flags: 0x0}, + 297: {lang: 0x4e, script: 0x2, flags: 0x1}, + 298: {lang: 0x482, script: 0x5b, flags: 0x0}, + 300: {lang: 0x50, script: 0x4, flags: 0x1}, + 302: {lang: 0x4a0, script: 0x5b, flags: 0x0}, + 303: {lang: 0x54, script: 0x2, flags: 0x1}, + 304: {lang: 0x445, script: 0x5b, flags: 0x0}, + 305: {lang: 0x56, script: 0x3, flags: 0x1}, + 306: {lang: 0x445, script: 0x5b, flags: 0x0}, + 310: {lang: 0x512, script: 0x3e, flags: 0x2}, + 311: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 312: {lang: 0x4bc, script: 0x5b, flags: 0x0}, + 313: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 316: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 319: {lang: 0x4c3, script: 0x5b, flags: 0x0}, + 320: {lang: 0x8a, script: 0x5b, flags: 0x0}, + 321: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 323: {lang: 0x41b, script: 0x5b, flags: 0x0}, + 334: {lang: 0x59, script: 0x2, flags: 0x1}, + 351: {lang: 0x3a, script: 0x5, flags: 0x0}, + 352: {lang: 0x5b, script: 0x2, flags: 0x1}, + 357: {lang: 0x423, script: 0x5b, flags: 0x0}, } // likelyRegionList holds lists info associated with likelyRegion. // Size: 558 bytes, 93 elements var likelyRegionList = [93]likelyLangScript{ 0: {lang: 0x148, script: 0x5, flags: 0x0}, - 1: {lang: 0x476, script: 0x5a, flags: 0x0}, - 2: {lang: 0x431, script: 0x5a, flags: 0x0}, + 1: {lang: 0x476, script: 0x5b, flags: 0x0}, + 2: {lang: 0x431, script: 0x5b, flags: 0x0}, 3: {lang: 0x2ff, script: 0x20, flags: 0x0}, 4: {lang: 0x1d7, script: 0x8, flags: 0x0}, - 5: {lang: 0x274, script: 0x5a, flags: 0x0}, - 6: {lang: 0xb7, script: 0x5a, flags: 0x0}, + 5: {lang: 0x274, script: 0x5b, flags: 0x0}, + 6: {lang: 0xb7, script: 0x5b, flags: 0x0}, 7: {lang: 0x432, script: 0x20, flags: 0x0}, - 8: {lang: 0x12d, script: 0xec, flags: 0x0}, + 8: {lang: 0x12d, script: 0xef, flags: 0x0}, 9: {lang: 0x351, script: 0x22, flags: 0x0}, 10: {lang: 0x529, script: 0x3b, flags: 0x0}, 11: {lang: 0x4ac, script: 0x5, flags: 0x0}, - 12: {lang: 0x523, script: 0x5a, flags: 0x0}, - 13: {lang: 0x29a, script: 0xeb, flags: 0x0}, + 12: {lang: 0x523, script: 0x5b, flags: 0x0}, + 13: {lang: 0x29a, script: 0xee, flags: 0x0}, 14: {lang: 0x136, script: 0x34, flags: 0x0}, - 15: {lang: 0x48a, script: 0x5a, flags: 0x0}, + 15: {lang: 0x48a, script: 0x5b, flags: 0x0}, 16: {lang: 0x3a, script: 0x5, flags: 0x0}, - 17: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 17: {lang: 0x15e, script: 0x5b, flags: 0x0}, 18: {lang: 0x27, script: 0x2c, flags: 0x0}, - 19: {lang: 0x139, script: 0x5a, flags: 0x0}, + 19: {lang: 0x139, script: 0x5b, flags: 0x0}, 20: {lang: 0x26a, script: 0x5, flags: 0x2}, 21: {lang: 0x512, script: 0x3e, flags: 0x2}, 22: {lang: 0x210, script: 0x2e, flags: 0x0}, 23: {lang: 0x5, script: 0x20, flags: 0x0}, - 24: {lang: 0x274, script: 0x5a, flags: 0x0}, + 24: {lang: 0x274, script: 0x5b, flags: 0x0}, 25: {lang: 0x136, script: 0x34, flags: 0x0}, 26: {lang: 0x2ff, script: 0x20, flags: 0x0}, - 27: {lang: 0x1e1, script: 0x5a, flags: 0x0}, + 27: {lang: 0x1e1, script: 0x5b, flags: 0x0}, 28: {lang: 0x31f, script: 0x5, flags: 0x0}, 29: {lang: 0x1be, script: 0x22, flags: 0x0}, 30: {lang: 0x4b4, script: 0x5, flags: 0x0}, - 31: {lang: 0x236, script: 0x75, flags: 0x0}, + 31: {lang: 0x236, script: 0x76, flags: 0x0}, 32: {lang: 0x148, script: 0x5, flags: 0x0}, - 33: {lang: 0x476, script: 0x5a, flags: 0x0}, - 34: {lang: 0x24a, script: 0x4e, flags: 0x0}, + 33: {lang: 0x476, script: 0x5b, flags: 0x0}, + 34: {lang: 0x24a, script: 0x4f, flags: 0x0}, 35: {lang: 0xe6, script: 0x5, flags: 0x0}, - 36: {lang: 0x226, script: 0xeb, flags: 0x0}, + 36: {lang: 0x226, script: 0xee, flags: 0x0}, 37: {lang: 0x3a, script: 0x5, flags: 0x0}, - 38: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 39: {lang: 0x2b8, script: 0x57, flags: 0x0}, - 40: {lang: 0x226, script: 0xeb, flags: 0x0}, + 38: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 39: {lang: 0x2b8, script: 0x58, flags: 0x0}, + 40: {lang: 0x226, script: 0xee, flags: 0x0}, 41: {lang: 0x3a, script: 0x5, flags: 0x0}, - 42: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 43: {lang: 0x3dc, script: 0x5a, flags: 0x0}, + 42: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 43: {lang: 0x3dc, script: 0x5b, flags: 0x0}, 44: {lang: 0x4ae, script: 0x20, flags: 0x0}, 45: {lang: 0x2ff, script: 0x20, flags: 0x0}, - 46: {lang: 0x431, script: 0x5a, flags: 0x0}, - 47: {lang: 0x331, script: 0x75, flags: 0x0}, - 48: {lang: 0x213, script: 0x5a, flags: 0x0}, + 46: {lang: 0x431, script: 0x5b, flags: 0x0}, + 47: {lang: 0x331, script: 0x76, flags: 0x0}, + 48: {lang: 0x213, script: 0x5b, flags: 0x0}, 49: {lang: 0x30b, script: 0x20, flags: 0x0}, 50: {lang: 0x242, script: 0x5, flags: 0x0}, 51: {lang: 0x529, script: 0x3c, flags: 0x0}, - 52: {lang: 0x3c0, script: 0x5a, flags: 0x0}, + 52: {lang: 0x3c0, script: 0x5b, flags: 0x0}, 53: {lang: 0x3a, script: 0x5, flags: 0x0}, - 54: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 55: {lang: 0x2ed, script: 0x5a, flags: 0x0}, + 54: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 55: {lang: 0x2ed, script: 0x5b, flags: 0x0}, 56: {lang: 0x4b4, script: 0x5, flags: 0x0}, 57: {lang: 0x88, script: 0x22, flags: 0x0}, 58: {lang: 0x4b4, script: 0x5, flags: 0x0}, 59: {lang: 0x4b4, script: 0x5, flags: 0x0}, 60: {lang: 0xbe, script: 0x22, flags: 0x0}, - 61: {lang: 0x3dc, script: 0x5a, flags: 0x0}, + 61: {lang: 0x3dc, script: 0x5b, flags: 0x0}, 62: {lang: 0x7e, script: 0x20, flags: 0x0}, 63: {lang: 0x3e2, script: 0x20, flags: 0x0}, - 64: {lang: 0x267, script: 0x5a, flags: 0x0}, - 65: {lang: 0x444, script: 0x5a, flags: 0x0}, + 64: {lang: 0x267, script: 0x5b, flags: 0x0}, + 65: {lang: 0x444, script: 0x5b, flags: 0x0}, 66: {lang: 0x512, script: 0x3e, flags: 0x0}, - 67: {lang: 0x412, script: 0x5a, flags: 0x0}, + 67: {lang: 0x412, script: 0x5b, flags: 0x0}, 68: {lang: 0x4ae, script: 0x20, flags: 0x0}, 69: {lang: 0x3a, script: 0x5, flags: 0x0}, - 70: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 71: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 70: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 71: {lang: 0x15e, script: 0x5b, flags: 0x0}, 72: {lang: 0x35, script: 0x5, flags: 0x0}, - 73: {lang: 0x46b, script: 0xeb, flags: 0x0}, + 73: {lang: 0x46b, script: 0xee, flags: 0x0}, 74: {lang: 0x2ec, script: 0x5, flags: 0x0}, - 75: {lang: 0x30f, script: 0x75, flags: 0x0}, + 75: {lang: 0x30f, script: 0x76, flags: 0x0}, 76: {lang: 0x467, script: 0x20, flags: 0x0}, 77: {lang: 0x148, script: 0x5, flags: 0x0}, 78: {lang: 0x3a, script: 0x5, flags: 0x0}, - 79: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 80: {lang: 0x48a, script: 0x5a, flags: 0x0}, + 79: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 80: {lang: 0x48a, script: 0x5b, flags: 0x0}, 81: {lang: 0x58, script: 0x5, flags: 0x0}, 82: {lang: 0x219, script: 0x20, flags: 0x0}, 83: {lang: 0x81, script: 0x34, flags: 0x0}, 84: {lang: 0x529, script: 0x3c, flags: 0x0}, - 85: {lang: 0x48c, script: 0x5a, flags: 0x0}, + 85: {lang: 0x48c, script: 0x5b, flags: 0x0}, 86: {lang: 0x4ae, script: 0x20, flags: 0x0}, 87: {lang: 0x512, script: 0x3e, flags: 0x0}, - 88: {lang: 0x3b3, script: 0x5a, flags: 0x0}, - 89: {lang: 0x431, script: 0x5a, flags: 0x0}, + 88: {lang: 0x3b3, script: 0x5b, flags: 0x0}, + 89: {lang: 0x431, script: 0x5b, flags: 0x0}, 90: {lang: 0x432, script: 0x20, flags: 0x0}, - 91: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 91: {lang: 0x15e, script: 0x5b, flags: 0x0}, 92: {lang: 0x446, script: 0x5, flags: 0x0}, } @@ -3298,38 +3320,38 @@ type likelyTag struct { // Size: 198 bytes, 33 elements var likelyRegionGroup = [33]likelyTag{ - 1: {lang: 0x139, region: 0xd6, script: 0x5a}, - 2: {lang: 0x139, region: 0x135, script: 0x5a}, - 3: {lang: 0x3c0, region: 0x41, script: 0x5a}, - 4: {lang: 0x139, region: 0x2f, script: 0x5a}, - 5: {lang: 0x139, region: 0xd6, script: 0x5a}, - 6: {lang: 0x13e, region: 0xcf, script: 0x5a}, - 7: {lang: 0x445, region: 0x12f, script: 0x5a}, - 8: {lang: 0x3a, region: 0x6b, script: 0x5}, - 9: {lang: 0x445, region: 0x4b, script: 0x5a}, - 10: {lang: 0x139, region: 0x161, script: 0x5a}, - 11: {lang: 0x139, region: 0x135, script: 0x5a}, - 12: {lang: 0x139, region: 0x135, script: 0x5a}, - 13: {lang: 0x13e, region: 0x59, script: 0x5a}, + 1: {lang: 0x139, region: 0xd7, script: 0x5b}, + 2: {lang: 0x139, region: 0x136, script: 0x5b}, + 3: {lang: 0x3c0, region: 0x41, script: 0x5b}, + 4: {lang: 0x139, region: 0x2f, script: 0x5b}, + 5: {lang: 0x139, region: 0xd7, script: 0x5b}, + 6: {lang: 0x13e, region: 0xd0, script: 0x5b}, + 7: {lang: 0x445, region: 0x130, script: 0x5b}, + 8: {lang: 0x3a, region: 0x6c, script: 0x5}, + 9: {lang: 0x445, region: 0x4b, script: 0x5b}, + 10: {lang: 0x139, region: 0x162, script: 0x5b}, + 11: {lang: 0x139, region: 0x136, script: 0x5b}, + 12: {lang: 0x139, region: 0x136, script: 0x5b}, + 13: {lang: 0x13e, region: 0x5a, script: 0x5b}, 14: {lang: 0x529, region: 0x53, script: 0x3b}, - 15: {lang: 0x1be, region: 0x99, script: 0x22}, - 16: {lang: 0x1e1, region: 0x95, script: 0x5a}, - 17: {lang: 0x1f9, region: 0x9e, script: 0x5a}, - 18: {lang: 0x139, region: 0x2f, script: 0x5a}, - 19: {lang: 0x139, region: 0xe6, script: 0x5a}, - 20: {lang: 0x139, region: 0x8a, script: 0x5a}, - 21: {lang: 0x41b, region: 0x142, script: 0x5a}, + 15: {lang: 0x1be, region: 0x9a, script: 0x22}, + 16: {lang: 0x1e1, region: 0x96, script: 0x5b}, + 17: {lang: 0x1f9, region: 0x9f, script: 0x5b}, + 18: {lang: 0x139, region: 0x2f, script: 0x5b}, + 19: {lang: 0x139, region: 0xe7, script: 0x5b}, + 20: {lang: 0x139, region: 0x8b, script: 0x5b}, + 21: {lang: 0x41b, region: 0x143, script: 0x5b}, 22: {lang: 0x529, region: 0x53, script: 0x3b}, - 23: {lang: 0x4bc, region: 0x137, script: 0x5a}, - 24: {lang: 0x3a, region: 0x108, script: 0x5}, - 25: {lang: 0x3e2, region: 0x106, script: 0x20}, - 26: {lang: 0x3e2, region: 0x106, script: 0x20}, - 27: {lang: 0x139, region: 0x7b, script: 0x5a}, - 28: {lang: 0x10d, region: 0x60, script: 0x5a}, - 29: {lang: 0x139, region: 0xd6, script: 0x5a}, - 30: {lang: 0x13e, region: 0x1f, script: 0x5a}, - 31: {lang: 0x139, region: 0x9a, script: 0x5a}, - 32: {lang: 0x139, region: 0x7b, script: 0x5a}, + 23: {lang: 0x4bc, region: 0x138, script: 0x5b}, + 24: {lang: 0x3a, region: 0x109, script: 0x5}, + 25: {lang: 0x3e2, region: 0x107, script: 0x20}, + 26: {lang: 0x3e2, region: 0x107, script: 0x20}, + 27: {lang: 0x139, region: 0x7c, script: 0x5b}, + 28: {lang: 0x10d, region: 0x61, script: 0x5b}, + 29: {lang: 0x139, region: 0xd7, script: 0x5b}, + 30: {lang: 0x13e, region: 0x1f, script: 0x5b}, + 31: {lang: 0x139, region: 0x9b, script: 0x5b}, + 32: {lang: 0x139, region: 0x7c, script: 0x5b}, } // Size: 264 bytes, 33 elements @@ -3350,8 +3372,8 @@ var regionContainment = [33]uint64{ // regionInclusion maps region identifiers to sets of regions in regionInclusionBits, // where each set holds all groupings that are directly connected in a region // containment graph. -// Size: 358 bytes, 358 elements -var regionInclusion = [358]uint8{ +// Size: 359 bytes, 359 elements +var regionInclusion = [359]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, @@ -3364,45 +3386,45 @@ var regionInclusion = [358]uint8{ // Entry 40 - 7F 0x26, 0x28, 0x26, 0x25, 0x31, 0x22, 0x32, 0x33, 0x34, 0x30, 0x22, 0x27, 0x27, 0x27, 0x35, 0x2d, - 0x29, 0x28, 0x27, 0x36, 0x28, 0x22, 0x34, 0x23, - 0x21, 0x26, 0x2d, 0x26, 0x22, 0x37, 0x2e, 0x35, - 0x2a, 0x22, 0x2f, 0x38, 0x26, 0x26, 0x21, 0x39, - 0x39, 0x28, 0x38, 0x39, 0x39, 0x2f, 0x3a, 0x2f, - 0x20, 0x21, 0x38, 0x3b, 0x28, 0x3c, 0x2c, 0x21, - 0x2a, 0x35, 0x27, 0x38, 0x26, 0x24, 0x28, 0x2c, + 0x29, 0x28, 0x27, 0x36, 0x28, 0x22, 0x21, 0x34, + 0x23, 0x21, 0x26, 0x2d, 0x26, 0x22, 0x37, 0x2e, + 0x35, 0x2a, 0x22, 0x2f, 0x38, 0x26, 0x26, 0x21, + 0x39, 0x39, 0x28, 0x38, 0x39, 0x39, 0x2f, 0x3a, + 0x2f, 0x20, 0x21, 0x38, 0x3b, 0x28, 0x3c, 0x2c, + 0x21, 0x2a, 0x35, 0x27, 0x38, 0x26, 0x24, 0x28, // Entry 80 - BF - 0x2d, 0x23, 0x30, 0x2d, 0x2d, 0x26, 0x27, 0x3a, - 0x22, 0x34, 0x3c, 0x2d, 0x28, 0x36, 0x22, 0x34, - 0x3a, 0x26, 0x2e, 0x21, 0x39, 0x31, 0x38, 0x24, - 0x2c, 0x25, 0x22, 0x24, 0x25, 0x2c, 0x3a, 0x2c, - 0x26, 0x24, 0x36, 0x21, 0x2f, 0x3d, 0x31, 0x3c, - 0x2f, 0x26, 0x36, 0x36, 0x24, 0x26, 0x3d, 0x31, - 0x24, 0x26, 0x35, 0x25, 0x2d, 0x32, 0x38, 0x2a, - 0x38, 0x39, 0x39, 0x35, 0x33, 0x23, 0x26, 0x2f, + 0x2c, 0x2d, 0x23, 0x30, 0x2d, 0x2d, 0x26, 0x27, + 0x3a, 0x22, 0x34, 0x3c, 0x2d, 0x28, 0x36, 0x22, + 0x34, 0x3a, 0x26, 0x2e, 0x21, 0x39, 0x31, 0x38, + 0x24, 0x2c, 0x25, 0x22, 0x24, 0x25, 0x2c, 0x3a, + 0x2c, 0x26, 0x24, 0x36, 0x21, 0x2f, 0x3d, 0x31, + 0x3c, 0x2f, 0x26, 0x36, 0x36, 0x24, 0x26, 0x3d, + 0x31, 0x24, 0x26, 0x35, 0x25, 0x2d, 0x32, 0x38, + 0x2a, 0x38, 0x39, 0x39, 0x35, 0x33, 0x23, 0x26, // Entry C0 - FF - 0x3c, 0x21, 0x23, 0x2d, 0x31, 0x36, 0x36, 0x3c, - 0x26, 0x2d, 0x26, 0x3a, 0x2f, 0x25, 0x2f, 0x34, - 0x31, 0x2f, 0x32, 0x3b, 0x2d, 0x2b, 0x2d, 0x21, - 0x34, 0x2a, 0x2c, 0x25, 0x21, 0x3c, 0x24, 0x29, - 0x2b, 0x24, 0x34, 0x21, 0x28, 0x29, 0x3b, 0x31, - 0x25, 0x2e, 0x30, 0x29, 0x26, 0x24, 0x3a, 0x21, - 0x3c, 0x28, 0x21, 0x24, 0x21, 0x21, 0x1f, 0x21, + 0x2f, 0x3c, 0x21, 0x23, 0x2d, 0x31, 0x36, 0x36, + 0x3c, 0x26, 0x2d, 0x26, 0x3a, 0x2f, 0x25, 0x2f, + 0x34, 0x31, 0x2f, 0x32, 0x3b, 0x2d, 0x2b, 0x2d, + 0x21, 0x34, 0x2a, 0x2c, 0x25, 0x21, 0x3c, 0x24, + 0x29, 0x2b, 0x24, 0x34, 0x21, 0x28, 0x29, 0x3b, + 0x31, 0x25, 0x2e, 0x30, 0x29, 0x26, 0x24, 0x3a, + 0x21, 0x3c, 0x28, 0x21, 0x24, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, // Entry 100 - 13F - 0x21, 0x21, 0x2f, 0x21, 0x2e, 0x23, 0x33, 0x2f, - 0x24, 0x3b, 0x2f, 0x39, 0x38, 0x31, 0x2d, 0x3a, - 0x2c, 0x2e, 0x2d, 0x23, 0x2d, 0x2f, 0x28, 0x2f, - 0x27, 0x33, 0x34, 0x26, 0x24, 0x32, 0x22, 0x26, - 0x27, 0x22, 0x2d, 0x31, 0x3d, 0x29, 0x31, 0x3d, - 0x39, 0x29, 0x31, 0x24, 0x26, 0x29, 0x36, 0x2f, - 0x33, 0x2f, 0x21, 0x22, 0x21, 0x30, 0x28, 0x3d, - 0x23, 0x26, 0x21, 0x28, 0x26, 0x26, 0x31, 0x3b, + 0x21, 0x21, 0x21, 0x2f, 0x21, 0x2e, 0x23, 0x33, + 0x2f, 0x24, 0x3b, 0x2f, 0x39, 0x38, 0x31, 0x2d, + 0x3a, 0x2c, 0x2e, 0x2d, 0x23, 0x2d, 0x2f, 0x28, + 0x2f, 0x27, 0x33, 0x34, 0x26, 0x24, 0x32, 0x22, + 0x26, 0x27, 0x22, 0x2d, 0x31, 0x3d, 0x29, 0x31, + 0x3d, 0x39, 0x29, 0x31, 0x24, 0x26, 0x29, 0x36, + 0x2f, 0x33, 0x2f, 0x21, 0x22, 0x21, 0x30, 0x28, + 0x3d, 0x23, 0x26, 0x21, 0x28, 0x26, 0x26, 0x31, // Entry 140 - 17F - 0x29, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x21, 0x21, + 0x3b, 0x29, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, 0x2f, - 0x23, 0x32, 0x2f, 0x27, 0x2f, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, + 0x2f, 0x23, 0x32, 0x2f, 0x27, 0x2f, 0x21, } // regionInclusionBits is an array of bit vectors where every vector represents @@ -3462,11 +3484,11 @@ type parentRel struct { // Size: 414 bytes, 5 elements var parents = [5]parentRel{ - 0: {lang: 0x139, script: 0x0, maxScript: 0x5a, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5c, 0x5d, 0x61, 0x64, 0x6d, 0x73, 0x74, 0x75, 0x7b, 0x7c, 0x7f, 0x80, 0x81, 0x83, 0x8c, 0x8d, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9f, 0xa0, 0xa4, 0xa7, 0xa9, 0xad, 0xb1, 0xb4, 0xb5, 0xbf, 0xc6, 0xca, 0xcb, 0xcc, 0xce, 0xd0, 0xd2, 0xd5, 0xd6, 0xdd, 0xdf, 0xe0, 0xe6, 0xe7, 0xe8, 0xeb, 0xf0, 0x107, 0x109, 0x10a, 0x10b, 0x10d, 0x10e, 0x112, 0x117, 0x11b, 0x11d, 0x11f, 0x125, 0x129, 0x12c, 0x12d, 0x12f, 0x131, 0x139, 0x13c, 0x13f, 0x142, 0x161, 0x162, 0x164}}, - 1: {lang: 0x139, script: 0x0, maxScript: 0x5a, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x60, 0x63, 0x72, 0xd9, 0x10c, 0x10f}}, - 2: {lang: 0x13e, script: 0x0, maxScript: 0x5a, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x56, 0x59, 0x65, 0x69, 0x89, 0x8f, 0xcf, 0xd8, 0xe2, 0xe4, 0xec, 0xf1, 0x11a, 0x135, 0x136, 0x13b}}, - 3: {lang: 0x3c0, script: 0x0, maxScript: 0x5a, toRegion: 0xee, fromRegion: []uint16{0x2a, 0x4e, 0x5a, 0x86, 0x8b, 0xb7, 0xc6, 0xd1, 0x118, 0x126}}, - 4: {lang: 0x529, script: 0x3c, maxScript: 0x3c, toRegion: 0x8d, fromRegion: []uint16{0xc6}}, + 0: {lang: 0x139, script: 0x0, maxScript: 0x5b, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5d, 0x5e, 0x62, 0x65, 0x6e, 0x74, 0x75, 0x76, 0x7c, 0x7d, 0x80, 0x81, 0x82, 0x84, 0x8d, 0x8e, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0xa0, 0xa1, 0xa5, 0xa8, 0xaa, 0xae, 0xb2, 0xb5, 0xb6, 0xc0, 0xc7, 0xcb, 0xcc, 0xcd, 0xcf, 0xd1, 0xd3, 0xd6, 0xd7, 0xde, 0xe0, 0xe1, 0xe7, 0xe8, 0xe9, 0xec, 0xf1, 0x108, 0x10a, 0x10b, 0x10c, 0x10e, 0x10f, 0x113, 0x118, 0x11c, 0x11e, 0x120, 0x126, 0x12a, 0x12d, 0x12e, 0x130, 0x132, 0x13a, 0x13d, 0x140, 0x143, 0x162, 0x163, 0x165}}, + 1: {lang: 0x139, script: 0x0, maxScript: 0x5b, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x61, 0x64, 0x73, 0xda, 0x10d, 0x110}}, + 2: {lang: 0x13e, script: 0x0, maxScript: 0x5b, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x57, 0x5a, 0x66, 0x6a, 0x8a, 0x90, 0xd0, 0xd9, 0xe3, 0xe5, 0xed, 0xf2, 0x11b, 0x136, 0x137, 0x13c}}, + 3: {lang: 0x3c0, script: 0x0, maxScript: 0x5b, toRegion: 0xef, fromRegion: []uint16{0x2a, 0x4e, 0x5b, 0x87, 0x8c, 0xb8, 0xc7, 0xd2, 0x119, 0x127}}, + 4: {lang: 0x529, script: 0x3c, maxScript: 0x3c, toRegion: 0x8e, fromRegion: []uint16{0xc7}}, } -// Total table size 30244 bytes (29KiB); checksum: B6B15F30 +// Total table size 30466 bytes (29KiB); checksum: 7544152B diff --git a/vendor/golang.org/x/text/language/match.go b/vendor/golang.org/x/text/language/match.go index ee45f49474..1153baf291 100644 --- a/vendor/golang.org/x/text/language/match.go +++ b/vendor/golang.org/x/text/language/match.go @@ -434,7 +434,7 @@ func newMatcher(supported []Tag, options []MatchOption) *matcher { // (their canonicalization simply substitutes a different language code, but // nothing else), the match confidence is Exact, otherwise it is High. for i, lm := range language.AliasMap { - // If deprecated codes match and there is no fiddling with the script or + // If deprecated codes match and there is no fiddling with the script // or region, we consider it an exact match. conf := Exact if language.AliasTypes[i] != language.Macro { diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go index 34a732b699..a6573dcb21 100644 --- a/vendor/golang.org/x/text/language/tables.go +++ b/vendor/golang.org/x/text/language/tables.go @@ -23,31 +23,31 @@ const ( _419 = 31 _BR = 65 _CA = 73 - _ES = 110 - _GB = 123 - _MD = 188 - _PT = 238 - _UK = 306 - _US = 309 - _ZZ = 357 - _XA = 323 - _XC = 325 - _XK = 333 + _ES = 111 + _GB = 124 + _MD = 189 + _PT = 239 + _UK = 307 + _US = 310 + _ZZ = 358 + _XA = 324 + _XC = 326 + _XK = 334 ) const ( - _Latn = 90 + _Latn = 91 _Hani = 57 _Hans = 59 _Hant = 60 - _Qaaa = 147 - _Qaai = 155 - _Qabx = 196 - _Zinh = 252 - _Zyyy = 257 - _Zzzz = 258 + _Qaaa = 149 + _Qaai = 157 + _Qabx = 198 + _Zinh = 255 + _Zyyy = 260 + _Zzzz = 261 ) -var regionToGroups = []uint8{ // 358 elements +var regionToGroups = []uint8{ // 359 elements // Entry 0 - 3F 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, @@ -60,51 +60,51 @@ var regionToGroups = []uint8{ // 358 elements // Entry 40 - 7F 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, - 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, // Entry 80 - BF - 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, // Entry C0 - FF - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, - 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x01, 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 100 - 13F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, // Entry 140 - 17F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -} // Size: 382 bytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} // Size: 383 bytes var paradigmLocales = [][3]uint16{ // 3 elements - 0: [3]uint16{0x139, 0x0, 0x7b}, + 0: [3]uint16{0x139, 0x0, 0x7c}, 1: [3]uint16{0x13e, 0x0, 0x1f}, - 2: [3]uint16{0x3c0, 0x41, 0xee}, + 2: [3]uint16{0x3c0, 0x41, 0xef}, } // Size: 42 bytes type mutualIntelligibility struct { @@ -249,30 +249,30 @@ var matchLang = []mutualIntelligibility{ // 113 elements // matchScript holds pairs of scriptIDs where readers of one script // can typically also read the other. Each is associated with a confidence. var matchScript = []scriptIntelligibility{ // 26 elements - 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5a, haveScript: 0x20, distance: 0x5}, - 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5a, distance: 0x5}, - 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5a, distance: 0xa}, + 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5b, haveScript: 0x20, distance: 0x5}, + 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5b, distance: 0x5}, + 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5b, distance: 0xa}, 4: {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x20, distance: 0xa}, - 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5a, distance: 0xa}, - 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4e, haveScript: 0x5a, distance: 0xa}, - 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x52, haveScript: 0x5a, distance: 0xa}, - 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x57, haveScript: 0x5a, distance: 0xa}, - 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6e, haveScript: 0x5a, distance: 0xa}, - 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x75, haveScript: 0x5a, distance: 0xa}, - 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5a, distance: 0xa}, - 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x81, haveScript: 0x5a, distance: 0xa}, - 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5a, distance: 0xa}, - 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd4, haveScript: 0x5a, distance: 0xa}, - 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe3, haveScript: 0x5a, distance: 0xa}, - 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5a, distance: 0xa}, - 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5a, distance: 0xa}, - 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5a, distance: 0xa}, + 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5b, distance: 0xa}, + 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4f, haveScript: 0x5b, distance: 0xa}, + 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x53, haveScript: 0x5b, distance: 0xa}, + 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x58, haveScript: 0x5b, distance: 0xa}, + 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6f, haveScript: 0x5b, distance: 0xa}, + 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x76, haveScript: 0x5b, distance: 0xa}, + 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5b, distance: 0xa}, + 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x83, haveScript: 0x5b, distance: 0xa}, + 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5b, distance: 0xa}, + 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd6, haveScript: 0x5b, distance: 0xa}, + 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5b, distance: 0xa}, + 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe9, haveScript: 0x5b, distance: 0xa}, + 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5b, distance: 0xa}, + 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5b, distance: 0xa}, 24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3b, haveScript: 0x3c, distance: 0xf}, 25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3c, haveScript: 0x3b, distance: 0x13}, } // Size: 232 bytes @@ -295,4 +295,4 @@ var matchRegion = []regionIntelligibility{ // 15 elements 14: {lang: 0x529, script: 0x3c, group: 0x80, distance: 0x5}, } // Size: 114 bytes -// Total table size 1472 bytes (1KiB); checksum: F86C669 +// Total table size 1473 bytes (1KiB); checksum: 7BB90B5C diff --git a/vendor/golang.org/x/text/secure/precis/tables13.0.0.go b/vendor/golang.org/x/text/secure/precis/tables13.0.0.go index aad68b35ed..7bc1a1629c 100644 --- a/vendor/golang.org/x/text/secure/precis/tables13.0.0.go +++ b/vendor/golang.org/x/text/secure/precis/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package precis diff --git a/vendor/golang.org/x/text/secure/precis/tables15.0.0.go b/vendor/golang.org/x/text/secure/precis/tables15.0.0.go new file mode 100644 index 0000000000..48c3227777 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/tables15.0.0.go @@ -0,0 +1,4316 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package precis + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *derivedPropertiesTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return derivedPropertiesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = derivedPropertiesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *derivedPropertiesTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return derivedPropertiesValues[c0] + } + i := derivedPropertiesIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *derivedPropertiesTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return derivedPropertiesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = derivedPropertiesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *derivedPropertiesTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return derivedPropertiesValues[c0] + } + i := derivedPropertiesIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// derivedPropertiesTrie. Total size: 28992 bytes (28.31 KiB). Checksum: 6ba05cbedd26c252. +type derivedPropertiesTrie struct{} + +func newDerivedPropertiesTrie(i int) *derivedPropertiesTrie { + return &derivedPropertiesTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *derivedPropertiesTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(derivedPropertiesValues[n<<6+uint32(b)]) + } +} + +// derivedPropertiesValues: 373 blocks, 23872 entries, 23872 bytes +// The third block is the zero block. +var derivedPropertiesValues = [23872]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x0040, 0x01: 0x0040, 0x02: 0x0040, 0x03: 0x0040, 0x04: 0x0040, 0x05: 0x0040, + 0x06: 0x0040, 0x07: 0x0040, 0x08: 0x0040, 0x09: 0x0040, 0x0a: 0x0040, 0x0b: 0x0040, + 0x0c: 0x0040, 0x0d: 0x0040, 0x0e: 0x0040, 0x0f: 0x0040, 0x10: 0x0040, 0x11: 0x0040, + 0x12: 0x0040, 0x13: 0x0040, 0x14: 0x0040, 0x15: 0x0040, 0x16: 0x0040, 0x17: 0x0040, + 0x18: 0x0040, 0x19: 0x0040, 0x1a: 0x0040, 0x1b: 0x0040, 0x1c: 0x0040, 0x1d: 0x0040, + 0x1e: 0x0040, 0x1f: 0x0040, 0x20: 0x0080, 0x21: 0x00c0, 0x22: 0x00c0, 0x23: 0x00c0, + 0x24: 0x00c0, 0x25: 0x00c0, 0x26: 0x00c0, 0x27: 0x00c0, 0x28: 0x00c0, 0x29: 0x00c0, + 0x2a: 0x00c0, 0x2b: 0x00c0, 0x2c: 0x00c0, 0x2d: 0x00c0, 0x2e: 0x00c0, 0x2f: 0x00c0, + 0x30: 0x00c0, 0x31: 0x00c0, 0x32: 0x00c0, 0x33: 0x00c0, 0x34: 0x00c0, 0x35: 0x00c0, + 0x36: 0x00c0, 0x37: 0x00c0, 0x38: 0x00c0, 0x39: 0x00c0, 0x3a: 0x00c0, 0x3b: 0x00c0, + 0x3c: 0x00c0, 0x3d: 0x00c0, 0x3e: 0x00c0, 0x3f: 0x00c0, + // Block 0x1, offset 0x40 + 0x40: 0x00c0, 0x41: 0x00c0, 0x42: 0x00c0, 0x43: 0x00c0, 0x44: 0x00c0, 0x45: 0x00c0, + 0x46: 0x00c0, 0x47: 0x00c0, 0x48: 0x00c0, 0x49: 0x00c0, 0x4a: 0x00c0, 0x4b: 0x00c0, + 0x4c: 0x00c0, 0x4d: 0x00c0, 0x4e: 0x00c0, 0x4f: 0x00c0, 0x50: 0x00c0, 0x51: 0x00c0, + 0x52: 0x00c0, 0x53: 0x00c0, 0x54: 0x00c0, 0x55: 0x00c0, 0x56: 0x00c0, 0x57: 0x00c0, + 0x58: 0x00c0, 0x59: 0x00c0, 0x5a: 0x00c0, 0x5b: 0x00c0, 0x5c: 0x00c0, 0x5d: 0x00c0, + 0x5e: 0x00c0, 0x5f: 0x00c0, 0x60: 0x00c0, 0x61: 0x00c0, 0x62: 0x00c0, 0x63: 0x00c0, + 0x64: 0x00c0, 0x65: 0x00c0, 0x66: 0x00c0, 0x67: 0x00c0, 0x68: 0x00c0, 0x69: 0x00c0, + 0x6a: 0x00c0, 0x6b: 0x00c0, 0x6c: 0x00c7, 0x6d: 0x00c0, 0x6e: 0x00c0, 0x6f: 0x00c0, + 0x70: 0x00c0, 0x71: 0x00c0, 0x72: 0x00c0, 0x73: 0x00c0, 0x74: 0x00c0, 0x75: 0x00c0, + 0x76: 0x00c0, 0x77: 0x00c0, 0x78: 0x00c0, 0x79: 0x00c0, 0x7a: 0x00c0, 0x7b: 0x00c0, + 0x7c: 0x00c0, 0x7d: 0x00c0, 0x7e: 0x00c0, 0x7f: 0x0040, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x0080, 0xe1: 0x0080, 0xe2: 0x0080, 0xe3: 0x0080, + 0xe4: 0x0080, 0xe5: 0x0080, 0xe6: 0x0080, 0xe7: 0x0080, 0xe8: 0x0080, 0xe9: 0x0080, + 0xea: 0x0080, 0xeb: 0x0080, 0xec: 0x0080, 0xed: 0x0040, 0xee: 0x0080, 0xef: 0x0080, + 0xf0: 0x0080, 0xf1: 0x0080, 0xf2: 0x0080, 0xf3: 0x0080, 0xf4: 0x0080, 0xf5: 0x0080, + 0xf6: 0x0080, 0xf7: 0x004f, 0xf8: 0x0080, 0xf9: 0x0080, 0xfa: 0x0080, 0xfb: 0x0080, + 0xfc: 0x0080, 0xfd: 0x0080, 0xfe: 0x0080, 0xff: 0x0080, + // Block 0x4, offset 0x100 + 0x100: 0x00c0, 0x101: 0x00c0, 0x102: 0x00c0, 0x103: 0x00c0, 0x104: 0x00c0, 0x105: 0x00c0, + 0x106: 0x00c0, 0x107: 0x00c0, 0x108: 0x00c0, 0x109: 0x00c0, 0x10a: 0x00c0, 0x10b: 0x00c0, + 0x10c: 0x00c0, 0x10d: 0x00c0, 0x10e: 0x00c0, 0x10f: 0x00c0, 0x110: 0x00c0, 0x111: 0x00c0, + 0x112: 0x00c0, 0x113: 0x00c0, 0x114: 0x00c0, 0x115: 0x00c0, 0x116: 0x00c0, 0x117: 0x0080, + 0x118: 0x00c0, 0x119: 0x00c0, 0x11a: 0x00c0, 0x11b: 0x00c0, 0x11c: 0x00c0, 0x11d: 0x00c0, + 0x11e: 0x00c0, 0x11f: 0x00c0, 0x120: 0x00c0, 0x121: 0x00c0, 0x122: 0x00c0, 0x123: 0x00c0, + 0x124: 0x00c0, 0x125: 0x00c0, 0x126: 0x00c0, 0x127: 0x00c0, 0x128: 0x00c0, 0x129: 0x00c0, + 0x12a: 0x00c0, 0x12b: 0x00c0, 0x12c: 0x00c0, 0x12d: 0x00c0, 0x12e: 0x00c0, 0x12f: 0x00c0, + 0x130: 0x00c0, 0x131: 0x00c0, 0x132: 0x00c0, 0x133: 0x00c0, 0x134: 0x00c0, 0x135: 0x00c0, + 0x136: 0x00c0, 0x137: 0x0080, 0x138: 0x00c0, 0x139: 0x00c0, 0x13a: 0x00c0, 0x13b: 0x00c0, + 0x13c: 0x00c0, 0x13d: 0x00c0, 0x13e: 0x00c0, 0x13f: 0x00c0, + // Block 0x5, offset 0x140 + 0x140: 0x00c0, 0x141: 0x00c0, 0x142: 0x00c0, 0x143: 0x00c0, 0x144: 0x00c0, 0x145: 0x00c0, + 0x146: 0x00c0, 0x147: 0x00c0, 0x148: 0x00c0, 0x149: 0x00c0, 0x14a: 0x00c0, 0x14b: 0x00c0, + 0x14c: 0x00c0, 0x14d: 0x00c0, 0x14e: 0x00c0, 0x14f: 0x00c0, 0x150: 0x00c0, 0x151: 0x00c0, + 0x152: 0x00c0, 0x153: 0x00c0, 0x154: 0x00c0, 0x155: 0x00c0, 0x156: 0x00c0, 0x157: 0x00c0, + 0x158: 0x00c0, 0x159: 0x00c0, 0x15a: 0x00c0, 0x15b: 0x00c0, 0x15c: 0x00c0, 0x15d: 0x00c0, + 0x15e: 0x00c0, 0x15f: 0x00c0, 0x160: 0x00c0, 0x161: 0x00c0, 0x162: 0x00c0, 0x163: 0x00c0, + 0x164: 0x00c0, 0x165: 0x00c0, 0x166: 0x00c0, 0x167: 0x00c0, 0x168: 0x00c0, 0x169: 0x00c0, + 0x16a: 0x00c0, 0x16b: 0x00c0, 0x16c: 0x00c0, 0x16d: 0x00c0, 0x16e: 0x00c0, 0x16f: 0x00c0, + 0x170: 0x00c0, 0x171: 0x00c0, 0x172: 0x0080, 0x173: 0x0080, 0x174: 0x00c0, 0x175: 0x00c0, + 0x176: 0x00c0, 0x177: 0x00c0, 0x178: 0x00c0, 0x179: 0x00c0, 0x17a: 0x00c0, 0x17b: 0x00c0, + 0x17c: 0x00c0, 0x17d: 0x00c0, 0x17e: 0x00c0, 0x17f: 0x0080, + // Block 0x6, offset 0x180 + 0x180: 0x0080, 0x181: 0x00c0, 0x182: 0x00c0, 0x183: 0x00c0, 0x184: 0x00c0, 0x185: 0x00c0, + 0x186: 0x00c0, 0x187: 0x00c0, 0x188: 0x00c0, 0x189: 0x0080, 0x18a: 0x00c0, 0x18b: 0x00c0, + 0x18c: 0x00c0, 0x18d: 0x00c0, 0x18e: 0x00c0, 0x18f: 0x00c0, 0x190: 0x00c0, 0x191: 0x00c0, + 0x192: 0x00c0, 0x193: 0x00c0, 0x194: 0x00c0, 0x195: 0x00c0, 0x196: 0x00c0, 0x197: 0x00c0, + 0x198: 0x00c0, 0x199: 0x00c0, 0x19a: 0x00c0, 0x19b: 0x00c0, 0x19c: 0x00c0, 0x19d: 0x00c0, + 0x19e: 0x00c0, 0x19f: 0x00c0, 0x1a0: 0x00c0, 0x1a1: 0x00c0, 0x1a2: 0x00c0, 0x1a3: 0x00c0, + 0x1a4: 0x00c0, 0x1a5: 0x00c0, 0x1a6: 0x00c0, 0x1a7: 0x00c0, 0x1a8: 0x00c0, 0x1a9: 0x00c0, + 0x1aa: 0x00c0, 0x1ab: 0x00c0, 0x1ac: 0x00c0, 0x1ad: 0x00c0, 0x1ae: 0x00c0, 0x1af: 0x00c0, + 0x1b0: 0x00c0, 0x1b1: 0x00c0, 0x1b2: 0x00c0, 0x1b3: 0x00c0, 0x1b4: 0x00c0, 0x1b5: 0x00c0, + 0x1b6: 0x00c0, 0x1b7: 0x00c0, 0x1b8: 0x00c0, 0x1b9: 0x00c0, 0x1ba: 0x00c0, 0x1bb: 0x00c0, + 0x1bc: 0x00c0, 0x1bd: 0x00c0, 0x1be: 0x00c0, 0x1bf: 0x0080, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x00c0, 0x1c1: 0x00c0, 0x1c2: 0x00c0, 0x1c3: 0x00c0, 0x1c4: 0x00c0, 0x1c5: 0x00c0, + 0x1c6: 0x00c0, 0x1c7: 0x00c0, 0x1c8: 0x00c0, 0x1c9: 0x00c0, 0x1ca: 0x00c0, 0x1cb: 0x00c0, + 0x1cc: 0x00c0, 0x1cd: 0x00c0, 0x1ce: 0x00c0, 0x1cf: 0x00c0, 0x1d0: 0x00c0, 0x1d1: 0x00c0, + 0x1d2: 0x00c0, 0x1d3: 0x00c0, 0x1d4: 0x00c0, 0x1d5: 0x00c0, 0x1d6: 0x00c0, 0x1d7: 0x00c0, + 0x1d8: 0x00c0, 0x1d9: 0x00c0, 0x1da: 0x00c0, 0x1db: 0x00c0, 0x1dc: 0x00c0, 0x1dd: 0x00c0, + 0x1de: 0x00c0, 0x1df: 0x00c0, 0x1e0: 0x00c0, 0x1e1: 0x00c0, 0x1e2: 0x00c0, 0x1e3: 0x00c0, + 0x1e4: 0x00c0, 0x1e5: 0x00c0, 0x1e6: 0x00c0, 0x1e7: 0x00c0, 0x1e8: 0x00c0, 0x1e9: 0x00c0, + 0x1ea: 0x00c0, 0x1eb: 0x00c0, 0x1ec: 0x00c0, 0x1ed: 0x00c0, 0x1ee: 0x00c0, 0x1ef: 0x00c0, + 0x1f0: 0x00c0, 0x1f1: 0x00c0, 0x1f2: 0x00c0, 0x1f3: 0x00c0, 0x1f4: 0x00c0, 0x1f5: 0x00c0, + 0x1f6: 0x00c0, 0x1f7: 0x00c0, 0x1f8: 0x00c0, 0x1f9: 0x00c0, 0x1fa: 0x00c0, 0x1fb: 0x00c0, + 0x1fc: 0x00c0, 0x1fd: 0x00c0, 0x1fe: 0x00c0, 0x1ff: 0x00c0, + // Block 0x8, offset 0x200 + 0x200: 0x00c0, 0x201: 0x00c0, 0x202: 0x00c0, 0x203: 0x00c0, 0x204: 0x0080, 0x205: 0x0080, + 0x206: 0x0080, 0x207: 0x0080, 0x208: 0x0080, 0x209: 0x0080, 0x20a: 0x0080, 0x20b: 0x0080, + 0x20c: 0x0080, 0x20d: 0x00c0, 0x20e: 0x00c0, 0x20f: 0x00c0, 0x210: 0x00c0, 0x211: 0x00c0, + 0x212: 0x00c0, 0x213: 0x00c0, 0x214: 0x00c0, 0x215: 0x00c0, 0x216: 0x00c0, 0x217: 0x00c0, + 0x218: 0x00c0, 0x219: 0x00c0, 0x21a: 0x00c0, 0x21b: 0x00c0, 0x21c: 0x00c0, 0x21d: 0x00c0, + 0x21e: 0x00c0, 0x21f: 0x00c0, 0x220: 0x00c0, 0x221: 0x00c0, 0x222: 0x00c0, 0x223: 0x00c0, + 0x224: 0x00c0, 0x225: 0x00c0, 0x226: 0x00c0, 0x227: 0x00c0, 0x228: 0x00c0, 0x229: 0x00c0, + 0x22a: 0x00c0, 0x22b: 0x00c0, 0x22c: 0x00c0, 0x22d: 0x00c0, 0x22e: 0x00c0, 0x22f: 0x00c0, + 0x230: 0x00c0, 0x231: 0x0080, 0x232: 0x0080, 0x233: 0x0080, 0x234: 0x00c0, 0x235: 0x00c0, + 0x236: 0x00c0, 0x237: 0x00c0, 0x238: 0x00c0, 0x239: 0x00c0, 0x23a: 0x00c0, 0x23b: 0x00c0, + 0x23c: 0x00c0, 0x23d: 0x00c0, 0x23e: 0x00c0, 0x23f: 0x00c0, + // Block 0x9, offset 0x240 + 0x240: 0x00c0, 0x241: 0x00c0, 0x242: 0x00c0, 0x243: 0x00c0, 0x244: 0x00c0, 0x245: 0x00c0, + 0x246: 0x00c0, 0x247: 0x00c0, 0x248: 0x00c0, 0x249: 0x00c0, 0x24a: 0x00c0, 0x24b: 0x00c0, + 0x24c: 0x00c0, 0x24d: 0x00c0, 0x24e: 0x00c0, 0x24f: 0x00c0, 0x250: 0x00c0, 0x251: 0x00c0, + 0x252: 0x00c0, 0x253: 0x00c0, 0x254: 0x00c0, 0x255: 0x00c0, 0x256: 0x00c0, 0x257: 0x00c0, + 0x258: 0x00c0, 0x259: 0x00c0, 0x25a: 0x00c0, 0x25b: 0x00c0, 0x25c: 0x00c0, 0x25d: 0x00c0, + 0x25e: 0x00c0, 0x25f: 0x00c0, 0x260: 0x00c0, 0x261: 0x00c0, 0x262: 0x00c0, 0x263: 0x00c0, + 0x264: 0x00c0, 0x265: 0x00c0, 0x266: 0x00c0, 0x267: 0x00c0, 0x268: 0x00c0, 0x269: 0x00c0, + 0x26a: 0x00c0, 0x26b: 0x00c0, 0x26c: 0x00c0, 0x26d: 0x00c0, 0x26e: 0x00c0, 0x26f: 0x00c0, + 0x270: 0x0080, 0x271: 0x0080, 0x272: 0x0080, 0x273: 0x0080, 0x274: 0x0080, 0x275: 0x0080, + 0x276: 0x0080, 0x277: 0x0080, 0x278: 0x0080, 0x279: 0x00c0, 0x27a: 0x00c0, 0x27b: 0x00c0, + 0x27c: 0x00c0, 0x27d: 0x00c0, 0x27e: 0x00c0, 0x27f: 0x00c0, + // Block 0xa, offset 0x280 + 0x280: 0x00c0, 0x281: 0x00c0, 0x282: 0x0080, 0x283: 0x0080, 0x284: 0x0080, 0x285: 0x0080, + 0x286: 0x00c0, 0x287: 0x00c0, 0x288: 0x00c0, 0x289: 0x00c0, 0x28a: 0x00c0, 0x28b: 0x00c0, + 0x28c: 0x00c0, 0x28d: 0x00c0, 0x28e: 0x00c0, 0x28f: 0x00c0, 0x290: 0x00c0, 0x291: 0x00c0, + 0x292: 0x0080, 0x293: 0x0080, 0x294: 0x0080, 0x295: 0x0080, 0x296: 0x0080, 0x297: 0x0080, + 0x298: 0x0080, 0x299: 0x0080, 0x29a: 0x0080, 0x29b: 0x0080, 0x29c: 0x0080, 0x29d: 0x0080, + 0x29e: 0x0080, 0x29f: 0x0080, 0x2a0: 0x0080, 0x2a1: 0x0080, 0x2a2: 0x0080, 0x2a3: 0x0080, + 0x2a4: 0x0080, 0x2a5: 0x0080, 0x2a6: 0x0080, 0x2a7: 0x0080, 0x2a8: 0x0080, 0x2a9: 0x0080, + 0x2aa: 0x0080, 0x2ab: 0x0080, 0x2ac: 0x00c0, 0x2ad: 0x0080, 0x2ae: 0x00c0, 0x2af: 0x0080, + 0x2b0: 0x0080, 0x2b1: 0x0080, 0x2b2: 0x0080, 0x2b3: 0x0080, 0x2b4: 0x0080, 0x2b5: 0x0080, + 0x2b6: 0x0080, 0x2b7: 0x0080, 0x2b8: 0x0080, 0x2b9: 0x0080, 0x2ba: 0x0080, 0x2bb: 0x0080, + 0x2bc: 0x0080, 0x2bd: 0x0080, 0x2be: 0x0080, 0x2bf: 0x0080, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x00c3, 0x2c1: 0x00c3, 0x2c2: 0x00c3, 0x2c3: 0x00c3, 0x2c4: 0x00c3, 0x2c5: 0x00c3, + 0x2c6: 0x00c3, 0x2c7: 0x00c3, 0x2c8: 0x00c3, 0x2c9: 0x00c3, 0x2ca: 0x00c3, 0x2cb: 0x00c3, + 0x2cc: 0x00c3, 0x2cd: 0x00c3, 0x2ce: 0x00c3, 0x2cf: 0x00c3, 0x2d0: 0x00c3, 0x2d1: 0x00c3, + 0x2d2: 0x00c3, 0x2d3: 0x00c3, 0x2d4: 0x00c3, 0x2d5: 0x00c3, 0x2d6: 0x00c3, 0x2d7: 0x00c3, + 0x2d8: 0x00c3, 0x2d9: 0x00c3, 0x2da: 0x00c3, 0x2db: 0x00c3, 0x2dc: 0x00c3, 0x2dd: 0x00c3, + 0x2de: 0x00c3, 0x2df: 0x00c3, 0x2e0: 0x00c3, 0x2e1: 0x00c3, 0x2e2: 0x00c3, 0x2e3: 0x00c3, + 0x2e4: 0x00c3, 0x2e5: 0x00c3, 0x2e6: 0x00c3, 0x2e7: 0x00c3, 0x2e8: 0x00c3, 0x2e9: 0x00c3, + 0x2ea: 0x00c3, 0x2eb: 0x00c3, 0x2ec: 0x00c3, 0x2ed: 0x00c3, 0x2ee: 0x00c3, 0x2ef: 0x00c3, + 0x2f0: 0x00c3, 0x2f1: 0x00c3, 0x2f2: 0x00c3, 0x2f3: 0x00c3, 0x2f4: 0x00c3, 0x2f5: 0x00c3, + 0x2f6: 0x00c3, 0x2f7: 0x00c3, 0x2f8: 0x00c3, 0x2f9: 0x00c3, 0x2fa: 0x00c3, 0x2fb: 0x00c3, + 0x2fc: 0x00c3, 0x2fd: 0x00c3, 0x2fe: 0x00c3, 0x2ff: 0x00c3, + // Block 0xc, offset 0x300 + 0x300: 0x0083, 0x301: 0x0083, 0x302: 0x00c3, 0x303: 0x0083, 0x304: 0x0083, 0x305: 0x00c3, + 0x306: 0x00c3, 0x307: 0x00c3, 0x308: 0x00c3, 0x309: 0x00c3, 0x30a: 0x00c3, 0x30b: 0x00c3, + 0x30c: 0x00c3, 0x30d: 0x00c3, 0x30e: 0x00c3, 0x30f: 0x0040, 0x310: 0x00c3, 0x311: 0x00c3, + 0x312: 0x00c3, 0x313: 0x00c3, 0x314: 0x00c3, 0x315: 0x00c3, 0x316: 0x00c3, 0x317: 0x00c3, + 0x318: 0x00c3, 0x319: 0x00c3, 0x31a: 0x00c3, 0x31b: 0x00c3, 0x31c: 0x00c3, 0x31d: 0x00c3, + 0x31e: 0x00c3, 0x31f: 0x00c3, 0x320: 0x00c3, 0x321: 0x00c3, 0x322: 0x00c3, 0x323: 0x00c3, + 0x324: 0x00c3, 0x325: 0x00c3, 0x326: 0x00c3, 0x327: 0x00c3, 0x328: 0x00c3, 0x329: 0x00c3, + 0x32a: 0x00c3, 0x32b: 0x00c3, 0x32c: 0x00c3, 0x32d: 0x00c3, 0x32e: 0x00c3, 0x32f: 0x00c3, + 0x330: 0x00c8, 0x331: 0x00c8, 0x332: 0x00c8, 0x333: 0x00c8, 0x334: 0x0080, 0x335: 0x0050, + 0x336: 0x00c8, 0x337: 0x00c8, 0x33a: 0x0088, 0x33b: 0x00c8, + 0x33c: 0x00c8, 0x33d: 0x00c8, 0x33e: 0x0080, 0x33f: 0x00c8, + // Block 0xd, offset 0x340 + 0x344: 0x0088, 0x345: 0x0080, + 0x346: 0x00c8, 0x347: 0x0080, 0x348: 0x00c8, 0x349: 0x00c8, 0x34a: 0x00c8, + 0x34c: 0x00c8, 0x34e: 0x00c8, 0x34f: 0x00c8, 0x350: 0x00c8, 0x351: 0x00c8, + 0x352: 0x00c8, 0x353: 0x00c8, 0x354: 0x00c8, 0x355: 0x00c8, 0x356: 0x00c8, 0x357: 0x00c8, + 0x358: 0x00c8, 0x359: 0x00c8, 0x35a: 0x00c8, 0x35b: 0x00c8, 0x35c: 0x00c8, 0x35d: 0x00c8, + 0x35e: 0x00c8, 0x35f: 0x00c8, 0x360: 0x00c8, 0x361: 0x00c8, 0x363: 0x00c8, + 0x364: 0x00c8, 0x365: 0x00c8, 0x366: 0x00c8, 0x367: 0x00c8, 0x368: 0x00c8, 0x369: 0x00c8, + 0x36a: 0x00c8, 0x36b: 0x00c8, 0x36c: 0x00c8, 0x36d: 0x00c8, 0x36e: 0x00c8, 0x36f: 0x00c8, + 0x370: 0x00c8, 0x371: 0x00c8, 0x372: 0x00c8, 0x373: 0x00c8, 0x374: 0x00c8, 0x375: 0x00c8, + 0x376: 0x00c8, 0x377: 0x00c8, 0x378: 0x00c8, 0x379: 0x00c8, 0x37a: 0x00c8, 0x37b: 0x00c8, + 0x37c: 0x00c8, 0x37d: 0x00c8, 0x37e: 0x00c8, 0x37f: 0x00c8, + // Block 0xe, offset 0x380 + 0x380: 0x00c8, 0x381: 0x00c8, 0x382: 0x00c8, 0x383: 0x00c8, 0x384: 0x00c8, 0x385: 0x00c8, + 0x386: 0x00c8, 0x387: 0x00c8, 0x388: 0x00c8, 0x389: 0x00c8, 0x38a: 0x00c8, 0x38b: 0x00c8, + 0x38c: 0x00c8, 0x38d: 0x00c8, 0x38e: 0x00c8, 0x38f: 0x00c8, 0x390: 0x0088, 0x391: 0x0088, + 0x392: 0x0088, 0x393: 0x0088, 0x394: 0x0088, 0x395: 0x0088, 0x396: 0x0088, 0x397: 0x00c8, + 0x398: 0x00c8, 0x399: 0x00c8, 0x39a: 0x00c8, 0x39b: 0x00c8, 0x39c: 0x00c8, 0x39d: 0x00c8, + 0x39e: 0x00c8, 0x39f: 0x00c8, 0x3a0: 0x00c8, 0x3a1: 0x00c8, 0x3a2: 0x00c0, 0x3a3: 0x00c0, + 0x3a4: 0x00c0, 0x3a5: 0x00c0, 0x3a6: 0x00c0, 0x3a7: 0x00c0, 0x3a8: 0x00c0, 0x3a9: 0x00c0, + 0x3aa: 0x00c0, 0x3ab: 0x00c0, 0x3ac: 0x00c0, 0x3ad: 0x00c0, 0x3ae: 0x00c0, 0x3af: 0x00c0, + 0x3b0: 0x0088, 0x3b1: 0x0088, 0x3b2: 0x0088, 0x3b3: 0x00c8, 0x3b4: 0x0088, 0x3b5: 0x0088, + 0x3b6: 0x0088, 0x3b7: 0x00c8, 0x3b8: 0x00c8, 0x3b9: 0x0088, 0x3ba: 0x00c8, 0x3bb: 0x00c8, + 0x3bc: 0x00c8, 0x3bd: 0x00c8, 0x3be: 0x00c8, 0x3bf: 0x00c8, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x00c0, 0x3c1: 0x00c0, 0x3c2: 0x0080, 0x3c3: 0x00c3, 0x3c4: 0x00c3, 0x3c5: 0x00c3, + 0x3c6: 0x00c3, 0x3c7: 0x00c3, 0x3c8: 0x0083, 0x3c9: 0x0083, 0x3ca: 0x00c0, 0x3cb: 0x00c0, + 0x3cc: 0x00c0, 0x3cd: 0x00c0, 0x3ce: 0x00c0, 0x3cf: 0x00c0, 0x3d0: 0x00c0, 0x3d1: 0x00c0, + 0x3d2: 0x00c0, 0x3d3: 0x00c0, 0x3d4: 0x00c0, 0x3d5: 0x00c0, 0x3d6: 0x00c0, 0x3d7: 0x00c0, + 0x3d8: 0x00c0, 0x3d9: 0x00c0, 0x3da: 0x00c0, 0x3db: 0x00c0, 0x3dc: 0x00c0, 0x3dd: 0x00c0, + 0x3de: 0x00c0, 0x3df: 0x00c0, 0x3e0: 0x00c0, 0x3e1: 0x00c0, 0x3e2: 0x00c0, 0x3e3: 0x00c0, + 0x3e4: 0x00c0, 0x3e5: 0x00c0, 0x3e6: 0x00c0, 0x3e7: 0x00c0, 0x3e8: 0x00c0, 0x3e9: 0x00c0, + 0x3ea: 0x00c0, 0x3eb: 0x00c0, 0x3ec: 0x00c0, 0x3ed: 0x00c0, 0x3ee: 0x00c0, 0x3ef: 0x00c0, + 0x3f0: 0x00c0, 0x3f1: 0x00c0, 0x3f2: 0x00c0, 0x3f3: 0x00c0, 0x3f4: 0x00c0, 0x3f5: 0x00c0, + 0x3f6: 0x00c0, 0x3f7: 0x00c0, 0x3f8: 0x00c0, 0x3f9: 0x00c0, 0x3fa: 0x00c0, 0x3fb: 0x00c0, + 0x3fc: 0x00c0, 0x3fd: 0x00c0, 0x3fe: 0x00c0, 0x3ff: 0x00c0, + // Block 0x10, offset 0x400 + 0x400: 0x00c0, 0x401: 0x00c0, 0x402: 0x00c0, 0x403: 0x00c0, 0x404: 0x00c0, 0x405: 0x00c0, + 0x406: 0x00c0, 0x407: 0x00c0, 0x408: 0x00c0, 0x409: 0x00c0, 0x40a: 0x00c0, 0x40b: 0x00c0, + 0x40c: 0x00c0, 0x40d: 0x00c0, 0x40e: 0x00c0, 0x40f: 0x00c0, 0x410: 0x00c0, 0x411: 0x00c0, + 0x412: 0x00c0, 0x413: 0x00c0, 0x414: 0x00c0, 0x415: 0x00c0, 0x416: 0x00c0, 0x417: 0x00c0, + 0x418: 0x00c0, 0x419: 0x00c0, 0x41a: 0x00c0, 0x41b: 0x00c0, 0x41c: 0x00c0, 0x41d: 0x00c0, + 0x41e: 0x00c0, 0x41f: 0x00c0, 0x420: 0x00c0, 0x421: 0x00c0, 0x422: 0x00c0, 0x423: 0x00c0, + 0x424: 0x00c0, 0x425: 0x00c0, 0x426: 0x00c0, 0x427: 0x00c0, 0x428: 0x00c0, 0x429: 0x00c0, + 0x42a: 0x00c0, 0x42b: 0x00c0, 0x42c: 0x00c0, 0x42d: 0x00c0, 0x42e: 0x00c0, 0x42f: 0x00c0, + 0x431: 0x00c0, 0x432: 0x00c0, 0x433: 0x00c0, 0x434: 0x00c0, 0x435: 0x00c0, + 0x436: 0x00c0, 0x437: 0x00c0, 0x438: 0x00c0, 0x439: 0x00c0, 0x43a: 0x00c0, 0x43b: 0x00c0, + 0x43c: 0x00c0, 0x43d: 0x00c0, 0x43e: 0x00c0, 0x43f: 0x00c0, + // Block 0x11, offset 0x440 + 0x440: 0x00c0, 0x441: 0x00c0, 0x442: 0x00c0, 0x443: 0x00c0, 0x444: 0x00c0, 0x445: 0x00c0, + 0x446: 0x00c0, 0x447: 0x00c0, 0x448: 0x00c0, 0x449: 0x00c0, 0x44a: 0x00c0, 0x44b: 0x00c0, + 0x44c: 0x00c0, 0x44d: 0x00c0, 0x44e: 0x00c0, 0x44f: 0x00c0, 0x450: 0x00c0, 0x451: 0x00c0, + 0x452: 0x00c0, 0x453: 0x00c0, 0x454: 0x00c0, 0x455: 0x00c0, 0x456: 0x00c0, + 0x459: 0x00c0, 0x45a: 0x0080, 0x45b: 0x0080, 0x45c: 0x0080, 0x45d: 0x0080, + 0x45e: 0x0080, 0x45f: 0x0080, 0x460: 0x00c0, 0x461: 0x00c0, 0x462: 0x00c0, 0x463: 0x00c0, + 0x464: 0x00c0, 0x465: 0x00c0, 0x466: 0x00c0, 0x467: 0x00c0, 0x468: 0x00c0, 0x469: 0x00c0, + 0x46a: 0x00c0, 0x46b: 0x00c0, 0x46c: 0x00c0, 0x46d: 0x00c0, 0x46e: 0x00c0, 0x46f: 0x00c0, + 0x470: 0x00c0, 0x471: 0x00c0, 0x472: 0x00c0, 0x473: 0x00c0, 0x474: 0x00c0, 0x475: 0x00c0, + 0x476: 0x00c0, 0x477: 0x00c0, 0x478: 0x00c0, 0x479: 0x00c0, 0x47a: 0x00c0, 0x47b: 0x00c0, + 0x47c: 0x00c0, 0x47d: 0x00c0, 0x47e: 0x00c0, 0x47f: 0x00c0, + // Block 0x12, offset 0x480 + 0x480: 0x00c0, 0x481: 0x00c0, 0x482: 0x00c0, 0x483: 0x00c0, 0x484: 0x00c0, 0x485: 0x00c0, + 0x486: 0x00c0, 0x487: 0x0080, 0x488: 0x00c0, 0x489: 0x0080, 0x48a: 0x0080, + 0x48d: 0x0080, 0x48e: 0x0080, 0x48f: 0x0080, 0x491: 0x00cb, + 0x492: 0x00cb, 0x493: 0x00cb, 0x494: 0x00cb, 0x495: 0x00cb, 0x496: 0x00cb, 0x497: 0x00cb, + 0x498: 0x00cb, 0x499: 0x00cb, 0x49a: 0x00cb, 0x49b: 0x00cb, 0x49c: 0x00cb, 0x49d: 0x00cb, + 0x49e: 0x00cb, 0x49f: 0x00cb, 0x4a0: 0x00cb, 0x4a1: 0x00cb, 0x4a2: 0x00cb, 0x4a3: 0x00cb, + 0x4a4: 0x00cb, 0x4a5: 0x00cb, 0x4a6: 0x00cb, 0x4a7: 0x00cb, 0x4a8: 0x00cb, 0x4a9: 0x00cb, + 0x4aa: 0x00cb, 0x4ab: 0x00cb, 0x4ac: 0x00cb, 0x4ad: 0x00cb, 0x4ae: 0x00cb, 0x4af: 0x00cb, + 0x4b0: 0x00cb, 0x4b1: 0x00cb, 0x4b2: 0x00cb, 0x4b3: 0x00cb, 0x4b4: 0x00cb, 0x4b5: 0x00cb, + 0x4b6: 0x00cb, 0x4b7: 0x00cb, 0x4b8: 0x00cb, 0x4b9: 0x00cb, 0x4ba: 0x00cb, 0x4bb: 0x00cb, + 0x4bc: 0x00cb, 0x4bd: 0x00cb, 0x4be: 0x008a, 0x4bf: 0x00cb, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x008a, 0x4c1: 0x00cb, 0x4c2: 0x00cb, 0x4c3: 0x008a, 0x4c4: 0x00cb, 0x4c5: 0x00cb, + 0x4c6: 0x008a, 0x4c7: 0x00cb, + 0x4d0: 0x00ca, 0x4d1: 0x00ca, + 0x4d2: 0x00ca, 0x4d3: 0x00ca, 0x4d4: 0x00ca, 0x4d5: 0x00ca, 0x4d6: 0x00ca, 0x4d7: 0x00ca, + 0x4d8: 0x00ca, 0x4d9: 0x00ca, 0x4da: 0x00ca, 0x4db: 0x00ca, 0x4dc: 0x00ca, 0x4dd: 0x00ca, + 0x4de: 0x00ca, 0x4df: 0x00ca, 0x4e0: 0x00ca, 0x4e1: 0x00ca, 0x4e2: 0x00ca, 0x4e3: 0x00ca, + 0x4e4: 0x00ca, 0x4e5: 0x00ca, 0x4e6: 0x00ca, 0x4e7: 0x00ca, 0x4e8: 0x00ca, 0x4e9: 0x00ca, + 0x4ea: 0x00ca, 0x4ef: 0x00ca, + 0x4f0: 0x00ca, 0x4f1: 0x00ca, 0x4f2: 0x00ca, 0x4f3: 0x0051, 0x4f4: 0x0051, + // Block 0x14, offset 0x500 + 0x500: 0x0040, 0x501: 0x0040, 0x502: 0x0040, 0x503: 0x0040, 0x504: 0x0040, 0x505: 0x0040, + 0x506: 0x0080, 0x507: 0x0080, 0x508: 0x0080, 0x509: 0x0080, 0x50a: 0x0080, 0x50b: 0x0080, + 0x50c: 0x0080, 0x50d: 0x0080, 0x50e: 0x0080, 0x50f: 0x0080, 0x510: 0x00c3, 0x511: 0x00c3, + 0x512: 0x00c3, 0x513: 0x00c3, 0x514: 0x00c3, 0x515: 0x00c3, 0x516: 0x00c3, 0x517: 0x00c3, + 0x518: 0x00c3, 0x519: 0x00c3, 0x51a: 0x00c3, 0x51b: 0x0080, 0x51c: 0x0040, 0x51d: 0x0080, + 0x51e: 0x0080, 0x51f: 0x0080, 0x520: 0x00c2, 0x521: 0x00c0, 0x522: 0x00c4, 0x523: 0x00c4, + 0x524: 0x00c4, 0x525: 0x00c4, 0x526: 0x00c2, 0x527: 0x00c4, 0x528: 0x00c2, 0x529: 0x00c4, + 0x52a: 0x00c2, 0x52b: 0x00c2, 0x52c: 0x00c2, 0x52d: 0x00c2, 0x52e: 0x00c2, 0x52f: 0x00c4, + 0x530: 0x00c4, 0x531: 0x00c4, 0x532: 0x00c4, 0x533: 0x00c2, 0x534: 0x00c2, 0x535: 0x00c2, + 0x536: 0x00c2, 0x537: 0x00c2, 0x538: 0x00c2, 0x539: 0x00c2, 0x53a: 0x00c2, 0x53b: 0x00c2, + 0x53c: 0x00c2, 0x53d: 0x00c2, 0x53e: 0x00c2, 0x53f: 0x00c2, + // Block 0x15, offset 0x540 + 0x540: 0x0040, 0x541: 0x00c2, 0x542: 0x00c2, 0x543: 0x00c2, 0x544: 0x00c2, 0x545: 0x00c2, + 0x546: 0x00c2, 0x547: 0x00c2, 0x548: 0x00c4, 0x549: 0x00c2, 0x54a: 0x00c2, 0x54b: 0x00c3, + 0x54c: 0x00c3, 0x54d: 0x00c3, 0x54e: 0x00c3, 0x54f: 0x00c3, 0x550: 0x00c3, 0x551: 0x00c3, + 0x552: 0x00c3, 0x553: 0x00c3, 0x554: 0x00c3, 0x555: 0x00c3, 0x556: 0x00c3, 0x557: 0x00c3, + 0x558: 0x00c3, 0x559: 0x00c3, 0x55a: 0x00c3, 0x55b: 0x00c3, 0x55c: 0x00c3, 0x55d: 0x00c3, + 0x55e: 0x00c3, 0x55f: 0x00c3, 0x560: 0x0053, 0x561: 0x0053, 0x562: 0x0053, 0x563: 0x0053, + 0x564: 0x0053, 0x565: 0x0053, 0x566: 0x0053, 0x567: 0x0053, 0x568: 0x0053, 0x569: 0x0053, + 0x56a: 0x0080, 0x56b: 0x0080, 0x56c: 0x0080, 0x56d: 0x0080, 0x56e: 0x00c2, 0x56f: 0x00c2, + 0x570: 0x00c3, 0x571: 0x00c4, 0x572: 0x00c4, 0x573: 0x00c4, 0x574: 0x00c0, 0x575: 0x0084, + 0x576: 0x0084, 0x577: 0x0084, 0x578: 0x0082, 0x579: 0x00c2, 0x57a: 0x00c2, 0x57b: 0x00c2, + 0x57c: 0x00c2, 0x57d: 0x00c2, 0x57e: 0x00c2, 0x57f: 0x00c2, + // Block 0x16, offset 0x580 + 0x580: 0x00c2, 0x581: 0x00c2, 0x582: 0x00c2, 0x583: 0x00c2, 0x584: 0x00c2, 0x585: 0x00c2, + 0x586: 0x00c2, 0x587: 0x00c2, 0x588: 0x00c4, 0x589: 0x00c4, 0x58a: 0x00c4, 0x58b: 0x00c4, + 0x58c: 0x00c4, 0x58d: 0x00c4, 0x58e: 0x00c4, 0x58f: 0x00c4, 0x590: 0x00c4, 0x591: 0x00c4, + 0x592: 0x00c4, 0x593: 0x00c4, 0x594: 0x00c4, 0x595: 0x00c4, 0x596: 0x00c4, 0x597: 0x00c4, + 0x598: 0x00c4, 0x599: 0x00c4, 0x59a: 0x00c2, 0x59b: 0x00c2, 0x59c: 0x00c2, 0x59d: 0x00c2, + 0x59e: 0x00c2, 0x59f: 0x00c2, 0x5a0: 0x00c2, 0x5a1: 0x00c2, 0x5a2: 0x00c2, 0x5a3: 0x00c2, + 0x5a4: 0x00c2, 0x5a5: 0x00c2, 0x5a6: 0x00c2, 0x5a7: 0x00c2, 0x5a8: 0x00c2, 0x5a9: 0x00c2, + 0x5aa: 0x00c2, 0x5ab: 0x00c2, 0x5ac: 0x00c2, 0x5ad: 0x00c2, 0x5ae: 0x00c2, 0x5af: 0x00c2, + 0x5b0: 0x00c2, 0x5b1: 0x00c2, 0x5b2: 0x00c2, 0x5b3: 0x00c2, 0x5b4: 0x00c2, 0x5b5: 0x00c2, + 0x5b6: 0x00c2, 0x5b7: 0x00c2, 0x5b8: 0x00c2, 0x5b9: 0x00c2, 0x5ba: 0x00c2, 0x5bb: 0x00c2, + 0x5bc: 0x00c2, 0x5bd: 0x00c2, 0x5be: 0x00c2, 0x5bf: 0x00c2, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x00c4, 0x5c1: 0x00c2, 0x5c2: 0x00c2, 0x5c3: 0x00c4, 0x5c4: 0x00c4, 0x5c5: 0x00c4, + 0x5c6: 0x00c4, 0x5c7: 0x00c4, 0x5c8: 0x00c4, 0x5c9: 0x00c4, 0x5ca: 0x00c4, 0x5cb: 0x00c4, + 0x5cc: 0x00c2, 0x5cd: 0x00c4, 0x5ce: 0x00c2, 0x5cf: 0x00c4, 0x5d0: 0x00c2, 0x5d1: 0x00c2, + 0x5d2: 0x00c4, 0x5d3: 0x00c4, 0x5d4: 0x0080, 0x5d5: 0x00c4, 0x5d6: 0x00c3, 0x5d7: 0x00c3, + 0x5d8: 0x00c3, 0x5d9: 0x00c3, 0x5da: 0x00c3, 0x5db: 0x00c3, 0x5dc: 0x00c3, 0x5dd: 0x0040, + 0x5de: 0x0080, 0x5df: 0x00c3, 0x5e0: 0x00c3, 0x5e1: 0x00c3, 0x5e2: 0x00c3, 0x5e3: 0x00c3, + 0x5e4: 0x00c3, 0x5e5: 0x00c0, 0x5e6: 0x00c0, 0x5e7: 0x00c3, 0x5e8: 0x00c3, 0x5e9: 0x0080, + 0x5ea: 0x00c3, 0x5eb: 0x00c3, 0x5ec: 0x00c3, 0x5ed: 0x00c3, 0x5ee: 0x00c4, 0x5ef: 0x00c4, + 0x5f0: 0x0054, 0x5f1: 0x0054, 0x5f2: 0x0054, 0x5f3: 0x0054, 0x5f4: 0x0054, 0x5f5: 0x0054, + 0x5f6: 0x0054, 0x5f7: 0x0054, 0x5f8: 0x0054, 0x5f9: 0x0054, 0x5fa: 0x00c2, 0x5fb: 0x00c2, + 0x5fc: 0x00c2, 0x5fd: 0x00c0, 0x5fe: 0x00c0, 0x5ff: 0x00c2, + // Block 0x18, offset 0x600 + 0x600: 0x0080, 0x601: 0x0080, 0x602: 0x0080, 0x603: 0x0080, 0x604: 0x0080, 0x605: 0x0080, + 0x606: 0x0080, 0x607: 0x0080, 0x608: 0x0080, 0x609: 0x0080, 0x60a: 0x0080, 0x60b: 0x0080, + 0x60c: 0x0080, 0x60d: 0x0080, 0x60f: 0x0040, 0x610: 0x00c4, 0x611: 0x00c3, + 0x612: 0x00c2, 0x613: 0x00c2, 0x614: 0x00c2, 0x615: 0x00c4, 0x616: 0x00c4, 0x617: 0x00c4, + 0x618: 0x00c4, 0x619: 0x00c4, 0x61a: 0x00c2, 0x61b: 0x00c2, 0x61c: 0x00c2, 0x61d: 0x00c2, + 0x61e: 0x00c4, 0x61f: 0x00c2, 0x620: 0x00c2, 0x621: 0x00c2, 0x622: 0x00c2, 0x623: 0x00c2, + 0x624: 0x00c2, 0x625: 0x00c2, 0x626: 0x00c2, 0x627: 0x00c2, 0x628: 0x00c4, 0x629: 0x00c2, + 0x62a: 0x00c4, 0x62b: 0x00c2, 0x62c: 0x00c4, 0x62d: 0x00c2, 0x62e: 0x00c2, 0x62f: 0x00c4, + 0x630: 0x00c3, 0x631: 0x00c3, 0x632: 0x00c3, 0x633: 0x00c3, 0x634: 0x00c3, 0x635: 0x00c3, + 0x636: 0x00c3, 0x637: 0x00c3, 0x638: 0x00c3, 0x639: 0x00c3, 0x63a: 0x00c3, 0x63b: 0x00c3, + 0x63c: 0x00c3, 0x63d: 0x00c3, 0x63e: 0x00c3, 0x63f: 0x00c3, + // Block 0x19, offset 0x640 + 0x640: 0x00c3, 0x641: 0x00c3, 0x642: 0x00c3, 0x643: 0x00c3, 0x644: 0x00c3, 0x645: 0x00c3, + 0x646: 0x00c3, 0x647: 0x00c3, 0x648: 0x00c3, 0x649: 0x00c3, 0x64a: 0x00c3, + 0x64d: 0x00c4, 0x64e: 0x00c2, 0x64f: 0x00c2, 0x650: 0x00c2, 0x651: 0x00c2, + 0x652: 0x00c2, 0x653: 0x00c2, 0x654: 0x00c2, 0x655: 0x00c2, 0x656: 0x00c2, 0x657: 0x00c2, + 0x658: 0x00c2, 0x659: 0x00c4, 0x65a: 0x00c4, 0x65b: 0x00c4, 0x65c: 0x00c2, 0x65d: 0x00c2, + 0x65e: 0x00c2, 0x65f: 0x00c2, 0x660: 0x00c2, 0x661: 0x00c2, 0x662: 0x00c2, 0x663: 0x00c2, + 0x664: 0x00c2, 0x665: 0x00c2, 0x666: 0x00c2, 0x667: 0x00c2, 0x668: 0x00c2, 0x669: 0x00c2, + 0x66a: 0x00c2, 0x66b: 0x00c4, 0x66c: 0x00c4, 0x66d: 0x00c2, 0x66e: 0x00c2, 0x66f: 0x00c2, + 0x670: 0x00c2, 0x671: 0x00c4, 0x672: 0x00c2, 0x673: 0x00c4, 0x674: 0x00c4, 0x675: 0x00c2, + 0x676: 0x00c2, 0x677: 0x00c2, 0x678: 0x00c4, 0x679: 0x00c4, 0x67a: 0x00c2, 0x67b: 0x00c2, + 0x67c: 0x00c2, 0x67d: 0x00c2, 0x67e: 0x00c2, 0x67f: 0x00c2, + // Block 0x1a, offset 0x680 + 0x680: 0x00c0, 0x681: 0x00c0, 0x682: 0x00c0, 0x683: 0x00c0, 0x684: 0x00c0, 0x685: 0x00c0, + 0x686: 0x00c0, 0x687: 0x00c0, 0x688: 0x00c0, 0x689: 0x00c0, 0x68a: 0x00c0, 0x68b: 0x00c0, + 0x68c: 0x00c0, 0x68d: 0x00c0, 0x68e: 0x00c0, 0x68f: 0x00c0, 0x690: 0x00c0, 0x691: 0x00c0, + 0x692: 0x00c0, 0x693: 0x00c0, 0x694: 0x00c0, 0x695: 0x00c0, 0x696: 0x00c0, 0x697: 0x00c0, + 0x698: 0x00c0, 0x699: 0x00c0, 0x69a: 0x00c0, 0x69b: 0x00c0, 0x69c: 0x00c0, 0x69d: 0x00c0, + 0x69e: 0x00c0, 0x69f: 0x00c0, 0x6a0: 0x00c0, 0x6a1: 0x00c0, 0x6a2: 0x00c0, 0x6a3: 0x00c0, + 0x6a4: 0x00c0, 0x6a5: 0x00c0, 0x6a6: 0x00c3, 0x6a7: 0x00c3, 0x6a8: 0x00c3, 0x6a9: 0x00c3, + 0x6aa: 0x00c3, 0x6ab: 0x00c3, 0x6ac: 0x00c3, 0x6ad: 0x00c3, 0x6ae: 0x00c3, 0x6af: 0x00c3, + 0x6b0: 0x00c3, 0x6b1: 0x00c0, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x00c0, 0x6c1: 0x00c0, 0x6c2: 0x00c0, 0x6c3: 0x00c0, 0x6c4: 0x00c0, 0x6c5: 0x00c0, + 0x6c6: 0x00c0, 0x6c7: 0x00c0, 0x6c8: 0x00c0, 0x6c9: 0x00c0, 0x6ca: 0x00c2, 0x6cb: 0x00c2, + 0x6cc: 0x00c2, 0x6cd: 0x00c2, 0x6ce: 0x00c2, 0x6cf: 0x00c2, 0x6d0: 0x00c2, 0x6d1: 0x00c2, + 0x6d2: 0x00c2, 0x6d3: 0x00c2, 0x6d4: 0x00c2, 0x6d5: 0x00c2, 0x6d6: 0x00c2, 0x6d7: 0x00c2, + 0x6d8: 0x00c2, 0x6d9: 0x00c2, 0x6da: 0x00c2, 0x6db: 0x00c2, 0x6dc: 0x00c2, 0x6dd: 0x00c2, + 0x6de: 0x00c2, 0x6df: 0x00c2, 0x6e0: 0x00c2, 0x6e1: 0x00c2, 0x6e2: 0x00c2, 0x6e3: 0x00c2, + 0x6e4: 0x00c2, 0x6e5: 0x00c2, 0x6e6: 0x00c2, 0x6e7: 0x00c2, 0x6e8: 0x00c2, 0x6e9: 0x00c2, + 0x6ea: 0x00c2, 0x6eb: 0x00c3, 0x6ec: 0x00c3, 0x6ed: 0x00c3, 0x6ee: 0x00c3, 0x6ef: 0x00c3, + 0x6f0: 0x00c3, 0x6f1: 0x00c3, 0x6f2: 0x00c3, 0x6f3: 0x00c3, 0x6f4: 0x00c0, 0x6f5: 0x00c0, + 0x6f6: 0x0080, 0x6f7: 0x0080, 0x6f8: 0x0080, 0x6f9: 0x0080, 0x6fa: 0x0040, + 0x6fd: 0x00c3, 0x6fe: 0x0080, 0x6ff: 0x0080, + // Block 0x1c, offset 0x700 + 0x700: 0x00c0, 0x701: 0x00c0, 0x702: 0x00c0, 0x703: 0x00c0, 0x704: 0x00c0, 0x705: 0x00c0, + 0x706: 0x00c0, 0x707: 0x00c0, 0x708: 0x00c0, 0x709: 0x00c0, 0x70a: 0x00c0, 0x70b: 0x00c0, + 0x70c: 0x00c0, 0x70d: 0x00c0, 0x70e: 0x00c0, 0x70f: 0x00c0, 0x710: 0x00c0, 0x711: 0x00c0, + 0x712: 0x00c0, 0x713: 0x00c0, 0x714: 0x00c0, 0x715: 0x00c0, 0x716: 0x00c3, 0x717: 0x00c3, + 0x718: 0x00c3, 0x719: 0x00c3, 0x71a: 0x00c0, 0x71b: 0x00c3, 0x71c: 0x00c3, 0x71d: 0x00c3, + 0x71e: 0x00c3, 0x71f: 0x00c3, 0x720: 0x00c3, 0x721: 0x00c3, 0x722: 0x00c3, 0x723: 0x00c3, + 0x724: 0x00c0, 0x725: 0x00c3, 0x726: 0x00c3, 0x727: 0x00c3, 0x728: 0x00c0, 0x729: 0x00c3, + 0x72a: 0x00c3, 0x72b: 0x00c3, 0x72c: 0x00c3, 0x72d: 0x00c3, + 0x730: 0x0080, 0x731: 0x0080, 0x732: 0x0080, 0x733: 0x0080, 0x734: 0x0080, 0x735: 0x0080, + 0x736: 0x0080, 0x737: 0x0080, 0x738: 0x0080, 0x739: 0x0080, 0x73a: 0x0080, 0x73b: 0x0080, + 0x73c: 0x0080, 0x73d: 0x0080, 0x73e: 0x0080, + // Block 0x1d, offset 0x740 + 0x740: 0x00c4, 0x741: 0x00c2, 0x742: 0x00c2, 0x743: 0x00c2, 0x744: 0x00c2, 0x745: 0x00c2, + 0x746: 0x00c4, 0x747: 0x00c4, 0x748: 0x00c2, 0x749: 0x00c4, 0x74a: 0x00c2, 0x74b: 0x00c2, + 0x74c: 0x00c2, 0x74d: 0x00c2, 0x74e: 0x00c2, 0x74f: 0x00c2, 0x750: 0x00c2, 0x751: 0x00c2, + 0x752: 0x00c2, 0x753: 0x00c2, 0x754: 0x00c4, 0x755: 0x00c2, 0x756: 0x00c4, 0x757: 0x00c4, + 0x758: 0x00c4, 0x759: 0x00c3, 0x75a: 0x00c3, 0x75b: 0x00c3, + 0x75e: 0x0080, 0x760: 0x00c2, 0x761: 0x00c0, 0x762: 0x00c2, 0x763: 0x00c2, + 0x764: 0x00c2, 0x765: 0x00c2, 0x766: 0x00c0, 0x767: 0x00c4, 0x768: 0x00c2, 0x769: 0x00c4, + 0x76a: 0x00c4, + 0x770: 0x00c4, 0x771: 0x00c4, 0x772: 0x00c4, 0x773: 0x00c4, 0x774: 0x00c4, 0x775: 0x00c4, + 0x776: 0x00c4, 0x777: 0x00c4, 0x778: 0x00c4, 0x779: 0x00c4, 0x77a: 0x00c4, 0x77b: 0x00c4, + 0x77c: 0x00c4, 0x77d: 0x00c4, 0x77e: 0x00c4, 0x77f: 0x00c4, + // Block 0x1e, offset 0x780 + 0x780: 0x00c4, 0x781: 0x00c4, 0x782: 0x00c4, 0x783: 0x00c0, 0x784: 0x00c0, 0x785: 0x00c0, + 0x786: 0x00c2, 0x787: 0x00c0, 0x788: 0x0080, 0x789: 0x00c2, 0x78a: 0x00c2, 0x78b: 0x00c2, + 0x78c: 0x00c2, 0x78d: 0x00c2, 0x78e: 0x00c4, 0x790: 0x0040, 0x791: 0x0040, + 0x798: 0x00c3, 0x799: 0x00c3, 0x79a: 0x00c3, 0x79b: 0x00c3, 0x79c: 0x00c3, 0x79d: 0x00c3, + 0x79e: 0x00c3, 0x79f: 0x00c3, 0x7a0: 0x00c2, 0x7a1: 0x00c2, 0x7a2: 0x00c2, 0x7a3: 0x00c2, + 0x7a4: 0x00c2, 0x7a5: 0x00c2, 0x7a6: 0x00c2, 0x7a7: 0x00c2, 0x7a8: 0x00c2, 0x7a9: 0x00c2, + 0x7aa: 0x00c4, 0x7ab: 0x00c4, 0x7ac: 0x00c4, 0x7ad: 0x00c0, 0x7ae: 0x00c4, 0x7af: 0x00c2, + 0x7b0: 0x00c2, 0x7b1: 0x00c4, 0x7b2: 0x00c4, 0x7b3: 0x00c2, 0x7b4: 0x00c2, 0x7b5: 0x00c2, + 0x7b6: 0x00c2, 0x7b7: 0x00c2, 0x7b8: 0x00c2, 0x7b9: 0x00c4, 0x7ba: 0x00c2, 0x7bb: 0x00c2, + 0x7bc: 0x00c2, 0x7bd: 0x00c2, 0x7be: 0x00c2, 0x7bf: 0x00c2, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x00c2, 0x7c1: 0x00c2, 0x7c2: 0x00c2, 0x7c3: 0x00c2, 0x7c4: 0x00c2, 0x7c5: 0x00c2, + 0x7c6: 0x00c2, 0x7c7: 0x00c2, 0x7c8: 0x00c2, 0x7c9: 0x00c0, 0x7ca: 0x00c3, 0x7cb: 0x00c3, + 0x7cc: 0x00c3, 0x7cd: 0x00c3, 0x7ce: 0x00c3, 0x7cf: 0x00c3, 0x7d0: 0x00c3, 0x7d1: 0x00c3, + 0x7d2: 0x00c3, 0x7d3: 0x00c3, 0x7d4: 0x00c3, 0x7d5: 0x00c3, 0x7d6: 0x00c3, 0x7d7: 0x00c3, + 0x7d8: 0x00c3, 0x7d9: 0x00c3, 0x7da: 0x00c3, 0x7db: 0x00c3, 0x7dc: 0x00c3, 0x7dd: 0x00c3, + 0x7de: 0x00c3, 0x7df: 0x00c3, 0x7e0: 0x00c3, 0x7e1: 0x00c3, 0x7e2: 0x0040, 0x7e3: 0x00c3, + 0x7e4: 0x00c3, 0x7e5: 0x00c3, 0x7e6: 0x00c3, 0x7e7: 0x00c3, 0x7e8: 0x00c3, 0x7e9: 0x00c3, + 0x7ea: 0x00c3, 0x7eb: 0x00c3, 0x7ec: 0x00c3, 0x7ed: 0x00c3, 0x7ee: 0x00c3, 0x7ef: 0x00c3, + 0x7f0: 0x00c3, 0x7f1: 0x00c3, 0x7f2: 0x00c3, 0x7f3: 0x00c3, 0x7f4: 0x00c3, 0x7f5: 0x00c3, + 0x7f6: 0x00c3, 0x7f7: 0x00c3, 0x7f8: 0x00c3, 0x7f9: 0x00c3, 0x7fa: 0x00c3, 0x7fb: 0x00c3, + 0x7fc: 0x00c3, 0x7fd: 0x00c3, 0x7fe: 0x00c3, 0x7ff: 0x00c3, + // Block 0x20, offset 0x800 + 0x800: 0x00c3, 0x801: 0x00c3, 0x802: 0x00c3, 0x803: 0x00c0, 0x804: 0x00c0, 0x805: 0x00c0, + 0x806: 0x00c0, 0x807: 0x00c0, 0x808: 0x00c0, 0x809: 0x00c0, 0x80a: 0x00c0, 0x80b: 0x00c0, + 0x80c: 0x00c0, 0x80d: 0x00c0, 0x80e: 0x00c0, 0x80f: 0x00c0, 0x810: 0x00c0, 0x811: 0x00c0, + 0x812: 0x00c0, 0x813: 0x00c0, 0x814: 0x00c0, 0x815: 0x00c0, 0x816: 0x00c0, 0x817: 0x00c0, + 0x818: 0x00c0, 0x819: 0x00c0, 0x81a: 0x00c0, 0x81b: 0x00c0, 0x81c: 0x00c0, 0x81d: 0x00c0, + 0x81e: 0x00c0, 0x81f: 0x00c0, 0x820: 0x00c0, 0x821: 0x00c0, 0x822: 0x00c0, 0x823: 0x00c0, + 0x824: 0x00c0, 0x825: 0x00c0, 0x826: 0x00c0, 0x827: 0x00c0, 0x828: 0x00c0, 0x829: 0x00c0, + 0x82a: 0x00c0, 0x82b: 0x00c0, 0x82c: 0x00c0, 0x82d: 0x00c0, 0x82e: 0x00c0, 0x82f: 0x00c0, + 0x830: 0x00c0, 0x831: 0x00c0, 0x832: 0x00c0, 0x833: 0x00c0, 0x834: 0x00c0, 0x835: 0x00c0, + 0x836: 0x00c0, 0x837: 0x00c0, 0x838: 0x00c0, 0x839: 0x00c0, 0x83a: 0x00c3, 0x83b: 0x00c0, + 0x83c: 0x00c3, 0x83d: 0x00c0, 0x83e: 0x00c0, 0x83f: 0x00c0, + // Block 0x21, offset 0x840 + 0x840: 0x00c0, 0x841: 0x00c3, 0x842: 0x00c3, 0x843: 0x00c3, 0x844: 0x00c3, 0x845: 0x00c3, + 0x846: 0x00c3, 0x847: 0x00c3, 0x848: 0x00c3, 0x849: 0x00c0, 0x84a: 0x00c0, 0x84b: 0x00c0, + 0x84c: 0x00c0, 0x84d: 0x00c6, 0x84e: 0x00c0, 0x84f: 0x00c0, 0x850: 0x00c0, 0x851: 0x00c3, + 0x852: 0x00c3, 0x853: 0x00c3, 0x854: 0x00c3, 0x855: 0x00c3, 0x856: 0x00c3, 0x857: 0x00c3, + 0x858: 0x0080, 0x859: 0x0080, 0x85a: 0x0080, 0x85b: 0x0080, 0x85c: 0x0080, 0x85d: 0x0080, + 0x85e: 0x0080, 0x85f: 0x0080, 0x860: 0x00c0, 0x861: 0x00c0, 0x862: 0x00c3, 0x863: 0x00c3, + 0x864: 0x0080, 0x865: 0x0080, 0x866: 0x00c0, 0x867: 0x00c0, 0x868: 0x00c0, 0x869: 0x00c0, + 0x86a: 0x00c0, 0x86b: 0x00c0, 0x86c: 0x00c0, 0x86d: 0x00c0, 0x86e: 0x00c0, 0x86f: 0x00c0, + 0x870: 0x0080, 0x871: 0x00c0, 0x872: 0x00c0, 0x873: 0x00c0, 0x874: 0x00c0, 0x875: 0x00c0, + 0x876: 0x00c0, 0x877: 0x00c0, 0x878: 0x00c0, 0x879: 0x00c0, 0x87a: 0x00c0, 0x87b: 0x00c0, + 0x87c: 0x00c0, 0x87d: 0x00c0, 0x87e: 0x00c0, 0x87f: 0x00c0, + // Block 0x22, offset 0x880 + 0x880: 0x00c0, 0x881: 0x00c3, 0x882: 0x00c0, 0x883: 0x00c0, 0x885: 0x00c0, + 0x886: 0x00c0, 0x887: 0x00c0, 0x888: 0x00c0, 0x889: 0x00c0, 0x88a: 0x00c0, 0x88b: 0x00c0, + 0x88c: 0x00c0, 0x88f: 0x00c0, 0x890: 0x00c0, + 0x893: 0x00c0, 0x894: 0x00c0, 0x895: 0x00c0, 0x896: 0x00c0, 0x897: 0x00c0, + 0x898: 0x00c0, 0x899: 0x00c0, 0x89a: 0x00c0, 0x89b: 0x00c0, 0x89c: 0x00c0, 0x89d: 0x00c0, + 0x89e: 0x00c0, 0x89f: 0x00c0, 0x8a0: 0x00c0, 0x8a1: 0x00c0, 0x8a2: 0x00c0, 0x8a3: 0x00c0, + 0x8a4: 0x00c0, 0x8a5: 0x00c0, 0x8a6: 0x00c0, 0x8a7: 0x00c0, 0x8a8: 0x00c0, + 0x8aa: 0x00c0, 0x8ab: 0x00c0, 0x8ac: 0x00c0, 0x8ad: 0x00c0, 0x8ae: 0x00c0, 0x8af: 0x00c0, + 0x8b0: 0x00c0, 0x8b2: 0x00c0, + 0x8b6: 0x00c0, 0x8b7: 0x00c0, 0x8b8: 0x00c0, 0x8b9: 0x00c0, + 0x8bc: 0x00c3, 0x8bd: 0x00c0, 0x8be: 0x00c0, 0x8bf: 0x00c0, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x00c0, 0x8c1: 0x00c3, 0x8c2: 0x00c3, 0x8c3: 0x00c3, 0x8c4: 0x00c3, + 0x8c7: 0x00c0, 0x8c8: 0x00c0, 0x8cb: 0x00c0, + 0x8cc: 0x00c0, 0x8cd: 0x00c6, 0x8ce: 0x00c0, + 0x8d7: 0x00c0, + 0x8dc: 0x0080, 0x8dd: 0x0080, + 0x8df: 0x0080, 0x8e0: 0x00c0, 0x8e1: 0x00c0, 0x8e2: 0x00c3, 0x8e3: 0x00c3, + 0x8e6: 0x00c0, 0x8e7: 0x00c0, 0x8e8: 0x00c0, 0x8e9: 0x00c0, + 0x8ea: 0x00c0, 0x8eb: 0x00c0, 0x8ec: 0x00c0, 0x8ed: 0x00c0, 0x8ee: 0x00c0, 0x8ef: 0x00c0, + 0x8f0: 0x00c0, 0x8f1: 0x00c0, 0x8f2: 0x0080, 0x8f3: 0x0080, 0x8f4: 0x0080, 0x8f5: 0x0080, + 0x8f6: 0x0080, 0x8f7: 0x0080, 0x8f8: 0x0080, 0x8f9: 0x0080, 0x8fa: 0x0080, 0x8fb: 0x0080, + 0x8fc: 0x00c0, 0x8fd: 0x0080, 0x8fe: 0x00c3, + // Block 0x24, offset 0x900 + 0x901: 0x00c3, 0x902: 0x00c3, 0x903: 0x00c0, 0x905: 0x00c0, + 0x906: 0x00c0, 0x907: 0x00c0, 0x908: 0x00c0, 0x909: 0x00c0, 0x90a: 0x00c0, + 0x90f: 0x00c0, 0x910: 0x00c0, + 0x913: 0x00c0, 0x914: 0x00c0, 0x915: 0x00c0, 0x916: 0x00c0, 0x917: 0x00c0, + 0x918: 0x00c0, 0x919: 0x00c0, 0x91a: 0x00c0, 0x91b: 0x00c0, 0x91c: 0x00c0, 0x91d: 0x00c0, + 0x91e: 0x00c0, 0x91f: 0x00c0, 0x920: 0x00c0, 0x921: 0x00c0, 0x922: 0x00c0, 0x923: 0x00c0, + 0x924: 0x00c0, 0x925: 0x00c0, 0x926: 0x00c0, 0x927: 0x00c0, 0x928: 0x00c0, + 0x92a: 0x00c0, 0x92b: 0x00c0, 0x92c: 0x00c0, 0x92d: 0x00c0, 0x92e: 0x00c0, 0x92f: 0x00c0, + 0x930: 0x00c0, 0x932: 0x00c0, 0x933: 0x0080, 0x935: 0x00c0, + 0x936: 0x0080, 0x938: 0x00c0, 0x939: 0x00c0, + 0x93c: 0x00c3, 0x93e: 0x00c0, 0x93f: 0x00c0, + // Block 0x25, offset 0x940 + 0x940: 0x00c0, 0x941: 0x00c3, 0x942: 0x00c3, + 0x947: 0x00c3, 0x948: 0x00c3, 0x94b: 0x00c3, + 0x94c: 0x00c3, 0x94d: 0x00c6, 0x951: 0x00c3, + 0x959: 0x0080, 0x95a: 0x0080, 0x95b: 0x0080, 0x95c: 0x00c0, + 0x95e: 0x0080, + 0x966: 0x00c0, 0x967: 0x00c0, 0x968: 0x00c0, 0x969: 0x00c0, + 0x96a: 0x00c0, 0x96b: 0x00c0, 0x96c: 0x00c0, 0x96d: 0x00c0, 0x96e: 0x00c0, 0x96f: 0x00c0, + 0x970: 0x00c3, 0x971: 0x00c3, 0x972: 0x00c0, 0x973: 0x00c0, 0x974: 0x00c0, 0x975: 0x00c3, + 0x976: 0x0080, + // Block 0x26, offset 0x980 + 0x981: 0x00c3, 0x982: 0x00c3, 0x983: 0x00c0, 0x985: 0x00c0, + 0x986: 0x00c0, 0x987: 0x00c0, 0x988: 0x00c0, 0x989: 0x00c0, 0x98a: 0x00c0, 0x98b: 0x00c0, + 0x98c: 0x00c0, 0x98d: 0x00c0, 0x98f: 0x00c0, 0x990: 0x00c0, 0x991: 0x00c0, + 0x993: 0x00c0, 0x994: 0x00c0, 0x995: 0x00c0, 0x996: 0x00c0, 0x997: 0x00c0, + 0x998: 0x00c0, 0x999: 0x00c0, 0x99a: 0x00c0, 0x99b: 0x00c0, 0x99c: 0x00c0, 0x99d: 0x00c0, + 0x99e: 0x00c0, 0x99f: 0x00c0, 0x9a0: 0x00c0, 0x9a1: 0x00c0, 0x9a2: 0x00c0, 0x9a3: 0x00c0, + 0x9a4: 0x00c0, 0x9a5: 0x00c0, 0x9a6: 0x00c0, 0x9a7: 0x00c0, 0x9a8: 0x00c0, + 0x9aa: 0x00c0, 0x9ab: 0x00c0, 0x9ac: 0x00c0, 0x9ad: 0x00c0, 0x9ae: 0x00c0, 0x9af: 0x00c0, + 0x9b0: 0x00c0, 0x9b2: 0x00c0, 0x9b3: 0x00c0, 0x9b5: 0x00c0, + 0x9b6: 0x00c0, 0x9b7: 0x00c0, 0x9b8: 0x00c0, 0x9b9: 0x00c0, + 0x9bc: 0x00c3, 0x9bd: 0x00c0, 0x9be: 0x00c0, 0x9bf: 0x00c0, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x00c0, 0x9c1: 0x00c3, 0x9c2: 0x00c3, 0x9c3: 0x00c3, 0x9c4: 0x00c3, 0x9c5: 0x00c3, + 0x9c7: 0x00c3, 0x9c8: 0x00c3, 0x9c9: 0x00c0, 0x9cb: 0x00c0, + 0x9cc: 0x00c0, 0x9cd: 0x00c6, 0x9d0: 0x00c0, + 0x9e0: 0x00c0, 0x9e1: 0x00c0, 0x9e2: 0x00c3, 0x9e3: 0x00c3, + 0x9e6: 0x00c0, 0x9e7: 0x00c0, 0x9e8: 0x00c0, 0x9e9: 0x00c0, + 0x9ea: 0x00c0, 0x9eb: 0x00c0, 0x9ec: 0x00c0, 0x9ed: 0x00c0, 0x9ee: 0x00c0, 0x9ef: 0x00c0, + 0x9f0: 0x0080, 0x9f1: 0x0080, + 0x9f9: 0x00c0, 0x9fa: 0x00c3, 0x9fb: 0x00c3, + 0x9fc: 0x00c3, 0x9fd: 0x00c3, 0x9fe: 0x00c3, 0x9ff: 0x00c3, + // Block 0x28, offset 0xa00 + 0xa01: 0x00c3, 0xa02: 0x00c0, 0xa03: 0x00c0, 0xa05: 0x00c0, + 0xa06: 0x00c0, 0xa07: 0x00c0, 0xa08: 0x00c0, 0xa09: 0x00c0, 0xa0a: 0x00c0, 0xa0b: 0x00c0, + 0xa0c: 0x00c0, 0xa0f: 0x00c0, 0xa10: 0x00c0, + 0xa13: 0x00c0, 0xa14: 0x00c0, 0xa15: 0x00c0, 0xa16: 0x00c0, 0xa17: 0x00c0, + 0xa18: 0x00c0, 0xa19: 0x00c0, 0xa1a: 0x00c0, 0xa1b: 0x00c0, 0xa1c: 0x00c0, 0xa1d: 0x00c0, + 0xa1e: 0x00c0, 0xa1f: 0x00c0, 0xa20: 0x00c0, 0xa21: 0x00c0, 0xa22: 0x00c0, 0xa23: 0x00c0, + 0xa24: 0x00c0, 0xa25: 0x00c0, 0xa26: 0x00c0, 0xa27: 0x00c0, 0xa28: 0x00c0, + 0xa2a: 0x00c0, 0xa2b: 0x00c0, 0xa2c: 0x00c0, 0xa2d: 0x00c0, 0xa2e: 0x00c0, 0xa2f: 0x00c0, + 0xa30: 0x00c0, 0xa32: 0x00c0, 0xa33: 0x00c0, 0xa35: 0x00c0, + 0xa36: 0x00c0, 0xa37: 0x00c0, 0xa38: 0x00c0, 0xa39: 0x00c0, + 0xa3c: 0x00c3, 0xa3d: 0x00c0, 0xa3e: 0x00c0, 0xa3f: 0x00c3, + // Block 0x29, offset 0xa40 + 0xa40: 0x00c0, 0xa41: 0x00c3, 0xa42: 0x00c3, 0xa43: 0x00c3, 0xa44: 0x00c3, + 0xa47: 0x00c0, 0xa48: 0x00c0, 0xa4b: 0x00c0, + 0xa4c: 0x00c0, 0xa4d: 0x00c6, + 0xa55: 0x00c3, 0xa56: 0x00c3, 0xa57: 0x00c0, + 0xa5c: 0x0080, 0xa5d: 0x0080, + 0xa5f: 0x00c0, 0xa60: 0x00c0, 0xa61: 0x00c0, 0xa62: 0x00c3, 0xa63: 0x00c3, + 0xa66: 0x00c0, 0xa67: 0x00c0, 0xa68: 0x00c0, 0xa69: 0x00c0, + 0xa6a: 0x00c0, 0xa6b: 0x00c0, 0xa6c: 0x00c0, 0xa6d: 0x00c0, 0xa6e: 0x00c0, 0xa6f: 0x00c0, + 0xa70: 0x0080, 0xa71: 0x00c0, 0xa72: 0x0080, 0xa73: 0x0080, 0xa74: 0x0080, 0xa75: 0x0080, + 0xa76: 0x0080, 0xa77: 0x0080, + // Block 0x2a, offset 0xa80 + 0xa82: 0x00c3, 0xa83: 0x00c0, 0xa85: 0x00c0, + 0xa86: 0x00c0, 0xa87: 0x00c0, 0xa88: 0x00c0, 0xa89: 0x00c0, 0xa8a: 0x00c0, + 0xa8e: 0x00c0, 0xa8f: 0x00c0, 0xa90: 0x00c0, + 0xa92: 0x00c0, 0xa93: 0x00c0, 0xa94: 0x00c0, 0xa95: 0x00c0, + 0xa99: 0x00c0, 0xa9a: 0x00c0, 0xa9c: 0x00c0, + 0xa9e: 0x00c0, 0xa9f: 0x00c0, 0xaa3: 0x00c0, + 0xaa4: 0x00c0, 0xaa8: 0x00c0, 0xaa9: 0x00c0, + 0xaaa: 0x00c0, 0xaae: 0x00c0, 0xaaf: 0x00c0, + 0xab0: 0x00c0, 0xab1: 0x00c0, 0xab2: 0x00c0, 0xab3: 0x00c0, 0xab4: 0x00c0, 0xab5: 0x00c0, + 0xab6: 0x00c0, 0xab7: 0x00c0, 0xab8: 0x00c0, 0xab9: 0x00c0, + 0xabe: 0x00c0, 0xabf: 0x00c0, + // Block 0x2b, offset 0xac0 + 0xac0: 0x00c3, 0xac1: 0x00c0, 0xac2: 0x00c0, + 0xac6: 0x00c0, 0xac7: 0x00c0, 0xac8: 0x00c0, 0xaca: 0x00c0, 0xacb: 0x00c0, + 0xacc: 0x00c0, 0xacd: 0x00c6, 0xad0: 0x00c0, + 0xad7: 0x00c0, + 0xae6: 0x00c0, 0xae7: 0x00c0, 0xae8: 0x00c0, 0xae9: 0x00c0, + 0xaea: 0x00c0, 0xaeb: 0x00c0, 0xaec: 0x00c0, 0xaed: 0x00c0, 0xaee: 0x00c0, 0xaef: 0x00c0, + 0xaf0: 0x0080, 0xaf1: 0x0080, 0xaf2: 0x0080, 0xaf3: 0x0080, 0xaf4: 0x0080, 0xaf5: 0x0080, + 0xaf6: 0x0080, 0xaf7: 0x0080, 0xaf8: 0x0080, 0xaf9: 0x0080, 0xafa: 0x0080, + // Block 0x2c, offset 0xb00 + 0xb00: 0x00c3, 0xb01: 0x00c0, 0xb02: 0x00c0, 0xb03: 0x00c0, 0xb04: 0x00c3, 0xb05: 0x00c0, + 0xb06: 0x00c0, 0xb07: 0x00c0, 0xb08: 0x00c0, 0xb09: 0x00c0, 0xb0a: 0x00c0, 0xb0b: 0x00c0, + 0xb0c: 0x00c0, 0xb0e: 0x00c0, 0xb0f: 0x00c0, 0xb10: 0x00c0, + 0xb12: 0x00c0, 0xb13: 0x00c0, 0xb14: 0x00c0, 0xb15: 0x00c0, 0xb16: 0x00c0, 0xb17: 0x00c0, + 0xb18: 0x00c0, 0xb19: 0x00c0, 0xb1a: 0x00c0, 0xb1b: 0x00c0, 0xb1c: 0x00c0, 0xb1d: 0x00c0, + 0xb1e: 0x00c0, 0xb1f: 0x00c0, 0xb20: 0x00c0, 0xb21: 0x00c0, 0xb22: 0x00c0, 0xb23: 0x00c0, + 0xb24: 0x00c0, 0xb25: 0x00c0, 0xb26: 0x00c0, 0xb27: 0x00c0, 0xb28: 0x00c0, + 0xb2a: 0x00c0, 0xb2b: 0x00c0, 0xb2c: 0x00c0, 0xb2d: 0x00c0, 0xb2e: 0x00c0, 0xb2f: 0x00c0, + 0xb30: 0x00c0, 0xb31: 0x00c0, 0xb32: 0x00c0, 0xb33: 0x00c0, 0xb34: 0x00c0, 0xb35: 0x00c0, + 0xb36: 0x00c0, 0xb37: 0x00c0, 0xb38: 0x00c0, 0xb39: 0x00c0, + 0xb3c: 0x00c3, 0xb3d: 0x00c0, 0xb3e: 0x00c3, 0xb3f: 0x00c3, + // Block 0x2d, offset 0xb40 + 0xb40: 0x00c3, 0xb41: 0x00c0, 0xb42: 0x00c0, 0xb43: 0x00c0, 0xb44: 0x00c0, + 0xb46: 0x00c3, 0xb47: 0x00c3, 0xb48: 0x00c3, 0xb4a: 0x00c3, 0xb4b: 0x00c3, + 0xb4c: 0x00c3, 0xb4d: 0x00c6, + 0xb55: 0x00c3, 0xb56: 0x00c3, + 0xb58: 0x00c0, 0xb59: 0x00c0, 0xb5a: 0x00c0, 0xb5d: 0x00c0, + 0xb60: 0x00c0, 0xb61: 0x00c0, 0xb62: 0x00c3, 0xb63: 0x00c3, + 0xb66: 0x00c0, 0xb67: 0x00c0, 0xb68: 0x00c0, 0xb69: 0x00c0, + 0xb6a: 0x00c0, 0xb6b: 0x00c0, 0xb6c: 0x00c0, 0xb6d: 0x00c0, 0xb6e: 0x00c0, 0xb6f: 0x00c0, + 0xb77: 0x0080, 0xb78: 0x0080, 0xb79: 0x0080, 0xb7a: 0x0080, 0xb7b: 0x0080, + 0xb7c: 0x0080, 0xb7d: 0x0080, 0xb7e: 0x0080, 0xb7f: 0x0080, + // Block 0x2e, offset 0xb80 + 0xb80: 0x00c0, 0xb81: 0x00c3, 0xb82: 0x00c0, 0xb83: 0x00c0, 0xb84: 0x0080, 0xb85: 0x00c0, + 0xb86: 0x00c0, 0xb87: 0x00c0, 0xb88: 0x00c0, 0xb89: 0x00c0, 0xb8a: 0x00c0, 0xb8b: 0x00c0, + 0xb8c: 0x00c0, 0xb8e: 0x00c0, 0xb8f: 0x00c0, 0xb90: 0x00c0, + 0xb92: 0x00c0, 0xb93: 0x00c0, 0xb94: 0x00c0, 0xb95: 0x00c0, 0xb96: 0x00c0, 0xb97: 0x00c0, + 0xb98: 0x00c0, 0xb99: 0x00c0, 0xb9a: 0x00c0, 0xb9b: 0x00c0, 0xb9c: 0x00c0, 0xb9d: 0x00c0, + 0xb9e: 0x00c0, 0xb9f: 0x00c0, 0xba0: 0x00c0, 0xba1: 0x00c0, 0xba2: 0x00c0, 0xba3: 0x00c0, + 0xba4: 0x00c0, 0xba5: 0x00c0, 0xba6: 0x00c0, 0xba7: 0x00c0, 0xba8: 0x00c0, + 0xbaa: 0x00c0, 0xbab: 0x00c0, 0xbac: 0x00c0, 0xbad: 0x00c0, 0xbae: 0x00c0, 0xbaf: 0x00c0, + 0xbb0: 0x00c0, 0xbb1: 0x00c0, 0xbb2: 0x00c0, 0xbb3: 0x00c0, 0xbb5: 0x00c0, + 0xbb6: 0x00c0, 0xbb7: 0x00c0, 0xbb8: 0x00c0, 0xbb9: 0x00c0, + 0xbbc: 0x00c3, 0xbbd: 0x00c0, 0xbbe: 0x00c0, 0xbbf: 0x00c3, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x00c0, 0xbc1: 0x00c0, 0xbc2: 0x00c0, 0xbc3: 0x00c0, 0xbc4: 0x00c0, + 0xbc6: 0x00c3, 0xbc7: 0x00c0, 0xbc8: 0x00c0, 0xbca: 0x00c0, 0xbcb: 0x00c0, + 0xbcc: 0x00c3, 0xbcd: 0x00c6, + 0xbd5: 0x00c0, 0xbd6: 0x00c0, + 0xbdd: 0x00c0, + 0xbde: 0x00c0, 0xbe0: 0x00c0, 0xbe1: 0x00c0, 0xbe2: 0x00c3, 0xbe3: 0x00c3, + 0xbe6: 0x00c0, 0xbe7: 0x00c0, 0xbe8: 0x00c0, 0xbe9: 0x00c0, + 0xbea: 0x00c0, 0xbeb: 0x00c0, 0xbec: 0x00c0, 0xbed: 0x00c0, 0xbee: 0x00c0, 0xbef: 0x00c0, + 0xbf1: 0x00c0, 0xbf2: 0x00c0, 0xbf3: 0x00c0, + // Block 0x30, offset 0xc00 + 0xc00: 0x00c3, 0xc01: 0x00c3, 0xc02: 0x00c0, 0xc03: 0x00c0, 0xc04: 0x00c0, 0xc05: 0x00c0, + 0xc06: 0x00c0, 0xc07: 0x00c0, 0xc08: 0x00c0, 0xc09: 0x00c0, 0xc0a: 0x00c0, 0xc0b: 0x00c0, + 0xc0c: 0x00c0, 0xc0e: 0x00c0, 0xc0f: 0x00c0, 0xc10: 0x00c0, + 0xc12: 0x00c0, 0xc13: 0x00c0, 0xc14: 0x00c0, 0xc15: 0x00c0, 0xc16: 0x00c0, 0xc17: 0x00c0, + 0xc18: 0x00c0, 0xc19: 0x00c0, 0xc1a: 0x00c0, 0xc1b: 0x00c0, 0xc1c: 0x00c0, 0xc1d: 0x00c0, + 0xc1e: 0x00c0, 0xc1f: 0x00c0, 0xc20: 0x00c0, 0xc21: 0x00c0, 0xc22: 0x00c0, 0xc23: 0x00c0, + 0xc24: 0x00c0, 0xc25: 0x00c0, 0xc26: 0x00c0, 0xc27: 0x00c0, 0xc28: 0x00c0, 0xc29: 0x00c0, + 0xc2a: 0x00c0, 0xc2b: 0x00c0, 0xc2c: 0x00c0, 0xc2d: 0x00c0, 0xc2e: 0x00c0, 0xc2f: 0x00c0, + 0xc30: 0x00c0, 0xc31: 0x00c0, 0xc32: 0x00c0, 0xc33: 0x00c0, 0xc34: 0x00c0, 0xc35: 0x00c0, + 0xc36: 0x00c0, 0xc37: 0x00c0, 0xc38: 0x00c0, 0xc39: 0x00c0, 0xc3a: 0x00c0, 0xc3b: 0x00c6, + 0xc3c: 0x00c6, 0xc3d: 0x00c0, 0xc3e: 0x00c0, 0xc3f: 0x00c0, + // Block 0x31, offset 0xc40 + 0xc40: 0x00c0, 0xc41: 0x00c3, 0xc42: 0x00c3, 0xc43: 0x00c3, 0xc44: 0x00c3, + 0xc46: 0x00c0, 0xc47: 0x00c0, 0xc48: 0x00c0, 0xc4a: 0x00c0, 0xc4b: 0x00c0, + 0xc4c: 0x00c0, 0xc4d: 0x00c6, 0xc4e: 0x00c0, 0xc4f: 0x0080, + 0xc54: 0x00c0, 0xc55: 0x00c0, 0xc56: 0x00c0, 0xc57: 0x00c0, + 0xc58: 0x0080, 0xc59: 0x0080, 0xc5a: 0x0080, 0xc5b: 0x0080, 0xc5c: 0x0080, 0xc5d: 0x0080, + 0xc5e: 0x0080, 0xc5f: 0x00c0, 0xc60: 0x00c0, 0xc61: 0x00c0, 0xc62: 0x00c3, 0xc63: 0x00c3, + 0xc66: 0x00c0, 0xc67: 0x00c0, 0xc68: 0x00c0, 0xc69: 0x00c0, + 0xc6a: 0x00c0, 0xc6b: 0x00c0, 0xc6c: 0x00c0, 0xc6d: 0x00c0, 0xc6e: 0x00c0, 0xc6f: 0x00c0, + 0xc70: 0x0080, 0xc71: 0x0080, 0xc72: 0x0080, 0xc73: 0x0080, 0xc74: 0x0080, 0xc75: 0x0080, + 0xc76: 0x0080, 0xc77: 0x0080, 0xc78: 0x0080, 0xc79: 0x0080, 0xc7a: 0x00c0, 0xc7b: 0x00c0, + 0xc7c: 0x00c0, 0xc7d: 0x00c0, 0xc7e: 0x00c0, 0xc7f: 0x00c0, + // Block 0x32, offset 0xc80 + 0xc81: 0x00c3, 0xc82: 0x00c0, 0xc83: 0x00c0, 0xc85: 0x00c0, + 0xc86: 0x00c0, 0xc87: 0x00c0, 0xc88: 0x00c0, 0xc89: 0x00c0, 0xc8a: 0x00c0, 0xc8b: 0x00c0, + 0xc8c: 0x00c0, 0xc8d: 0x00c0, 0xc8e: 0x00c0, 0xc8f: 0x00c0, 0xc90: 0x00c0, 0xc91: 0x00c0, + 0xc92: 0x00c0, 0xc93: 0x00c0, 0xc94: 0x00c0, 0xc95: 0x00c0, 0xc96: 0x00c0, + 0xc9a: 0x00c0, 0xc9b: 0x00c0, 0xc9c: 0x00c0, 0xc9d: 0x00c0, + 0xc9e: 0x00c0, 0xc9f: 0x00c0, 0xca0: 0x00c0, 0xca1: 0x00c0, 0xca2: 0x00c0, 0xca3: 0x00c0, + 0xca4: 0x00c0, 0xca5: 0x00c0, 0xca6: 0x00c0, 0xca7: 0x00c0, 0xca8: 0x00c0, 0xca9: 0x00c0, + 0xcaa: 0x00c0, 0xcab: 0x00c0, 0xcac: 0x00c0, 0xcad: 0x00c0, 0xcae: 0x00c0, 0xcaf: 0x00c0, + 0xcb0: 0x00c0, 0xcb1: 0x00c0, 0xcb3: 0x00c0, 0xcb4: 0x00c0, 0xcb5: 0x00c0, + 0xcb6: 0x00c0, 0xcb7: 0x00c0, 0xcb8: 0x00c0, 0xcb9: 0x00c0, 0xcba: 0x00c0, 0xcbb: 0x00c0, + 0xcbd: 0x00c0, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x00c0, 0xcc1: 0x00c0, 0xcc2: 0x00c0, 0xcc3: 0x00c0, 0xcc4: 0x00c0, 0xcc5: 0x00c0, + 0xcc6: 0x00c0, 0xcca: 0x00c6, + 0xccf: 0x00c0, 0xcd0: 0x00c0, 0xcd1: 0x00c0, + 0xcd2: 0x00c3, 0xcd3: 0x00c3, 0xcd4: 0x00c3, 0xcd6: 0x00c3, + 0xcd8: 0x00c0, 0xcd9: 0x00c0, 0xcda: 0x00c0, 0xcdb: 0x00c0, 0xcdc: 0x00c0, 0xcdd: 0x00c0, + 0xcde: 0x00c0, 0xcdf: 0x00c0, + 0xce6: 0x00c0, 0xce7: 0x00c0, 0xce8: 0x00c0, 0xce9: 0x00c0, + 0xcea: 0x00c0, 0xceb: 0x00c0, 0xcec: 0x00c0, 0xced: 0x00c0, 0xcee: 0x00c0, 0xcef: 0x00c0, + 0xcf2: 0x00c0, 0xcf3: 0x00c0, 0xcf4: 0x0080, + // Block 0x34, offset 0xd00 + 0xd01: 0x00c0, 0xd02: 0x00c0, 0xd03: 0x00c0, 0xd04: 0x00c0, 0xd05: 0x00c0, + 0xd06: 0x00c0, 0xd07: 0x00c0, 0xd08: 0x00c0, 0xd09: 0x00c0, 0xd0a: 0x00c0, 0xd0b: 0x00c0, + 0xd0c: 0x00c0, 0xd0d: 0x00c0, 0xd0e: 0x00c0, 0xd0f: 0x00c0, 0xd10: 0x00c0, 0xd11: 0x00c0, + 0xd12: 0x00c0, 0xd13: 0x00c0, 0xd14: 0x00c0, 0xd15: 0x00c0, 0xd16: 0x00c0, 0xd17: 0x00c0, + 0xd18: 0x00c0, 0xd19: 0x00c0, 0xd1a: 0x00c0, 0xd1b: 0x00c0, 0xd1c: 0x00c0, 0xd1d: 0x00c0, + 0xd1e: 0x00c0, 0xd1f: 0x00c0, 0xd20: 0x00c0, 0xd21: 0x00c0, 0xd22: 0x00c0, 0xd23: 0x00c0, + 0xd24: 0x00c0, 0xd25: 0x00c0, 0xd26: 0x00c0, 0xd27: 0x00c0, 0xd28: 0x00c0, 0xd29: 0x00c0, + 0xd2a: 0x00c0, 0xd2b: 0x00c0, 0xd2c: 0x00c0, 0xd2d: 0x00c0, 0xd2e: 0x00c0, 0xd2f: 0x00c0, + 0xd30: 0x00c0, 0xd31: 0x00c3, 0xd32: 0x00c0, 0xd33: 0x0080, 0xd34: 0x00c3, 0xd35: 0x00c3, + 0xd36: 0x00c3, 0xd37: 0x00c3, 0xd38: 0x00c3, 0xd39: 0x00c3, 0xd3a: 0x00c6, + 0xd3f: 0x0080, + // Block 0x35, offset 0xd40 + 0xd40: 0x00c0, 0xd41: 0x00c0, 0xd42: 0x00c0, 0xd43: 0x00c0, 0xd44: 0x00c0, 0xd45: 0x00c0, + 0xd46: 0x00c0, 0xd47: 0x00c3, 0xd48: 0x00c3, 0xd49: 0x00c3, 0xd4a: 0x00c3, 0xd4b: 0x00c3, + 0xd4c: 0x00c3, 0xd4d: 0x00c3, 0xd4e: 0x00c3, 0xd4f: 0x0080, 0xd50: 0x00c0, 0xd51: 0x00c0, + 0xd52: 0x00c0, 0xd53: 0x00c0, 0xd54: 0x00c0, 0xd55: 0x00c0, 0xd56: 0x00c0, 0xd57: 0x00c0, + 0xd58: 0x00c0, 0xd59: 0x00c0, 0xd5a: 0x0080, 0xd5b: 0x0080, + // Block 0x36, offset 0xd80 + 0xd81: 0x00c0, 0xd82: 0x00c0, 0xd84: 0x00c0, + 0xd86: 0x00c0, 0xd87: 0x00c0, 0xd88: 0x00c0, 0xd89: 0x00c0, 0xd8a: 0x00c0, + 0xd8c: 0x00c0, 0xd8d: 0x00c0, 0xd8e: 0x00c0, 0xd8f: 0x00c0, 0xd90: 0x00c0, 0xd91: 0x00c0, + 0xd92: 0x00c0, 0xd93: 0x00c0, 0xd94: 0x00c0, 0xd95: 0x00c0, 0xd96: 0x00c0, 0xd97: 0x00c0, + 0xd98: 0x00c0, 0xd99: 0x00c0, 0xd9a: 0x00c0, 0xd9b: 0x00c0, 0xd9c: 0x00c0, 0xd9d: 0x00c0, + 0xd9e: 0x00c0, 0xd9f: 0x00c0, 0xda0: 0x00c0, 0xda1: 0x00c0, 0xda2: 0x00c0, 0xda3: 0x00c0, + 0xda5: 0x00c0, 0xda7: 0x00c0, 0xda8: 0x00c0, 0xda9: 0x00c0, + 0xdaa: 0x00c0, 0xdab: 0x00c0, 0xdac: 0x00c0, 0xdad: 0x00c0, 0xdae: 0x00c0, 0xdaf: 0x00c0, + 0xdb0: 0x00c0, 0xdb1: 0x00c3, 0xdb2: 0x00c0, 0xdb3: 0x0080, 0xdb4: 0x00c3, 0xdb5: 0x00c3, + 0xdb6: 0x00c3, 0xdb7: 0x00c3, 0xdb8: 0x00c3, 0xdb9: 0x00c3, 0xdba: 0x00c6, 0xdbb: 0x00c3, + 0xdbc: 0x00c3, 0xdbd: 0x00c0, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x00c0, 0xdc1: 0x00c0, 0xdc2: 0x00c0, 0xdc3: 0x00c0, 0xdc4: 0x00c0, + 0xdc6: 0x00c0, 0xdc8: 0x00c3, 0xdc9: 0x00c3, 0xdca: 0x00c3, 0xdcb: 0x00c3, + 0xdcc: 0x00c3, 0xdcd: 0x00c3, 0xdce: 0x00c3, 0xdd0: 0x00c0, 0xdd1: 0x00c0, + 0xdd2: 0x00c0, 0xdd3: 0x00c0, 0xdd4: 0x00c0, 0xdd5: 0x00c0, 0xdd6: 0x00c0, 0xdd7: 0x00c0, + 0xdd8: 0x00c0, 0xdd9: 0x00c0, 0xddc: 0x0080, 0xddd: 0x0080, + 0xdde: 0x00c0, 0xddf: 0x00c0, + // Block 0x38, offset 0xe00 + 0xe00: 0x00c0, 0xe01: 0x0080, 0xe02: 0x0080, 0xe03: 0x0080, 0xe04: 0x0080, 0xe05: 0x0080, + 0xe06: 0x0080, 0xe07: 0x0080, 0xe08: 0x0080, 0xe09: 0x0080, 0xe0a: 0x0080, 0xe0b: 0x00c0, + 0xe0c: 0x0080, 0xe0d: 0x0080, 0xe0e: 0x0080, 0xe0f: 0x0080, 0xe10: 0x0080, 0xe11: 0x0080, + 0xe12: 0x0080, 0xe13: 0x0080, 0xe14: 0x0080, 0xe15: 0x0080, 0xe16: 0x0080, 0xe17: 0x0080, + 0xe18: 0x00c3, 0xe19: 0x00c3, 0xe1a: 0x0080, 0xe1b: 0x0080, 0xe1c: 0x0080, 0xe1d: 0x0080, + 0xe1e: 0x0080, 0xe1f: 0x0080, 0xe20: 0x00c0, 0xe21: 0x00c0, 0xe22: 0x00c0, 0xe23: 0x00c0, + 0xe24: 0x00c0, 0xe25: 0x00c0, 0xe26: 0x00c0, 0xe27: 0x00c0, 0xe28: 0x00c0, 0xe29: 0x00c0, + 0xe2a: 0x0080, 0xe2b: 0x0080, 0xe2c: 0x0080, 0xe2d: 0x0080, 0xe2e: 0x0080, 0xe2f: 0x0080, + 0xe30: 0x0080, 0xe31: 0x0080, 0xe32: 0x0080, 0xe33: 0x0080, 0xe34: 0x0080, 0xe35: 0x00c3, + 0xe36: 0x0080, 0xe37: 0x00c3, 0xe38: 0x0080, 0xe39: 0x00c3, 0xe3a: 0x0080, 0xe3b: 0x0080, + 0xe3c: 0x0080, 0xe3d: 0x0080, 0xe3e: 0x00c0, 0xe3f: 0x00c0, + // Block 0x39, offset 0xe40 + 0xe40: 0x00c0, 0xe41: 0x00c0, 0xe42: 0x00c0, 0xe43: 0x0080, 0xe44: 0x00c0, 0xe45: 0x00c0, + 0xe46: 0x00c0, 0xe47: 0x00c0, 0xe49: 0x00c0, 0xe4a: 0x00c0, 0xe4b: 0x00c0, + 0xe4c: 0x00c0, 0xe4d: 0x0080, 0xe4e: 0x00c0, 0xe4f: 0x00c0, 0xe50: 0x00c0, 0xe51: 0x00c0, + 0xe52: 0x0080, 0xe53: 0x00c0, 0xe54: 0x00c0, 0xe55: 0x00c0, 0xe56: 0x00c0, 0xe57: 0x0080, + 0xe58: 0x00c0, 0xe59: 0x00c0, 0xe5a: 0x00c0, 0xe5b: 0x00c0, 0xe5c: 0x0080, 0xe5d: 0x00c0, + 0xe5e: 0x00c0, 0xe5f: 0x00c0, 0xe60: 0x00c0, 0xe61: 0x00c0, 0xe62: 0x00c0, 0xe63: 0x00c0, + 0xe64: 0x00c0, 0xe65: 0x00c0, 0xe66: 0x00c0, 0xe67: 0x00c0, 0xe68: 0x00c0, 0xe69: 0x0080, + 0xe6a: 0x00c0, 0xe6b: 0x00c0, 0xe6c: 0x00c0, + 0xe71: 0x00c3, 0xe72: 0x00c3, 0xe73: 0x0083, 0xe74: 0x00c3, 0xe75: 0x0083, + 0xe76: 0x0083, 0xe77: 0x0083, 0xe78: 0x0083, 0xe79: 0x0083, 0xe7a: 0x00c3, 0xe7b: 0x00c3, + 0xe7c: 0x00c3, 0xe7d: 0x00c3, 0xe7e: 0x00c3, 0xe7f: 0x00c0, + // Block 0x3a, offset 0xe80 + 0xe80: 0x00c3, 0xe81: 0x0083, 0xe82: 0x00c3, 0xe83: 0x00c3, 0xe84: 0x00c6, 0xe85: 0x0080, + 0xe86: 0x00c3, 0xe87: 0x00c3, 0xe88: 0x00c0, 0xe89: 0x00c0, 0xe8a: 0x00c0, 0xe8b: 0x00c0, + 0xe8c: 0x00c0, 0xe8d: 0x00c3, 0xe8e: 0x00c3, 0xe8f: 0x00c3, 0xe90: 0x00c3, 0xe91: 0x00c3, + 0xe92: 0x00c3, 0xe93: 0x0083, 0xe94: 0x00c3, 0xe95: 0x00c3, 0xe96: 0x00c3, 0xe97: 0x00c3, + 0xe99: 0x00c3, 0xe9a: 0x00c3, 0xe9b: 0x00c3, 0xe9c: 0x00c3, 0xe9d: 0x0083, + 0xe9e: 0x00c3, 0xe9f: 0x00c3, 0xea0: 0x00c3, 0xea1: 0x00c3, 0xea2: 0x0083, 0xea3: 0x00c3, + 0xea4: 0x00c3, 0xea5: 0x00c3, 0xea6: 0x00c3, 0xea7: 0x0083, 0xea8: 0x00c3, 0xea9: 0x00c3, + 0xeaa: 0x00c3, 0xeab: 0x00c3, 0xeac: 0x0083, 0xead: 0x00c3, 0xeae: 0x00c3, 0xeaf: 0x00c3, + 0xeb0: 0x00c3, 0xeb1: 0x00c3, 0xeb2: 0x00c3, 0xeb3: 0x00c3, 0xeb4: 0x00c3, 0xeb5: 0x00c3, + 0xeb6: 0x00c3, 0xeb7: 0x00c3, 0xeb8: 0x00c3, 0xeb9: 0x0083, 0xeba: 0x00c3, 0xebb: 0x00c3, + 0xebc: 0x00c3, 0xebe: 0x0080, 0xebf: 0x0080, + // Block 0x3b, offset 0xec0 + 0xec0: 0x0080, 0xec1: 0x0080, 0xec2: 0x0080, 0xec3: 0x0080, 0xec4: 0x0080, 0xec5: 0x0080, + 0xec6: 0x00c3, 0xec7: 0x0080, 0xec8: 0x0080, 0xec9: 0x0080, 0xeca: 0x0080, 0xecb: 0x0080, + 0xecc: 0x0080, 0xece: 0x0080, 0xecf: 0x0080, 0xed0: 0x0080, 0xed1: 0x0080, + 0xed2: 0x0080, 0xed3: 0x0080, 0xed4: 0x0080, 0xed5: 0x0080, 0xed6: 0x0080, 0xed7: 0x0080, + 0xed8: 0x0080, 0xed9: 0x0080, 0xeda: 0x0080, + // Block 0x3c, offset 0xf00 + 0xf00: 0x00c0, 0xf01: 0x00c0, 0xf02: 0x00c0, 0xf03: 0x00c0, 0xf04: 0x00c0, 0xf05: 0x00c0, + 0xf06: 0x00c0, 0xf07: 0x00c0, 0xf08: 0x00c0, 0xf09: 0x00c0, 0xf0a: 0x00c0, 0xf0b: 0x00c0, + 0xf0c: 0x00c0, 0xf0d: 0x00c0, 0xf0e: 0x00c0, 0xf0f: 0x00c0, 0xf10: 0x00c0, 0xf11: 0x00c0, + 0xf12: 0x00c0, 0xf13: 0x00c0, 0xf14: 0x00c0, 0xf15: 0x00c0, 0xf16: 0x00c0, 0xf17: 0x00c0, + 0xf18: 0x00c0, 0xf19: 0x00c0, 0xf1a: 0x00c0, 0xf1b: 0x00c0, 0xf1c: 0x00c0, 0xf1d: 0x00c0, + 0xf1e: 0x00c0, 0xf1f: 0x00c0, 0xf20: 0x00c0, 0xf21: 0x00c0, 0xf22: 0x00c0, 0xf23: 0x00c0, + 0xf24: 0x00c0, 0xf25: 0x00c0, 0xf26: 0x00c0, 0xf27: 0x00c0, 0xf28: 0x00c0, 0xf29: 0x00c0, + 0xf2a: 0x00c0, 0xf2b: 0x00c0, 0xf2c: 0x00c0, 0xf2d: 0x00c3, 0xf2e: 0x00c3, 0xf2f: 0x00c3, + 0xf30: 0x00c3, 0xf31: 0x00c0, 0xf32: 0x00c3, 0xf33: 0x00c3, 0xf34: 0x00c3, 0xf35: 0x00c3, + 0xf36: 0x00c3, 0xf37: 0x00c3, 0xf38: 0x00c0, 0xf39: 0x00c6, 0xf3a: 0x00c6, 0xf3b: 0x00c0, + 0xf3c: 0x00c0, 0xf3d: 0x00c3, 0xf3e: 0x00c3, 0xf3f: 0x00c0, + // Block 0x3d, offset 0xf40 + 0xf40: 0x00c0, 0xf41: 0x00c0, 0xf42: 0x00c0, 0xf43: 0x00c0, 0xf44: 0x00c0, 0xf45: 0x00c0, + 0xf46: 0x00c0, 0xf47: 0x00c0, 0xf48: 0x00c0, 0xf49: 0x00c0, 0xf4a: 0x0080, 0xf4b: 0x0080, + 0xf4c: 0x0080, 0xf4d: 0x0080, 0xf4e: 0x0080, 0xf4f: 0x0080, 0xf50: 0x00c0, 0xf51: 0x00c0, + 0xf52: 0x00c0, 0xf53: 0x00c0, 0xf54: 0x00c0, 0xf55: 0x00c0, 0xf56: 0x00c0, 0xf57: 0x00c0, + 0xf58: 0x00c3, 0xf59: 0x00c3, 0xf5a: 0x00c0, 0xf5b: 0x00c0, 0xf5c: 0x00c0, 0xf5d: 0x00c0, + 0xf5e: 0x00c3, 0xf5f: 0x00c3, 0xf60: 0x00c3, 0xf61: 0x00c0, 0xf62: 0x00c0, 0xf63: 0x00c0, + 0xf64: 0x00c0, 0xf65: 0x00c0, 0xf66: 0x00c0, 0xf67: 0x00c0, 0xf68: 0x00c0, 0xf69: 0x00c0, + 0xf6a: 0x00c0, 0xf6b: 0x00c0, 0xf6c: 0x00c0, 0xf6d: 0x00c0, 0xf6e: 0x00c0, 0xf6f: 0x00c0, + 0xf70: 0x00c0, 0xf71: 0x00c3, 0xf72: 0x00c3, 0xf73: 0x00c3, 0xf74: 0x00c3, 0xf75: 0x00c0, + 0xf76: 0x00c0, 0xf77: 0x00c0, 0xf78: 0x00c0, 0xf79: 0x00c0, 0xf7a: 0x00c0, 0xf7b: 0x00c0, + 0xf7c: 0x00c0, 0xf7d: 0x00c0, 0xf7e: 0x00c0, 0xf7f: 0x00c0, + // Block 0x3e, offset 0xf80 + 0xf80: 0x00c0, 0xf81: 0x00c0, 0xf82: 0x00c3, 0xf83: 0x00c0, 0xf84: 0x00c0, 0xf85: 0x00c3, + 0xf86: 0x00c3, 0xf87: 0x00c0, 0xf88: 0x00c0, 0xf89: 0x00c0, 0xf8a: 0x00c0, 0xf8b: 0x00c0, + 0xf8c: 0x00c0, 0xf8d: 0x00c3, 0xf8e: 0x00c0, 0xf8f: 0x00c0, 0xf90: 0x00c0, 0xf91: 0x00c0, + 0xf92: 0x00c0, 0xf93: 0x00c0, 0xf94: 0x00c0, 0xf95: 0x00c0, 0xf96: 0x00c0, 0xf97: 0x00c0, + 0xf98: 0x00c0, 0xf99: 0x00c0, 0xf9a: 0x00c0, 0xf9b: 0x00c0, 0xf9c: 0x00c0, 0xf9d: 0x00c3, + 0xf9e: 0x0080, 0xf9f: 0x0080, 0xfa0: 0x00c0, 0xfa1: 0x00c0, 0xfa2: 0x00c0, 0xfa3: 0x00c0, + 0xfa4: 0x00c0, 0xfa5: 0x00c0, 0xfa6: 0x00c0, 0xfa7: 0x00c0, 0xfa8: 0x00c0, 0xfa9: 0x00c0, + 0xfaa: 0x00c0, 0xfab: 0x00c0, 0xfac: 0x00c0, 0xfad: 0x00c0, 0xfae: 0x00c0, 0xfaf: 0x00c0, + 0xfb0: 0x00c0, 0xfb1: 0x00c0, 0xfb2: 0x00c0, 0xfb3: 0x00c0, 0xfb4: 0x00c0, 0xfb5: 0x00c0, + 0xfb6: 0x00c0, 0xfb7: 0x00c0, 0xfb8: 0x00c0, 0xfb9: 0x00c0, 0xfba: 0x00c0, 0xfbb: 0x00c0, + 0xfbc: 0x00c0, 0xfbd: 0x00c0, 0xfbe: 0x00c0, 0xfbf: 0x00c0, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x00c0, 0xfc1: 0x00c0, 0xfc2: 0x00c0, 0xfc3: 0x00c0, 0xfc4: 0x00c0, 0xfc5: 0x00c0, + 0xfc7: 0x00c0, + 0xfcd: 0x00c0, 0xfd0: 0x00c0, 0xfd1: 0x00c0, + 0xfd2: 0x00c0, 0xfd3: 0x00c0, 0xfd4: 0x00c0, 0xfd5: 0x00c0, 0xfd6: 0x00c0, 0xfd7: 0x00c0, + 0xfd8: 0x00c0, 0xfd9: 0x00c0, 0xfda: 0x00c0, 0xfdb: 0x00c0, 0xfdc: 0x00c0, 0xfdd: 0x00c0, + 0xfde: 0x00c0, 0xfdf: 0x00c0, 0xfe0: 0x00c0, 0xfe1: 0x00c0, 0xfe2: 0x00c0, 0xfe3: 0x00c0, + 0xfe4: 0x00c0, 0xfe5: 0x00c0, 0xfe6: 0x00c0, 0xfe7: 0x00c0, 0xfe8: 0x00c0, 0xfe9: 0x00c0, + 0xfea: 0x00c0, 0xfeb: 0x00c0, 0xfec: 0x00c0, 0xfed: 0x00c0, 0xfee: 0x00c0, 0xfef: 0x00c0, + 0xff0: 0x00c0, 0xff1: 0x00c0, 0xff2: 0x00c0, 0xff3: 0x00c0, 0xff4: 0x00c0, 0xff5: 0x00c0, + 0xff6: 0x00c0, 0xff7: 0x00c0, 0xff8: 0x00c0, 0xff9: 0x00c0, 0xffa: 0x00c0, 0xffb: 0x0080, + 0xffc: 0x0080, 0xffd: 0x00c0, 0xffe: 0x00c0, 0xfff: 0x00c0, + // Block 0x40, offset 0x1000 + 0x1000: 0x0040, 0x1001: 0x0040, 0x1002: 0x0040, 0x1003: 0x0040, 0x1004: 0x0040, 0x1005: 0x0040, + 0x1006: 0x0040, 0x1007: 0x0040, 0x1008: 0x0040, 0x1009: 0x0040, 0x100a: 0x0040, 0x100b: 0x0040, + 0x100c: 0x0040, 0x100d: 0x0040, 0x100e: 0x0040, 0x100f: 0x0040, 0x1010: 0x0040, 0x1011: 0x0040, + 0x1012: 0x0040, 0x1013: 0x0040, 0x1014: 0x0040, 0x1015: 0x0040, 0x1016: 0x0040, 0x1017: 0x0040, + 0x1018: 0x0040, 0x1019: 0x0040, 0x101a: 0x0040, 0x101b: 0x0040, 0x101c: 0x0040, 0x101d: 0x0040, + 0x101e: 0x0040, 0x101f: 0x0040, 0x1020: 0x0040, 0x1021: 0x0040, 0x1022: 0x0040, 0x1023: 0x0040, + 0x1024: 0x0040, 0x1025: 0x0040, 0x1026: 0x0040, 0x1027: 0x0040, 0x1028: 0x0040, 0x1029: 0x0040, + 0x102a: 0x0040, 0x102b: 0x0040, 0x102c: 0x0040, 0x102d: 0x0040, 0x102e: 0x0040, 0x102f: 0x0040, + 0x1030: 0x0040, 0x1031: 0x0040, 0x1032: 0x0040, 0x1033: 0x0040, 0x1034: 0x0040, 0x1035: 0x0040, + 0x1036: 0x0040, 0x1037: 0x0040, 0x1038: 0x0040, 0x1039: 0x0040, 0x103a: 0x0040, 0x103b: 0x0040, + 0x103c: 0x0040, 0x103d: 0x0040, 0x103e: 0x0040, 0x103f: 0x0040, + // Block 0x41, offset 0x1040 + 0x1040: 0x00c0, 0x1041: 0x00c0, 0x1042: 0x00c0, 0x1043: 0x00c0, 0x1044: 0x00c0, 0x1045: 0x00c0, + 0x1046: 0x00c0, 0x1047: 0x00c0, 0x1048: 0x00c0, 0x104a: 0x00c0, 0x104b: 0x00c0, + 0x104c: 0x00c0, 0x104d: 0x00c0, 0x1050: 0x00c0, 0x1051: 0x00c0, + 0x1052: 0x00c0, 0x1053: 0x00c0, 0x1054: 0x00c0, 0x1055: 0x00c0, 0x1056: 0x00c0, + 0x1058: 0x00c0, 0x105a: 0x00c0, 0x105b: 0x00c0, 0x105c: 0x00c0, 0x105d: 0x00c0, + 0x1060: 0x00c0, 0x1061: 0x00c0, 0x1062: 0x00c0, 0x1063: 0x00c0, + 0x1064: 0x00c0, 0x1065: 0x00c0, 0x1066: 0x00c0, 0x1067: 0x00c0, 0x1068: 0x00c0, 0x1069: 0x00c0, + 0x106a: 0x00c0, 0x106b: 0x00c0, 0x106c: 0x00c0, 0x106d: 0x00c0, 0x106e: 0x00c0, 0x106f: 0x00c0, + 0x1070: 0x00c0, 0x1071: 0x00c0, 0x1072: 0x00c0, 0x1073: 0x00c0, 0x1074: 0x00c0, 0x1075: 0x00c0, + 0x1076: 0x00c0, 0x1077: 0x00c0, 0x1078: 0x00c0, 0x1079: 0x00c0, 0x107a: 0x00c0, 0x107b: 0x00c0, + 0x107c: 0x00c0, 0x107d: 0x00c0, 0x107e: 0x00c0, 0x107f: 0x00c0, + // Block 0x42, offset 0x1080 + 0x1080: 0x00c0, 0x1081: 0x00c0, 0x1082: 0x00c0, 0x1083: 0x00c0, 0x1084: 0x00c0, 0x1085: 0x00c0, + 0x1086: 0x00c0, 0x1087: 0x00c0, 0x1088: 0x00c0, 0x108a: 0x00c0, 0x108b: 0x00c0, + 0x108c: 0x00c0, 0x108d: 0x00c0, 0x1090: 0x00c0, 0x1091: 0x00c0, + 0x1092: 0x00c0, 0x1093: 0x00c0, 0x1094: 0x00c0, 0x1095: 0x00c0, 0x1096: 0x00c0, 0x1097: 0x00c0, + 0x1098: 0x00c0, 0x1099: 0x00c0, 0x109a: 0x00c0, 0x109b: 0x00c0, 0x109c: 0x00c0, 0x109d: 0x00c0, + 0x109e: 0x00c0, 0x109f: 0x00c0, 0x10a0: 0x00c0, 0x10a1: 0x00c0, 0x10a2: 0x00c0, 0x10a3: 0x00c0, + 0x10a4: 0x00c0, 0x10a5: 0x00c0, 0x10a6: 0x00c0, 0x10a7: 0x00c0, 0x10a8: 0x00c0, 0x10a9: 0x00c0, + 0x10aa: 0x00c0, 0x10ab: 0x00c0, 0x10ac: 0x00c0, 0x10ad: 0x00c0, 0x10ae: 0x00c0, 0x10af: 0x00c0, + 0x10b0: 0x00c0, 0x10b2: 0x00c0, 0x10b3: 0x00c0, 0x10b4: 0x00c0, 0x10b5: 0x00c0, + 0x10b8: 0x00c0, 0x10b9: 0x00c0, 0x10ba: 0x00c0, 0x10bb: 0x00c0, + 0x10bc: 0x00c0, 0x10bd: 0x00c0, 0x10be: 0x00c0, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x00c0, 0x10c2: 0x00c0, 0x10c3: 0x00c0, 0x10c4: 0x00c0, 0x10c5: 0x00c0, + 0x10c8: 0x00c0, 0x10c9: 0x00c0, 0x10ca: 0x00c0, 0x10cb: 0x00c0, + 0x10cc: 0x00c0, 0x10cd: 0x00c0, 0x10ce: 0x00c0, 0x10cf: 0x00c0, 0x10d0: 0x00c0, 0x10d1: 0x00c0, + 0x10d2: 0x00c0, 0x10d3: 0x00c0, 0x10d4: 0x00c0, 0x10d5: 0x00c0, 0x10d6: 0x00c0, + 0x10d8: 0x00c0, 0x10d9: 0x00c0, 0x10da: 0x00c0, 0x10db: 0x00c0, 0x10dc: 0x00c0, 0x10dd: 0x00c0, + 0x10de: 0x00c0, 0x10df: 0x00c0, 0x10e0: 0x00c0, 0x10e1: 0x00c0, 0x10e2: 0x00c0, 0x10e3: 0x00c0, + 0x10e4: 0x00c0, 0x10e5: 0x00c0, 0x10e6: 0x00c0, 0x10e7: 0x00c0, 0x10e8: 0x00c0, 0x10e9: 0x00c0, + 0x10ea: 0x00c0, 0x10eb: 0x00c0, 0x10ec: 0x00c0, 0x10ed: 0x00c0, 0x10ee: 0x00c0, 0x10ef: 0x00c0, + 0x10f0: 0x00c0, 0x10f1: 0x00c0, 0x10f2: 0x00c0, 0x10f3: 0x00c0, 0x10f4: 0x00c0, 0x10f5: 0x00c0, + 0x10f6: 0x00c0, 0x10f7: 0x00c0, 0x10f8: 0x00c0, 0x10f9: 0x00c0, 0x10fa: 0x00c0, 0x10fb: 0x00c0, + 0x10fc: 0x00c0, 0x10fd: 0x00c0, 0x10fe: 0x00c0, 0x10ff: 0x00c0, + // Block 0x44, offset 0x1100 + 0x1100: 0x00c0, 0x1101: 0x00c0, 0x1102: 0x00c0, 0x1103: 0x00c0, 0x1104: 0x00c0, 0x1105: 0x00c0, + 0x1106: 0x00c0, 0x1107: 0x00c0, 0x1108: 0x00c0, 0x1109: 0x00c0, 0x110a: 0x00c0, 0x110b: 0x00c0, + 0x110c: 0x00c0, 0x110d: 0x00c0, 0x110e: 0x00c0, 0x110f: 0x00c0, 0x1110: 0x00c0, + 0x1112: 0x00c0, 0x1113: 0x00c0, 0x1114: 0x00c0, 0x1115: 0x00c0, + 0x1118: 0x00c0, 0x1119: 0x00c0, 0x111a: 0x00c0, 0x111b: 0x00c0, 0x111c: 0x00c0, 0x111d: 0x00c0, + 0x111e: 0x00c0, 0x111f: 0x00c0, 0x1120: 0x00c0, 0x1121: 0x00c0, 0x1122: 0x00c0, 0x1123: 0x00c0, + 0x1124: 0x00c0, 0x1125: 0x00c0, 0x1126: 0x00c0, 0x1127: 0x00c0, 0x1128: 0x00c0, 0x1129: 0x00c0, + 0x112a: 0x00c0, 0x112b: 0x00c0, 0x112c: 0x00c0, 0x112d: 0x00c0, 0x112e: 0x00c0, 0x112f: 0x00c0, + 0x1130: 0x00c0, 0x1131: 0x00c0, 0x1132: 0x00c0, 0x1133: 0x00c0, 0x1134: 0x00c0, 0x1135: 0x00c0, + 0x1136: 0x00c0, 0x1137: 0x00c0, 0x1138: 0x00c0, 0x1139: 0x00c0, 0x113a: 0x00c0, 0x113b: 0x00c0, + 0x113c: 0x00c0, 0x113d: 0x00c0, 0x113e: 0x00c0, 0x113f: 0x00c0, + // Block 0x45, offset 0x1140 + 0x1140: 0x00c0, 0x1141: 0x00c0, 0x1142: 0x00c0, 0x1143: 0x00c0, 0x1144: 0x00c0, 0x1145: 0x00c0, + 0x1146: 0x00c0, 0x1147: 0x00c0, 0x1148: 0x00c0, 0x1149: 0x00c0, 0x114a: 0x00c0, 0x114b: 0x00c0, + 0x114c: 0x00c0, 0x114d: 0x00c0, 0x114e: 0x00c0, 0x114f: 0x00c0, 0x1150: 0x00c0, 0x1151: 0x00c0, + 0x1152: 0x00c0, 0x1153: 0x00c0, 0x1154: 0x00c0, 0x1155: 0x00c0, 0x1156: 0x00c0, 0x1157: 0x00c0, + 0x1158: 0x00c0, 0x1159: 0x00c0, 0x115a: 0x00c0, 0x115d: 0x00c3, + 0x115e: 0x00c3, 0x115f: 0x00c3, 0x1160: 0x0080, 0x1161: 0x0080, 0x1162: 0x0080, 0x1163: 0x0080, + 0x1164: 0x0080, 0x1165: 0x0080, 0x1166: 0x0080, 0x1167: 0x0080, 0x1168: 0x0080, 0x1169: 0x0080, + 0x116a: 0x0080, 0x116b: 0x0080, 0x116c: 0x0080, 0x116d: 0x0080, 0x116e: 0x0080, 0x116f: 0x0080, + 0x1170: 0x0080, 0x1171: 0x0080, 0x1172: 0x0080, 0x1173: 0x0080, 0x1174: 0x0080, 0x1175: 0x0080, + 0x1176: 0x0080, 0x1177: 0x0080, 0x1178: 0x0080, 0x1179: 0x0080, 0x117a: 0x0080, 0x117b: 0x0080, + 0x117c: 0x0080, + // Block 0x46, offset 0x1180 + 0x1180: 0x00c0, 0x1181: 0x00c0, 0x1182: 0x00c0, 0x1183: 0x00c0, 0x1184: 0x00c0, 0x1185: 0x00c0, + 0x1186: 0x00c0, 0x1187: 0x00c0, 0x1188: 0x00c0, 0x1189: 0x00c0, 0x118a: 0x00c0, 0x118b: 0x00c0, + 0x118c: 0x00c0, 0x118d: 0x00c0, 0x118e: 0x00c0, 0x118f: 0x00c0, 0x1190: 0x0080, 0x1191: 0x0080, + 0x1192: 0x0080, 0x1193: 0x0080, 0x1194: 0x0080, 0x1195: 0x0080, 0x1196: 0x0080, 0x1197: 0x0080, + 0x1198: 0x0080, 0x1199: 0x0080, + 0x11a0: 0x00c0, 0x11a1: 0x00c0, 0x11a2: 0x00c0, 0x11a3: 0x00c0, + 0x11a4: 0x00c0, 0x11a5: 0x00c0, 0x11a6: 0x00c0, 0x11a7: 0x00c0, 0x11a8: 0x00c0, 0x11a9: 0x00c0, + 0x11aa: 0x00c0, 0x11ab: 0x00c0, 0x11ac: 0x00c0, 0x11ad: 0x00c0, 0x11ae: 0x00c0, 0x11af: 0x00c0, + 0x11b0: 0x00c0, 0x11b1: 0x00c0, 0x11b2: 0x00c0, 0x11b3: 0x00c0, 0x11b4: 0x00c0, 0x11b5: 0x00c0, + 0x11b6: 0x00c0, 0x11b7: 0x00c0, 0x11b8: 0x00c0, 0x11b9: 0x00c0, 0x11ba: 0x00c0, 0x11bb: 0x00c0, + 0x11bc: 0x00c0, 0x11bd: 0x00c0, 0x11be: 0x00c0, 0x11bf: 0x00c0, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x00c0, 0x11c1: 0x00c0, 0x11c2: 0x00c0, 0x11c3: 0x00c0, 0x11c4: 0x00c0, 0x11c5: 0x00c0, + 0x11c6: 0x00c0, 0x11c7: 0x00c0, 0x11c8: 0x00c0, 0x11c9: 0x00c0, 0x11ca: 0x00c0, 0x11cb: 0x00c0, + 0x11cc: 0x00c0, 0x11cd: 0x00c0, 0x11ce: 0x00c0, 0x11cf: 0x00c0, 0x11d0: 0x00c0, 0x11d1: 0x00c0, + 0x11d2: 0x00c0, 0x11d3: 0x00c0, 0x11d4: 0x00c0, 0x11d5: 0x00c0, 0x11d6: 0x00c0, 0x11d7: 0x00c0, + 0x11d8: 0x00c0, 0x11d9: 0x00c0, 0x11da: 0x00c0, 0x11db: 0x00c0, 0x11dc: 0x00c0, 0x11dd: 0x00c0, + 0x11de: 0x00c0, 0x11df: 0x00c0, 0x11e0: 0x00c0, 0x11e1: 0x00c0, 0x11e2: 0x00c0, 0x11e3: 0x00c0, + 0x11e4: 0x00c0, 0x11e5: 0x00c0, 0x11e6: 0x00c0, 0x11e7: 0x00c0, 0x11e8: 0x00c0, 0x11e9: 0x00c0, + 0x11ea: 0x00c0, 0x11eb: 0x00c0, 0x11ec: 0x00c0, 0x11ed: 0x00c0, 0x11ee: 0x00c0, 0x11ef: 0x00c0, + 0x11f0: 0x00c0, 0x11f1: 0x00c0, 0x11f2: 0x00c0, 0x11f3: 0x00c0, 0x11f4: 0x00c0, 0x11f5: 0x00c0, + 0x11f8: 0x00c0, 0x11f9: 0x00c0, 0x11fa: 0x00c0, 0x11fb: 0x00c0, + 0x11fc: 0x00c0, 0x11fd: 0x00c0, + // Block 0x48, offset 0x1200 + 0x1200: 0x0080, 0x1201: 0x00c0, 0x1202: 0x00c0, 0x1203: 0x00c0, 0x1204: 0x00c0, 0x1205: 0x00c0, + 0x1206: 0x00c0, 0x1207: 0x00c0, 0x1208: 0x00c0, 0x1209: 0x00c0, 0x120a: 0x00c0, 0x120b: 0x00c0, + 0x120c: 0x00c0, 0x120d: 0x00c0, 0x120e: 0x00c0, 0x120f: 0x00c0, 0x1210: 0x00c0, 0x1211: 0x00c0, + 0x1212: 0x00c0, 0x1213: 0x00c0, 0x1214: 0x00c0, 0x1215: 0x00c0, 0x1216: 0x00c0, 0x1217: 0x00c0, + 0x1218: 0x00c0, 0x1219: 0x00c0, 0x121a: 0x00c0, 0x121b: 0x00c0, 0x121c: 0x00c0, 0x121d: 0x00c0, + 0x121e: 0x00c0, 0x121f: 0x00c0, 0x1220: 0x00c0, 0x1221: 0x00c0, 0x1222: 0x00c0, 0x1223: 0x00c0, + 0x1224: 0x00c0, 0x1225: 0x00c0, 0x1226: 0x00c0, 0x1227: 0x00c0, 0x1228: 0x00c0, 0x1229: 0x00c0, + 0x122a: 0x00c0, 0x122b: 0x00c0, 0x122c: 0x00c0, 0x122d: 0x00c0, 0x122e: 0x00c0, 0x122f: 0x00c0, + 0x1230: 0x00c0, 0x1231: 0x00c0, 0x1232: 0x00c0, 0x1233: 0x00c0, 0x1234: 0x00c0, 0x1235: 0x00c0, + 0x1236: 0x00c0, 0x1237: 0x00c0, 0x1238: 0x00c0, 0x1239: 0x00c0, 0x123a: 0x00c0, 0x123b: 0x00c0, + 0x123c: 0x00c0, 0x123d: 0x00c0, 0x123e: 0x00c0, 0x123f: 0x00c0, + // Block 0x49, offset 0x1240 + 0x1240: 0x00c0, 0x1241: 0x00c0, 0x1242: 0x00c0, 0x1243: 0x00c0, 0x1244: 0x00c0, 0x1245: 0x00c0, + 0x1246: 0x00c0, 0x1247: 0x00c0, 0x1248: 0x00c0, 0x1249: 0x00c0, 0x124a: 0x00c0, 0x124b: 0x00c0, + 0x124c: 0x00c0, 0x124d: 0x00c0, 0x124e: 0x00c0, 0x124f: 0x00c0, 0x1250: 0x00c0, 0x1251: 0x00c0, + 0x1252: 0x00c0, 0x1253: 0x00c0, 0x1254: 0x00c0, 0x1255: 0x00c0, 0x1256: 0x00c0, 0x1257: 0x00c0, + 0x1258: 0x00c0, 0x1259: 0x00c0, 0x125a: 0x00c0, 0x125b: 0x00c0, 0x125c: 0x00c0, 0x125d: 0x00c0, + 0x125e: 0x00c0, 0x125f: 0x00c0, 0x1260: 0x00c0, 0x1261: 0x00c0, 0x1262: 0x00c0, 0x1263: 0x00c0, + 0x1264: 0x00c0, 0x1265: 0x00c0, 0x1266: 0x00c0, 0x1267: 0x00c0, 0x1268: 0x00c0, 0x1269: 0x00c0, + 0x126a: 0x00c0, 0x126b: 0x00c0, 0x126c: 0x00c0, 0x126d: 0x0080, 0x126e: 0x0080, 0x126f: 0x00c0, + 0x1270: 0x00c0, 0x1271: 0x00c0, 0x1272: 0x00c0, 0x1273: 0x00c0, 0x1274: 0x00c0, 0x1275: 0x00c0, + 0x1276: 0x00c0, 0x1277: 0x00c0, 0x1278: 0x00c0, 0x1279: 0x00c0, 0x127a: 0x00c0, 0x127b: 0x00c0, + 0x127c: 0x00c0, 0x127d: 0x00c0, 0x127e: 0x00c0, 0x127f: 0x00c0, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0080, 0x1281: 0x00c0, 0x1282: 0x00c0, 0x1283: 0x00c0, 0x1284: 0x00c0, 0x1285: 0x00c0, + 0x1286: 0x00c0, 0x1287: 0x00c0, 0x1288: 0x00c0, 0x1289: 0x00c0, 0x128a: 0x00c0, 0x128b: 0x00c0, + 0x128c: 0x00c0, 0x128d: 0x00c0, 0x128e: 0x00c0, 0x128f: 0x00c0, 0x1290: 0x00c0, 0x1291: 0x00c0, + 0x1292: 0x00c0, 0x1293: 0x00c0, 0x1294: 0x00c0, 0x1295: 0x00c0, 0x1296: 0x00c0, 0x1297: 0x00c0, + 0x1298: 0x00c0, 0x1299: 0x00c0, 0x129a: 0x00c0, 0x129b: 0x0080, 0x129c: 0x0080, + 0x12a0: 0x00c0, 0x12a1: 0x00c0, 0x12a2: 0x00c0, 0x12a3: 0x00c0, + 0x12a4: 0x00c0, 0x12a5: 0x00c0, 0x12a6: 0x00c0, 0x12a7: 0x00c0, 0x12a8: 0x00c0, 0x12a9: 0x00c0, + 0x12aa: 0x00c0, 0x12ab: 0x00c0, 0x12ac: 0x00c0, 0x12ad: 0x00c0, 0x12ae: 0x00c0, 0x12af: 0x00c0, + 0x12b0: 0x00c0, 0x12b1: 0x00c0, 0x12b2: 0x00c0, 0x12b3: 0x00c0, 0x12b4: 0x00c0, 0x12b5: 0x00c0, + 0x12b6: 0x00c0, 0x12b7: 0x00c0, 0x12b8: 0x00c0, 0x12b9: 0x00c0, 0x12ba: 0x00c0, 0x12bb: 0x00c0, + 0x12bc: 0x00c0, 0x12bd: 0x00c0, 0x12be: 0x00c0, 0x12bf: 0x00c0, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x00c0, 0x12c1: 0x00c0, 0x12c2: 0x00c0, 0x12c3: 0x00c0, 0x12c4: 0x00c0, 0x12c5: 0x00c0, + 0x12c6: 0x00c0, 0x12c7: 0x00c0, 0x12c8: 0x00c0, 0x12c9: 0x00c0, 0x12ca: 0x00c0, 0x12cb: 0x00c0, + 0x12cc: 0x00c0, 0x12cd: 0x00c0, 0x12ce: 0x00c0, 0x12cf: 0x00c0, 0x12d0: 0x00c0, 0x12d1: 0x00c0, + 0x12d2: 0x00c0, 0x12d3: 0x00c0, 0x12d4: 0x00c0, 0x12d5: 0x00c0, 0x12d6: 0x00c0, 0x12d7: 0x00c0, + 0x12d8: 0x00c0, 0x12d9: 0x00c0, 0x12da: 0x00c0, 0x12db: 0x00c0, 0x12dc: 0x00c0, 0x12dd: 0x00c0, + 0x12de: 0x00c0, 0x12df: 0x00c0, 0x12e0: 0x00c0, 0x12e1: 0x00c0, 0x12e2: 0x00c0, 0x12e3: 0x00c0, + 0x12e4: 0x00c0, 0x12e5: 0x00c0, 0x12e6: 0x00c0, 0x12e7: 0x00c0, 0x12e8: 0x00c0, 0x12e9: 0x00c0, + 0x12ea: 0x00c0, 0x12eb: 0x0080, 0x12ec: 0x0080, 0x12ed: 0x0080, 0x12ee: 0x0080, 0x12ef: 0x0080, + 0x12f0: 0x0080, 0x12f1: 0x00c0, 0x12f2: 0x00c0, 0x12f3: 0x00c0, 0x12f4: 0x00c0, 0x12f5: 0x00c0, + 0x12f6: 0x00c0, 0x12f7: 0x00c0, 0x12f8: 0x00c0, + // Block 0x4c, offset 0x1300 + 0x1300: 0x00c0, 0x1301: 0x00c0, 0x1302: 0x00c0, 0x1303: 0x00c0, 0x1304: 0x00c0, 0x1305: 0x00c0, + 0x1306: 0x00c0, 0x1307: 0x00c0, 0x1308: 0x00c0, 0x1309: 0x00c0, 0x130a: 0x00c0, 0x130b: 0x00c0, + 0x130c: 0x00c0, 0x130d: 0x00c0, 0x130e: 0x00c0, 0x130f: 0x00c0, 0x1310: 0x00c0, 0x1311: 0x00c0, + 0x1312: 0x00c3, 0x1313: 0x00c3, 0x1314: 0x00c6, 0x1315: 0x00c5, + 0x131f: 0x00c0, 0x1320: 0x00c0, 0x1321: 0x00c0, 0x1322: 0x00c0, 0x1323: 0x00c0, + 0x1324: 0x00c0, 0x1325: 0x00c0, 0x1326: 0x00c0, 0x1327: 0x00c0, 0x1328: 0x00c0, 0x1329: 0x00c0, + 0x132a: 0x00c0, 0x132b: 0x00c0, 0x132c: 0x00c0, 0x132d: 0x00c0, 0x132e: 0x00c0, 0x132f: 0x00c0, + 0x1330: 0x00c0, 0x1331: 0x00c0, 0x1332: 0x00c3, 0x1333: 0x00c3, 0x1334: 0x00c5, 0x1335: 0x0080, + 0x1336: 0x0080, + // Block 0x4d, offset 0x1340 + 0x1340: 0x00c0, 0x1341: 0x00c0, 0x1342: 0x00c0, 0x1343: 0x00c0, 0x1344: 0x00c0, 0x1345: 0x00c0, + 0x1346: 0x00c0, 0x1347: 0x00c0, 0x1348: 0x00c0, 0x1349: 0x00c0, 0x134a: 0x00c0, 0x134b: 0x00c0, + 0x134c: 0x00c0, 0x134d: 0x00c0, 0x134e: 0x00c0, 0x134f: 0x00c0, 0x1350: 0x00c0, 0x1351: 0x00c0, + 0x1352: 0x00c3, 0x1353: 0x00c3, + 0x1360: 0x00c0, 0x1361: 0x00c0, 0x1362: 0x00c0, 0x1363: 0x00c0, + 0x1364: 0x00c0, 0x1365: 0x00c0, 0x1366: 0x00c0, 0x1367: 0x00c0, 0x1368: 0x00c0, 0x1369: 0x00c0, + 0x136a: 0x00c0, 0x136b: 0x00c0, 0x136c: 0x00c0, 0x136e: 0x00c0, 0x136f: 0x00c0, + 0x1370: 0x00c0, 0x1372: 0x00c3, 0x1373: 0x00c3, + // Block 0x4e, offset 0x1380 + 0x1380: 0x00c0, 0x1381: 0x00c0, 0x1382: 0x00c0, 0x1383: 0x00c0, 0x1384: 0x00c0, 0x1385: 0x00c0, + 0x1386: 0x00c0, 0x1387: 0x00c0, 0x1388: 0x00c0, 0x1389: 0x00c0, 0x138a: 0x00c0, 0x138b: 0x00c0, + 0x138c: 0x00c0, 0x138d: 0x00c0, 0x138e: 0x00c0, 0x138f: 0x00c0, 0x1390: 0x00c0, 0x1391: 0x00c0, + 0x1392: 0x00c0, 0x1393: 0x00c0, 0x1394: 0x00c0, 0x1395: 0x00c0, 0x1396: 0x00c0, 0x1397: 0x00c0, + 0x1398: 0x00c0, 0x1399: 0x00c0, 0x139a: 0x00c0, 0x139b: 0x00c0, 0x139c: 0x00c0, 0x139d: 0x00c0, + 0x139e: 0x00c0, 0x139f: 0x00c0, 0x13a0: 0x00c0, 0x13a1: 0x00c0, 0x13a2: 0x00c0, 0x13a3: 0x00c0, + 0x13a4: 0x00c0, 0x13a5: 0x00c0, 0x13a6: 0x00c0, 0x13a7: 0x00c0, 0x13a8: 0x00c0, 0x13a9: 0x00c0, + 0x13aa: 0x00c0, 0x13ab: 0x00c0, 0x13ac: 0x00c0, 0x13ad: 0x00c0, 0x13ae: 0x00c0, 0x13af: 0x00c0, + 0x13b0: 0x00c0, 0x13b1: 0x00c0, 0x13b2: 0x00c0, 0x13b3: 0x00c0, 0x13b4: 0x0040, 0x13b5: 0x0040, + 0x13b6: 0x00c0, 0x13b7: 0x00c3, 0x13b8: 0x00c3, 0x13b9: 0x00c3, 0x13ba: 0x00c3, 0x13bb: 0x00c3, + 0x13bc: 0x00c3, 0x13bd: 0x00c3, 0x13be: 0x00c0, 0x13bf: 0x00c0, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x00c0, 0x13c1: 0x00c0, 0x13c2: 0x00c0, 0x13c3: 0x00c0, 0x13c4: 0x00c0, 0x13c5: 0x00c0, + 0x13c6: 0x00c3, 0x13c7: 0x00c0, 0x13c8: 0x00c0, 0x13c9: 0x00c3, 0x13ca: 0x00c3, 0x13cb: 0x00c3, + 0x13cc: 0x00c3, 0x13cd: 0x00c3, 0x13ce: 0x00c3, 0x13cf: 0x00c3, 0x13d0: 0x00c3, 0x13d1: 0x00c3, + 0x13d2: 0x00c6, 0x13d3: 0x00c3, 0x13d4: 0x0080, 0x13d5: 0x0080, 0x13d6: 0x0080, 0x13d7: 0x00c0, + 0x13d8: 0x0080, 0x13d9: 0x0080, 0x13da: 0x0080, 0x13db: 0x0080, 0x13dc: 0x00c0, 0x13dd: 0x00c3, + 0x13e0: 0x00c0, 0x13e1: 0x00c0, 0x13e2: 0x00c0, 0x13e3: 0x00c0, + 0x13e4: 0x00c0, 0x13e5: 0x00c0, 0x13e6: 0x00c0, 0x13e7: 0x00c0, 0x13e8: 0x00c0, 0x13e9: 0x00c0, + 0x13f0: 0x0080, 0x13f1: 0x0080, 0x13f2: 0x0080, 0x13f3: 0x0080, 0x13f4: 0x0080, 0x13f5: 0x0080, + 0x13f6: 0x0080, 0x13f7: 0x0080, 0x13f8: 0x0080, 0x13f9: 0x0080, + // Block 0x50, offset 0x1400 + 0x1400: 0x0080, 0x1401: 0x0080, 0x1402: 0x0080, 0x1403: 0x0080, 0x1404: 0x0080, 0x1405: 0x0080, + 0x1406: 0x0080, 0x1407: 0x0082, 0x1408: 0x0080, 0x1409: 0x0080, 0x140a: 0x0080, 0x140b: 0x0040, + 0x140c: 0x0040, 0x140d: 0x0040, 0x140e: 0x0040, 0x140f: 0x0040, 0x1410: 0x00c0, 0x1411: 0x00c0, + 0x1412: 0x00c0, 0x1413: 0x00c0, 0x1414: 0x00c0, 0x1415: 0x00c0, 0x1416: 0x00c0, 0x1417: 0x00c0, + 0x1418: 0x00c0, 0x1419: 0x00c0, + 0x1420: 0x00c2, 0x1421: 0x00c2, 0x1422: 0x00c2, 0x1423: 0x00c2, + 0x1424: 0x00c2, 0x1425: 0x00c2, 0x1426: 0x00c2, 0x1427: 0x00c2, 0x1428: 0x00c2, 0x1429: 0x00c2, + 0x142a: 0x00c2, 0x142b: 0x00c2, 0x142c: 0x00c2, 0x142d: 0x00c2, 0x142e: 0x00c2, 0x142f: 0x00c2, + 0x1430: 0x00c2, 0x1431: 0x00c2, 0x1432: 0x00c2, 0x1433: 0x00c2, 0x1434: 0x00c2, 0x1435: 0x00c2, + 0x1436: 0x00c2, 0x1437: 0x00c2, 0x1438: 0x00c2, 0x1439: 0x00c2, 0x143a: 0x00c2, 0x143b: 0x00c2, + 0x143c: 0x00c2, 0x143d: 0x00c2, 0x143e: 0x00c2, 0x143f: 0x00c2, + // Block 0x51, offset 0x1440 + 0x1440: 0x00c2, 0x1441: 0x00c2, 0x1442: 0x00c2, 0x1443: 0x00c2, 0x1444: 0x00c2, 0x1445: 0x00c2, + 0x1446: 0x00c2, 0x1447: 0x00c2, 0x1448: 0x00c2, 0x1449: 0x00c2, 0x144a: 0x00c2, 0x144b: 0x00c2, + 0x144c: 0x00c2, 0x144d: 0x00c2, 0x144e: 0x00c2, 0x144f: 0x00c2, 0x1450: 0x00c2, 0x1451: 0x00c2, + 0x1452: 0x00c2, 0x1453: 0x00c2, 0x1454: 0x00c2, 0x1455: 0x00c2, 0x1456: 0x00c2, 0x1457: 0x00c2, + 0x1458: 0x00c2, 0x1459: 0x00c2, 0x145a: 0x00c2, 0x145b: 0x00c2, 0x145c: 0x00c2, 0x145d: 0x00c2, + 0x145e: 0x00c2, 0x145f: 0x00c2, 0x1460: 0x00c2, 0x1461: 0x00c2, 0x1462: 0x00c2, 0x1463: 0x00c2, + 0x1464: 0x00c2, 0x1465: 0x00c2, 0x1466: 0x00c2, 0x1467: 0x00c2, 0x1468: 0x00c2, 0x1469: 0x00c2, + 0x146a: 0x00c2, 0x146b: 0x00c2, 0x146c: 0x00c2, 0x146d: 0x00c2, 0x146e: 0x00c2, 0x146f: 0x00c2, + 0x1470: 0x00c2, 0x1471: 0x00c2, 0x1472: 0x00c2, 0x1473: 0x00c2, 0x1474: 0x00c2, 0x1475: 0x00c2, + 0x1476: 0x00c2, 0x1477: 0x00c2, 0x1478: 0x00c2, + // Block 0x52, offset 0x1480 + 0x1480: 0x00c0, 0x1481: 0x00c0, 0x1482: 0x00c0, 0x1483: 0x00c0, 0x1484: 0x00c0, 0x1485: 0x00c3, + 0x1486: 0x00c3, 0x1487: 0x00c2, 0x1488: 0x00c2, 0x1489: 0x00c2, 0x148a: 0x00c2, 0x148b: 0x00c2, + 0x148c: 0x00c2, 0x148d: 0x00c2, 0x148e: 0x00c2, 0x148f: 0x00c2, 0x1490: 0x00c2, 0x1491: 0x00c2, + 0x1492: 0x00c2, 0x1493: 0x00c2, 0x1494: 0x00c2, 0x1495: 0x00c2, 0x1496: 0x00c2, 0x1497: 0x00c2, + 0x1498: 0x00c2, 0x1499: 0x00c2, 0x149a: 0x00c2, 0x149b: 0x00c2, 0x149c: 0x00c2, 0x149d: 0x00c2, + 0x149e: 0x00c2, 0x149f: 0x00c2, 0x14a0: 0x00c2, 0x14a1: 0x00c2, 0x14a2: 0x00c2, 0x14a3: 0x00c2, + 0x14a4: 0x00c2, 0x14a5: 0x00c2, 0x14a6: 0x00c2, 0x14a7: 0x00c2, 0x14a8: 0x00c2, 0x14a9: 0x00c3, + 0x14aa: 0x00c2, + 0x14b0: 0x00c0, 0x14b1: 0x00c0, 0x14b2: 0x00c0, 0x14b3: 0x00c0, 0x14b4: 0x00c0, 0x14b5: 0x00c0, + 0x14b6: 0x00c0, 0x14b7: 0x00c0, 0x14b8: 0x00c0, 0x14b9: 0x00c0, 0x14ba: 0x00c0, 0x14bb: 0x00c0, + 0x14bc: 0x00c0, 0x14bd: 0x00c0, 0x14be: 0x00c0, 0x14bf: 0x00c0, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x00c0, 0x14c1: 0x00c0, 0x14c2: 0x00c0, 0x14c3: 0x00c0, 0x14c4: 0x00c0, 0x14c5: 0x00c0, + 0x14c6: 0x00c0, 0x14c7: 0x00c0, 0x14c8: 0x00c0, 0x14c9: 0x00c0, 0x14ca: 0x00c0, 0x14cb: 0x00c0, + 0x14cc: 0x00c0, 0x14cd: 0x00c0, 0x14ce: 0x00c0, 0x14cf: 0x00c0, 0x14d0: 0x00c0, 0x14d1: 0x00c0, + 0x14d2: 0x00c0, 0x14d3: 0x00c0, 0x14d4: 0x00c0, 0x14d5: 0x00c0, 0x14d6: 0x00c0, 0x14d7: 0x00c0, + 0x14d8: 0x00c0, 0x14d9: 0x00c0, 0x14da: 0x00c0, 0x14db: 0x00c0, 0x14dc: 0x00c0, 0x14dd: 0x00c0, + 0x14de: 0x00c0, 0x14df: 0x00c0, 0x14e0: 0x00c0, 0x14e1: 0x00c0, 0x14e2: 0x00c0, 0x14e3: 0x00c0, + 0x14e4: 0x00c0, 0x14e5: 0x00c0, 0x14e6: 0x00c0, 0x14e7: 0x00c0, 0x14e8: 0x00c0, 0x14e9: 0x00c0, + 0x14ea: 0x00c0, 0x14eb: 0x00c0, 0x14ec: 0x00c0, 0x14ed: 0x00c0, 0x14ee: 0x00c0, 0x14ef: 0x00c0, + 0x14f0: 0x00c0, 0x14f1: 0x00c0, 0x14f2: 0x00c0, 0x14f3: 0x00c0, 0x14f4: 0x00c0, 0x14f5: 0x00c0, + // Block 0x54, offset 0x1500 + 0x1500: 0x00c0, 0x1501: 0x00c0, 0x1502: 0x00c0, 0x1503: 0x00c0, 0x1504: 0x00c0, 0x1505: 0x00c0, + 0x1506: 0x00c0, 0x1507: 0x00c0, 0x1508: 0x00c0, 0x1509: 0x00c0, 0x150a: 0x00c0, 0x150b: 0x00c0, + 0x150c: 0x00c0, 0x150d: 0x00c0, 0x150e: 0x00c0, 0x150f: 0x00c0, 0x1510: 0x00c0, 0x1511: 0x00c0, + 0x1512: 0x00c0, 0x1513: 0x00c0, 0x1514: 0x00c0, 0x1515: 0x00c0, 0x1516: 0x00c0, 0x1517: 0x00c0, + 0x1518: 0x00c0, 0x1519: 0x00c0, 0x151a: 0x00c0, 0x151b: 0x00c0, 0x151c: 0x00c0, 0x151d: 0x00c0, + 0x151e: 0x00c0, 0x1520: 0x00c3, 0x1521: 0x00c3, 0x1522: 0x00c3, 0x1523: 0x00c0, + 0x1524: 0x00c0, 0x1525: 0x00c0, 0x1526: 0x00c0, 0x1527: 0x00c3, 0x1528: 0x00c3, 0x1529: 0x00c0, + 0x152a: 0x00c0, 0x152b: 0x00c0, + 0x1530: 0x00c0, 0x1531: 0x00c0, 0x1532: 0x00c3, 0x1533: 0x00c0, 0x1534: 0x00c0, 0x1535: 0x00c0, + 0x1536: 0x00c0, 0x1537: 0x00c0, 0x1538: 0x00c0, 0x1539: 0x00c3, 0x153a: 0x00c3, 0x153b: 0x00c3, + // Block 0x55, offset 0x1540 + 0x1540: 0x0080, 0x1544: 0x0080, 0x1545: 0x0080, + 0x1546: 0x00c0, 0x1547: 0x00c0, 0x1548: 0x00c0, 0x1549: 0x00c0, 0x154a: 0x00c0, 0x154b: 0x00c0, + 0x154c: 0x00c0, 0x154d: 0x00c0, 0x154e: 0x00c0, 0x154f: 0x00c0, 0x1550: 0x00c0, 0x1551: 0x00c0, + 0x1552: 0x00c0, 0x1553: 0x00c0, 0x1554: 0x00c0, 0x1555: 0x00c0, 0x1556: 0x00c0, 0x1557: 0x00c0, + 0x1558: 0x00c0, 0x1559: 0x00c0, 0x155a: 0x00c0, 0x155b: 0x00c0, 0x155c: 0x00c0, 0x155d: 0x00c0, + 0x155e: 0x00c0, 0x155f: 0x00c0, 0x1560: 0x00c0, 0x1561: 0x00c0, 0x1562: 0x00c0, 0x1563: 0x00c0, + 0x1564: 0x00c0, 0x1565: 0x00c0, 0x1566: 0x00c0, 0x1567: 0x00c0, 0x1568: 0x00c0, 0x1569: 0x00c0, + 0x156a: 0x00c0, 0x156b: 0x00c0, 0x156c: 0x00c0, 0x156d: 0x00c0, + 0x1570: 0x00c0, 0x1571: 0x00c0, 0x1572: 0x00c0, 0x1573: 0x00c0, 0x1574: 0x00c0, + // Block 0x56, offset 0x1580 + 0x1580: 0x00c0, 0x1581: 0x00c0, 0x1582: 0x00c0, 0x1583: 0x00c0, 0x1584: 0x00c0, 0x1585: 0x00c0, + 0x1586: 0x00c0, 0x1587: 0x00c0, 0x1588: 0x00c0, 0x1589: 0x00c0, 0x158a: 0x00c0, 0x158b: 0x00c0, + 0x158c: 0x00c0, 0x158d: 0x00c0, 0x158e: 0x00c0, 0x158f: 0x00c0, 0x1590: 0x00c0, 0x1591: 0x00c0, + 0x1592: 0x00c0, 0x1593: 0x00c0, 0x1594: 0x00c0, 0x1595: 0x00c0, 0x1596: 0x00c0, 0x1597: 0x00c0, + 0x1598: 0x00c0, 0x1599: 0x00c0, 0x159a: 0x00c0, 0x159b: 0x00c0, 0x159c: 0x00c0, 0x159d: 0x00c0, + 0x159e: 0x00c0, 0x159f: 0x00c0, 0x15a0: 0x00c0, 0x15a1: 0x00c0, 0x15a2: 0x00c0, 0x15a3: 0x00c0, + 0x15a4: 0x00c0, 0x15a5: 0x00c0, 0x15a6: 0x00c0, 0x15a7: 0x00c0, 0x15a8: 0x00c0, 0x15a9: 0x00c0, + 0x15aa: 0x00c0, 0x15ab: 0x00c0, + 0x15b0: 0x00c0, 0x15b1: 0x00c0, 0x15b2: 0x00c0, 0x15b3: 0x00c0, 0x15b4: 0x00c0, 0x15b5: 0x00c0, + 0x15b6: 0x00c0, 0x15b7: 0x00c0, 0x15b8: 0x00c0, 0x15b9: 0x00c0, 0x15ba: 0x00c0, 0x15bb: 0x00c0, + 0x15bc: 0x00c0, 0x15bd: 0x00c0, 0x15be: 0x00c0, 0x15bf: 0x00c0, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x00c0, 0x15c1: 0x00c0, 0x15c2: 0x00c0, 0x15c3: 0x00c0, 0x15c4: 0x00c0, 0x15c5: 0x00c0, + 0x15c6: 0x00c0, 0x15c7: 0x00c0, 0x15c8: 0x00c0, 0x15c9: 0x00c0, + 0x15d0: 0x00c0, 0x15d1: 0x00c0, + 0x15d2: 0x00c0, 0x15d3: 0x00c0, 0x15d4: 0x00c0, 0x15d5: 0x00c0, 0x15d6: 0x00c0, 0x15d7: 0x00c0, + 0x15d8: 0x00c0, 0x15d9: 0x00c0, 0x15da: 0x0080, + 0x15de: 0x0080, 0x15df: 0x0080, 0x15e0: 0x0080, 0x15e1: 0x0080, 0x15e2: 0x0080, 0x15e3: 0x0080, + 0x15e4: 0x0080, 0x15e5: 0x0080, 0x15e6: 0x0080, 0x15e7: 0x0080, 0x15e8: 0x0080, 0x15e9: 0x0080, + 0x15ea: 0x0080, 0x15eb: 0x0080, 0x15ec: 0x0080, 0x15ed: 0x0080, 0x15ee: 0x0080, 0x15ef: 0x0080, + 0x15f0: 0x0080, 0x15f1: 0x0080, 0x15f2: 0x0080, 0x15f3: 0x0080, 0x15f4: 0x0080, 0x15f5: 0x0080, + 0x15f6: 0x0080, 0x15f7: 0x0080, 0x15f8: 0x0080, 0x15f9: 0x0080, 0x15fa: 0x0080, 0x15fb: 0x0080, + 0x15fc: 0x0080, 0x15fd: 0x0080, 0x15fe: 0x0080, 0x15ff: 0x0080, + // Block 0x58, offset 0x1600 + 0x1600: 0x00c0, 0x1601: 0x00c0, 0x1602: 0x00c0, 0x1603: 0x00c0, 0x1604: 0x00c0, 0x1605: 0x00c0, + 0x1606: 0x00c0, 0x1607: 0x00c0, 0x1608: 0x00c0, 0x1609: 0x00c0, 0x160a: 0x00c0, 0x160b: 0x00c0, + 0x160c: 0x00c0, 0x160d: 0x00c0, 0x160e: 0x00c0, 0x160f: 0x00c0, 0x1610: 0x00c0, 0x1611: 0x00c0, + 0x1612: 0x00c0, 0x1613: 0x00c0, 0x1614: 0x00c0, 0x1615: 0x00c0, 0x1616: 0x00c0, 0x1617: 0x00c3, + 0x1618: 0x00c3, 0x1619: 0x00c0, 0x161a: 0x00c0, 0x161b: 0x00c3, + 0x161e: 0x0080, 0x161f: 0x0080, 0x1620: 0x00c0, 0x1621: 0x00c0, 0x1622: 0x00c0, 0x1623: 0x00c0, + 0x1624: 0x00c0, 0x1625: 0x00c0, 0x1626: 0x00c0, 0x1627: 0x00c0, 0x1628: 0x00c0, 0x1629: 0x00c0, + 0x162a: 0x00c0, 0x162b: 0x00c0, 0x162c: 0x00c0, 0x162d: 0x00c0, 0x162e: 0x00c0, 0x162f: 0x00c0, + 0x1630: 0x00c0, 0x1631: 0x00c0, 0x1632: 0x00c0, 0x1633: 0x00c0, 0x1634: 0x00c0, 0x1635: 0x00c0, + 0x1636: 0x00c0, 0x1637: 0x00c0, 0x1638: 0x00c0, 0x1639: 0x00c0, 0x163a: 0x00c0, 0x163b: 0x00c0, + 0x163c: 0x00c0, 0x163d: 0x00c0, 0x163e: 0x00c0, 0x163f: 0x00c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x00c0, 0x1641: 0x00c0, 0x1642: 0x00c0, 0x1643: 0x00c0, 0x1644: 0x00c0, 0x1645: 0x00c0, + 0x1646: 0x00c0, 0x1647: 0x00c0, 0x1648: 0x00c0, 0x1649: 0x00c0, 0x164a: 0x00c0, 0x164b: 0x00c0, + 0x164c: 0x00c0, 0x164d: 0x00c0, 0x164e: 0x00c0, 0x164f: 0x00c0, 0x1650: 0x00c0, 0x1651: 0x00c0, + 0x1652: 0x00c0, 0x1653: 0x00c0, 0x1654: 0x00c0, 0x1655: 0x00c0, 0x1656: 0x00c3, 0x1657: 0x00c0, + 0x1658: 0x00c3, 0x1659: 0x00c3, 0x165a: 0x00c3, 0x165b: 0x00c3, 0x165c: 0x00c3, 0x165d: 0x00c3, + 0x165e: 0x00c3, 0x1660: 0x00c6, 0x1661: 0x00c0, 0x1662: 0x00c3, 0x1663: 0x00c0, + 0x1664: 0x00c0, 0x1665: 0x00c3, 0x1666: 0x00c3, 0x1667: 0x00c3, 0x1668: 0x00c3, 0x1669: 0x00c3, + 0x166a: 0x00c3, 0x166b: 0x00c3, 0x166c: 0x00c3, 0x166d: 0x00c0, 0x166e: 0x00c0, 0x166f: 0x00c0, + 0x1670: 0x00c0, 0x1671: 0x00c0, 0x1672: 0x00c0, 0x1673: 0x00c3, 0x1674: 0x00c3, 0x1675: 0x00c3, + 0x1676: 0x00c3, 0x1677: 0x00c3, 0x1678: 0x00c3, 0x1679: 0x00c3, 0x167a: 0x00c3, 0x167b: 0x00c3, + 0x167c: 0x00c3, 0x167f: 0x00c3, + // Block 0x5a, offset 0x1680 + 0x1680: 0x00c0, 0x1681: 0x00c0, 0x1682: 0x00c0, 0x1683: 0x00c0, 0x1684: 0x00c0, 0x1685: 0x00c0, + 0x1686: 0x00c0, 0x1687: 0x00c0, 0x1688: 0x00c0, 0x1689: 0x00c0, + 0x1690: 0x00c0, 0x1691: 0x00c0, + 0x1692: 0x00c0, 0x1693: 0x00c0, 0x1694: 0x00c0, 0x1695: 0x00c0, 0x1696: 0x00c0, 0x1697: 0x00c0, + 0x1698: 0x00c0, 0x1699: 0x00c0, + 0x16a0: 0x0080, 0x16a1: 0x0080, 0x16a2: 0x0080, 0x16a3: 0x0080, + 0x16a4: 0x0080, 0x16a5: 0x0080, 0x16a6: 0x0080, 0x16a7: 0x00c0, 0x16a8: 0x0080, 0x16a9: 0x0080, + 0x16aa: 0x0080, 0x16ab: 0x0080, 0x16ac: 0x0080, 0x16ad: 0x0080, + 0x16b0: 0x00c3, 0x16b1: 0x00c3, 0x16b2: 0x00c3, 0x16b3: 0x00c3, 0x16b4: 0x00c3, 0x16b5: 0x00c3, + 0x16b6: 0x00c3, 0x16b7: 0x00c3, 0x16b8: 0x00c3, 0x16b9: 0x00c3, 0x16ba: 0x00c3, 0x16bb: 0x00c3, + 0x16bc: 0x00c3, 0x16bd: 0x00c3, 0x16be: 0x0083, 0x16bf: 0x00c3, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x00c3, 0x16c1: 0x00c3, 0x16c2: 0x00c3, 0x16c3: 0x00c3, 0x16c4: 0x00c3, 0x16c5: 0x00c3, + 0x16c6: 0x00c3, 0x16c7: 0x00c3, 0x16c8: 0x00c3, 0x16c9: 0x00c3, 0x16ca: 0x00c3, 0x16cb: 0x00c3, + 0x16cc: 0x00c3, 0x16cd: 0x00c3, 0x16ce: 0x00c3, + // Block 0x5c, offset 0x1700 + 0x1700: 0x00c3, 0x1701: 0x00c3, 0x1702: 0x00c3, 0x1703: 0x00c3, 0x1704: 0x00c0, 0x1705: 0x00c0, + 0x1706: 0x00c0, 0x1707: 0x00c0, 0x1708: 0x00c0, 0x1709: 0x00c0, 0x170a: 0x00c0, 0x170b: 0x00c0, + 0x170c: 0x00c0, 0x170d: 0x00c0, 0x170e: 0x00c0, 0x170f: 0x00c0, 0x1710: 0x00c0, 0x1711: 0x00c0, + 0x1712: 0x00c0, 0x1713: 0x00c0, 0x1714: 0x00c0, 0x1715: 0x00c0, 0x1716: 0x00c0, 0x1717: 0x00c0, + 0x1718: 0x00c0, 0x1719: 0x00c0, 0x171a: 0x00c0, 0x171b: 0x00c0, 0x171c: 0x00c0, 0x171d: 0x00c0, + 0x171e: 0x00c0, 0x171f: 0x00c0, 0x1720: 0x00c0, 0x1721: 0x00c0, 0x1722: 0x00c0, 0x1723: 0x00c0, + 0x1724: 0x00c0, 0x1725: 0x00c0, 0x1726: 0x00c0, 0x1727: 0x00c0, 0x1728: 0x00c0, 0x1729: 0x00c0, + 0x172a: 0x00c0, 0x172b: 0x00c0, 0x172c: 0x00c0, 0x172d: 0x00c0, 0x172e: 0x00c0, 0x172f: 0x00c0, + 0x1730: 0x00c0, 0x1731: 0x00c0, 0x1732: 0x00c0, 0x1733: 0x00c0, 0x1734: 0x00c3, 0x1735: 0x00c0, + 0x1736: 0x00c3, 0x1737: 0x00c3, 0x1738: 0x00c3, 0x1739: 0x00c3, 0x173a: 0x00c3, 0x173b: 0x00c0, + 0x173c: 0x00c3, 0x173d: 0x00c0, 0x173e: 0x00c0, 0x173f: 0x00c0, + // Block 0x5d, offset 0x1740 + 0x1740: 0x00c0, 0x1741: 0x00c0, 0x1742: 0x00c3, 0x1743: 0x00c0, 0x1744: 0x00c5, 0x1745: 0x00c0, + 0x1746: 0x00c0, 0x1747: 0x00c0, 0x1748: 0x00c0, 0x1749: 0x00c0, 0x174a: 0x00c0, 0x174b: 0x00c0, + 0x174c: 0x00c0, 0x1750: 0x00c0, 0x1751: 0x00c0, + 0x1752: 0x00c0, 0x1753: 0x00c0, 0x1754: 0x00c0, 0x1755: 0x00c0, 0x1756: 0x00c0, 0x1757: 0x00c0, + 0x1758: 0x00c0, 0x1759: 0x00c0, 0x175a: 0x0080, 0x175b: 0x0080, 0x175c: 0x0080, 0x175d: 0x0080, + 0x175e: 0x0080, 0x175f: 0x0080, 0x1760: 0x0080, 0x1761: 0x0080, 0x1762: 0x0080, 0x1763: 0x0080, + 0x1764: 0x0080, 0x1765: 0x0080, 0x1766: 0x0080, 0x1767: 0x0080, 0x1768: 0x0080, 0x1769: 0x0080, + 0x176a: 0x0080, 0x176b: 0x00c3, 0x176c: 0x00c3, 0x176d: 0x00c3, 0x176e: 0x00c3, 0x176f: 0x00c3, + 0x1770: 0x00c3, 0x1771: 0x00c3, 0x1772: 0x00c3, 0x1773: 0x00c3, 0x1774: 0x0080, 0x1775: 0x0080, + 0x1776: 0x0080, 0x1777: 0x0080, 0x1778: 0x0080, 0x1779: 0x0080, 0x177a: 0x0080, 0x177b: 0x0080, + 0x177c: 0x0080, 0x177d: 0x0080, 0x177e: 0x0080, + // Block 0x5e, offset 0x1780 + 0x1780: 0x00c3, 0x1781: 0x00c3, 0x1782: 0x00c0, 0x1783: 0x00c0, 0x1784: 0x00c0, 0x1785: 0x00c0, + 0x1786: 0x00c0, 0x1787: 0x00c0, 0x1788: 0x00c0, 0x1789: 0x00c0, 0x178a: 0x00c0, 0x178b: 0x00c0, + 0x178c: 0x00c0, 0x178d: 0x00c0, 0x178e: 0x00c0, 0x178f: 0x00c0, 0x1790: 0x00c0, 0x1791: 0x00c0, + 0x1792: 0x00c0, 0x1793: 0x00c0, 0x1794: 0x00c0, 0x1795: 0x00c0, 0x1796: 0x00c0, 0x1797: 0x00c0, + 0x1798: 0x00c0, 0x1799: 0x00c0, 0x179a: 0x00c0, 0x179b: 0x00c0, 0x179c: 0x00c0, 0x179d: 0x00c0, + 0x179e: 0x00c0, 0x179f: 0x00c0, 0x17a0: 0x00c0, 0x17a1: 0x00c0, 0x17a2: 0x00c3, 0x17a3: 0x00c3, + 0x17a4: 0x00c3, 0x17a5: 0x00c3, 0x17a6: 0x00c0, 0x17a7: 0x00c0, 0x17a8: 0x00c3, 0x17a9: 0x00c3, + 0x17aa: 0x00c5, 0x17ab: 0x00c6, 0x17ac: 0x00c3, 0x17ad: 0x00c3, 0x17ae: 0x00c0, 0x17af: 0x00c0, + 0x17b0: 0x00c0, 0x17b1: 0x00c0, 0x17b2: 0x00c0, 0x17b3: 0x00c0, 0x17b4: 0x00c0, 0x17b5: 0x00c0, + 0x17b6: 0x00c0, 0x17b7: 0x00c0, 0x17b8: 0x00c0, 0x17b9: 0x00c0, 0x17ba: 0x00c0, 0x17bb: 0x00c0, + 0x17bc: 0x00c0, 0x17bd: 0x00c0, 0x17be: 0x00c0, 0x17bf: 0x00c0, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x00c0, 0x17c1: 0x00c0, 0x17c2: 0x00c0, 0x17c3: 0x00c0, 0x17c4: 0x00c0, 0x17c5: 0x00c0, + 0x17c6: 0x00c0, 0x17c7: 0x00c0, 0x17c8: 0x00c0, 0x17c9: 0x00c0, 0x17ca: 0x00c0, 0x17cb: 0x00c0, + 0x17cc: 0x00c0, 0x17cd: 0x00c0, 0x17ce: 0x00c0, 0x17cf: 0x00c0, 0x17d0: 0x00c0, 0x17d1: 0x00c0, + 0x17d2: 0x00c0, 0x17d3: 0x00c0, 0x17d4: 0x00c0, 0x17d5: 0x00c0, 0x17d6: 0x00c0, 0x17d7: 0x00c0, + 0x17d8: 0x00c0, 0x17d9: 0x00c0, 0x17da: 0x00c0, 0x17db: 0x00c0, 0x17dc: 0x00c0, 0x17dd: 0x00c0, + 0x17de: 0x00c0, 0x17df: 0x00c0, 0x17e0: 0x00c0, 0x17e1: 0x00c0, 0x17e2: 0x00c0, 0x17e3: 0x00c0, + 0x17e4: 0x00c0, 0x17e5: 0x00c0, 0x17e6: 0x00c3, 0x17e7: 0x00c0, 0x17e8: 0x00c3, 0x17e9: 0x00c3, + 0x17ea: 0x00c0, 0x17eb: 0x00c0, 0x17ec: 0x00c0, 0x17ed: 0x00c3, 0x17ee: 0x00c0, 0x17ef: 0x00c3, + 0x17f0: 0x00c3, 0x17f1: 0x00c3, 0x17f2: 0x00c5, 0x17f3: 0x00c5, + 0x17fc: 0x0080, 0x17fd: 0x0080, 0x17fe: 0x0080, 0x17ff: 0x0080, + // Block 0x60, offset 0x1800 + 0x1800: 0x00c0, 0x1801: 0x00c0, 0x1802: 0x00c0, 0x1803: 0x00c0, 0x1804: 0x00c0, 0x1805: 0x00c0, + 0x1806: 0x00c0, 0x1807: 0x00c0, 0x1808: 0x00c0, 0x1809: 0x00c0, 0x180a: 0x00c0, 0x180b: 0x00c0, + 0x180c: 0x00c0, 0x180d: 0x00c0, 0x180e: 0x00c0, 0x180f: 0x00c0, 0x1810: 0x00c0, 0x1811: 0x00c0, + 0x1812: 0x00c0, 0x1813: 0x00c0, 0x1814: 0x00c0, 0x1815: 0x00c0, 0x1816: 0x00c0, 0x1817: 0x00c0, + 0x1818: 0x00c0, 0x1819: 0x00c0, 0x181a: 0x00c0, 0x181b: 0x00c0, 0x181c: 0x00c0, 0x181d: 0x00c0, + 0x181e: 0x00c0, 0x181f: 0x00c0, 0x1820: 0x00c0, 0x1821: 0x00c0, 0x1822: 0x00c0, 0x1823: 0x00c0, + 0x1824: 0x00c0, 0x1825: 0x00c0, 0x1826: 0x00c0, 0x1827: 0x00c0, 0x1828: 0x00c0, 0x1829: 0x00c0, + 0x182a: 0x00c0, 0x182b: 0x00c0, 0x182c: 0x00c3, 0x182d: 0x00c3, 0x182e: 0x00c3, 0x182f: 0x00c3, + 0x1830: 0x00c3, 0x1831: 0x00c3, 0x1832: 0x00c3, 0x1833: 0x00c3, 0x1834: 0x00c0, 0x1835: 0x00c0, + 0x1836: 0x00c3, 0x1837: 0x00c3, 0x183b: 0x0080, + 0x183c: 0x0080, 0x183d: 0x0080, 0x183e: 0x0080, 0x183f: 0x0080, + // Block 0x61, offset 0x1840 + 0x1840: 0x00c0, 0x1841: 0x00c0, 0x1842: 0x00c0, 0x1843: 0x00c0, 0x1844: 0x00c0, 0x1845: 0x00c0, + 0x1846: 0x00c0, 0x1847: 0x00c0, 0x1848: 0x00c0, 0x1849: 0x00c0, + 0x184d: 0x00c0, 0x184e: 0x00c0, 0x184f: 0x00c0, 0x1850: 0x00c0, 0x1851: 0x00c0, + 0x1852: 0x00c0, 0x1853: 0x00c0, 0x1854: 0x00c0, 0x1855: 0x00c0, 0x1856: 0x00c0, 0x1857: 0x00c0, + 0x1858: 0x00c0, 0x1859: 0x00c0, 0x185a: 0x00c0, 0x185b: 0x00c0, 0x185c: 0x00c0, 0x185d: 0x00c0, + 0x185e: 0x00c0, 0x185f: 0x00c0, 0x1860: 0x00c0, 0x1861: 0x00c0, 0x1862: 0x00c0, 0x1863: 0x00c0, + 0x1864: 0x00c0, 0x1865: 0x00c0, 0x1866: 0x00c0, 0x1867: 0x00c0, 0x1868: 0x00c0, 0x1869: 0x00c0, + 0x186a: 0x00c0, 0x186b: 0x00c0, 0x186c: 0x00c0, 0x186d: 0x00c0, 0x186e: 0x00c0, 0x186f: 0x00c0, + 0x1870: 0x00c0, 0x1871: 0x00c0, 0x1872: 0x00c0, 0x1873: 0x00c0, 0x1874: 0x00c0, 0x1875: 0x00c0, + 0x1876: 0x00c0, 0x1877: 0x00c0, 0x1878: 0x00c0, 0x1879: 0x00c0, 0x187a: 0x00c0, 0x187b: 0x00c0, + 0x187c: 0x00c0, 0x187d: 0x00c0, 0x187e: 0x0080, 0x187f: 0x0080, + // Block 0x62, offset 0x1880 + 0x1880: 0x00c0, 0x1881: 0x00c0, 0x1882: 0x00c0, 0x1883: 0x00c0, 0x1884: 0x00c0, 0x1885: 0x00c0, + 0x1886: 0x00c0, 0x1887: 0x00c0, 0x1888: 0x00c0, + 0x1890: 0x00c0, 0x1891: 0x00c0, + 0x1892: 0x00c0, 0x1893: 0x00c0, 0x1894: 0x00c0, 0x1895: 0x00c0, 0x1896: 0x00c0, 0x1897: 0x00c0, + 0x1898: 0x00c0, 0x1899: 0x00c0, 0x189a: 0x00c0, 0x189b: 0x00c0, 0x189c: 0x00c0, 0x189d: 0x00c0, + 0x189e: 0x00c0, 0x189f: 0x00c0, 0x18a0: 0x00c0, 0x18a1: 0x00c0, 0x18a2: 0x00c0, 0x18a3: 0x00c0, + 0x18a4: 0x00c0, 0x18a5: 0x00c0, 0x18a6: 0x00c0, 0x18a7: 0x00c0, 0x18a8: 0x00c0, 0x18a9: 0x00c0, + 0x18aa: 0x00c0, 0x18ab: 0x00c0, 0x18ac: 0x00c0, 0x18ad: 0x00c0, 0x18ae: 0x00c0, 0x18af: 0x00c0, + 0x18b0: 0x00c0, 0x18b1: 0x00c0, 0x18b2: 0x00c0, 0x18b3: 0x00c0, 0x18b4: 0x00c0, 0x18b5: 0x00c0, + 0x18b6: 0x00c0, 0x18b7: 0x00c0, 0x18b8: 0x00c0, 0x18b9: 0x00c0, 0x18ba: 0x00c0, + 0x18bd: 0x00c0, 0x18be: 0x00c0, 0x18bf: 0x00c0, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0080, 0x18c1: 0x0080, 0x18c2: 0x0080, 0x18c3: 0x0080, 0x18c4: 0x0080, 0x18c5: 0x0080, + 0x18c6: 0x0080, 0x18c7: 0x0080, + 0x18d0: 0x00c3, 0x18d1: 0x00c3, + 0x18d2: 0x00c3, 0x18d3: 0x0080, 0x18d4: 0x00c3, 0x18d5: 0x00c3, 0x18d6: 0x00c3, 0x18d7: 0x00c3, + 0x18d8: 0x00c3, 0x18d9: 0x00c3, 0x18da: 0x00c3, 0x18db: 0x00c3, 0x18dc: 0x00c3, 0x18dd: 0x00c3, + 0x18de: 0x00c3, 0x18df: 0x00c3, 0x18e0: 0x00c3, 0x18e1: 0x00c0, 0x18e2: 0x00c3, 0x18e3: 0x00c3, + 0x18e4: 0x00c3, 0x18e5: 0x00c3, 0x18e6: 0x00c3, 0x18e7: 0x00c3, 0x18e8: 0x00c3, 0x18e9: 0x00c0, + 0x18ea: 0x00c0, 0x18eb: 0x00c0, 0x18ec: 0x00c0, 0x18ed: 0x00c3, 0x18ee: 0x00c0, 0x18ef: 0x00c0, + 0x18f0: 0x00c0, 0x18f1: 0x00c0, 0x18f2: 0x00c0, 0x18f3: 0x00c0, 0x18f4: 0x00c3, 0x18f5: 0x00c0, + 0x18f6: 0x00c0, 0x18f7: 0x00c0, 0x18f8: 0x00c3, 0x18f9: 0x00c3, 0x18fa: 0x00c0, + // Block 0x64, offset 0x1900 + 0x1900: 0x00c0, 0x1901: 0x00c0, 0x1902: 0x00c0, 0x1903: 0x00c0, 0x1904: 0x00c0, 0x1905: 0x00c0, + 0x1906: 0x00c0, 0x1907: 0x00c0, 0x1908: 0x00c0, 0x1909: 0x00c0, 0x190a: 0x00c0, 0x190b: 0x00c0, + 0x190c: 0x00c0, 0x190d: 0x00c0, 0x190e: 0x00c0, 0x190f: 0x00c0, 0x1910: 0x00c0, 0x1911: 0x00c0, + 0x1912: 0x00c0, 0x1913: 0x00c0, 0x1914: 0x00c0, 0x1915: 0x00c0, 0x1916: 0x00c0, 0x1917: 0x00c0, + 0x1918: 0x00c0, 0x1919: 0x00c0, 0x191a: 0x00c0, 0x191b: 0x00c0, 0x191c: 0x00c0, 0x191d: 0x00c0, + 0x191e: 0x00c0, 0x191f: 0x00c0, 0x1920: 0x00c0, 0x1921: 0x00c0, 0x1922: 0x00c0, 0x1923: 0x00c0, + 0x1924: 0x00c0, 0x1925: 0x00c0, 0x1926: 0x00c8, 0x1927: 0x00c8, 0x1928: 0x00c8, 0x1929: 0x00c8, + 0x192a: 0x00c8, 0x192b: 0x00c0, 0x192c: 0x0080, 0x192d: 0x0080, 0x192e: 0x0080, 0x192f: 0x00c0, + 0x1930: 0x0080, 0x1931: 0x0080, 0x1932: 0x0080, 0x1933: 0x0080, 0x1934: 0x0080, 0x1935: 0x0080, + 0x1936: 0x0080, 0x1937: 0x0080, 0x1938: 0x0080, 0x1939: 0x0080, 0x193a: 0x0080, 0x193b: 0x00c0, + 0x193c: 0x0080, 0x193d: 0x0080, 0x193e: 0x0080, 0x193f: 0x0080, + // Block 0x65, offset 0x1940 + 0x1940: 0x0080, 0x1941: 0x0080, 0x1942: 0x0080, 0x1943: 0x0080, 0x1944: 0x0080, 0x1945: 0x0080, + 0x1946: 0x0080, 0x1947: 0x0080, 0x1948: 0x0080, 0x1949: 0x0080, 0x194a: 0x0080, 0x194b: 0x0080, + 0x194c: 0x0080, 0x194d: 0x0080, 0x194e: 0x00c0, 0x194f: 0x0080, 0x1950: 0x0080, 0x1951: 0x0080, + 0x1952: 0x0080, 0x1953: 0x0080, 0x1954: 0x0080, 0x1955: 0x0080, 0x1956: 0x0080, 0x1957: 0x0080, + 0x1958: 0x0080, 0x1959: 0x0080, 0x195a: 0x0080, 0x195b: 0x0080, 0x195c: 0x0080, 0x195d: 0x0088, + 0x195e: 0x0088, 0x195f: 0x0088, 0x1960: 0x0088, 0x1961: 0x0088, 0x1962: 0x0080, 0x1963: 0x0080, + 0x1964: 0x0080, 0x1965: 0x0080, 0x1966: 0x0088, 0x1967: 0x0088, 0x1968: 0x0088, 0x1969: 0x0088, + 0x196a: 0x0088, 0x196b: 0x00c0, 0x196c: 0x00c0, 0x196d: 0x00c0, 0x196e: 0x00c0, 0x196f: 0x00c0, + 0x1970: 0x00c0, 0x1971: 0x00c0, 0x1972: 0x00c0, 0x1973: 0x00c0, 0x1974: 0x00c0, 0x1975: 0x00c0, + 0x1976: 0x00c0, 0x1977: 0x00c0, 0x1978: 0x0080, 0x1979: 0x00c0, 0x197a: 0x00c0, 0x197b: 0x00c0, + 0x197c: 0x00c0, 0x197d: 0x00c0, 0x197e: 0x00c0, 0x197f: 0x00c0, + // Block 0x66, offset 0x1980 + 0x1980: 0x00c0, 0x1981: 0x00c0, 0x1982: 0x00c0, 0x1983: 0x00c0, 0x1984: 0x00c0, 0x1985: 0x00c0, + 0x1986: 0x00c0, 0x1987: 0x00c0, 0x1988: 0x00c0, 0x1989: 0x00c0, 0x198a: 0x00c0, 0x198b: 0x00c0, + 0x198c: 0x00c0, 0x198d: 0x00c0, 0x198e: 0x00c0, 0x198f: 0x00c0, 0x1990: 0x00c0, 0x1991: 0x00c0, + 0x1992: 0x00c0, 0x1993: 0x00c0, 0x1994: 0x00c0, 0x1995: 0x00c0, 0x1996: 0x00c0, 0x1997: 0x00c0, + 0x1998: 0x00c0, 0x1999: 0x00c0, 0x199a: 0x00c0, 0x199b: 0x0080, 0x199c: 0x0080, 0x199d: 0x0080, + 0x199e: 0x0080, 0x199f: 0x0080, 0x19a0: 0x0080, 0x19a1: 0x0080, 0x19a2: 0x0080, 0x19a3: 0x0080, + 0x19a4: 0x0080, 0x19a5: 0x0080, 0x19a6: 0x0080, 0x19a7: 0x0080, 0x19a8: 0x0080, 0x19a9: 0x0080, + 0x19aa: 0x0080, 0x19ab: 0x0080, 0x19ac: 0x0080, 0x19ad: 0x0080, 0x19ae: 0x0080, 0x19af: 0x0080, + 0x19b0: 0x0080, 0x19b1: 0x0080, 0x19b2: 0x0080, 0x19b3: 0x0080, 0x19b4: 0x0080, 0x19b5: 0x0080, + 0x19b6: 0x0080, 0x19b7: 0x0080, 0x19b8: 0x0080, 0x19b9: 0x0080, 0x19ba: 0x0080, 0x19bb: 0x0080, + 0x19bc: 0x0080, 0x19bd: 0x0080, 0x19be: 0x0080, 0x19bf: 0x0088, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x00c0, 0x19c1: 0x00c0, 0x19c2: 0x00c0, 0x19c3: 0x00c0, 0x19c4: 0x00c0, 0x19c5: 0x00c0, + 0x19c6: 0x00c0, 0x19c7: 0x00c0, 0x19c8: 0x00c0, 0x19c9: 0x00c0, 0x19ca: 0x00c0, 0x19cb: 0x00c0, + 0x19cc: 0x00c0, 0x19cd: 0x00c0, 0x19ce: 0x00c0, 0x19cf: 0x00c0, 0x19d0: 0x00c0, 0x19d1: 0x00c0, + 0x19d2: 0x00c0, 0x19d3: 0x00c0, 0x19d4: 0x00c0, 0x19d5: 0x00c0, 0x19d6: 0x00c0, 0x19d7: 0x00c0, + 0x19d8: 0x00c0, 0x19d9: 0x00c0, 0x19da: 0x0080, 0x19db: 0x0080, 0x19dc: 0x00c0, 0x19dd: 0x00c0, + 0x19de: 0x00c0, 0x19df: 0x00c0, 0x19e0: 0x00c0, 0x19e1: 0x00c0, 0x19e2: 0x00c0, 0x19e3: 0x00c0, + 0x19e4: 0x00c0, 0x19e5: 0x00c0, 0x19e6: 0x00c0, 0x19e7: 0x00c0, 0x19e8: 0x00c0, 0x19e9: 0x00c0, + 0x19ea: 0x00c0, 0x19eb: 0x00c0, 0x19ec: 0x00c0, 0x19ed: 0x00c0, 0x19ee: 0x00c0, 0x19ef: 0x00c0, + 0x19f0: 0x00c0, 0x19f1: 0x00c0, 0x19f2: 0x00c0, 0x19f3: 0x00c0, 0x19f4: 0x00c0, 0x19f5: 0x00c0, + 0x19f6: 0x00c0, 0x19f7: 0x00c0, 0x19f8: 0x00c0, 0x19f9: 0x00c0, 0x19fa: 0x00c0, 0x19fb: 0x00c0, + 0x19fc: 0x00c0, 0x19fd: 0x00c0, 0x19fe: 0x00c0, 0x19ff: 0x00c0, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x00c8, 0x1a01: 0x00c8, 0x1a02: 0x00c8, 0x1a03: 0x00c8, 0x1a04: 0x00c8, 0x1a05: 0x00c8, + 0x1a06: 0x00c8, 0x1a07: 0x00c8, 0x1a08: 0x00c8, 0x1a09: 0x00c8, 0x1a0a: 0x00c8, 0x1a0b: 0x00c8, + 0x1a0c: 0x00c8, 0x1a0d: 0x00c8, 0x1a0e: 0x00c8, 0x1a0f: 0x00c8, 0x1a10: 0x00c8, 0x1a11: 0x00c8, + 0x1a12: 0x00c8, 0x1a13: 0x00c8, 0x1a14: 0x00c8, 0x1a15: 0x00c8, + 0x1a18: 0x00c8, 0x1a19: 0x00c8, 0x1a1a: 0x00c8, 0x1a1b: 0x00c8, 0x1a1c: 0x00c8, 0x1a1d: 0x00c8, + 0x1a20: 0x00c8, 0x1a21: 0x00c8, 0x1a22: 0x00c8, 0x1a23: 0x00c8, + 0x1a24: 0x00c8, 0x1a25: 0x00c8, 0x1a26: 0x00c8, 0x1a27: 0x00c8, 0x1a28: 0x00c8, 0x1a29: 0x00c8, + 0x1a2a: 0x00c8, 0x1a2b: 0x00c8, 0x1a2c: 0x00c8, 0x1a2d: 0x00c8, 0x1a2e: 0x00c8, 0x1a2f: 0x00c8, + 0x1a30: 0x00c8, 0x1a31: 0x00c8, 0x1a32: 0x00c8, 0x1a33: 0x00c8, 0x1a34: 0x00c8, 0x1a35: 0x00c8, + 0x1a36: 0x00c8, 0x1a37: 0x00c8, 0x1a38: 0x00c8, 0x1a39: 0x00c8, 0x1a3a: 0x00c8, 0x1a3b: 0x00c8, + 0x1a3c: 0x00c8, 0x1a3d: 0x00c8, 0x1a3e: 0x00c8, 0x1a3f: 0x00c8, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x00c8, 0x1a41: 0x00c8, 0x1a42: 0x00c8, 0x1a43: 0x00c8, 0x1a44: 0x00c8, 0x1a45: 0x00c8, + 0x1a48: 0x00c8, 0x1a49: 0x00c8, 0x1a4a: 0x00c8, 0x1a4b: 0x00c8, + 0x1a4c: 0x00c8, 0x1a4d: 0x00c8, 0x1a50: 0x00c8, 0x1a51: 0x00c8, + 0x1a52: 0x00c8, 0x1a53: 0x00c8, 0x1a54: 0x00c8, 0x1a55: 0x00c8, 0x1a56: 0x00c8, 0x1a57: 0x00c8, + 0x1a59: 0x00c8, 0x1a5b: 0x00c8, 0x1a5d: 0x00c8, + 0x1a5f: 0x00c8, 0x1a60: 0x00c8, 0x1a61: 0x00c8, 0x1a62: 0x00c8, 0x1a63: 0x00c8, + 0x1a64: 0x00c8, 0x1a65: 0x00c8, 0x1a66: 0x00c8, 0x1a67: 0x00c8, 0x1a68: 0x00c8, 0x1a69: 0x00c8, + 0x1a6a: 0x00c8, 0x1a6b: 0x00c8, 0x1a6c: 0x00c8, 0x1a6d: 0x00c8, 0x1a6e: 0x00c8, 0x1a6f: 0x00c8, + 0x1a70: 0x00c8, 0x1a71: 0x0088, 0x1a72: 0x00c8, 0x1a73: 0x0088, 0x1a74: 0x00c8, 0x1a75: 0x0088, + 0x1a76: 0x00c8, 0x1a77: 0x0088, 0x1a78: 0x00c8, 0x1a79: 0x0088, 0x1a7a: 0x00c8, 0x1a7b: 0x0088, + 0x1a7c: 0x00c8, 0x1a7d: 0x0088, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x00c8, 0x1a81: 0x00c8, 0x1a82: 0x00c8, 0x1a83: 0x00c8, 0x1a84: 0x00c8, 0x1a85: 0x00c8, + 0x1a86: 0x00c8, 0x1a87: 0x00c8, 0x1a88: 0x0088, 0x1a89: 0x0088, 0x1a8a: 0x0088, 0x1a8b: 0x0088, + 0x1a8c: 0x0088, 0x1a8d: 0x0088, 0x1a8e: 0x0088, 0x1a8f: 0x0088, 0x1a90: 0x00c8, 0x1a91: 0x00c8, + 0x1a92: 0x00c8, 0x1a93: 0x00c8, 0x1a94: 0x00c8, 0x1a95: 0x00c8, 0x1a96: 0x00c8, 0x1a97: 0x00c8, + 0x1a98: 0x0088, 0x1a99: 0x0088, 0x1a9a: 0x0088, 0x1a9b: 0x0088, 0x1a9c: 0x0088, 0x1a9d: 0x0088, + 0x1a9e: 0x0088, 0x1a9f: 0x0088, 0x1aa0: 0x00c8, 0x1aa1: 0x00c8, 0x1aa2: 0x00c8, 0x1aa3: 0x00c8, + 0x1aa4: 0x00c8, 0x1aa5: 0x00c8, 0x1aa6: 0x00c8, 0x1aa7: 0x00c8, 0x1aa8: 0x0088, 0x1aa9: 0x0088, + 0x1aaa: 0x0088, 0x1aab: 0x0088, 0x1aac: 0x0088, 0x1aad: 0x0088, 0x1aae: 0x0088, 0x1aaf: 0x0088, + 0x1ab0: 0x00c8, 0x1ab1: 0x00c8, 0x1ab2: 0x00c8, 0x1ab3: 0x00c8, 0x1ab4: 0x00c8, + 0x1ab6: 0x00c8, 0x1ab7: 0x00c8, 0x1ab8: 0x00c8, 0x1ab9: 0x00c8, 0x1aba: 0x00c8, 0x1abb: 0x0088, + 0x1abc: 0x0088, 0x1abd: 0x0088, 0x1abe: 0x0088, 0x1abf: 0x0088, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x0088, 0x1ac1: 0x0088, 0x1ac2: 0x00c8, 0x1ac3: 0x00c8, 0x1ac4: 0x00c8, + 0x1ac6: 0x00c8, 0x1ac7: 0x00c8, 0x1ac8: 0x00c8, 0x1ac9: 0x0088, 0x1aca: 0x00c8, 0x1acb: 0x0088, + 0x1acc: 0x0088, 0x1acd: 0x0088, 0x1ace: 0x0088, 0x1acf: 0x0088, 0x1ad0: 0x00c8, 0x1ad1: 0x00c8, + 0x1ad2: 0x00c8, 0x1ad3: 0x0088, 0x1ad6: 0x00c8, 0x1ad7: 0x00c8, + 0x1ad8: 0x00c8, 0x1ad9: 0x00c8, 0x1ada: 0x00c8, 0x1adb: 0x0088, 0x1add: 0x0088, + 0x1ade: 0x0088, 0x1adf: 0x0088, 0x1ae0: 0x00c8, 0x1ae1: 0x00c8, 0x1ae2: 0x00c8, 0x1ae3: 0x0088, + 0x1ae4: 0x00c8, 0x1ae5: 0x00c8, 0x1ae6: 0x00c8, 0x1ae7: 0x00c8, 0x1ae8: 0x00c8, 0x1ae9: 0x00c8, + 0x1aea: 0x00c8, 0x1aeb: 0x0088, 0x1aec: 0x00c8, 0x1aed: 0x0088, 0x1aee: 0x0088, 0x1aef: 0x0088, + 0x1af2: 0x00c8, 0x1af3: 0x00c8, 0x1af4: 0x00c8, + 0x1af6: 0x00c8, 0x1af7: 0x00c8, 0x1af8: 0x00c8, 0x1af9: 0x0088, 0x1afa: 0x00c8, 0x1afb: 0x0088, + 0x1afc: 0x0088, 0x1afd: 0x0088, 0x1afe: 0x0088, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x0080, 0x1b01: 0x0080, 0x1b02: 0x0080, 0x1b03: 0x0080, 0x1b04: 0x0080, 0x1b05: 0x0080, + 0x1b06: 0x0080, 0x1b07: 0x0080, 0x1b08: 0x0080, 0x1b09: 0x0080, 0x1b0a: 0x0080, 0x1b0b: 0x0040, + 0x1b0c: 0x004d, 0x1b0d: 0x004e, 0x1b0e: 0x0040, 0x1b0f: 0x0040, 0x1b10: 0x0080, 0x1b11: 0x0080, + 0x1b12: 0x0080, 0x1b13: 0x0080, 0x1b14: 0x0080, 0x1b15: 0x0080, 0x1b16: 0x0080, 0x1b17: 0x0080, + 0x1b18: 0x0080, 0x1b19: 0x0080, 0x1b1a: 0x0080, 0x1b1b: 0x0080, 0x1b1c: 0x0080, 0x1b1d: 0x0080, + 0x1b1e: 0x0080, 0x1b1f: 0x0080, 0x1b20: 0x0080, 0x1b21: 0x0080, 0x1b22: 0x0080, 0x1b23: 0x0080, + 0x1b24: 0x0080, 0x1b25: 0x0080, 0x1b26: 0x0080, 0x1b27: 0x0080, 0x1b28: 0x0040, 0x1b29: 0x0040, + 0x1b2a: 0x0040, 0x1b2b: 0x0040, 0x1b2c: 0x0040, 0x1b2d: 0x0040, 0x1b2e: 0x0040, 0x1b2f: 0x0080, + 0x1b30: 0x0080, 0x1b31: 0x0080, 0x1b32: 0x0080, 0x1b33: 0x0080, 0x1b34: 0x0080, 0x1b35: 0x0080, + 0x1b36: 0x0080, 0x1b37: 0x0080, 0x1b38: 0x0080, 0x1b39: 0x0080, 0x1b3a: 0x0080, 0x1b3b: 0x0080, + 0x1b3c: 0x0080, 0x1b3d: 0x0080, 0x1b3e: 0x0080, 0x1b3f: 0x0080, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x0080, 0x1b41: 0x0080, 0x1b42: 0x0080, 0x1b43: 0x0080, 0x1b44: 0x0080, 0x1b45: 0x0080, + 0x1b46: 0x0080, 0x1b47: 0x0080, 0x1b48: 0x0080, 0x1b49: 0x0080, 0x1b4a: 0x0080, 0x1b4b: 0x0080, + 0x1b4c: 0x0080, 0x1b4d: 0x0080, 0x1b4e: 0x0080, 0x1b4f: 0x0080, 0x1b50: 0x0080, 0x1b51: 0x0080, + 0x1b52: 0x0080, 0x1b53: 0x0080, 0x1b54: 0x0080, 0x1b55: 0x0080, 0x1b56: 0x0080, 0x1b57: 0x0080, + 0x1b58: 0x0080, 0x1b59: 0x0080, 0x1b5a: 0x0080, 0x1b5b: 0x0080, 0x1b5c: 0x0080, 0x1b5d: 0x0080, + 0x1b5e: 0x0080, 0x1b5f: 0x0080, 0x1b60: 0x0040, 0x1b61: 0x0040, 0x1b62: 0x0040, 0x1b63: 0x0040, + 0x1b64: 0x0040, 0x1b66: 0x0040, 0x1b67: 0x0040, 0x1b68: 0x0040, 0x1b69: 0x0040, + 0x1b6a: 0x0040, 0x1b6b: 0x0040, 0x1b6c: 0x0040, 0x1b6d: 0x0040, 0x1b6e: 0x0040, 0x1b6f: 0x0040, + 0x1b70: 0x0080, 0x1b71: 0x0080, 0x1b74: 0x0080, 0x1b75: 0x0080, + 0x1b76: 0x0080, 0x1b77: 0x0080, 0x1b78: 0x0080, 0x1b79: 0x0080, 0x1b7a: 0x0080, 0x1b7b: 0x0080, + 0x1b7c: 0x0080, 0x1b7d: 0x0080, 0x1b7e: 0x0080, 0x1b7f: 0x0080, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x0080, 0x1b81: 0x0080, 0x1b82: 0x0080, 0x1b83: 0x0080, 0x1b84: 0x0080, 0x1b85: 0x0080, + 0x1b86: 0x0080, 0x1b87: 0x0080, 0x1b88: 0x0080, 0x1b89: 0x0080, 0x1b8a: 0x0080, 0x1b8b: 0x0080, + 0x1b8c: 0x0080, 0x1b8d: 0x0080, 0x1b8e: 0x0080, 0x1b90: 0x0080, 0x1b91: 0x0080, + 0x1b92: 0x0080, 0x1b93: 0x0080, 0x1b94: 0x0080, 0x1b95: 0x0080, 0x1b96: 0x0080, 0x1b97: 0x0080, + 0x1b98: 0x0080, 0x1b99: 0x0080, 0x1b9a: 0x0080, 0x1b9b: 0x0080, 0x1b9c: 0x0080, + 0x1ba0: 0x0080, 0x1ba1: 0x0080, 0x1ba2: 0x0080, 0x1ba3: 0x0080, + 0x1ba4: 0x0080, 0x1ba5: 0x0080, 0x1ba6: 0x0080, 0x1ba7: 0x0080, 0x1ba8: 0x0080, 0x1ba9: 0x0080, + 0x1baa: 0x0080, 0x1bab: 0x0080, 0x1bac: 0x0080, 0x1bad: 0x0080, 0x1bae: 0x0080, 0x1baf: 0x0080, + 0x1bb0: 0x0080, 0x1bb1: 0x0080, 0x1bb2: 0x0080, 0x1bb3: 0x0080, 0x1bb4: 0x0080, 0x1bb5: 0x0080, + 0x1bb6: 0x0080, 0x1bb7: 0x0080, 0x1bb8: 0x0080, 0x1bb9: 0x0080, 0x1bba: 0x0080, 0x1bbb: 0x0080, + 0x1bbc: 0x0080, 0x1bbd: 0x0080, 0x1bbe: 0x0080, 0x1bbf: 0x0080, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0080, + 0x1bd0: 0x00c3, 0x1bd1: 0x00c3, + 0x1bd2: 0x00c3, 0x1bd3: 0x00c3, 0x1bd4: 0x00c3, 0x1bd5: 0x00c3, 0x1bd6: 0x00c3, 0x1bd7: 0x00c3, + 0x1bd8: 0x00c3, 0x1bd9: 0x00c3, 0x1bda: 0x00c3, 0x1bdb: 0x00c3, 0x1bdc: 0x00c3, 0x1bdd: 0x0083, + 0x1bde: 0x0083, 0x1bdf: 0x0083, 0x1be0: 0x0083, 0x1be1: 0x00c3, 0x1be2: 0x0083, 0x1be3: 0x0083, + 0x1be4: 0x0083, 0x1be5: 0x00c3, 0x1be6: 0x00c3, 0x1be7: 0x00c3, 0x1be8: 0x00c3, 0x1be9: 0x00c3, + 0x1bea: 0x00c3, 0x1beb: 0x00c3, 0x1bec: 0x00c3, 0x1bed: 0x00c3, 0x1bee: 0x00c3, 0x1bef: 0x00c3, + 0x1bf0: 0x00c3, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0080, 0x1c01: 0x0080, 0x1c02: 0x0080, 0x1c03: 0x0080, 0x1c04: 0x0080, 0x1c05: 0x0080, + 0x1c06: 0x0080, 0x1c07: 0x0080, 0x1c08: 0x0080, 0x1c09: 0x0080, 0x1c0a: 0x0080, 0x1c0b: 0x0080, + 0x1c0c: 0x0080, 0x1c0d: 0x0080, 0x1c0e: 0x0080, 0x1c0f: 0x0080, 0x1c10: 0x0080, 0x1c11: 0x0080, + 0x1c12: 0x0080, 0x1c13: 0x0080, 0x1c14: 0x0080, 0x1c15: 0x0080, 0x1c16: 0x0080, 0x1c17: 0x0080, + 0x1c18: 0x0080, 0x1c19: 0x0080, 0x1c1a: 0x0080, 0x1c1b: 0x0080, 0x1c1c: 0x0080, 0x1c1d: 0x0080, + 0x1c1e: 0x0080, 0x1c1f: 0x0080, 0x1c20: 0x0080, 0x1c21: 0x0080, 0x1c22: 0x0080, 0x1c23: 0x0080, + 0x1c24: 0x0080, 0x1c25: 0x0080, 0x1c26: 0x0088, 0x1c27: 0x0080, 0x1c28: 0x0080, 0x1c29: 0x0080, + 0x1c2a: 0x0080, 0x1c2b: 0x0080, 0x1c2c: 0x0080, 0x1c2d: 0x0080, 0x1c2e: 0x0080, 0x1c2f: 0x0080, + 0x1c30: 0x0080, 0x1c31: 0x0080, 0x1c32: 0x00c0, 0x1c33: 0x0080, 0x1c34: 0x0080, 0x1c35: 0x0080, + 0x1c36: 0x0080, 0x1c37: 0x0080, 0x1c38: 0x0080, 0x1c39: 0x0080, 0x1c3a: 0x0080, 0x1c3b: 0x0080, + 0x1c3c: 0x0080, 0x1c3d: 0x0080, 0x1c3e: 0x0080, 0x1c3f: 0x0080, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0080, 0x1c41: 0x0080, 0x1c42: 0x0080, 0x1c43: 0x0080, 0x1c44: 0x0080, 0x1c45: 0x0080, + 0x1c46: 0x0080, 0x1c47: 0x0080, 0x1c48: 0x0080, 0x1c49: 0x0080, 0x1c4a: 0x0080, 0x1c4b: 0x0080, + 0x1c4c: 0x0080, 0x1c4d: 0x0080, 0x1c4e: 0x00c0, 0x1c4f: 0x0080, 0x1c50: 0x0080, 0x1c51: 0x0080, + 0x1c52: 0x0080, 0x1c53: 0x0080, 0x1c54: 0x0080, 0x1c55: 0x0080, 0x1c56: 0x0080, 0x1c57: 0x0080, + 0x1c58: 0x0080, 0x1c59: 0x0080, 0x1c5a: 0x0080, 0x1c5b: 0x0080, 0x1c5c: 0x0080, 0x1c5d: 0x0080, + 0x1c5e: 0x0080, 0x1c5f: 0x0080, 0x1c60: 0x0080, 0x1c61: 0x0080, 0x1c62: 0x0080, 0x1c63: 0x0080, + 0x1c64: 0x0080, 0x1c65: 0x0080, 0x1c66: 0x0080, 0x1c67: 0x0080, 0x1c68: 0x0080, 0x1c69: 0x0080, + 0x1c6a: 0x0080, 0x1c6b: 0x0080, 0x1c6c: 0x0080, 0x1c6d: 0x0080, 0x1c6e: 0x0080, 0x1c6f: 0x0080, + 0x1c70: 0x0080, 0x1c71: 0x0080, 0x1c72: 0x0080, 0x1c73: 0x0080, 0x1c74: 0x0080, 0x1c75: 0x0080, + 0x1c76: 0x0080, 0x1c77: 0x0080, 0x1c78: 0x0080, 0x1c79: 0x0080, 0x1c7a: 0x0080, 0x1c7b: 0x0080, + 0x1c7c: 0x0080, 0x1c7d: 0x0080, 0x1c7e: 0x0080, 0x1c7f: 0x0080, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x0080, 0x1c81: 0x0080, 0x1c82: 0x0080, 0x1c83: 0x00c0, 0x1c84: 0x00c0, 0x1c85: 0x0080, + 0x1c86: 0x0080, 0x1c87: 0x0080, 0x1c88: 0x0080, 0x1c89: 0x0080, 0x1c8a: 0x0080, 0x1c8b: 0x0080, + 0x1c90: 0x0080, 0x1c91: 0x0080, + 0x1c92: 0x0080, 0x1c93: 0x0080, 0x1c94: 0x0080, 0x1c95: 0x0080, 0x1c96: 0x0080, 0x1c97: 0x0080, + 0x1c98: 0x0080, 0x1c99: 0x0080, 0x1c9a: 0x0080, 0x1c9b: 0x0080, 0x1c9c: 0x0080, 0x1c9d: 0x0080, + 0x1c9e: 0x0080, 0x1c9f: 0x0080, 0x1ca0: 0x0080, 0x1ca1: 0x0080, 0x1ca2: 0x0080, 0x1ca3: 0x0080, + 0x1ca4: 0x0080, 0x1ca5: 0x0080, 0x1ca6: 0x0080, 0x1ca7: 0x0080, 0x1ca8: 0x0080, 0x1ca9: 0x0080, + 0x1caa: 0x0080, 0x1cab: 0x0080, 0x1cac: 0x0080, 0x1cad: 0x0080, 0x1cae: 0x0080, 0x1caf: 0x0080, + 0x1cb0: 0x0080, 0x1cb1: 0x0080, 0x1cb2: 0x0080, 0x1cb3: 0x0080, 0x1cb4: 0x0080, 0x1cb5: 0x0080, + 0x1cb6: 0x0080, 0x1cb7: 0x0080, 0x1cb8: 0x0080, 0x1cb9: 0x0080, 0x1cba: 0x0080, 0x1cbb: 0x0080, + 0x1cbc: 0x0080, 0x1cbd: 0x0080, 0x1cbe: 0x0080, 0x1cbf: 0x0080, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0080, 0x1cc1: 0x0080, 0x1cc2: 0x0080, 0x1cc3: 0x0080, 0x1cc4: 0x0080, 0x1cc5: 0x0080, + 0x1cc6: 0x0080, 0x1cc7: 0x0080, 0x1cc8: 0x0080, 0x1cc9: 0x0080, 0x1cca: 0x0080, 0x1ccb: 0x0080, + 0x1ccc: 0x0080, 0x1ccd: 0x0080, 0x1cce: 0x0080, 0x1ccf: 0x0080, 0x1cd0: 0x0080, 0x1cd1: 0x0080, + 0x1cd2: 0x0080, 0x1cd3: 0x0080, 0x1cd4: 0x0080, 0x1cd5: 0x0080, 0x1cd6: 0x0080, 0x1cd7: 0x0080, + 0x1cd8: 0x0080, 0x1cd9: 0x0080, 0x1cda: 0x0080, 0x1cdb: 0x0080, 0x1cdc: 0x0080, 0x1cdd: 0x0080, + 0x1cde: 0x0080, 0x1cdf: 0x0080, 0x1ce0: 0x0080, 0x1ce1: 0x0080, 0x1ce2: 0x0080, 0x1ce3: 0x0080, + 0x1ce4: 0x0080, 0x1ce5: 0x0080, 0x1ce6: 0x0080, 0x1ce7: 0x0080, 0x1ce8: 0x0080, 0x1ce9: 0x0080, + 0x1cea: 0x0080, 0x1ceb: 0x0080, 0x1cec: 0x0080, 0x1ced: 0x0080, 0x1cee: 0x0080, 0x1cef: 0x0080, + 0x1cf0: 0x0080, 0x1cf1: 0x0080, 0x1cf2: 0x0080, 0x1cf3: 0x0080, 0x1cf4: 0x0080, 0x1cf5: 0x0080, + 0x1cf6: 0x0080, 0x1cf7: 0x0080, 0x1cf8: 0x0080, 0x1cf9: 0x0080, 0x1cfa: 0x0080, 0x1cfb: 0x0080, + 0x1cfc: 0x0080, 0x1cfd: 0x0080, 0x1cfe: 0x0080, 0x1cff: 0x0080, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x0080, 0x1d01: 0x0080, 0x1d02: 0x0080, 0x1d03: 0x0080, 0x1d04: 0x0080, 0x1d05: 0x0080, + 0x1d06: 0x0080, 0x1d07: 0x0080, 0x1d08: 0x0080, 0x1d09: 0x0080, 0x1d0a: 0x0080, 0x1d0b: 0x0080, + 0x1d0c: 0x0080, 0x1d0d: 0x0080, 0x1d0e: 0x0080, 0x1d0f: 0x0080, 0x1d10: 0x0080, 0x1d11: 0x0080, + 0x1d12: 0x0080, 0x1d13: 0x0080, 0x1d14: 0x0080, 0x1d15: 0x0080, 0x1d16: 0x0080, 0x1d17: 0x0080, + 0x1d18: 0x0080, 0x1d19: 0x0080, 0x1d1a: 0x0080, 0x1d1b: 0x0080, 0x1d1c: 0x0080, 0x1d1d: 0x0080, + 0x1d1e: 0x0080, 0x1d1f: 0x0080, 0x1d20: 0x0080, 0x1d21: 0x0080, 0x1d22: 0x0080, 0x1d23: 0x0080, + 0x1d24: 0x0080, 0x1d25: 0x0080, 0x1d26: 0x0080, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0080, 0x1d41: 0x0080, 0x1d42: 0x0080, 0x1d43: 0x0080, 0x1d44: 0x0080, 0x1d45: 0x0080, + 0x1d46: 0x0080, 0x1d47: 0x0080, 0x1d48: 0x0080, 0x1d49: 0x0080, 0x1d4a: 0x0080, + 0x1d60: 0x0080, 0x1d61: 0x0080, 0x1d62: 0x0080, 0x1d63: 0x0080, + 0x1d64: 0x0080, 0x1d65: 0x0080, 0x1d66: 0x0080, 0x1d67: 0x0080, 0x1d68: 0x0080, 0x1d69: 0x0080, + 0x1d6a: 0x0080, 0x1d6b: 0x0080, 0x1d6c: 0x0080, 0x1d6d: 0x0080, 0x1d6e: 0x0080, 0x1d6f: 0x0080, + 0x1d70: 0x0080, 0x1d71: 0x0080, 0x1d72: 0x0080, 0x1d73: 0x0080, 0x1d74: 0x0080, 0x1d75: 0x0080, + 0x1d76: 0x0080, 0x1d77: 0x0080, 0x1d78: 0x0080, 0x1d79: 0x0080, 0x1d7a: 0x0080, 0x1d7b: 0x0080, + 0x1d7c: 0x0080, 0x1d7d: 0x0080, 0x1d7e: 0x0080, 0x1d7f: 0x0080, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x0080, 0x1d81: 0x0080, 0x1d82: 0x0080, 0x1d83: 0x0080, 0x1d84: 0x0080, 0x1d85: 0x0080, + 0x1d86: 0x0080, 0x1d87: 0x0080, 0x1d88: 0x0080, 0x1d89: 0x0080, 0x1d8a: 0x0080, 0x1d8b: 0x0080, + 0x1d8c: 0x0080, 0x1d8d: 0x0080, 0x1d8e: 0x0080, 0x1d8f: 0x0080, 0x1d90: 0x0080, 0x1d91: 0x0080, + 0x1d92: 0x0080, 0x1d93: 0x0080, 0x1d94: 0x0080, 0x1d95: 0x0080, 0x1d96: 0x0080, 0x1d97: 0x0080, + 0x1d98: 0x0080, 0x1d99: 0x0080, 0x1d9a: 0x0080, 0x1d9b: 0x0080, 0x1d9c: 0x0080, 0x1d9d: 0x0080, + 0x1d9e: 0x0080, 0x1d9f: 0x0080, 0x1da0: 0x0080, 0x1da1: 0x0080, 0x1da2: 0x0080, 0x1da3: 0x0080, + 0x1da4: 0x0080, 0x1da5: 0x0080, 0x1da6: 0x0080, 0x1da7: 0x0080, 0x1da8: 0x0080, 0x1da9: 0x0080, + 0x1daa: 0x0080, 0x1dab: 0x0080, 0x1dac: 0x0080, 0x1dad: 0x0080, 0x1dae: 0x0080, 0x1daf: 0x0080, + 0x1db0: 0x0080, 0x1db1: 0x0080, 0x1db2: 0x0080, 0x1db3: 0x0080, + 0x1db6: 0x0080, 0x1db7: 0x0080, 0x1db8: 0x0080, 0x1db9: 0x0080, 0x1dba: 0x0080, 0x1dbb: 0x0080, + 0x1dbc: 0x0080, 0x1dbd: 0x0080, 0x1dbe: 0x0080, 0x1dbf: 0x0080, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0x0080, 0x1dc1: 0x0080, 0x1dc2: 0x0080, 0x1dc3: 0x0080, 0x1dc4: 0x0080, 0x1dc5: 0x0080, + 0x1dc6: 0x0080, 0x1dc7: 0x0080, 0x1dc8: 0x0080, 0x1dc9: 0x0080, 0x1dca: 0x0080, 0x1dcb: 0x0080, + 0x1dcc: 0x0080, 0x1dcd: 0x0080, 0x1dce: 0x0080, 0x1dcf: 0x0080, 0x1dd0: 0x0080, 0x1dd1: 0x0080, + 0x1dd2: 0x0080, 0x1dd3: 0x0080, 0x1dd4: 0x0080, 0x1dd5: 0x0080, 0x1dd7: 0x0080, + 0x1dd8: 0x0080, 0x1dd9: 0x0080, 0x1dda: 0x0080, 0x1ddb: 0x0080, 0x1ddc: 0x0080, 0x1ddd: 0x0080, + 0x1dde: 0x0080, 0x1ddf: 0x0080, 0x1de0: 0x0080, 0x1de1: 0x0080, 0x1de2: 0x0080, 0x1de3: 0x0080, + 0x1de4: 0x0080, 0x1de5: 0x0080, 0x1de6: 0x0080, 0x1de7: 0x0080, 0x1de8: 0x0080, 0x1de9: 0x0080, + 0x1dea: 0x0080, 0x1deb: 0x0080, 0x1dec: 0x0080, 0x1ded: 0x0080, 0x1dee: 0x0080, 0x1def: 0x0080, + 0x1df0: 0x0080, 0x1df1: 0x0080, 0x1df2: 0x0080, 0x1df3: 0x0080, 0x1df4: 0x0080, 0x1df5: 0x0080, + 0x1df6: 0x0080, 0x1df7: 0x0080, 0x1df8: 0x0080, 0x1df9: 0x0080, 0x1dfa: 0x0080, 0x1dfb: 0x0080, + 0x1dfc: 0x0080, 0x1dfd: 0x0080, 0x1dfe: 0x0080, 0x1dff: 0x0080, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x00c0, 0x1e01: 0x00c0, 0x1e02: 0x00c0, 0x1e03: 0x00c0, 0x1e04: 0x00c0, 0x1e05: 0x00c0, + 0x1e06: 0x00c0, 0x1e07: 0x00c0, 0x1e08: 0x00c0, 0x1e09: 0x00c0, 0x1e0a: 0x00c0, 0x1e0b: 0x00c0, + 0x1e0c: 0x00c0, 0x1e0d: 0x00c0, 0x1e0e: 0x00c0, 0x1e0f: 0x00c0, 0x1e10: 0x00c0, 0x1e11: 0x00c0, + 0x1e12: 0x00c0, 0x1e13: 0x00c0, 0x1e14: 0x00c0, 0x1e15: 0x00c0, 0x1e16: 0x00c0, 0x1e17: 0x00c0, + 0x1e18: 0x00c0, 0x1e19: 0x00c0, 0x1e1a: 0x00c0, 0x1e1b: 0x00c0, 0x1e1c: 0x00c0, 0x1e1d: 0x00c0, + 0x1e1e: 0x00c0, 0x1e1f: 0x00c0, 0x1e20: 0x00c0, 0x1e21: 0x00c0, 0x1e22: 0x00c0, 0x1e23: 0x00c0, + 0x1e24: 0x00c0, 0x1e25: 0x00c0, 0x1e26: 0x00c0, 0x1e27: 0x00c0, 0x1e28: 0x00c0, 0x1e29: 0x00c0, + 0x1e2a: 0x00c0, 0x1e2b: 0x00c0, 0x1e2c: 0x00c0, 0x1e2d: 0x00c0, 0x1e2e: 0x00c0, 0x1e2f: 0x00c0, + 0x1e30: 0x00c0, 0x1e31: 0x00c0, 0x1e32: 0x00c0, 0x1e33: 0x00c0, 0x1e34: 0x00c0, 0x1e35: 0x00c0, + 0x1e36: 0x00c0, 0x1e37: 0x00c0, 0x1e38: 0x00c0, 0x1e39: 0x00c0, 0x1e3a: 0x00c0, 0x1e3b: 0x00c0, + 0x1e3c: 0x0080, 0x1e3d: 0x0080, 0x1e3e: 0x00c0, 0x1e3f: 0x00c0, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x00c0, 0x1e41: 0x00c0, 0x1e42: 0x00c0, 0x1e43: 0x00c0, 0x1e44: 0x00c0, 0x1e45: 0x00c0, + 0x1e46: 0x00c0, 0x1e47: 0x00c0, 0x1e48: 0x00c0, 0x1e49: 0x00c0, 0x1e4a: 0x00c0, 0x1e4b: 0x00c0, + 0x1e4c: 0x00c0, 0x1e4d: 0x00c0, 0x1e4e: 0x00c0, 0x1e4f: 0x00c0, 0x1e50: 0x00c0, 0x1e51: 0x00c0, + 0x1e52: 0x00c0, 0x1e53: 0x00c0, 0x1e54: 0x00c0, 0x1e55: 0x00c0, 0x1e56: 0x00c0, 0x1e57: 0x00c0, + 0x1e58: 0x00c0, 0x1e59: 0x00c0, 0x1e5a: 0x00c0, 0x1e5b: 0x00c0, 0x1e5c: 0x00c0, 0x1e5d: 0x00c0, + 0x1e5e: 0x00c0, 0x1e5f: 0x00c0, 0x1e60: 0x00c0, 0x1e61: 0x00c0, 0x1e62: 0x00c0, 0x1e63: 0x00c0, + 0x1e64: 0x00c0, 0x1e65: 0x0080, 0x1e66: 0x0080, 0x1e67: 0x0080, 0x1e68: 0x0080, 0x1e69: 0x0080, + 0x1e6a: 0x0080, 0x1e6b: 0x00c0, 0x1e6c: 0x00c0, 0x1e6d: 0x00c0, 0x1e6e: 0x00c0, 0x1e6f: 0x00c3, + 0x1e70: 0x00c3, 0x1e71: 0x00c3, 0x1e72: 0x00c0, 0x1e73: 0x00c0, + 0x1e79: 0x0080, 0x1e7a: 0x0080, 0x1e7b: 0x0080, + 0x1e7c: 0x0080, 0x1e7d: 0x0080, 0x1e7e: 0x0080, 0x1e7f: 0x0080, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x00c0, 0x1e81: 0x00c0, 0x1e82: 0x00c0, 0x1e83: 0x00c0, 0x1e84: 0x00c0, 0x1e85: 0x00c0, + 0x1e86: 0x00c0, 0x1e87: 0x00c0, 0x1e88: 0x00c0, 0x1e89: 0x00c0, 0x1e8a: 0x00c0, 0x1e8b: 0x00c0, + 0x1e8c: 0x00c0, 0x1e8d: 0x00c0, 0x1e8e: 0x00c0, 0x1e8f: 0x00c0, 0x1e90: 0x00c0, 0x1e91: 0x00c0, + 0x1e92: 0x00c0, 0x1e93: 0x00c0, 0x1e94: 0x00c0, 0x1e95: 0x00c0, 0x1e96: 0x00c0, 0x1e97: 0x00c0, + 0x1e98: 0x00c0, 0x1e99: 0x00c0, 0x1e9a: 0x00c0, 0x1e9b: 0x00c0, 0x1e9c: 0x00c0, 0x1e9d: 0x00c0, + 0x1e9e: 0x00c0, 0x1e9f: 0x00c0, 0x1ea0: 0x00c0, 0x1ea1: 0x00c0, 0x1ea2: 0x00c0, 0x1ea3: 0x00c0, + 0x1ea4: 0x00c0, 0x1ea5: 0x00c0, 0x1ea7: 0x00c0, + 0x1ead: 0x00c0, + 0x1eb0: 0x00c0, 0x1eb1: 0x00c0, 0x1eb2: 0x00c0, 0x1eb3: 0x00c0, 0x1eb4: 0x00c0, 0x1eb5: 0x00c0, + 0x1eb6: 0x00c0, 0x1eb7: 0x00c0, 0x1eb8: 0x00c0, 0x1eb9: 0x00c0, 0x1eba: 0x00c0, 0x1ebb: 0x00c0, + 0x1ebc: 0x00c0, 0x1ebd: 0x00c0, 0x1ebe: 0x00c0, 0x1ebf: 0x00c0, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x00c0, 0x1ec1: 0x00c0, 0x1ec2: 0x00c0, 0x1ec3: 0x00c0, 0x1ec4: 0x00c0, 0x1ec5: 0x00c0, + 0x1ec6: 0x00c0, 0x1ec7: 0x00c0, 0x1ec8: 0x00c0, 0x1ec9: 0x00c0, 0x1eca: 0x00c0, 0x1ecb: 0x00c0, + 0x1ecc: 0x00c0, 0x1ecd: 0x00c0, 0x1ece: 0x00c0, 0x1ecf: 0x00c0, 0x1ed0: 0x00c0, 0x1ed1: 0x00c0, + 0x1ed2: 0x00c0, 0x1ed3: 0x00c0, 0x1ed4: 0x00c0, 0x1ed5: 0x00c0, 0x1ed6: 0x00c0, 0x1ed7: 0x00c0, + 0x1ed8: 0x00c0, 0x1ed9: 0x00c0, 0x1eda: 0x00c0, 0x1edb: 0x00c0, 0x1edc: 0x00c0, 0x1edd: 0x00c0, + 0x1ede: 0x00c0, 0x1edf: 0x00c0, 0x1ee0: 0x00c0, 0x1ee1: 0x00c0, 0x1ee2: 0x00c0, 0x1ee3: 0x00c0, + 0x1ee4: 0x00c0, 0x1ee5: 0x00c0, 0x1ee6: 0x00c0, 0x1ee7: 0x00c0, + 0x1eef: 0x0080, + 0x1ef0: 0x0080, + 0x1eff: 0x00c6, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x00c0, 0x1f01: 0x00c0, 0x1f02: 0x00c0, 0x1f03: 0x00c0, 0x1f04: 0x00c0, 0x1f05: 0x00c0, + 0x1f06: 0x00c0, 0x1f07: 0x00c0, 0x1f08: 0x00c0, 0x1f09: 0x00c0, 0x1f0a: 0x00c0, 0x1f0b: 0x00c0, + 0x1f0c: 0x00c0, 0x1f0d: 0x00c0, 0x1f0e: 0x00c0, 0x1f0f: 0x00c0, 0x1f10: 0x00c0, 0x1f11: 0x00c0, + 0x1f12: 0x00c0, 0x1f13: 0x00c0, 0x1f14: 0x00c0, 0x1f15: 0x00c0, 0x1f16: 0x00c0, + 0x1f20: 0x00c0, 0x1f21: 0x00c0, 0x1f22: 0x00c0, 0x1f23: 0x00c0, + 0x1f24: 0x00c0, 0x1f25: 0x00c0, 0x1f26: 0x00c0, 0x1f28: 0x00c0, 0x1f29: 0x00c0, + 0x1f2a: 0x00c0, 0x1f2b: 0x00c0, 0x1f2c: 0x00c0, 0x1f2d: 0x00c0, 0x1f2e: 0x00c0, + 0x1f30: 0x00c0, 0x1f31: 0x00c0, 0x1f32: 0x00c0, 0x1f33: 0x00c0, 0x1f34: 0x00c0, 0x1f35: 0x00c0, + 0x1f36: 0x00c0, 0x1f38: 0x00c0, 0x1f39: 0x00c0, 0x1f3a: 0x00c0, 0x1f3b: 0x00c0, + 0x1f3c: 0x00c0, 0x1f3d: 0x00c0, 0x1f3e: 0x00c0, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x00c0, 0x1f41: 0x00c0, 0x1f42: 0x00c0, 0x1f43: 0x00c0, 0x1f44: 0x00c0, 0x1f45: 0x00c0, + 0x1f46: 0x00c0, 0x1f48: 0x00c0, 0x1f49: 0x00c0, 0x1f4a: 0x00c0, 0x1f4b: 0x00c0, + 0x1f4c: 0x00c0, 0x1f4d: 0x00c0, 0x1f4e: 0x00c0, 0x1f50: 0x00c0, 0x1f51: 0x00c0, + 0x1f52: 0x00c0, 0x1f53: 0x00c0, 0x1f54: 0x00c0, 0x1f55: 0x00c0, 0x1f56: 0x00c0, + 0x1f58: 0x00c0, 0x1f59: 0x00c0, 0x1f5a: 0x00c0, 0x1f5b: 0x00c0, 0x1f5c: 0x00c0, 0x1f5d: 0x00c0, + 0x1f5e: 0x00c0, 0x1f60: 0x00c3, 0x1f61: 0x00c3, 0x1f62: 0x00c3, 0x1f63: 0x00c3, + 0x1f64: 0x00c3, 0x1f65: 0x00c3, 0x1f66: 0x00c3, 0x1f67: 0x00c3, 0x1f68: 0x00c3, 0x1f69: 0x00c3, + 0x1f6a: 0x00c3, 0x1f6b: 0x00c3, 0x1f6c: 0x00c3, 0x1f6d: 0x00c3, 0x1f6e: 0x00c3, 0x1f6f: 0x00c3, + 0x1f70: 0x00c3, 0x1f71: 0x00c3, 0x1f72: 0x00c3, 0x1f73: 0x00c3, 0x1f74: 0x00c3, 0x1f75: 0x00c3, + 0x1f76: 0x00c3, 0x1f77: 0x00c3, 0x1f78: 0x00c3, 0x1f79: 0x00c3, 0x1f7a: 0x00c3, 0x1f7b: 0x00c3, + 0x1f7c: 0x00c3, 0x1f7d: 0x00c3, 0x1f7e: 0x00c3, 0x1f7f: 0x00c3, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x0080, 0x1f81: 0x0080, 0x1f82: 0x0080, 0x1f83: 0x0080, 0x1f84: 0x0080, 0x1f85: 0x0080, + 0x1f86: 0x0080, 0x1f87: 0x0080, 0x1f88: 0x0080, 0x1f89: 0x0080, 0x1f8a: 0x0080, 0x1f8b: 0x0080, + 0x1f8c: 0x0080, 0x1f8d: 0x0080, 0x1f8e: 0x0080, 0x1f8f: 0x0080, 0x1f90: 0x0080, 0x1f91: 0x0080, + 0x1f92: 0x0080, 0x1f93: 0x0080, 0x1f94: 0x0080, 0x1f95: 0x0080, 0x1f96: 0x0080, 0x1f97: 0x0080, + 0x1f98: 0x0080, 0x1f99: 0x0080, 0x1f9a: 0x0080, 0x1f9b: 0x0080, 0x1f9c: 0x0080, 0x1f9d: 0x0080, + 0x1f9e: 0x0080, 0x1f9f: 0x0080, 0x1fa0: 0x0080, 0x1fa1: 0x0080, 0x1fa2: 0x0080, 0x1fa3: 0x0080, + 0x1fa4: 0x0080, 0x1fa5: 0x0080, 0x1fa6: 0x0080, 0x1fa7: 0x0080, 0x1fa8: 0x0080, 0x1fa9: 0x0080, + 0x1faa: 0x0080, 0x1fab: 0x0080, 0x1fac: 0x0080, 0x1fad: 0x0080, 0x1fae: 0x0080, 0x1faf: 0x00c0, + 0x1fb0: 0x0080, 0x1fb1: 0x0080, 0x1fb2: 0x0080, 0x1fb3: 0x0080, 0x1fb4: 0x0080, 0x1fb5: 0x0080, + 0x1fb6: 0x0080, 0x1fb7: 0x0080, 0x1fb8: 0x0080, 0x1fb9: 0x0080, 0x1fba: 0x0080, 0x1fbb: 0x0080, + 0x1fbc: 0x0080, 0x1fbd: 0x0080, 0x1fbe: 0x0080, 0x1fbf: 0x0080, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x0080, 0x1fc1: 0x0080, 0x1fc2: 0x0080, 0x1fc3: 0x0080, 0x1fc4: 0x0080, 0x1fc5: 0x0080, + 0x1fc6: 0x0080, 0x1fc7: 0x0080, 0x1fc8: 0x0080, 0x1fc9: 0x0080, 0x1fca: 0x0080, 0x1fcb: 0x0080, + 0x1fcc: 0x0080, 0x1fcd: 0x0080, 0x1fce: 0x0080, 0x1fcf: 0x0080, 0x1fd0: 0x0080, 0x1fd1: 0x0080, + 0x1fd2: 0x0080, 0x1fd3: 0x0080, 0x1fd4: 0x0080, 0x1fd5: 0x0080, 0x1fd6: 0x0080, 0x1fd7: 0x0080, + 0x1fd8: 0x0080, 0x1fd9: 0x0080, 0x1fda: 0x0080, 0x1fdb: 0x0080, 0x1fdc: 0x0080, 0x1fdd: 0x0080, + // Block 0x80, offset 0x2000 + 0x2000: 0x008c, 0x2001: 0x008c, 0x2002: 0x008c, 0x2003: 0x008c, 0x2004: 0x008c, 0x2005: 0x008c, + 0x2006: 0x008c, 0x2007: 0x008c, 0x2008: 0x008c, 0x2009: 0x008c, 0x200a: 0x008c, 0x200b: 0x008c, + 0x200c: 0x008c, 0x200d: 0x008c, 0x200e: 0x008c, 0x200f: 0x008c, 0x2010: 0x008c, 0x2011: 0x008c, + 0x2012: 0x008c, 0x2013: 0x008c, 0x2014: 0x008c, 0x2015: 0x008c, 0x2016: 0x008c, 0x2017: 0x008c, + 0x2018: 0x008c, 0x2019: 0x008c, 0x201b: 0x008c, 0x201c: 0x008c, 0x201d: 0x008c, + 0x201e: 0x008c, 0x201f: 0x008c, 0x2020: 0x008c, 0x2021: 0x008c, 0x2022: 0x008c, 0x2023: 0x008c, + 0x2024: 0x008c, 0x2025: 0x008c, 0x2026: 0x008c, 0x2027: 0x008c, 0x2028: 0x008c, 0x2029: 0x008c, + 0x202a: 0x008c, 0x202b: 0x008c, 0x202c: 0x008c, 0x202d: 0x008c, 0x202e: 0x008c, 0x202f: 0x008c, + 0x2030: 0x008c, 0x2031: 0x008c, 0x2032: 0x008c, 0x2033: 0x008c, 0x2034: 0x008c, 0x2035: 0x008c, + 0x2036: 0x008c, 0x2037: 0x008c, 0x2038: 0x008c, 0x2039: 0x008c, 0x203a: 0x008c, 0x203b: 0x008c, + 0x203c: 0x008c, 0x203d: 0x008c, 0x203e: 0x008c, 0x203f: 0x008c, + // Block 0x81, offset 0x2040 + 0x2040: 0x008c, 0x2041: 0x008c, 0x2042: 0x008c, 0x2043: 0x008c, 0x2044: 0x008c, 0x2045: 0x008c, + 0x2046: 0x008c, 0x2047: 0x008c, 0x2048: 0x008c, 0x2049: 0x008c, 0x204a: 0x008c, 0x204b: 0x008c, + 0x204c: 0x008c, 0x204d: 0x008c, 0x204e: 0x008c, 0x204f: 0x008c, 0x2050: 0x008c, 0x2051: 0x008c, + 0x2052: 0x008c, 0x2053: 0x008c, 0x2054: 0x008c, 0x2055: 0x008c, 0x2056: 0x008c, 0x2057: 0x008c, + 0x2058: 0x008c, 0x2059: 0x008c, 0x205a: 0x008c, 0x205b: 0x008c, 0x205c: 0x008c, 0x205d: 0x008c, + 0x205e: 0x008c, 0x205f: 0x008c, 0x2060: 0x008c, 0x2061: 0x008c, 0x2062: 0x008c, 0x2063: 0x008c, + 0x2064: 0x008c, 0x2065: 0x008c, 0x2066: 0x008c, 0x2067: 0x008c, 0x2068: 0x008c, 0x2069: 0x008c, + 0x206a: 0x008c, 0x206b: 0x008c, 0x206c: 0x008c, 0x206d: 0x008c, 0x206e: 0x008c, 0x206f: 0x008c, + 0x2070: 0x008c, 0x2071: 0x008c, 0x2072: 0x008c, 0x2073: 0x008c, + // Block 0x82, offset 0x2080 + 0x2080: 0x008c, 0x2081: 0x008c, 0x2082: 0x008c, 0x2083: 0x008c, 0x2084: 0x008c, 0x2085: 0x008c, + 0x2086: 0x008c, 0x2087: 0x008c, 0x2088: 0x008c, 0x2089: 0x008c, 0x208a: 0x008c, 0x208b: 0x008c, + 0x208c: 0x008c, 0x208d: 0x008c, 0x208e: 0x008c, 0x208f: 0x008c, 0x2090: 0x008c, 0x2091: 0x008c, + 0x2092: 0x008c, 0x2093: 0x008c, 0x2094: 0x008c, 0x2095: 0x008c, 0x2096: 0x008c, 0x2097: 0x008c, + 0x2098: 0x008c, 0x2099: 0x008c, 0x209a: 0x008c, 0x209b: 0x008c, 0x209c: 0x008c, 0x209d: 0x008c, + 0x209e: 0x008c, 0x209f: 0x008c, 0x20a0: 0x008c, 0x20a1: 0x008c, 0x20a2: 0x008c, 0x20a3: 0x008c, + 0x20a4: 0x008c, 0x20a5: 0x008c, 0x20a6: 0x008c, 0x20a7: 0x008c, 0x20a8: 0x008c, 0x20a9: 0x008c, + 0x20aa: 0x008c, 0x20ab: 0x008c, 0x20ac: 0x008c, 0x20ad: 0x008c, 0x20ae: 0x008c, 0x20af: 0x008c, + 0x20b0: 0x008c, 0x20b1: 0x008c, 0x20b2: 0x008c, 0x20b3: 0x008c, 0x20b4: 0x008c, 0x20b5: 0x008c, + 0x20b6: 0x008c, 0x20b7: 0x008c, 0x20b8: 0x008c, 0x20b9: 0x008c, 0x20ba: 0x008c, 0x20bb: 0x008c, + 0x20bc: 0x008c, 0x20bd: 0x008c, 0x20be: 0x008c, 0x20bf: 0x008c, + // Block 0x83, offset 0x20c0 + 0x20c0: 0x008c, 0x20c1: 0x008c, 0x20c2: 0x008c, 0x20c3: 0x008c, 0x20c4: 0x008c, 0x20c5: 0x008c, + 0x20c6: 0x008c, 0x20c7: 0x008c, 0x20c8: 0x008c, 0x20c9: 0x008c, 0x20ca: 0x008c, 0x20cb: 0x008c, + 0x20cc: 0x008c, 0x20cd: 0x008c, 0x20ce: 0x008c, 0x20cf: 0x008c, 0x20d0: 0x008c, 0x20d1: 0x008c, + 0x20d2: 0x008c, 0x20d3: 0x008c, 0x20d4: 0x008c, 0x20d5: 0x008c, + 0x20f0: 0x0080, 0x20f1: 0x0080, 0x20f2: 0x0080, 0x20f3: 0x0080, 0x20f4: 0x0080, 0x20f5: 0x0080, + 0x20f6: 0x0080, 0x20f7: 0x0080, 0x20f8: 0x0080, 0x20f9: 0x0080, 0x20fa: 0x0080, 0x20fb: 0x0080, + // Block 0x84, offset 0x2100 + 0x2100: 0x0080, 0x2101: 0x0080, 0x2102: 0x0080, 0x2103: 0x0080, 0x2104: 0x0080, 0x2105: 0x00cc, + 0x2106: 0x00c0, 0x2107: 0x00cc, 0x2108: 0x0080, 0x2109: 0x0080, 0x210a: 0x0080, 0x210b: 0x0080, + 0x210c: 0x0080, 0x210d: 0x0080, 0x210e: 0x0080, 0x210f: 0x0080, 0x2110: 0x0080, 0x2111: 0x0080, + 0x2112: 0x0080, 0x2113: 0x0080, 0x2114: 0x0080, 0x2115: 0x0080, 0x2116: 0x0080, 0x2117: 0x0080, + 0x2118: 0x0080, 0x2119: 0x0080, 0x211a: 0x0080, 0x211b: 0x0080, 0x211c: 0x0080, 0x211d: 0x0080, + 0x211e: 0x0080, 0x211f: 0x0080, 0x2120: 0x0080, 0x2121: 0x008c, 0x2122: 0x008c, 0x2123: 0x008c, + 0x2124: 0x008c, 0x2125: 0x008c, 0x2126: 0x008c, 0x2127: 0x008c, 0x2128: 0x008c, 0x2129: 0x008c, + 0x212a: 0x00c3, 0x212b: 0x00c3, 0x212c: 0x00c3, 0x212d: 0x00c3, 0x212e: 0x0040, 0x212f: 0x0040, + 0x2130: 0x0080, 0x2131: 0x0040, 0x2132: 0x0040, 0x2133: 0x0040, 0x2134: 0x0040, 0x2135: 0x0040, + 0x2136: 0x0080, 0x2137: 0x0080, 0x2138: 0x008c, 0x2139: 0x008c, 0x213a: 0x008c, 0x213b: 0x0040, + 0x213c: 0x00c0, 0x213d: 0x0080, 0x213e: 0x0080, 0x213f: 0x0080, + // Block 0x85, offset 0x2140 + 0x2141: 0x00cc, 0x2142: 0x00cc, 0x2143: 0x00cc, 0x2144: 0x00cc, 0x2145: 0x00cc, + 0x2146: 0x00cc, 0x2147: 0x00cc, 0x2148: 0x00cc, 0x2149: 0x00cc, 0x214a: 0x00cc, 0x214b: 0x00cc, + 0x214c: 0x00cc, 0x214d: 0x00cc, 0x214e: 0x00cc, 0x214f: 0x00cc, 0x2150: 0x00cc, 0x2151: 0x00cc, + 0x2152: 0x00cc, 0x2153: 0x00cc, 0x2154: 0x00cc, 0x2155: 0x00cc, 0x2156: 0x00cc, 0x2157: 0x00cc, + 0x2158: 0x00cc, 0x2159: 0x00cc, 0x215a: 0x00cc, 0x215b: 0x00cc, 0x215c: 0x00cc, 0x215d: 0x00cc, + 0x215e: 0x00cc, 0x215f: 0x00cc, 0x2160: 0x00cc, 0x2161: 0x00cc, 0x2162: 0x00cc, 0x2163: 0x00cc, + 0x2164: 0x00cc, 0x2165: 0x00cc, 0x2166: 0x00cc, 0x2167: 0x00cc, 0x2168: 0x00cc, 0x2169: 0x00cc, + 0x216a: 0x00cc, 0x216b: 0x00cc, 0x216c: 0x00cc, 0x216d: 0x00cc, 0x216e: 0x00cc, 0x216f: 0x00cc, + 0x2170: 0x00cc, 0x2171: 0x00cc, 0x2172: 0x00cc, 0x2173: 0x00cc, 0x2174: 0x00cc, 0x2175: 0x00cc, + 0x2176: 0x00cc, 0x2177: 0x00cc, 0x2178: 0x00cc, 0x2179: 0x00cc, 0x217a: 0x00cc, 0x217b: 0x00cc, + 0x217c: 0x00cc, 0x217d: 0x00cc, 0x217e: 0x00cc, 0x217f: 0x00cc, + // Block 0x86, offset 0x2180 + 0x2180: 0x00cc, 0x2181: 0x00cc, 0x2182: 0x00cc, 0x2183: 0x00cc, 0x2184: 0x00cc, 0x2185: 0x00cc, + 0x2186: 0x00cc, 0x2187: 0x00cc, 0x2188: 0x00cc, 0x2189: 0x00cc, 0x218a: 0x00cc, 0x218b: 0x00cc, + 0x218c: 0x00cc, 0x218d: 0x00cc, 0x218e: 0x00cc, 0x218f: 0x00cc, 0x2190: 0x00cc, 0x2191: 0x00cc, + 0x2192: 0x00cc, 0x2193: 0x00cc, 0x2194: 0x00cc, 0x2195: 0x00cc, 0x2196: 0x00cc, + 0x2199: 0x00c3, 0x219a: 0x00c3, 0x219b: 0x0080, 0x219c: 0x0080, 0x219d: 0x00cc, + 0x219e: 0x00cc, 0x219f: 0x008c, 0x21a0: 0x0080, 0x21a1: 0x00cc, 0x21a2: 0x00cc, 0x21a3: 0x00cc, + 0x21a4: 0x00cc, 0x21a5: 0x00cc, 0x21a6: 0x00cc, 0x21a7: 0x00cc, 0x21a8: 0x00cc, 0x21a9: 0x00cc, + 0x21aa: 0x00cc, 0x21ab: 0x00cc, 0x21ac: 0x00cc, 0x21ad: 0x00cc, 0x21ae: 0x00cc, 0x21af: 0x00cc, + 0x21b0: 0x00cc, 0x21b1: 0x00cc, 0x21b2: 0x00cc, 0x21b3: 0x00cc, 0x21b4: 0x00cc, 0x21b5: 0x00cc, + 0x21b6: 0x00cc, 0x21b7: 0x00cc, 0x21b8: 0x00cc, 0x21b9: 0x00cc, 0x21ba: 0x00cc, 0x21bb: 0x00cc, + 0x21bc: 0x00cc, 0x21bd: 0x00cc, 0x21be: 0x00cc, 0x21bf: 0x00cc, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x00cc, 0x21c1: 0x00cc, 0x21c2: 0x00cc, 0x21c3: 0x00cc, 0x21c4: 0x00cc, 0x21c5: 0x00cc, + 0x21c6: 0x00cc, 0x21c7: 0x00cc, 0x21c8: 0x00cc, 0x21c9: 0x00cc, 0x21ca: 0x00cc, 0x21cb: 0x00cc, + 0x21cc: 0x00cc, 0x21cd: 0x00cc, 0x21ce: 0x00cc, 0x21cf: 0x00cc, 0x21d0: 0x00cc, 0x21d1: 0x00cc, + 0x21d2: 0x00cc, 0x21d3: 0x00cc, 0x21d4: 0x00cc, 0x21d5: 0x00cc, 0x21d6: 0x00cc, 0x21d7: 0x00cc, + 0x21d8: 0x00cc, 0x21d9: 0x00cc, 0x21da: 0x00cc, 0x21db: 0x00cc, 0x21dc: 0x00cc, 0x21dd: 0x00cc, + 0x21de: 0x00cc, 0x21df: 0x00cc, 0x21e0: 0x00cc, 0x21e1: 0x00cc, 0x21e2: 0x00cc, 0x21e3: 0x00cc, + 0x21e4: 0x00cc, 0x21e5: 0x00cc, 0x21e6: 0x00cc, 0x21e7: 0x00cc, 0x21e8: 0x00cc, 0x21e9: 0x00cc, + 0x21ea: 0x00cc, 0x21eb: 0x00cc, 0x21ec: 0x00cc, 0x21ed: 0x00cc, 0x21ee: 0x00cc, 0x21ef: 0x00cc, + 0x21f0: 0x00cc, 0x21f1: 0x00cc, 0x21f2: 0x00cc, 0x21f3: 0x00cc, 0x21f4: 0x00cc, 0x21f5: 0x00cc, + 0x21f6: 0x00cc, 0x21f7: 0x00cc, 0x21f8: 0x00cc, 0x21f9: 0x00cc, 0x21fa: 0x00cc, 0x21fb: 0x00d2, + 0x21fc: 0x00c0, 0x21fd: 0x00cc, 0x21fe: 0x00cc, 0x21ff: 0x008c, + // Block 0x88, offset 0x2200 + 0x2205: 0x00c0, + 0x2206: 0x00c0, 0x2207: 0x00c0, 0x2208: 0x00c0, 0x2209: 0x00c0, 0x220a: 0x00c0, 0x220b: 0x00c0, + 0x220c: 0x00c0, 0x220d: 0x00c0, 0x220e: 0x00c0, 0x220f: 0x00c0, 0x2210: 0x00c0, 0x2211: 0x00c0, + 0x2212: 0x00c0, 0x2213: 0x00c0, 0x2214: 0x00c0, 0x2215: 0x00c0, 0x2216: 0x00c0, 0x2217: 0x00c0, + 0x2218: 0x00c0, 0x2219: 0x00c0, 0x221a: 0x00c0, 0x221b: 0x00c0, 0x221c: 0x00c0, 0x221d: 0x00c0, + 0x221e: 0x00c0, 0x221f: 0x00c0, 0x2220: 0x00c0, 0x2221: 0x00c0, 0x2222: 0x00c0, 0x2223: 0x00c0, + 0x2224: 0x00c0, 0x2225: 0x00c0, 0x2226: 0x00c0, 0x2227: 0x00c0, 0x2228: 0x00c0, 0x2229: 0x00c0, + 0x222a: 0x00c0, 0x222b: 0x00c0, 0x222c: 0x00c0, 0x222d: 0x00c0, 0x222e: 0x00c0, 0x222f: 0x00c0, + 0x2231: 0x0080, 0x2232: 0x0080, 0x2233: 0x0080, 0x2234: 0x0080, 0x2235: 0x0080, + 0x2236: 0x0080, 0x2237: 0x0080, 0x2238: 0x0080, 0x2239: 0x0080, 0x223a: 0x0080, 0x223b: 0x0080, + 0x223c: 0x0080, 0x223d: 0x0080, 0x223e: 0x0080, 0x223f: 0x0080, + // Block 0x89, offset 0x2240 + 0x2240: 0x0080, 0x2241: 0x0080, 0x2242: 0x0080, 0x2243: 0x0080, 0x2244: 0x0080, 0x2245: 0x0080, + 0x2246: 0x0080, 0x2247: 0x0080, 0x2248: 0x0080, 0x2249: 0x0080, 0x224a: 0x0080, 0x224b: 0x0080, + 0x224c: 0x0080, 0x224d: 0x0080, 0x224e: 0x0080, 0x224f: 0x0080, 0x2250: 0x0080, 0x2251: 0x0080, + 0x2252: 0x0080, 0x2253: 0x0080, 0x2254: 0x0080, 0x2255: 0x0080, 0x2256: 0x0080, 0x2257: 0x0080, + 0x2258: 0x0080, 0x2259: 0x0080, 0x225a: 0x0080, 0x225b: 0x0080, 0x225c: 0x0080, 0x225d: 0x0080, + 0x225e: 0x0080, 0x225f: 0x0080, 0x2260: 0x0080, 0x2261: 0x0080, 0x2262: 0x0080, 0x2263: 0x0080, + 0x2264: 0x0040, 0x2265: 0x0080, 0x2266: 0x0080, 0x2267: 0x0080, 0x2268: 0x0080, 0x2269: 0x0080, + 0x226a: 0x0080, 0x226b: 0x0080, 0x226c: 0x0080, 0x226d: 0x0080, 0x226e: 0x0080, 0x226f: 0x0080, + 0x2270: 0x0080, 0x2271: 0x0080, 0x2272: 0x0080, 0x2273: 0x0080, 0x2274: 0x0080, 0x2275: 0x0080, + 0x2276: 0x0080, 0x2277: 0x0080, 0x2278: 0x0080, 0x2279: 0x0080, 0x227a: 0x0080, 0x227b: 0x0080, + 0x227c: 0x0080, 0x227d: 0x0080, 0x227e: 0x0080, 0x227f: 0x0080, + // Block 0x8a, offset 0x2280 + 0x2280: 0x0080, 0x2281: 0x0080, 0x2282: 0x0080, 0x2283: 0x0080, 0x2284: 0x0080, 0x2285: 0x0080, + 0x2286: 0x0080, 0x2287: 0x0080, 0x2288: 0x0080, 0x2289: 0x0080, 0x228a: 0x0080, 0x228b: 0x0080, + 0x228c: 0x0080, 0x228d: 0x0080, 0x228e: 0x0080, 0x2290: 0x0080, 0x2291: 0x0080, + 0x2292: 0x0080, 0x2293: 0x0080, 0x2294: 0x0080, 0x2295: 0x0080, 0x2296: 0x0080, 0x2297: 0x0080, + 0x2298: 0x0080, 0x2299: 0x0080, 0x229a: 0x0080, 0x229b: 0x0080, 0x229c: 0x0080, 0x229d: 0x0080, + 0x229e: 0x0080, 0x229f: 0x0080, 0x22a0: 0x00c0, 0x22a1: 0x00c0, 0x22a2: 0x00c0, 0x22a3: 0x00c0, + 0x22a4: 0x00c0, 0x22a5: 0x00c0, 0x22a6: 0x00c0, 0x22a7: 0x00c0, 0x22a8: 0x00c0, 0x22a9: 0x00c0, + 0x22aa: 0x00c0, 0x22ab: 0x00c0, 0x22ac: 0x00c0, 0x22ad: 0x00c0, 0x22ae: 0x00c0, 0x22af: 0x00c0, + 0x22b0: 0x00c0, 0x22b1: 0x00c0, 0x22b2: 0x00c0, 0x22b3: 0x00c0, 0x22b4: 0x00c0, 0x22b5: 0x00c0, + 0x22b6: 0x00c0, 0x22b7: 0x00c0, 0x22b8: 0x00c0, 0x22b9: 0x00c0, 0x22ba: 0x00c0, 0x22bb: 0x00c0, + 0x22bc: 0x00c0, 0x22bd: 0x00c0, 0x22be: 0x00c0, 0x22bf: 0x00c0, + // Block 0x8b, offset 0x22c0 + 0x22c0: 0x0080, 0x22c1: 0x0080, 0x22c2: 0x0080, 0x22c3: 0x0080, 0x22c4: 0x0080, 0x22c5: 0x0080, + 0x22c6: 0x0080, 0x22c7: 0x0080, 0x22c8: 0x0080, 0x22c9: 0x0080, 0x22ca: 0x0080, 0x22cb: 0x0080, + 0x22cc: 0x0080, 0x22cd: 0x0080, 0x22ce: 0x0080, 0x22cf: 0x0080, 0x22d0: 0x0080, 0x22d1: 0x0080, + 0x22d2: 0x0080, 0x22d3: 0x0080, 0x22d4: 0x0080, 0x22d5: 0x0080, 0x22d6: 0x0080, 0x22d7: 0x0080, + 0x22d8: 0x0080, 0x22d9: 0x0080, 0x22da: 0x0080, 0x22db: 0x0080, 0x22dc: 0x0080, 0x22dd: 0x0080, + 0x22de: 0x0080, 0x22df: 0x0080, 0x22e0: 0x0080, 0x22e1: 0x0080, 0x22e2: 0x0080, 0x22e3: 0x0080, + 0x22f0: 0x00cc, 0x22f1: 0x00cc, 0x22f2: 0x00cc, 0x22f3: 0x00cc, 0x22f4: 0x00cc, 0x22f5: 0x00cc, + 0x22f6: 0x00cc, 0x22f7: 0x00cc, 0x22f8: 0x00cc, 0x22f9: 0x00cc, 0x22fa: 0x00cc, 0x22fb: 0x00cc, + 0x22fc: 0x00cc, 0x22fd: 0x00cc, 0x22fe: 0x00cc, 0x22ff: 0x00cc, + // Block 0x8c, offset 0x2300 + 0x2300: 0x0080, 0x2301: 0x0080, 0x2302: 0x0080, 0x2303: 0x0080, 0x2304: 0x0080, 0x2305: 0x0080, + 0x2306: 0x0080, 0x2307: 0x0080, 0x2308: 0x0080, 0x2309: 0x0080, 0x230a: 0x0080, 0x230b: 0x0080, + 0x230c: 0x0080, 0x230d: 0x0080, 0x230e: 0x0080, 0x230f: 0x0080, 0x2310: 0x0080, 0x2311: 0x0080, + 0x2312: 0x0080, 0x2313: 0x0080, 0x2314: 0x0080, 0x2315: 0x0080, 0x2316: 0x0080, 0x2317: 0x0080, + 0x2318: 0x0080, 0x2319: 0x0080, 0x231a: 0x0080, 0x231b: 0x0080, 0x231c: 0x0080, 0x231d: 0x0080, + 0x231e: 0x0080, 0x2320: 0x0080, 0x2321: 0x0080, 0x2322: 0x0080, 0x2323: 0x0080, + 0x2324: 0x0080, 0x2325: 0x0080, 0x2326: 0x0080, 0x2327: 0x0080, 0x2328: 0x0080, 0x2329: 0x0080, + 0x232a: 0x0080, 0x232b: 0x0080, 0x232c: 0x0080, 0x232d: 0x0080, 0x232e: 0x0080, 0x232f: 0x0080, + 0x2330: 0x0080, 0x2331: 0x0080, 0x2332: 0x0080, 0x2333: 0x0080, 0x2334: 0x0080, 0x2335: 0x0080, + 0x2336: 0x0080, 0x2337: 0x0080, 0x2338: 0x0080, 0x2339: 0x0080, 0x233a: 0x0080, 0x233b: 0x0080, + 0x233c: 0x0080, 0x233d: 0x0080, 0x233e: 0x0080, 0x233f: 0x0080, + // Block 0x8d, offset 0x2340 + 0x2340: 0x0080, 0x2341: 0x0080, 0x2342: 0x0080, 0x2343: 0x0080, 0x2344: 0x0080, 0x2345: 0x0080, + 0x2346: 0x0080, 0x2347: 0x0080, 0x2348: 0x0080, 0x2349: 0x0080, 0x234a: 0x0080, 0x234b: 0x0080, + 0x234c: 0x0080, 0x234d: 0x0080, 0x234e: 0x0080, 0x234f: 0x0080, 0x2350: 0x008c, 0x2351: 0x008c, + 0x2352: 0x008c, 0x2353: 0x008c, 0x2354: 0x008c, 0x2355: 0x008c, 0x2356: 0x008c, 0x2357: 0x008c, + 0x2358: 0x008c, 0x2359: 0x008c, 0x235a: 0x008c, 0x235b: 0x008c, 0x235c: 0x008c, 0x235d: 0x008c, + 0x235e: 0x008c, 0x235f: 0x008c, 0x2360: 0x008c, 0x2361: 0x008c, 0x2362: 0x008c, 0x2363: 0x008c, + 0x2364: 0x008c, 0x2365: 0x008c, 0x2366: 0x008c, 0x2367: 0x008c, 0x2368: 0x008c, 0x2369: 0x008c, + 0x236a: 0x008c, 0x236b: 0x008c, 0x236c: 0x008c, 0x236d: 0x008c, 0x236e: 0x008c, 0x236f: 0x008c, + 0x2370: 0x008c, 0x2371: 0x008c, 0x2372: 0x008c, 0x2373: 0x008c, 0x2374: 0x008c, 0x2375: 0x008c, + 0x2376: 0x008c, 0x2377: 0x008c, 0x2378: 0x008c, 0x2379: 0x008c, 0x237a: 0x008c, 0x237b: 0x008c, + 0x237c: 0x008c, 0x237d: 0x008c, 0x237e: 0x008c, 0x237f: 0x0080, + // Block 0x8e, offset 0x2380 + 0x2380: 0x008c, 0x2381: 0x008c, 0x2382: 0x008c, 0x2383: 0x008c, 0x2384: 0x008c, 0x2385: 0x008c, + 0x2386: 0x008c, 0x2387: 0x008c, 0x2388: 0x008c, 0x2389: 0x008c, 0x238a: 0x008c, 0x238b: 0x008c, + 0x238c: 0x008c, 0x238d: 0x008c, 0x238e: 0x008c, 0x238f: 0x008c, 0x2390: 0x008c, 0x2391: 0x008c, + 0x2392: 0x008c, 0x2393: 0x008c, 0x2394: 0x008c, 0x2395: 0x008c, 0x2396: 0x008c, 0x2397: 0x008c, + 0x2398: 0x0080, 0x2399: 0x0080, 0x239a: 0x0080, 0x239b: 0x0080, 0x239c: 0x0080, 0x239d: 0x0080, + 0x239e: 0x0080, 0x239f: 0x0080, 0x23a0: 0x0080, 0x23a1: 0x0080, 0x23a2: 0x0080, 0x23a3: 0x0080, + 0x23a4: 0x0080, 0x23a5: 0x0080, 0x23a6: 0x0080, 0x23a7: 0x0080, 0x23a8: 0x0080, 0x23a9: 0x0080, + 0x23aa: 0x0080, 0x23ab: 0x0080, 0x23ac: 0x0080, 0x23ad: 0x0080, 0x23ae: 0x0080, 0x23af: 0x0080, + 0x23b0: 0x0080, 0x23b1: 0x0080, 0x23b2: 0x0080, 0x23b3: 0x0080, 0x23b4: 0x0080, 0x23b5: 0x0080, + 0x23b6: 0x0080, 0x23b7: 0x0080, 0x23b8: 0x0080, 0x23b9: 0x0080, 0x23ba: 0x0080, 0x23bb: 0x0080, + 0x23bc: 0x0080, 0x23bd: 0x0080, 0x23be: 0x0080, 0x23bf: 0x0080, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x00cc, 0x23c1: 0x00cc, 0x23c2: 0x00cc, 0x23c3: 0x00cc, 0x23c4: 0x00cc, 0x23c5: 0x00cc, + 0x23c6: 0x00cc, 0x23c7: 0x00cc, 0x23c8: 0x00cc, 0x23c9: 0x00cc, 0x23ca: 0x00cc, 0x23cb: 0x00cc, + 0x23cc: 0x00cc, 0x23cd: 0x00cc, 0x23ce: 0x00cc, 0x23cf: 0x00cc, 0x23d0: 0x00cc, 0x23d1: 0x00cc, + 0x23d2: 0x00cc, 0x23d3: 0x00cc, 0x23d4: 0x00cc, 0x23d5: 0x00cc, 0x23d6: 0x00cc, 0x23d7: 0x00cc, + 0x23d8: 0x00cc, 0x23d9: 0x00cc, 0x23da: 0x00cc, 0x23db: 0x00cc, 0x23dc: 0x00cc, 0x23dd: 0x00cc, + 0x23de: 0x00cc, 0x23df: 0x00cc, 0x23e0: 0x00cc, 0x23e1: 0x00cc, 0x23e2: 0x00cc, 0x23e3: 0x00cc, + 0x23e4: 0x00cc, 0x23e5: 0x00cc, 0x23e6: 0x00cc, 0x23e7: 0x00cc, 0x23e8: 0x00cc, 0x23e9: 0x00cc, + 0x23ea: 0x00cc, 0x23eb: 0x00cc, 0x23ec: 0x00cc, 0x23ed: 0x00cc, 0x23ee: 0x00cc, 0x23ef: 0x00cc, + 0x23f0: 0x00cc, 0x23f1: 0x00cc, 0x23f2: 0x00cc, 0x23f3: 0x00cc, 0x23f4: 0x00cc, 0x23f5: 0x00cc, + 0x23f6: 0x00cc, 0x23f7: 0x00cc, 0x23f8: 0x00cc, 0x23f9: 0x00cc, 0x23fa: 0x00cc, 0x23fb: 0x00cc, + 0x23fc: 0x00cc, 0x23fd: 0x00cc, 0x23fe: 0x00cc, 0x23ff: 0x00cc, + // Block 0x90, offset 0x2400 + 0x2400: 0x00c0, 0x2401: 0x00c0, 0x2402: 0x00c0, 0x2403: 0x00c0, 0x2404: 0x00c0, 0x2405: 0x00c0, + 0x2406: 0x00c0, 0x2407: 0x00c0, 0x2408: 0x00c0, 0x2409: 0x00c0, 0x240a: 0x00c0, 0x240b: 0x00c0, + 0x240c: 0x00c0, 0x2410: 0x0080, 0x2411: 0x0080, + 0x2412: 0x0080, 0x2413: 0x0080, 0x2414: 0x0080, 0x2415: 0x0080, 0x2416: 0x0080, 0x2417: 0x0080, + 0x2418: 0x0080, 0x2419: 0x0080, 0x241a: 0x0080, 0x241b: 0x0080, 0x241c: 0x0080, 0x241d: 0x0080, + 0x241e: 0x0080, 0x241f: 0x0080, 0x2420: 0x0080, 0x2421: 0x0080, 0x2422: 0x0080, 0x2423: 0x0080, + 0x2424: 0x0080, 0x2425: 0x0080, 0x2426: 0x0080, 0x2427: 0x0080, 0x2428: 0x0080, 0x2429: 0x0080, + 0x242a: 0x0080, 0x242b: 0x0080, 0x242c: 0x0080, 0x242d: 0x0080, 0x242e: 0x0080, 0x242f: 0x0080, + 0x2430: 0x0080, 0x2431: 0x0080, 0x2432: 0x0080, 0x2433: 0x0080, 0x2434: 0x0080, 0x2435: 0x0080, + 0x2436: 0x0080, 0x2437: 0x0080, 0x2438: 0x0080, 0x2439: 0x0080, 0x243a: 0x0080, 0x243b: 0x0080, + 0x243c: 0x0080, 0x243d: 0x0080, 0x243e: 0x0080, 0x243f: 0x0080, + // Block 0x91, offset 0x2440 + 0x2440: 0x0080, 0x2441: 0x0080, 0x2442: 0x0080, 0x2443: 0x0080, 0x2444: 0x0080, 0x2445: 0x0080, + 0x2446: 0x0080, + 0x2450: 0x00c0, 0x2451: 0x00c0, + 0x2452: 0x00c0, 0x2453: 0x00c0, 0x2454: 0x00c0, 0x2455: 0x00c0, 0x2456: 0x00c0, 0x2457: 0x00c0, + 0x2458: 0x00c0, 0x2459: 0x00c0, 0x245a: 0x00c0, 0x245b: 0x00c0, 0x245c: 0x00c0, 0x245d: 0x00c0, + 0x245e: 0x00c0, 0x245f: 0x00c0, 0x2460: 0x00c0, 0x2461: 0x00c0, 0x2462: 0x00c0, 0x2463: 0x00c0, + 0x2464: 0x00c0, 0x2465: 0x00c0, 0x2466: 0x00c0, 0x2467: 0x00c0, 0x2468: 0x00c0, 0x2469: 0x00c0, + 0x246a: 0x00c0, 0x246b: 0x00c0, 0x246c: 0x00c0, 0x246d: 0x00c0, 0x246e: 0x00c0, 0x246f: 0x00c0, + 0x2470: 0x00c0, 0x2471: 0x00c0, 0x2472: 0x00c0, 0x2473: 0x00c0, 0x2474: 0x00c0, 0x2475: 0x00c0, + 0x2476: 0x00c0, 0x2477: 0x00c0, 0x2478: 0x00c0, 0x2479: 0x00c0, 0x247a: 0x00c0, 0x247b: 0x00c0, + 0x247c: 0x00c0, 0x247d: 0x00c0, 0x247e: 0x0080, 0x247f: 0x0080, + // Block 0x92, offset 0x2480 + 0x2480: 0x00c0, 0x2481: 0x00c0, 0x2482: 0x00c0, 0x2483: 0x00c0, 0x2484: 0x00c0, 0x2485: 0x00c0, + 0x2486: 0x00c0, 0x2487: 0x00c0, 0x2488: 0x00c0, 0x2489: 0x00c0, 0x248a: 0x00c0, 0x248b: 0x00c0, + 0x248c: 0x00c0, 0x248d: 0x0080, 0x248e: 0x0080, 0x248f: 0x0080, 0x2490: 0x00c0, 0x2491: 0x00c0, + 0x2492: 0x00c0, 0x2493: 0x00c0, 0x2494: 0x00c0, 0x2495: 0x00c0, 0x2496: 0x00c0, 0x2497: 0x00c0, + 0x2498: 0x00c0, 0x2499: 0x00c0, 0x249a: 0x00c0, 0x249b: 0x00c0, 0x249c: 0x00c0, 0x249d: 0x00c0, + 0x249e: 0x00c0, 0x249f: 0x00c0, 0x24a0: 0x00c0, 0x24a1: 0x00c0, 0x24a2: 0x00c0, 0x24a3: 0x00c0, + 0x24a4: 0x00c0, 0x24a5: 0x00c0, 0x24a6: 0x00c0, 0x24a7: 0x00c0, 0x24a8: 0x00c0, 0x24a9: 0x00c0, + 0x24aa: 0x00c0, 0x24ab: 0x00c0, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x00c0, 0x24c1: 0x00c0, 0x24c2: 0x00c0, 0x24c3: 0x00c0, 0x24c4: 0x00c0, 0x24c5: 0x00c0, + 0x24c6: 0x00c0, 0x24c7: 0x00c0, 0x24c8: 0x00c0, 0x24c9: 0x00c0, 0x24ca: 0x00c0, 0x24cb: 0x00c0, + 0x24cc: 0x00c0, 0x24cd: 0x00c0, 0x24ce: 0x00c0, 0x24cf: 0x00c0, 0x24d0: 0x00c0, 0x24d1: 0x00c0, + 0x24d2: 0x00c0, 0x24d3: 0x00c0, 0x24d4: 0x00c0, 0x24d5: 0x00c0, 0x24d6: 0x00c0, 0x24d7: 0x00c0, + 0x24d8: 0x00c0, 0x24d9: 0x00c0, 0x24da: 0x00c0, 0x24db: 0x00c0, 0x24dc: 0x00c0, 0x24dd: 0x00c0, + 0x24de: 0x00c0, 0x24df: 0x00c0, 0x24e0: 0x00c0, 0x24e1: 0x00c0, 0x24e2: 0x00c0, 0x24e3: 0x00c0, + 0x24e4: 0x00c0, 0x24e5: 0x00c0, 0x24e6: 0x00c0, 0x24e7: 0x00c0, 0x24e8: 0x00c0, 0x24e9: 0x00c0, + 0x24ea: 0x00c0, 0x24eb: 0x00c0, 0x24ec: 0x00c0, 0x24ed: 0x00c0, 0x24ee: 0x00c0, 0x24ef: 0x00c3, + 0x24f0: 0x0083, 0x24f1: 0x0083, 0x24f2: 0x0083, 0x24f3: 0x0080, 0x24f4: 0x00c3, 0x24f5: 0x00c3, + 0x24f6: 0x00c3, 0x24f7: 0x00c3, 0x24f8: 0x00c3, 0x24f9: 0x00c3, 0x24fa: 0x00c3, 0x24fb: 0x00c3, + 0x24fc: 0x00c3, 0x24fd: 0x00c3, 0x24fe: 0x0080, 0x24ff: 0x00c0, + // Block 0x94, offset 0x2500 + 0x2500: 0x00c0, 0x2501: 0x00c0, 0x2502: 0x00c0, 0x2503: 0x00c0, 0x2504: 0x00c0, 0x2505: 0x00c0, + 0x2506: 0x00c0, 0x2507: 0x00c0, 0x2508: 0x00c0, 0x2509: 0x00c0, 0x250a: 0x00c0, 0x250b: 0x00c0, + 0x250c: 0x00c0, 0x250d: 0x00c0, 0x250e: 0x00c0, 0x250f: 0x00c0, 0x2510: 0x00c0, 0x2511: 0x00c0, + 0x2512: 0x00c0, 0x2513: 0x00c0, 0x2514: 0x00c0, 0x2515: 0x00c0, 0x2516: 0x00c0, 0x2517: 0x00c0, + 0x2518: 0x00c0, 0x2519: 0x00c0, 0x251a: 0x00c0, 0x251b: 0x00c0, 0x251c: 0x0080, 0x251d: 0x0080, + 0x251e: 0x00c3, 0x251f: 0x00c3, 0x2520: 0x00c0, 0x2521: 0x00c0, 0x2522: 0x00c0, 0x2523: 0x00c0, + 0x2524: 0x00c0, 0x2525: 0x00c0, 0x2526: 0x00c0, 0x2527: 0x00c0, 0x2528: 0x00c0, 0x2529: 0x00c0, + 0x252a: 0x00c0, 0x252b: 0x00c0, 0x252c: 0x00c0, 0x252d: 0x00c0, 0x252e: 0x00c0, 0x252f: 0x00c0, + 0x2530: 0x00c0, 0x2531: 0x00c0, 0x2532: 0x00c0, 0x2533: 0x00c0, 0x2534: 0x00c0, 0x2535: 0x00c0, + 0x2536: 0x00c0, 0x2537: 0x00c0, 0x2538: 0x00c0, 0x2539: 0x00c0, 0x253a: 0x00c0, 0x253b: 0x00c0, + 0x253c: 0x00c0, 0x253d: 0x00c0, 0x253e: 0x00c0, 0x253f: 0x00c0, + // Block 0x95, offset 0x2540 + 0x2540: 0x00c0, 0x2541: 0x00c0, 0x2542: 0x00c0, 0x2543: 0x00c0, 0x2544: 0x00c0, 0x2545: 0x00c0, + 0x2546: 0x00c0, 0x2547: 0x00c0, 0x2548: 0x00c0, 0x2549: 0x00c0, 0x254a: 0x00c0, 0x254b: 0x00c0, + 0x254c: 0x00c0, 0x254d: 0x00c0, 0x254e: 0x00c0, 0x254f: 0x00c0, 0x2550: 0x00c0, 0x2551: 0x00c0, + 0x2552: 0x00c0, 0x2553: 0x00c0, 0x2554: 0x00c0, 0x2555: 0x00c0, 0x2556: 0x00c0, 0x2557: 0x00c0, + 0x2558: 0x00c0, 0x2559: 0x00c0, 0x255a: 0x00c0, 0x255b: 0x00c0, 0x255c: 0x00c0, 0x255d: 0x00c0, + 0x255e: 0x00c0, 0x255f: 0x00c0, 0x2560: 0x00c0, 0x2561: 0x00c0, 0x2562: 0x00c0, 0x2563: 0x00c0, + 0x2564: 0x00c0, 0x2565: 0x00c0, 0x2566: 0x0080, 0x2567: 0x0080, 0x2568: 0x0080, 0x2569: 0x0080, + 0x256a: 0x0080, 0x256b: 0x0080, 0x256c: 0x0080, 0x256d: 0x0080, 0x256e: 0x0080, 0x256f: 0x0080, + 0x2570: 0x00c3, 0x2571: 0x00c3, 0x2572: 0x0080, 0x2573: 0x0080, 0x2574: 0x0080, 0x2575: 0x0080, + 0x2576: 0x0080, 0x2577: 0x0080, + // Block 0x96, offset 0x2580 + 0x2580: 0x0080, 0x2581: 0x0080, 0x2582: 0x0080, 0x2583: 0x0080, 0x2584: 0x0080, 0x2585: 0x0080, + 0x2586: 0x0080, 0x2587: 0x0080, 0x2588: 0x0080, 0x2589: 0x0080, 0x258a: 0x0080, 0x258b: 0x0080, + 0x258c: 0x0080, 0x258d: 0x0080, 0x258e: 0x0080, 0x258f: 0x0080, 0x2590: 0x0080, 0x2591: 0x0080, + 0x2592: 0x0080, 0x2593: 0x0080, 0x2594: 0x0080, 0x2595: 0x0080, 0x2596: 0x0080, 0x2597: 0x00c0, + 0x2598: 0x00c0, 0x2599: 0x00c0, 0x259a: 0x00c0, 0x259b: 0x00c0, 0x259c: 0x00c0, 0x259d: 0x00c0, + 0x259e: 0x00c0, 0x259f: 0x00c0, 0x25a0: 0x0080, 0x25a1: 0x0080, 0x25a2: 0x00c0, 0x25a3: 0x00c0, + 0x25a4: 0x00c0, 0x25a5: 0x00c0, 0x25a6: 0x00c0, 0x25a7: 0x00c0, 0x25a8: 0x00c0, 0x25a9: 0x00c0, + 0x25aa: 0x00c0, 0x25ab: 0x00c0, 0x25ac: 0x00c0, 0x25ad: 0x00c0, 0x25ae: 0x00c0, 0x25af: 0x00c0, + 0x25b0: 0x00c0, 0x25b1: 0x00c0, 0x25b2: 0x00c0, 0x25b3: 0x00c0, 0x25b4: 0x00c0, 0x25b5: 0x00c0, + 0x25b6: 0x00c0, 0x25b7: 0x00c0, 0x25b8: 0x00c0, 0x25b9: 0x00c0, 0x25ba: 0x00c0, 0x25bb: 0x00c0, + 0x25bc: 0x00c0, 0x25bd: 0x00c0, 0x25be: 0x00c0, 0x25bf: 0x00c0, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x00c0, 0x25c1: 0x00c0, 0x25c2: 0x00c0, 0x25c3: 0x00c0, 0x25c4: 0x00c0, 0x25c5: 0x00c0, + 0x25c6: 0x00c0, 0x25c7: 0x00c0, 0x25c8: 0x00c0, 0x25c9: 0x00c0, 0x25ca: 0x00c0, 0x25cb: 0x00c0, + 0x25cc: 0x00c0, 0x25cd: 0x00c0, 0x25ce: 0x00c0, 0x25cf: 0x00c0, 0x25d0: 0x00c0, 0x25d1: 0x00c0, + 0x25d2: 0x00c0, 0x25d3: 0x00c0, 0x25d4: 0x00c0, 0x25d5: 0x00c0, 0x25d6: 0x00c0, 0x25d7: 0x00c0, + 0x25d8: 0x00c0, 0x25d9: 0x00c0, 0x25da: 0x00c0, 0x25db: 0x00c0, 0x25dc: 0x00c0, 0x25dd: 0x00c0, + 0x25de: 0x00c0, 0x25df: 0x00c0, 0x25e0: 0x00c0, 0x25e1: 0x00c0, 0x25e2: 0x00c0, 0x25e3: 0x00c0, + 0x25e4: 0x00c0, 0x25e5: 0x00c0, 0x25e6: 0x00c0, 0x25e7: 0x00c0, 0x25e8: 0x00c0, 0x25e9: 0x00c0, + 0x25ea: 0x00c0, 0x25eb: 0x00c0, 0x25ec: 0x00c0, 0x25ed: 0x00c0, 0x25ee: 0x00c0, 0x25ef: 0x00c0, + 0x25f0: 0x0080, 0x25f1: 0x00c0, 0x25f2: 0x00c0, 0x25f3: 0x00c0, 0x25f4: 0x00c0, 0x25f5: 0x00c0, + 0x25f6: 0x00c0, 0x25f7: 0x00c0, 0x25f8: 0x00c0, 0x25f9: 0x00c0, 0x25fa: 0x00c0, 0x25fb: 0x00c0, + 0x25fc: 0x00c0, 0x25fd: 0x00c0, 0x25fe: 0x00c0, 0x25ff: 0x00c0, + // Block 0x98, offset 0x2600 + 0x2600: 0x00c0, 0x2601: 0x00c0, 0x2602: 0x00c0, 0x2603: 0x00c0, 0x2604: 0x00c0, 0x2605: 0x00c0, + 0x2606: 0x00c0, 0x2607: 0x00c0, 0x2608: 0x00c0, 0x2609: 0x0080, 0x260a: 0x0080, 0x260b: 0x00c0, + 0x260c: 0x00c0, 0x260d: 0x00c0, 0x260e: 0x00c0, 0x260f: 0x00c0, 0x2610: 0x00c0, 0x2611: 0x00c0, + 0x2612: 0x00c0, 0x2613: 0x00c0, 0x2614: 0x00c0, 0x2615: 0x00c0, 0x2616: 0x00c0, 0x2617: 0x00c0, + 0x2618: 0x00c0, 0x2619: 0x00c0, 0x261a: 0x00c0, 0x261b: 0x00c0, 0x261c: 0x00c0, 0x261d: 0x00c0, + 0x261e: 0x00c0, 0x261f: 0x00c0, 0x2620: 0x00c0, 0x2621: 0x00c0, 0x2622: 0x00c0, 0x2623: 0x00c0, + 0x2624: 0x00c0, 0x2625: 0x00c0, 0x2626: 0x00c0, 0x2627: 0x00c0, 0x2628: 0x00c0, 0x2629: 0x00c0, + 0x262a: 0x00c0, 0x262b: 0x00c0, 0x262c: 0x00c0, 0x262d: 0x00c0, 0x262e: 0x00c0, 0x262f: 0x00c0, + 0x2630: 0x00c0, 0x2631: 0x00c0, 0x2632: 0x00c0, 0x2633: 0x00c0, 0x2634: 0x00c0, 0x2635: 0x00c0, + 0x2636: 0x00c0, 0x2637: 0x00c0, 0x2638: 0x00c0, 0x2639: 0x00c0, 0x263a: 0x00c0, 0x263b: 0x00c0, + 0x263c: 0x00c0, 0x263d: 0x00c0, 0x263e: 0x00c0, 0x263f: 0x00c0, + // Block 0x99, offset 0x2640 + 0x2640: 0x00c0, 0x2641: 0x00c0, 0x2642: 0x00c0, 0x2643: 0x00c0, 0x2644: 0x00c0, 0x2645: 0x00c0, + 0x2646: 0x00c0, 0x2647: 0x00c0, 0x2648: 0x00c0, 0x2649: 0x00c0, 0x264a: 0x00c0, + 0x2650: 0x00c0, 0x2651: 0x00c0, + 0x2653: 0x00c0, 0x2655: 0x00c0, 0x2656: 0x00c0, 0x2657: 0x00c0, + 0x2658: 0x00c0, 0x2659: 0x00c0, + 0x2672: 0x0080, 0x2673: 0x0080, 0x2674: 0x0080, 0x2675: 0x00c0, + 0x2676: 0x00c0, 0x2677: 0x00c0, 0x2678: 0x0080, 0x2679: 0x0080, 0x267a: 0x00c0, 0x267b: 0x00c0, + 0x267c: 0x00c0, 0x267d: 0x00c0, 0x267e: 0x00c0, 0x267f: 0x00c0, + // Block 0x9a, offset 0x2680 + 0x2680: 0x00c0, 0x2681: 0x00c0, 0x2682: 0x00c3, 0x2683: 0x00c0, 0x2684: 0x00c0, 0x2685: 0x00c0, + 0x2686: 0x00c6, 0x2687: 0x00c0, 0x2688: 0x00c0, 0x2689: 0x00c0, 0x268a: 0x00c0, 0x268b: 0x00c3, + 0x268c: 0x00c0, 0x268d: 0x00c0, 0x268e: 0x00c0, 0x268f: 0x00c0, 0x2690: 0x00c0, 0x2691: 0x00c0, + 0x2692: 0x00c0, 0x2693: 0x00c0, 0x2694: 0x00c0, 0x2695: 0x00c0, 0x2696: 0x00c0, 0x2697: 0x00c0, + 0x2698: 0x00c0, 0x2699: 0x00c0, 0x269a: 0x00c0, 0x269b: 0x00c0, 0x269c: 0x00c0, 0x269d: 0x00c0, + 0x269e: 0x00c0, 0x269f: 0x00c0, 0x26a0: 0x00c0, 0x26a1: 0x00c0, 0x26a2: 0x00c0, 0x26a3: 0x00c0, + 0x26a4: 0x00c0, 0x26a5: 0x00c3, 0x26a6: 0x00c3, 0x26a7: 0x00c0, 0x26a8: 0x0080, 0x26a9: 0x0080, + 0x26aa: 0x0080, 0x26ab: 0x0080, 0x26ac: 0x00c6, + 0x26b0: 0x0080, 0x26b1: 0x0080, 0x26b2: 0x0080, 0x26b3: 0x0080, 0x26b4: 0x0080, 0x26b5: 0x0080, + 0x26b6: 0x0080, 0x26b7: 0x0080, 0x26b8: 0x0080, 0x26b9: 0x0080, + // Block 0x9b, offset 0x26c0 + 0x26c0: 0x00c2, 0x26c1: 0x00c2, 0x26c2: 0x00c2, 0x26c3: 0x00c2, 0x26c4: 0x00c2, 0x26c5: 0x00c2, + 0x26c6: 0x00c2, 0x26c7: 0x00c2, 0x26c8: 0x00c2, 0x26c9: 0x00c2, 0x26ca: 0x00c2, 0x26cb: 0x00c2, + 0x26cc: 0x00c2, 0x26cd: 0x00c2, 0x26ce: 0x00c2, 0x26cf: 0x00c2, 0x26d0: 0x00c2, 0x26d1: 0x00c2, + 0x26d2: 0x00c2, 0x26d3: 0x00c2, 0x26d4: 0x00c2, 0x26d5: 0x00c2, 0x26d6: 0x00c2, 0x26d7: 0x00c2, + 0x26d8: 0x00c2, 0x26d9: 0x00c2, 0x26da: 0x00c2, 0x26db: 0x00c2, 0x26dc: 0x00c2, 0x26dd: 0x00c2, + 0x26de: 0x00c2, 0x26df: 0x00c2, 0x26e0: 0x00c2, 0x26e1: 0x00c2, 0x26e2: 0x00c2, 0x26e3: 0x00c2, + 0x26e4: 0x00c2, 0x26e5: 0x00c2, 0x26e6: 0x00c2, 0x26e7: 0x00c2, 0x26e8: 0x00c2, 0x26e9: 0x00c2, + 0x26ea: 0x00c2, 0x26eb: 0x00c2, 0x26ec: 0x00c2, 0x26ed: 0x00c2, 0x26ee: 0x00c2, 0x26ef: 0x00c2, + 0x26f0: 0x00c2, 0x26f1: 0x00c2, 0x26f2: 0x00c1, 0x26f3: 0x00c0, 0x26f4: 0x0080, 0x26f5: 0x0080, + 0x26f6: 0x0080, 0x26f7: 0x0080, + // Block 0x9c, offset 0x2700 + 0x2700: 0x00c0, 0x2701: 0x00c0, 0x2702: 0x00c0, 0x2703: 0x00c0, 0x2704: 0x00c6, 0x2705: 0x00c3, + 0x270e: 0x0080, 0x270f: 0x0080, 0x2710: 0x00c0, 0x2711: 0x00c0, + 0x2712: 0x00c0, 0x2713: 0x00c0, 0x2714: 0x00c0, 0x2715: 0x00c0, 0x2716: 0x00c0, 0x2717: 0x00c0, + 0x2718: 0x00c0, 0x2719: 0x00c0, + 0x2720: 0x00c3, 0x2721: 0x00c3, 0x2722: 0x00c3, 0x2723: 0x00c3, + 0x2724: 0x00c3, 0x2725: 0x00c3, 0x2726: 0x00c3, 0x2727: 0x00c3, 0x2728: 0x00c3, 0x2729: 0x00c3, + 0x272a: 0x00c3, 0x272b: 0x00c3, 0x272c: 0x00c3, 0x272d: 0x00c3, 0x272e: 0x00c3, 0x272f: 0x00c3, + 0x2730: 0x00c3, 0x2731: 0x00c3, 0x2732: 0x00c0, 0x2733: 0x00c0, 0x2734: 0x00c0, 0x2735: 0x00c0, + 0x2736: 0x00c0, 0x2737: 0x00c0, 0x2738: 0x0080, 0x2739: 0x0080, 0x273a: 0x0080, 0x273b: 0x00c0, + 0x273c: 0x0080, 0x273d: 0x00c0, 0x273e: 0x00c0, 0x273f: 0x00c3, + // Block 0x9d, offset 0x2740 + 0x2740: 0x00c0, 0x2741: 0x00c0, 0x2742: 0x00c0, 0x2743: 0x00c0, 0x2744: 0x00c0, 0x2745: 0x00c0, + 0x2746: 0x00c0, 0x2747: 0x00c0, 0x2748: 0x00c0, 0x2749: 0x00c0, 0x274a: 0x00c0, 0x274b: 0x00c0, + 0x274c: 0x00c0, 0x274d: 0x00c0, 0x274e: 0x00c0, 0x274f: 0x00c0, 0x2750: 0x00c0, 0x2751: 0x00c0, + 0x2752: 0x00c0, 0x2753: 0x00c0, 0x2754: 0x00c0, 0x2755: 0x00c0, 0x2756: 0x00c0, 0x2757: 0x00c0, + 0x2758: 0x00c0, 0x2759: 0x00c0, 0x275a: 0x00c0, 0x275b: 0x00c0, 0x275c: 0x00c0, 0x275d: 0x00c0, + 0x275e: 0x00c0, 0x275f: 0x00c0, 0x2760: 0x00c0, 0x2761: 0x00c0, 0x2762: 0x00c0, 0x2763: 0x00c0, + 0x2764: 0x00c0, 0x2765: 0x00c0, 0x2766: 0x00c3, 0x2767: 0x00c3, 0x2768: 0x00c3, 0x2769: 0x00c3, + 0x276a: 0x00c3, 0x276b: 0x00c3, 0x276c: 0x00c3, 0x276d: 0x00c3, 0x276e: 0x0080, 0x276f: 0x0080, + 0x2770: 0x00c0, 0x2771: 0x00c0, 0x2772: 0x00c0, 0x2773: 0x00c0, 0x2774: 0x00c0, 0x2775: 0x00c0, + 0x2776: 0x00c0, 0x2777: 0x00c0, 0x2778: 0x00c0, 0x2779: 0x00c0, 0x277a: 0x00c0, 0x277b: 0x00c0, + 0x277c: 0x00c0, 0x277d: 0x00c0, 0x277e: 0x00c0, 0x277f: 0x00c0, + // Block 0x9e, offset 0x2780 + 0x2780: 0x00c0, 0x2781: 0x00c0, 0x2782: 0x00c0, 0x2783: 0x00c0, 0x2784: 0x00c0, 0x2785: 0x00c0, + 0x2786: 0x00c0, 0x2787: 0x00c3, 0x2788: 0x00c3, 0x2789: 0x00c3, 0x278a: 0x00c3, 0x278b: 0x00c3, + 0x278c: 0x00c3, 0x278d: 0x00c3, 0x278e: 0x00c3, 0x278f: 0x00c3, 0x2790: 0x00c3, 0x2791: 0x00c3, + 0x2792: 0x00c0, 0x2793: 0x00c5, + 0x279f: 0x0080, 0x27a0: 0x0040, 0x27a1: 0x0040, 0x27a2: 0x0040, 0x27a3: 0x0040, + 0x27a4: 0x0040, 0x27a5: 0x0040, 0x27a6: 0x0040, 0x27a7: 0x0040, 0x27a8: 0x0040, 0x27a9: 0x0040, + 0x27aa: 0x0040, 0x27ab: 0x0040, 0x27ac: 0x0040, 0x27ad: 0x0040, 0x27ae: 0x0040, 0x27af: 0x0040, + 0x27b0: 0x0040, 0x27b1: 0x0040, 0x27b2: 0x0040, 0x27b3: 0x0040, 0x27b4: 0x0040, 0x27b5: 0x0040, + 0x27b6: 0x0040, 0x27b7: 0x0040, 0x27b8: 0x0040, 0x27b9: 0x0040, 0x27ba: 0x0040, 0x27bb: 0x0040, + 0x27bc: 0x0040, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x00c3, 0x27c1: 0x00c3, 0x27c2: 0x00c3, 0x27c3: 0x00c0, 0x27c4: 0x00c0, 0x27c5: 0x00c0, + 0x27c6: 0x00c0, 0x27c7: 0x00c0, 0x27c8: 0x00c0, 0x27c9: 0x00c0, 0x27ca: 0x00c0, 0x27cb: 0x00c0, + 0x27cc: 0x00c0, 0x27cd: 0x00c0, 0x27ce: 0x00c0, 0x27cf: 0x00c0, 0x27d0: 0x00c0, 0x27d1: 0x00c0, + 0x27d2: 0x00c0, 0x27d3: 0x00c0, 0x27d4: 0x00c0, 0x27d5: 0x00c0, 0x27d6: 0x00c0, 0x27d7: 0x00c0, + 0x27d8: 0x00c0, 0x27d9: 0x00c0, 0x27da: 0x00c0, 0x27db: 0x00c0, 0x27dc: 0x00c0, 0x27dd: 0x00c0, + 0x27de: 0x00c0, 0x27df: 0x00c0, 0x27e0: 0x00c0, 0x27e1: 0x00c0, 0x27e2: 0x00c0, 0x27e3: 0x00c0, + 0x27e4: 0x00c0, 0x27e5: 0x00c0, 0x27e6: 0x00c0, 0x27e7: 0x00c0, 0x27e8: 0x00c0, 0x27e9: 0x00c0, + 0x27ea: 0x00c0, 0x27eb: 0x00c0, 0x27ec: 0x00c0, 0x27ed: 0x00c0, 0x27ee: 0x00c0, 0x27ef: 0x00c0, + 0x27f0: 0x00c0, 0x27f1: 0x00c0, 0x27f2: 0x00c0, 0x27f3: 0x00c3, 0x27f4: 0x00c0, 0x27f5: 0x00c0, + 0x27f6: 0x00c3, 0x27f7: 0x00c3, 0x27f8: 0x00c3, 0x27f9: 0x00c3, 0x27fa: 0x00c0, 0x27fb: 0x00c0, + 0x27fc: 0x00c3, 0x27fd: 0x00c3, 0x27fe: 0x00c0, 0x27ff: 0x00c0, + // Block 0xa0, offset 0x2800 + 0x2800: 0x00c5, 0x2801: 0x0080, 0x2802: 0x0080, 0x2803: 0x0080, 0x2804: 0x0080, 0x2805: 0x0080, + 0x2806: 0x0080, 0x2807: 0x0080, 0x2808: 0x0080, 0x2809: 0x0080, 0x280a: 0x0080, 0x280b: 0x0080, + 0x280c: 0x0080, 0x280d: 0x0080, 0x280f: 0x00c0, 0x2810: 0x00c0, 0x2811: 0x00c0, + 0x2812: 0x00c0, 0x2813: 0x00c0, 0x2814: 0x00c0, 0x2815: 0x00c0, 0x2816: 0x00c0, 0x2817: 0x00c0, + 0x2818: 0x00c0, 0x2819: 0x00c0, + 0x281e: 0x0080, 0x281f: 0x0080, 0x2820: 0x00c0, 0x2821: 0x00c0, 0x2822: 0x00c0, 0x2823: 0x00c0, + 0x2824: 0x00c0, 0x2825: 0x00c3, 0x2826: 0x00c0, 0x2827: 0x00c0, 0x2828: 0x00c0, 0x2829: 0x00c0, + 0x282a: 0x00c0, 0x282b: 0x00c0, 0x282c: 0x00c0, 0x282d: 0x00c0, 0x282e: 0x00c0, 0x282f: 0x00c0, + 0x2830: 0x00c0, 0x2831: 0x00c0, 0x2832: 0x00c0, 0x2833: 0x00c0, 0x2834: 0x00c0, 0x2835: 0x00c0, + 0x2836: 0x00c0, 0x2837: 0x00c0, 0x2838: 0x00c0, 0x2839: 0x00c0, 0x283a: 0x00c0, 0x283b: 0x00c0, + 0x283c: 0x00c0, 0x283d: 0x00c0, 0x283e: 0x00c0, + // Block 0xa1, offset 0x2840 + 0x2840: 0x00c0, 0x2841: 0x00c0, 0x2842: 0x00c0, 0x2843: 0x00c0, 0x2844: 0x00c0, 0x2845: 0x00c0, + 0x2846: 0x00c0, 0x2847: 0x00c0, 0x2848: 0x00c0, 0x2849: 0x00c0, 0x284a: 0x00c0, 0x284b: 0x00c0, + 0x284c: 0x00c0, 0x284d: 0x00c0, 0x284e: 0x00c0, 0x284f: 0x00c0, 0x2850: 0x00c0, 0x2851: 0x00c0, + 0x2852: 0x00c0, 0x2853: 0x00c0, 0x2854: 0x00c0, 0x2855: 0x00c0, 0x2856: 0x00c0, 0x2857: 0x00c0, + 0x2858: 0x00c0, 0x2859: 0x00c0, 0x285a: 0x00c0, 0x285b: 0x00c0, 0x285c: 0x00c0, 0x285d: 0x00c0, + 0x285e: 0x00c0, 0x285f: 0x00c0, 0x2860: 0x00c0, 0x2861: 0x00c0, 0x2862: 0x00c0, 0x2863: 0x00c0, + 0x2864: 0x00c0, 0x2865: 0x00c0, 0x2866: 0x00c0, 0x2867: 0x00c0, 0x2868: 0x00c0, 0x2869: 0x00c3, + 0x286a: 0x00c3, 0x286b: 0x00c3, 0x286c: 0x00c3, 0x286d: 0x00c3, 0x286e: 0x00c3, 0x286f: 0x00c0, + 0x2870: 0x00c0, 0x2871: 0x00c3, 0x2872: 0x00c3, 0x2873: 0x00c0, 0x2874: 0x00c0, 0x2875: 0x00c3, + 0x2876: 0x00c3, + // Block 0xa2, offset 0x2880 + 0x2880: 0x00c0, 0x2881: 0x00c0, 0x2882: 0x00c0, 0x2883: 0x00c3, 0x2884: 0x00c0, 0x2885: 0x00c0, + 0x2886: 0x00c0, 0x2887: 0x00c0, 0x2888: 0x00c0, 0x2889: 0x00c0, 0x288a: 0x00c0, 0x288b: 0x00c0, + 0x288c: 0x00c3, 0x288d: 0x00c0, 0x2890: 0x00c0, 0x2891: 0x00c0, + 0x2892: 0x00c0, 0x2893: 0x00c0, 0x2894: 0x00c0, 0x2895: 0x00c0, 0x2896: 0x00c0, 0x2897: 0x00c0, + 0x2898: 0x00c0, 0x2899: 0x00c0, 0x289c: 0x0080, 0x289d: 0x0080, + 0x289e: 0x0080, 0x289f: 0x0080, 0x28a0: 0x00c0, 0x28a1: 0x00c0, 0x28a2: 0x00c0, 0x28a3: 0x00c0, + 0x28a4: 0x00c0, 0x28a5: 0x00c0, 0x28a6: 0x00c0, 0x28a7: 0x00c0, 0x28a8: 0x00c0, 0x28a9: 0x00c0, + 0x28aa: 0x00c0, 0x28ab: 0x00c0, 0x28ac: 0x00c0, 0x28ad: 0x00c0, 0x28ae: 0x00c0, 0x28af: 0x00c0, + 0x28b0: 0x00c0, 0x28b1: 0x00c0, 0x28b2: 0x00c0, 0x28b3: 0x00c0, 0x28b4: 0x00c0, 0x28b5: 0x00c0, + 0x28b6: 0x00c0, 0x28b7: 0x0080, 0x28b8: 0x0080, 0x28b9: 0x0080, 0x28ba: 0x00c0, 0x28bb: 0x00c0, + 0x28bc: 0x00c3, 0x28bd: 0x00c0, 0x28be: 0x00c0, 0x28bf: 0x00c0, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x00c0, 0x28c1: 0x00c0, 0x28c2: 0x00c0, 0x28c3: 0x00c0, 0x28c4: 0x00c0, 0x28c5: 0x00c0, + 0x28c6: 0x00c0, 0x28c7: 0x00c0, 0x28c8: 0x00c0, 0x28c9: 0x00c0, 0x28ca: 0x00c0, 0x28cb: 0x00c0, + 0x28cc: 0x00c0, 0x28cd: 0x00c0, 0x28ce: 0x00c0, 0x28cf: 0x00c0, 0x28d0: 0x00c0, 0x28d1: 0x00c0, + 0x28d2: 0x00c0, 0x28d3: 0x00c0, 0x28d4: 0x00c0, 0x28d5: 0x00c0, 0x28d6: 0x00c0, 0x28d7: 0x00c0, + 0x28d8: 0x00c0, 0x28d9: 0x00c0, 0x28da: 0x00c0, 0x28db: 0x00c0, 0x28dc: 0x00c0, 0x28dd: 0x00c0, + 0x28de: 0x00c0, 0x28df: 0x00c0, 0x28e0: 0x00c0, 0x28e1: 0x00c0, 0x28e2: 0x00c0, 0x28e3: 0x00c0, + 0x28e4: 0x00c0, 0x28e5: 0x00c0, 0x28e6: 0x00c0, 0x28e7: 0x00c0, 0x28e8: 0x00c0, 0x28e9: 0x00c0, + 0x28ea: 0x00c0, 0x28eb: 0x00c0, 0x28ec: 0x00c0, 0x28ed: 0x00c0, 0x28ee: 0x00c0, 0x28ef: 0x00c0, + 0x28f0: 0x00c3, 0x28f1: 0x00c0, 0x28f2: 0x00c3, 0x28f3: 0x00c3, 0x28f4: 0x00c3, 0x28f5: 0x00c0, + 0x28f6: 0x00c0, 0x28f7: 0x00c3, 0x28f8: 0x00c3, 0x28f9: 0x00c0, 0x28fa: 0x00c0, 0x28fb: 0x00c0, + 0x28fc: 0x00c0, 0x28fd: 0x00c0, 0x28fe: 0x00c3, 0x28ff: 0x00c3, + // Block 0xa4, offset 0x2900 + 0x2900: 0x00c0, 0x2901: 0x00c3, 0x2902: 0x00c0, + 0x291b: 0x00c0, 0x291c: 0x00c0, 0x291d: 0x00c0, + 0x291e: 0x0080, 0x291f: 0x0080, 0x2920: 0x00c0, 0x2921: 0x00c0, 0x2922: 0x00c0, 0x2923: 0x00c0, + 0x2924: 0x00c0, 0x2925: 0x00c0, 0x2926: 0x00c0, 0x2927: 0x00c0, 0x2928: 0x00c0, 0x2929: 0x00c0, + 0x292a: 0x00c0, 0x292b: 0x00c0, 0x292c: 0x00c3, 0x292d: 0x00c3, 0x292e: 0x00c0, 0x292f: 0x00c0, + 0x2930: 0x0080, 0x2931: 0x0080, 0x2932: 0x00c0, 0x2933: 0x00c0, 0x2934: 0x00c0, 0x2935: 0x00c0, + 0x2936: 0x00c6, + // Block 0xa5, offset 0x2940 + 0x2941: 0x00c0, 0x2942: 0x00c0, 0x2943: 0x00c0, 0x2944: 0x00c0, 0x2945: 0x00c0, + 0x2946: 0x00c0, 0x2949: 0x00c0, 0x294a: 0x00c0, 0x294b: 0x00c0, + 0x294c: 0x00c0, 0x294d: 0x00c0, 0x294e: 0x00c0, 0x2951: 0x00c0, + 0x2952: 0x00c0, 0x2953: 0x00c0, 0x2954: 0x00c0, 0x2955: 0x00c0, 0x2956: 0x00c0, + 0x2960: 0x00c0, 0x2961: 0x00c0, 0x2962: 0x00c0, 0x2963: 0x00c0, + 0x2964: 0x00c0, 0x2965: 0x00c0, 0x2966: 0x00c0, 0x2968: 0x00c0, 0x2969: 0x00c0, + 0x296a: 0x00c0, 0x296b: 0x00c0, 0x296c: 0x00c0, 0x296d: 0x00c0, 0x296e: 0x00c0, + 0x2970: 0x00c0, 0x2971: 0x00c0, 0x2972: 0x00c0, 0x2973: 0x00c0, 0x2974: 0x00c0, 0x2975: 0x00c0, + 0x2976: 0x00c0, 0x2977: 0x00c0, 0x2978: 0x00c0, 0x2979: 0x00c0, 0x297a: 0x00c0, 0x297b: 0x00c0, + 0x297c: 0x00c0, 0x297d: 0x00c0, 0x297e: 0x00c0, 0x297f: 0x00c0, + // Block 0xa6, offset 0x2980 + 0x2980: 0x00c0, 0x2981: 0x00c0, 0x2982: 0x00c0, 0x2983: 0x00c0, 0x2984: 0x00c0, 0x2985: 0x00c0, + 0x2986: 0x00c0, 0x2987: 0x00c0, 0x2988: 0x00c0, 0x2989: 0x00c0, 0x298a: 0x00c0, 0x298b: 0x00c0, + 0x298c: 0x00c0, 0x298d: 0x00c0, 0x298e: 0x00c0, 0x298f: 0x00c0, 0x2990: 0x00c0, 0x2991: 0x00c0, + 0x2992: 0x00c0, 0x2993: 0x00c0, 0x2994: 0x00c0, 0x2995: 0x00c0, 0x2996: 0x00c0, 0x2997: 0x00c0, + 0x2998: 0x00c0, 0x2999: 0x00c0, 0x299a: 0x00c0, 0x299b: 0x0080, 0x299c: 0x0080, 0x299d: 0x0080, + 0x299e: 0x0080, 0x299f: 0x0080, 0x29a0: 0x00c0, 0x29a1: 0x00c0, 0x29a2: 0x00c0, 0x29a3: 0x00c0, + 0x29a4: 0x00c0, 0x29a5: 0x00c8, 0x29a6: 0x00c0, 0x29a7: 0x00c0, 0x29a8: 0x00c0, 0x29a9: 0x0080, + 0x29aa: 0x0080, 0x29ab: 0x0080, + 0x29b0: 0x00c0, 0x29b1: 0x00c0, 0x29b2: 0x00c0, 0x29b3: 0x00c0, 0x29b4: 0x00c0, 0x29b5: 0x00c0, + 0x29b6: 0x00c0, 0x29b7: 0x00c0, 0x29b8: 0x00c0, 0x29b9: 0x00c0, 0x29ba: 0x00c0, 0x29bb: 0x00c0, + 0x29bc: 0x00c0, 0x29bd: 0x00c0, 0x29be: 0x00c0, 0x29bf: 0x00c0, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x00c0, 0x29c1: 0x00c0, 0x29c2: 0x00c0, 0x29c3: 0x00c0, 0x29c4: 0x00c0, 0x29c5: 0x00c0, + 0x29c6: 0x00c0, 0x29c7: 0x00c0, 0x29c8: 0x00c0, 0x29c9: 0x00c0, 0x29ca: 0x00c0, 0x29cb: 0x00c0, + 0x29cc: 0x00c0, 0x29cd: 0x00c0, 0x29ce: 0x00c0, 0x29cf: 0x00c0, 0x29d0: 0x00c0, 0x29d1: 0x00c0, + 0x29d2: 0x00c0, 0x29d3: 0x00c0, 0x29d4: 0x00c0, 0x29d5: 0x00c0, 0x29d6: 0x00c0, 0x29d7: 0x00c0, + 0x29d8: 0x00c0, 0x29d9: 0x00c0, 0x29da: 0x00c0, 0x29db: 0x00c0, 0x29dc: 0x00c0, 0x29dd: 0x00c0, + 0x29de: 0x00c0, 0x29df: 0x00c0, 0x29e0: 0x00c0, 0x29e1: 0x00c0, 0x29e2: 0x00c0, 0x29e3: 0x00c0, + 0x29e4: 0x00c0, 0x29e5: 0x00c3, 0x29e6: 0x00c0, 0x29e7: 0x00c0, 0x29e8: 0x00c3, 0x29e9: 0x00c0, + 0x29ea: 0x00c0, 0x29eb: 0x0080, 0x29ec: 0x00c0, 0x29ed: 0x00c6, + 0x29f0: 0x00c0, 0x29f1: 0x00c0, 0x29f2: 0x00c0, 0x29f3: 0x00c0, 0x29f4: 0x00c0, 0x29f5: 0x00c0, + 0x29f6: 0x00c0, 0x29f7: 0x00c0, 0x29f8: 0x00c0, 0x29f9: 0x00c0, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x00c0, 0x2a01: 0x00c0, 0x2a02: 0x00c0, 0x2a03: 0x00c0, 0x2a04: 0x00c0, 0x2a05: 0x00c0, + 0x2a06: 0x00c0, 0x2a07: 0x00c0, 0x2a08: 0x00c0, 0x2a09: 0x00c0, 0x2a0a: 0x00c0, 0x2a0b: 0x00c0, + 0x2a0c: 0x00c0, 0x2a0d: 0x00c0, 0x2a0e: 0x00c0, 0x2a0f: 0x00c0, 0x2a10: 0x00c0, 0x2a11: 0x00c0, + 0x2a12: 0x00c0, 0x2a13: 0x00c0, 0x2a14: 0x00c0, 0x2a15: 0x00c0, 0x2a16: 0x00c0, 0x2a17: 0x00c0, + 0x2a18: 0x00c0, 0x2a19: 0x00c0, 0x2a1a: 0x00c0, 0x2a1b: 0x00c0, 0x2a1c: 0x00c0, 0x2a1d: 0x00c0, + 0x2a1e: 0x00c0, 0x2a1f: 0x00c0, 0x2a20: 0x00c0, 0x2a21: 0x00c0, 0x2a22: 0x00c0, 0x2a23: 0x00c0, + 0x2a30: 0x0040, 0x2a31: 0x0040, 0x2a32: 0x0040, 0x2a33: 0x0040, 0x2a34: 0x0040, 0x2a35: 0x0040, + 0x2a36: 0x0040, 0x2a37: 0x0040, 0x2a38: 0x0040, 0x2a39: 0x0040, 0x2a3a: 0x0040, 0x2a3b: 0x0040, + 0x2a3c: 0x0040, 0x2a3d: 0x0040, 0x2a3e: 0x0040, 0x2a3f: 0x0040, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0040, 0x2a41: 0x0040, 0x2a42: 0x0040, 0x2a43: 0x0040, 0x2a44: 0x0040, 0x2a45: 0x0040, + 0x2a46: 0x0040, 0x2a4b: 0x0040, + 0x2a4c: 0x0040, 0x2a4d: 0x0040, 0x2a4e: 0x0040, 0x2a4f: 0x0040, 0x2a50: 0x0040, 0x2a51: 0x0040, + 0x2a52: 0x0040, 0x2a53: 0x0040, 0x2a54: 0x0040, 0x2a55: 0x0040, 0x2a56: 0x0040, 0x2a57: 0x0040, + 0x2a58: 0x0040, 0x2a59: 0x0040, 0x2a5a: 0x0040, 0x2a5b: 0x0040, 0x2a5c: 0x0040, 0x2a5d: 0x0040, + 0x2a5e: 0x0040, 0x2a5f: 0x0040, 0x2a60: 0x0040, 0x2a61: 0x0040, 0x2a62: 0x0040, 0x2a63: 0x0040, + 0x2a64: 0x0040, 0x2a65: 0x0040, 0x2a66: 0x0040, 0x2a67: 0x0040, 0x2a68: 0x0040, 0x2a69: 0x0040, + 0x2a6a: 0x0040, 0x2a6b: 0x0040, 0x2a6c: 0x0040, 0x2a6d: 0x0040, 0x2a6e: 0x0040, 0x2a6f: 0x0040, + 0x2a70: 0x0040, 0x2a71: 0x0040, 0x2a72: 0x0040, 0x2a73: 0x0040, 0x2a74: 0x0040, 0x2a75: 0x0040, + 0x2a76: 0x0040, 0x2a77: 0x0040, 0x2a78: 0x0040, 0x2a79: 0x0040, 0x2a7a: 0x0040, 0x2a7b: 0x0040, + // Block 0xaa, offset 0x2a80 + 0x2a80: 0x008c, 0x2a81: 0x008c, 0x2a82: 0x008c, 0x2a83: 0x008c, 0x2a84: 0x008c, 0x2a85: 0x008c, + 0x2a86: 0x008c, 0x2a87: 0x008c, 0x2a88: 0x008c, 0x2a89: 0x008c, 0x2a8a: 0x008c, 0x2a8b: 0x008c, + 0x2a8c: 0x008c, 0x2a8d: 0x008c, 0x2a8e: 0x00cc, 0x2a8f: 0x00cc, 0x2a90: 0x008c, 0x2a91: 0x00cc, + 0x2a92: 0x008c, 0x2a93: 0x00cc, 0x2a94: 0x00cc, 0x2a95: 0x008c, 0x2a96: 0x008c, 0x2a97: 0x008c, + 0x2a98: 0x008c, 0x2a99: 0x008c, 0x2a9a: 0x008c, 0x2a9b: 0x008c, 0x2a9c: 0x008c, 0x2a9d: 0x008c, + 0x2a9e: 0x008c, 0x2a9f: 0x00cc, 0x2aa0: 0x008c, 0x2aa1: 0x00cc, 0x2aa2: 0x008c, 0x2aa3: 0x00cc, + 0x2aa4: 0x00cc, 0x2aa5: 0x008c, 0x2aa6: 0x008c, 0x2aa7: 0x00cc, 0x2aa8: 0x00cc, 0x2aa9: 0x00cc, + 0x2aaa: 0x008c, 0x2aab: 0x008c, 0x2aac: 0x008c, 0x2aad: 0x008c, 0x2aae: 0x008c, 0x2aaf: 0x008c, + 0x2ab0: 0x008c, 0x2ab1: 0x008c, 0x2ab2: 0x008c, 0x2ab3: 0x008c, 0x2ab4: 0x008c, 0x2ab5: 0x008c, + 0x2ab6: 0x008c, 0x2ab7: 0x008c, 0x2ab8: 0x008c, 0x2ab9: 0x008c, 0x2aba: 0x008c, 0x2abb: 0x008c, + 0x2abc: 0x008c, 0x2abd: 0x008c, 0x2abe: 0x008c, 0x2abf: 0x008c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x008c, 0x2ac1: 0x008c, 0x2ac2: 0x008c, 0x2ac3: 0x008c, 0x2ac4: 0x008c, 0x2ac5: 0x008c, + 0x2ac6: 0x008c, 0x2ac7: 0x008c, 0x2ac8: 0x008c, 0x2ac9: 0x008c, 0x2aca: 0x008c, 0x2acb: 0x008c, + 0x2acc: 0x008c, 0x2acd: 0x008c, 0x2ace: 0x008c, 0x2acf: 0x008c, 0x2ad0: 0x008c, 0x2ad1: 0x008c, + 0x2ad2: 0x008c, 0x2ad3: 0x008c, 0x2ad4: 0x008c, 0x2ad5: 0x008c, 0x2ad6: 0x008c, 0x2ad7: 0x008c, + 0x2ad8: 0x008c, 0x2ad9: 0x008c, 0x2ada: 0x008c, 0x2adb: 0x008c, 0x2adc: 0x008c, 0x2add: 0x008c, + 0x2ade: 0x008c, 0x2adf: 0x008c, 0x2ae0: 0x008c, 0x2ae1: 0x008c, 0x2ae2: 0x008c, 0x2ae3: 0x008c, + 0x2ae4: 0x008c, 0x2ae5: 0x008c, 0x2ae6: 0x008c, 0x2ae7: 0x008c, 0x2ae8: 0x008c, 0x2ae9: 0x008c, + 0x2aea: 0x008c, 0x2aeb: 0x008c, 0x2aec: 0x008c, 0x2aed: 0x008c, + 0x2af0: 0x008c, 0x2af1: 0x008c, 0x2af2: 0x008c, 0x2af3: 0x008c, 0x2af4: 0x008c, 0x2af5: 0x008c, + 0x2af6: 0x008c, 0x2af7: 0x008c, 0x2af8: 0x008c, 0x2af9: 0x008c, 0x2afa: 0x008c, 0x2afb: 0x008c, + 0x2afc: 0x008c, 0x2afd: 0x008c, 0x2afe: 0x008c, 0x2aff: 0x008c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x008c, 0x2b01: 0x008c, 0x2b02: 0x008c, 0x2b03: 0x008c, 0x2b04: 0x008c, 0x2b05: 0x008c, + 0x2b06: 0x008c, 0x2b07: 0x008c, 0x2b08: 0x008c, 0x2b09: 0x008c, 0x2b0a: 0x008c, 0x2b0b: 0x008c, + 0x2b0c: 0x008c, 0x2b0d: 0x008c, 0x2b0e: 0x008c, 0x2b0f: 0x008c, 0x2b10: 0x008c, 0x2b11: 0x008c, + 0x2b12: 0x008c, 0x2b13: 0x008c, 0x2b14: 0x008c, 0x2b15: 0x008c, 0x2b16: 0x008c, 0x2b17: 0x008c, + 0x2b18: 0x008c, 0x2b19: 0x008c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x0080, 0x2b41: 0x0080, 0x2b42: 0x0080, 0x2b43: 0x0080, 0x2b44: 0x0080, 0x2b45: 0x0080, + 0x2b46: 0x0080, + 0x2b53: 0x0080, 0x2b54: 0x0080, 0x2b55: 0x0080, 0x2b56: 0x0080, 0x2b57: 0x0080, + 0x2b5d: 0x008a, + 0x2b5e: 0x00cb, 0x2b5f: 0x008a, 0x2b60: 0x008a, 0x2b61: 0x008a, 0x2b62: 0x008a, 0x2b63: 0x008a, + 0x2b64: 0x008a, 0x2b65: 0x008a, 0x2b66: 0x008a, 0x2b67: 0x008a, 0x2b68: 0x008a, 0x2b69: 0x008a, + 0x2b6a: 0x008a, 0x2b6b: 0x008a, 0x2b6c: 0x008a, 0x2b6d: 0x008a, 0x2b6e: 0x008a, 0x2b6f: 0x008a, + 0x2b70: 0x008a, 0x2b71: 0x008a, 0x2b72: 0x008a, 0x2b73: 0x008a, 0x2b74: 0x008a, 0x2b75: 0x008a, + 0x2b76: 0x008a, 0x2b78: 0x008a, 0x2b79: 0x008a, 0x2b7a: 0x008a, 0x2b7b: 0x008a, + 0x2b7c: 0x008a, 0x2b7e: 0x008a, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x008a, 0x2b81: 0x008a, 0x2b83: 0x008a, 0x2b84: 0x008a, + 0x2b86: 0x008a, 0x2b87: 0x008a, 0x2b88: 0x008a, 0x2b89: 0x008a, 0x2b8a: 0x008a, 0x2b8b: 0x008a, + 0x2b8c: 0x008a, 0x2b8d: 0x008a, 0x2b8e: 0x008a, 0x2b8f: 0x008a, 0x2b90: 0x0080, 0x2b91: 0x0080, + 0x2b92: 0x0080, 0x2b93: 0x0080, 0x2b94: 0x0080, 0x2b95: 0x0080, 0x2b96: 0x0080, 0x2b97: 0x0080, + 0x2b98: 0x0080, 0x2b99: 0x0080, 0x2b9a: 0x0080, 0x2b9b: 0x0080, 0x2b9c: 0x0080, 0x2b9d: 0x0080, + 0x2b9e: 0x0080, 0x2b9f: 0x0080, 0x2ba0: 0x0080, 0x2ba1: 0x0080, 0x2ba2: 0x0080, 0x2ba3: 0x0080, + 0x2ba4: 0x0080, 0x2ba5: 0x0080, 0x2ba6: 0x0080, 0x2ba7: 0x0080, 0x2ba8: 0x0080, 0x2ba9: 0x0080, + 0x2baa: 0x0080, 0x2bab: 0x0080, 0x2bac: 0x0080, 0x2bad: 0x0080, 0x2bae: 0x0080, 0x2baf: 0x0080, + 0x2bb0: 0x0080, 0x2bb1: 0x0080, 0x2bb2: 0x0080, 0x2bb3: 0x0080, 0x2bb4: 0x0080, 0x2bb5: 0x0080, + 0x2bb6: 0x0080, 0x2bb7: 0x0080, 0x2bb8: 0x0080, 0x2bb9: 0x0080, 0x2bba: 0x0080, 0x2bbb: 0x0080, + 0x2bbc: 0x0080, 0x2bbd: 0x0080, 0x2bbe: 0x0080, 0x2bbf: 0x0080, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x0080, 0x2bc1: 0x0080, 0x2bc2: 0x0080, + 0x2bd3: 0x0080, 0x2bd4: 0x0080, 0x2bd5: 0x0080, 0x2bd6: 0x0080, 0x2bd7: 0x0080, + 0x2bd8: 0x0080, 0x2bd9: 0x0080, 0x2bda: 0x0080, 0x2bdb: 0x0080, 0x2bdc: 0x0080, 0x2bdd: 0x0080, + 0x2bde: 0x0080, 0x2bdf: 0x0080, 0x2be0: 0x0080, 0x2be1: 0x0080, 0x2be2: 0x0080, 0x2be3: 0x0080, + 0x2be4: 0x0080, 0x2be5: 0x0080, 0x2be6: 0x0080, 0x2be7: 0x0080, 0x2be8: 0x0080, 0x2be9: 0x0080, + 0x2bea: 0x0080, 0x2beb: 0x0080, 0x2bec: 0x0080, 0x2bed: 0x0080, 0x2bee: 0x0080, 0x2bef: 0x0080, + 0x2bf0: 0x0080, 0x2bf1: 0x0080, 0x2bf2: 0x0080, 0x2bf3: 0x0080, 0x2bf4: 0x0080, 0x2bf5: 0x0080, + 0x2bf6: 0x0080, 0x2bf7: 0x0080, 0x2bf8: 0x0080, 0x2bf9: 0x0080, 0x2bfa: 0x0080, 0x2bfb: 0x0080, + 0x2bfc: 0x0080, 0x2bfd: 0x0080, 0x2bfe: 0x0080, 0x2bff: 0x0080, + // Block 0xb0, offset 0x2c00 + 0x2c00: 0x0080, 0x2c01: 0x0080, 0x2c02: 0x0080, 0x2c03: 0x0080, 0x2c04: 0x0080, 0x2c05: 0x0080, + 0x2c06: 0x0080, 0x2c07: 0x0080, 0x2c08: 0x0080, 0x2c09: 0x0080, 0x2c0a: 0x0080, 0x2c0b: 0x0080, + 0x2c0c: 0x0080, 0x2c0d: 0x0080, 0x2c0e: 0x0080, 0x2c0f: 0x0080, + 0x2c12: 0x0080, 0x2c13: 0x0080, 0x2c14: 0x0080, 0x2c15: 0x0080, 0x2c16: 0x0080, 0x2c17: 0x0080, + 0x2c18: 0x0080, 0x2c19: 0x0080, 0x2c1a: 0x0080, 0x2c1b: 0x0080, 0x2c1c: 0x0080, 0x2c1d: 0x0080, + 0x2c1e: 0x0080, 0x2c1f: 0x0080, 0x2c20: 0x0080, 0x2c21: 0x0080, 0x2c22: 0x0080, 0x2c23: 0x0080, + 0x2c24: 0x0080, 0x2c25: 0x0080, 0x2c26: 0x0080, 0x2c27: 0x0080, 0x2c28: 0x0080, 0x2c29: 0x0080, + 0x2c2a: 0x0080, 0x2c2b: 0x0080, 0x2c2c: 0x0080, 0x2c2d: 0x0080, 0x2c2e: 0x0080, 0x2c2f: 0x0080, + 0x2c30: 0x0080, 0x2c31: 0x0080, 0x2c32: 0x0080, 0x2c33: 0x0080, 0x2c34: 0x0080, 0x2c35: 0x0080, + 0x2c36: 0x0080, 0x2c37: 0x0080, 0x2c38: 0x0080, 0x2c39: 0x0080, 0x2c3a: 0x0080, 0x2c3b: 0x0080, + 0x2c3c: 0x0080, 0x2c3d: 0x0080, 0x2c3e: 0x0080, 0x2c3f: 0x0080, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x0080, 0x2c41: 0x0080, 0x2c42: 0x0080, 0x2c43: 0x0080, 0x2c44: 0x0080, 0x2c45: 0x0080, + 0x2c46: 0x0080, 0x2c47: 0x0080, + 0x2c4f: 0x0080, + 0x2c70: 0x0080, 0x2c71: 0x0080, 0x2c72: 0x0080, 0x2c73: 0x0080, 0x2c74: 0x0080, 0x2c75: 0x0080, + 0x2c76: 0x0080, 0x2c77: 0x0080, 0x2c78: 0x0080, 0x2c79: 0x0080, 0x2c7a: 0x0080, 0x2c7b: 0x0080, + 0x2c7c: 0x0080, 0x2c7d: 0x0080, 0x2c7e: 0x0080, 0x2c7f: 0x0080, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x0040, 0x2c81: 0x0040, 0x2c82: 0x0040, 0x2c83: 0x0040, 0x2c84: 0x0040, 0x2c85: 0x0040, + 0x2c86: 0x0040, 0x2c87: 0x0040, 0x2c88: 0x0040, 0x2c89: 0x0040, 0x2c8a: 0x0040, 0x2c8b: 0x0040, + 0x2c8c: 0x0040, 0x2c8d: 0x0040, 0x2c8e: 0x0040, 0x2c8f: 0x0040, 0x2c90: 0x0080, 0x2c91: 0x0080, + 0x2c92: 0x0080, 0x2c93: 0x0080, 0x2c94: 0x0080, 0x2c95: 0x0080, 0x2c96: 0x0080, 0x2c97: 0x0080, + 0x2c98: 0x0080, 0x2c99: 0x0080, + 0x2ca0: 0x00c3, 0x2ca1: 0x00c3, 0x2ca2: 0x00c3, 0x2ca3: 0x00c3, + 0x2ca4: 0x00c3, 0x2ca5: 0x00c3, 0x2ca6: 0x00c3, 0x2ca7: 0x00c3, 0x2ca8: 0x00c3, 0x2ca9: 0x00c3, + 0x2caa: 0x00c3, 0x2cab: 0x00c3, 0x2cac: 0x00c3, 0x2cad: 0x00c3, 0x2cae: 0x00c3, 0x2caf: 0x00c3, + 0x2cb0: 0x0080, 0x2cb1: 0x0080, 0x2cb2: 0x0080, 0x2cb3: 0x0080, 0x2cb4: 0x0080, 0x2cb5: 0x0080, + 0x2cb6: 0x0080, 0x2cb7: 0x0080, 0x2cb8: 0x0080, 0x2cb9: 0x0080, 0x2cba: 0x0080, 0x2cbb: 0x0080, + 0x2cbc: 0x0080, 0x2cbd: 0x0080, 0x2cbe: 0x0080, 0x2cbf: 0x0080, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x0080, 0x2cc1: 0x0080, 0x2cc2: 0x0080, 0x2cc3: 0x0080, 0x2cc4: 0x0080, 0x2cc5: 0x0080, + 0x2cc6: 0x0080, 0x2cc7: 0x0080, 0x2cc8: 0x0080, 0x2cc9: 0x0080, 0x2cca: 0x0080, 0x2ccb: 0x0080, + 0x2ccc: 0x0080, 0x2ccd: 0x0080, 0x2cce: 0x0080, 0x2ccf: 0x0080, 0x2cd0: 0x0080, 0x2cd1: 0x0080, + 0x2cd2: 0x0080, 0x2cd4: 0x0080, 0x2cd5: 0x0080, 0x2cd6: 0x0080, 0x2cd7: 0x0080, + 0x2cd8: 0x0080, 0x2cd9: 0x0080, 0x2cda: 0x0080, 0x2cdb: 0x0080, 0x2cdc: 0x0080, 0x2cdd: 0x0080, + 0x2cde: 0x0080, 0x2cdf: 0x0080, 0x2ce0: 0x0080, 0x2ce1: 0x0080, 0x2ce2: 0x0080, 0x2ce3: 0x0080, + 0x2ce4: 0x0080, 0x2ce5: 0x0080, 0x2ce6: 0x0080, 0x2ce8: 0x0080, 0x2ce9: 0x0080, + 0x2cea: 0x0080, 0x2ceb: 0x0080, + 0x2cf0: 0x0080, 0x2cf1: 0x0080, 0x2cf2: 0x0080, 0x2cf3: 0x00c0, 0x2cf4: 0x0080, + 0x2cf6: 0x0080, 0x2cf7: 0x0080, 0x2cf8: 0x0080, 0x2cf9: 0x0080, 0x2cfa: 0x0080, 0x2cfb: 0x0080, + 0x2cfc: 0x0080, 0x2cfd: 0x0080, 0x2cfe: 0x0080, 0x2cff: 0x0080, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x0080, 0x2d01: 0x0080, 0x2d02: 0x0080, 0x2d03: 0x0080, 0x2d04: 0x0080, 0x2d05: 0x0080, + 0x2d06: 0x0080, 0x2d07: 0x0080, 0x2d08: 0x0080, 0x2d09: 0x0080, 0x2d0a: 0x0080, 0x2d0b: 0x0080, + 0x2d0c: 0x0080, 0x2d0d: 0x0080, 0x2d0e: 0x0080, 0x2d0f: 0x0080, 0x2d10: 0x0080, 0x2d11: 0x0080, + 0x2d12: 0x0080, 0x2d13: 0x0080, 0x2d14: 0x0080, 0x2d15: 0x0080, 0x2d16: 0x0080, 0x2d17: 0x0080, + 0x2d18: 0x0080, 0x2d19: 0x0080, 0x2d1a: 0x0080, 0x2d1b: 0x0080, 0x2d1c: 0x0080, 0x2d1d: 0x0080, + 0x2d1e: 0x0080, 0x2d1f: 0x0080, 0x2d20: 0x0080, 0x2d21: 0x0080, 0x2d22: 0x0080, 0x2d23: 0x0080, + 0x2d24: 0x0080, 0x2d25: 0x0080, 0x2d26: 0x0080, 0x2d27: 0x0080, 0x2d28: 0x0080, 0x2d29: 0x0080, + 0x2d2a: 0x0080, 0x2d2b: 0x0080, 0x2d2c: 0x0080, 0x2d2d: 0x0080, 0x2d2e: 0x0080, 0x2d2f: 0x0080, + 0x2d30: 0x0080, 0x2d31: 0x0080, 0x2d32: 0x0080, 0x2d33: 0x0080, 0x2d34: 0x0080, 0x2d35: 0x0080, + 0x2d36: 0x0080, 0x2d37: 0x0080, 0x2d38: 0x0080, 0x2d39: 0x0080, 0x2d3a: 0x0080, 0x2d3b: 0x0080, + 0x2d3c: 0x0080, 0x2d3f: 0x0040, + // Block 0xb5, offset 0x2d40 + 0x2d41: 0x0080, 0x2d42: 0x0080, 0x2d43: 0x0080, 0x2d44: 0x0080, 0x2d45: 0x0080, + 0x2d46: 0x0080, 0x2d47: 0x0080, 0x2d48: 0x0080, 0x2d49: 0x0080, 0x2d4a: 0x0080, 0x2d4b: 0x0080, + 0x2d4c: 0x0080, 0x2d4d: 0x0080, 0x2d4e: 0x0080, 0x2d4f: 0x0080, 0x2d50: 0x0080, 0x2d51: 0x0080, + 0x2d52: 0x0080, 0x2d53: 0x0080, 0x2d54: 0x0080, 0x2d55: 0x0080, 0x2d56: 0x0080, 0x2d57: 0x0080, + 0x2d58: 0x0080, 0x2d59: 0x0080, 0x2d5a: 0x0080, 0x2d5b: 0x0080, 0x2d5c: 0x0080, 0x2d5d: 0x0080, + 0x2d5e: 0x0080, 0x2d5f: 0x0080, 0x2d60: 0x0080, 0x2d61: 0x0080, 0x2d62: 0x0080, 0x2d63: 0x0080, + 0x2d64: 0x0080, 0x2d65: 0x0080, 0x2d66: 0x0080, 0x2d67: 0x0080, 0x2d68: 0x0080, 0x2d69: 0x0080, + 0x2d6a: 0x0080, 0x2d6b: 0x0080, 0x2d6c: 0x0080, 0x2d6d: 0x0080, 0x2d6e: 0x0080, 0x2d6f: 0x0080, + 0x2d70: 0x0080, 0x2d71: 0x0080, 0x2d72: 0x0080, 0x2d73: 0x0080, 0x2d74: 0x0080, 0x2d75: 0x0080, + 0x2d76: 0x0080, 0x2d77: 0x0080, 0x2d78: 0x0080, 0x2d79: 0x0080, 0x2d7a: 0x0080, 0x2d7b: 0x0080, + 0x2d7c: 0x0080, 0x2d7d: 0x0080, 0x2d7e: 0x0080, 0x2d7f: 0x0080, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0x0080, 0x2d81: 0x0080, 0x2d82: 0x0080, 0x2d83: 0x0080, 0x2d84: 0x0080, 0x2d85: 0x0080, + 0x2d86: 0x0080, 0x2d87: 0x0080, 0x2d88: 0x0080, 0x2d89: 0x0080, 0x2d8a: 0x0080, 0x2d8b: 0x0080, + 0x2d8c: 0x0080, 0x2d8d: 0x0080, 0x2d8e: 0x0080, 0x2d8f: 0x0080, 0x2d90: 0x0080, 0x2d91: 0x0080, + 0x2d92: 0x0080, 0x2d93: 0x0080, 0x2d94: 0x0080, 0x2d95: 0x0080, 0x2d96: 0x0080, 0x2d97: 0x0080, + 0x2d98: 0x0080, 0x2d99: 0x0080, 0x2d9a: 0x0080, 0x2d9b: 0x0080, 0x2d9c: 0x0080, 0x2d9d: 0x0080, + 0x2d9e: 0x0080, 0x2d9f: 0x0080, 0x2da0: 0x0080, 0x2da1: 0x0080, 0x2da2: 0x0080, 0x2da3: 0x0080, + 0x2da4: 0x0080, 0x2da5: 0x0080, 0x2da6: 0x008c, 0x2da7: 0x008c, 0x2da8: 0x008c, 0x2da9: 0x008c, + 0x2daa: 0x008c, 0x2dab: 0x008c, 0x2dac: 0x008c, 0x2dad: 0x008c, 0x2dae: 0x008c, 0x2daf: 0x008c, + 0x2db0: 0x0080, 0x2db1: 0x008c, 0x2db2: 0x008c, 0x2db3: 0x008c, 0x2db4: 0x008c, 0x2db5: 0x008c, + 0x2db6: 0x008c, 0x2db7: 0x008c, 0x2db8: 0x008c, 0x2db9: 0x008c, 0x2dba: 0x008c, 0x2dbb: 0x008c, + 0x2dbc: 0x008c, 0x2dbd: 0x008c, 0x2dbe: 0x008c, 0x2dbf: 0x008c, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x008c, 0x2dc1: 0x008c, 0x2dc2: 0x008c, 0x2dc3: 0x008c, 0x2dc4: 0x008c, 0x2dc5: 0x008c, + 0x2dc6: 0x008c, 0x2dc7: 0x008c, 0x2dc8: 0x008c, 0x2dc9: 0x008c, 0x2dca: 0x008c, 0x2dcb: 0x008c, + 0x2dcc: 0x008c, 0x2dcd: 0x008c, 0x2dce: 0x008c, 0x2dcf: 0x008c, 0x2dd0: 0x008c, 0x2dd1: 0x008c, + 0x2dd2: 0x008c, 0x2dd3: 0x008c, 0x2dd4: 0x008c, 0x2dd5: 0x008c, 0x2dd6: 0x008c, 0x2dd7: 0x008c, + 0x2dd8: 0x008c, 0x2dd9: 0x008c, 0x2dda: 0x008c, 0x2ddb: 0x008c, 0x2ddc: 0x008c, 0x2ddd: 0x008c, + 0x2dde: 0x0080, 0x2ddf: 0x0080, 0x2de0: 0x0040, 0x2de1: 0x0080, 0x2de2: 0x0080, 0x2de3: 0x0080, + 0x2de4: 0x0080, 0x2de5: 0x0080, 0x2de6: 0x0080, 0x2de7: 0x0080, 0x2de8: 0x0080, 0x2de9: 0x0080, + 0x2dea: 0x0080, 0x2deb: 0x0080, 0x2dec: 0x0080, 0x2ded: 0x0080, 0x2dee: 0x0080, 0x2def: 0x0080, + 0x2df0: 0x0080, 0x2df1: 0x0080, 0x2df2: 0x0080, 0x2df3: 0x0080, 0x2df4: 0x0080, 0x2df5: 0x0080, + 0x2df6: 0x0080, 0x2df7: 0x0080, 0x2df8: 0x0080, 0x2df9: 0x0080, 0x2dfa: 0x0080, 0x2dfb: 0x0080, + 0x2dfc: 0x0080, 0x2dfd: 0x0080, 0x2dfe: 0x0080, + // Block 0xb8, offset 0x2e00 + 0x2e02: 0x0080, 0x2e03: 0x0080, 0x2e04: 0x0080, 0x2e05: 0x0080, + 0x2e06: 0x0080, 0x2e07: 0x0080, 0x2e0a: 0x0080, 0x2e0b: 0x0080, + 0x2e0c: 0x0080, 0x2e0d: 0x0080, 0x2e0e: 0x0080, 0x2e0f: 0x0080, + 0x2e12: 0x0080, 0x2e13: 0x0080, 0x2e14: 0x0080, 0x2e15: 0x0080, 0x2e16: 0x0080, 0x2e17: 0x0080, + 0x2e1a: 0x0080, 0x2e1b: 0x0080, 0x2e1c: 0x0080, + 0x2e20: 0x0080, 0x2e21: 0x0080, 0x2e22: 0x0080, 0x2e23: 0x0080, + 0x2e24: 0x0080, 0x2e25: 0x0080, 0x2e26: 0x0080, 0x2e28: 0x0080, 0x2e29: 0x0080, + 0x2e2a: 0x0080, 0x2e2b: 0x0080, 0x2e2c: 0x0080, 0x2e2d: 0x0080, 0x2e2e: 0x0080, + 0x2e39: 0x0040, 0x2e3a: 0x0040, 0x2e3b: 0x0040, + 0x2e3c: 0x0080, 0x2e3d: 0x0080, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x00c0, 0x2e41: 0x00c0, 0x2e42: 0x00c0, 0x2e43: 0x00c0, 0x2e44: 0x00c0, 0x2e45: 0x00c0, + 0x2e46: 0x00c0, 0x2e47: 0x00c0, 0x2e48: 0x00c0, 0x2e49: 0x00c0, 0x2e4a: 0x00c0, 0x2e4b: 0x00c0, + 0x2e4d: 0x00c0, 0x2e4e: 0x00c0, 0x2e4f: 0x00c0, 0x2e50: 0x00c0, 0x2e51: 0x00c0, + 0x2e52: 0x00c0, 0x2e53: 0x00c0, 0x2e54: 0x00c0, 0x2e55: 0x00c0, 0x2e56: 0x00c0, 0x2e57: 0x00c0, + 0x2e58: 0x00c0, 0x2e59: 0x00c0, 0x2e5a: 0x00c0, 0x2e5b: 0x00c0, 0x2e5c: 0x00c0, 0x2e5d: 0x00c0, + 0x2e5e: 0x00c0, 0x2e5f: 0x00c0, 0x2e60: 0x00c0, 0x2e61: 0x00c0, 0x2e62: 0x00c0, 0x2e63: 0x00c0, + 0x2e64: 0x00c0, 0x2e65: 0x00c0, 0x2e66: 0x00c0, 0x2e68: 0x00c0, 0x2e69: 0x00c0, + 0x2e6a: 0x00c0, 0x2e6b: 0x00c0, 0x2e6c: 0x00c0, 0x2e6d: 0x00c0, 0x2e6e: 0x00c0, 0x2e6f: 0x00c0, + 0x2e70: 0x00c0, 0x2e71: 0x00c0, 0x2e72: 0x00c0, 0x2e73: 0x00c0, 0x2e74: 0x00c0, 0x2e75: 0x00c0, + 0x2e76: 0x00c0, 0x2e77: 0x00c0, 0x2e78: 0x00c0, 0x2e79: 0x00c0, 0x2e7a: 0x00c0, + 0x2e7c: 0x00c0, 0x2e7d: 0x00c0, 0x2e7f: 0x00c0, + // Block 0xba, offset 0x2e80 + 0x2e80: 0x00c0, 0x2e81: 0x00c0, 0x2e82: 0x00c0, 0x2e83: 0x00c0, 0x2e84: 0x00c0, 0x2e85: 0x00c0, + 0x2e86: 0x00c0, 0x2e87: 0x00c0, 0x2e88: 0x00c0, 0x2e89: 0x00c0, 0x2e8a: 0x00c0, 0x2e8b: 0x00c0, + 0x2e8c: 0x00c0, 0x2e8d: 0x00c0, 0x2e90: 0x00c0, 0x2e91: 0x00c0, + 0x2e92: 0x00c0, 0x2e93: 0x00c0, 0x2e94: 0x00c0, 0x2e95: 0x00c0, 0x2e96: 0x00c0, 0x2e97: 0x00c0, + 0x2e98: 0x00c0, 0x2e99: 0x00c0, 0x2e9a: 0x00c0, 0x2e9b: 0x00c0, 0x2e9c: 0x00c0, 0x2e9d: 0x00c0, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x00c0, 0x2ec1: 0x00c0, 0x2ec2: 0x00c0, 0x2ec3: 0x00c0, 0x2ec4: 0x00c0, 0x2ec5: 0x00c0, + 0x2ec6: 0x00c0, 0x2ec7: 0x00c0, 0x2ec8: 0x00c0, 0x2ec9: 0x00c0, 0x2eca: 0x00c0, 0x2ecb: 0x00c0, + 0x2ecc: 0x00c0, 0x2ecd: 0x00c0, 0x2ece: 0x00c0, 0x2ecf: 0x00c0, 0x2ed0: 0x00c0, 0x2ed1: 0x00c0, + 0x2ed2: 0x00c0, 0x2ed3: 0x00c0, 0x2ed4: 0x00c0, 0x2ed5: 0x00c0, 0x2ed6: 0x00c0, 0x2ed7: 0x00c0, + 0x2ed8: 0x00c0, 0x2ed9: 0x00c0, 0x2eda: 0x00c0, 0x2edb: 0x00c0, 0x2edc: 0x00c0, 0x2edd: 0x00c0, + 0x2ede: 0x00c0, 0x2edf: 0x00c0, 0x2ee0: 0x00c0, 0x2ee1: 0x00c0, 0x2ee2: 0x00c0, 0x2ee3: 0x00c0, + 0x2ee4: 0x00c0, 0x2ee5: 0x00c0, 0x2ee6: 0x00c0, 0x2ee7: 0x00c0, 0x2ee8: 0x00c0, 0x2ee9: 0x00c0, + 0x2eea: 0x00c0, 0x2eeb: 0x00c0, 0x2eec: 0x00c0, 0x2eed: 0x00c0, 0x2eee: 0x00c0, 0x2eef: 0x00c0, + 0x2ef0: 0x00c0, 0x2ef1: 0x00c0, 0x2ef2: 0x00c0, 0x2ef3: 0x00c0, 0x2ef4: 0x00c0, 0x2ef5: 0x00c0, + 0x2ef6: 0x00c0, 0x2ef7: 0x00c0, 0x2ef8: 0x00c0, 0x2ef9: 0x00c0, 0x2efa: 0x00c0, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x0080, 0x2f01: 0x0080, 0x2f02: 0x0080, + 0x2f07: 0x0080, 0x2f08: 0x0080, 0x2f09: 0x0080, 0x2f0a: 0x0080, 0x2f0b: 0x0080, + 0x2f0c: 0x0080, 0x2f0d: 0x0080, 0x2f0e: 0x0080, 0x2f0f: 0x0080, 0x2f10: 0x0080, 0x2f11: 0x0080, + 0x2f12: 0x0080, 0x2f13: 0x0080, 0x2f14: 0x0080, 0x2f15: 0x0080, 0x2f16: 0x0080, 0x2f17: 0x0080, + 0x2f18: 0x0080, 0x2f19: 0x0080, 0x2f1a: 0x0080, 0x2f1b: 0x0080, 0x2f1c: 0x0080, 0x2f1d: 0x0080, + 0x2f1e: 0x0080, 0x2f1f: 0x0080, 0x2f20: 0x0080, 0x2f21: 0x0080, 0x2f22: 0x0080, 0x2f23: 0x0080, + 0x2f24: 0x0080, 0x2f25: 0x0080, 0x2f26: 0x0080, 0x2f27: 0x0080, 0x2f28: 0x0080, 0x2f29: 0x0080, + 0x2f2a: 0x0080, 0x2f2b: 0x0080, 0x2f2c: 0x0080, 0x2f2d: 0x0080, 0x2f2e: 0x0080, 0x2f2f: 0x0080, + 0x2f30: 0x0080, 0x2f31: 0x0080, 0x2f32: 0x0080, 0x2f33: 0x0080, + 0x2f37: 0x0080, 0x2f38: 0x0080, 0x2f39: 0x0080, 0x2f3a: 0x0080, 0x2f3b: 0x0080, + 0x2f3c: 0x0080, 0x2f3d: 0x0080, 0x2f3e: 0x0080, 0x2f3f: 0x0080, + // Block 0xbd, offset 0x2f40 + 0x2f40: 0x0088, 0x2f41: 0x0088, 0x2f42: 0x0088, 0x2f43: 0x0088, 0x2f44: 0x0088, 0x2f45: 0x0088, + 0x2f46: 0x0088, 0x2f47: 0x0088, 0x2f48: 0x0088, 0x2f49: 0x0088, 0x2f4a: 0x0088, 0x2f4b: 0x0088, + 0x2f4c: 0x0088, 0x2f4d: 0x0088, 0x2f4e: 0x0088, 0x2f4f: 0x0088, 0x2f50: 0x0088, 0x2f51: 0x0088, + 0x2f52: 0x0088, 0x2f53: 0x0088, 0x2f54: 0x0088, 0x2f55: 0x0088, 0x2f56: 0x0088, 0x2f57: 0x0088, + 0x2f58: 0x0088, 0x2f59: 0x0088, 0x2f5a: 0x0088, 0x2f5b: 0x0088, 0x2f5c: 0x0088, 0x2f5d: 0x0088, + 0x2f5e: 0x0088, 0x2f5f: 0x0088, 0x2f60: 0x0088, 0x2f61: 0x0088, 0x2f62: 0x0088, 0x2f63: 0x0088, + 0x2f64: 0x0088, 0x2f65: 0x0088, 0x2f66: 0x0088, 0x2f67: 0x0088, 0x2f68: 0x0088, 0x2f69: 0x0088, + 0x2f6a: 0x0088, 0x2f6b: 0x0088, 0x2f6c: 0x0088, 0x2f6d: 0x0088, 0x2f6e: 0x0088, 0x2f6f: 0x0088, + 0x2f70: 0x0088, 0x2f71: 0x0088, 0x2f72: 0x0088, 0x2f73: 0x0088, 0x2f74: 0x0088, 0x2f75: 0x0088, + 0x2f76: 0x0088, 0x2f77: 0x0088, 0x2f78: 0x0088, 0x2f79: 0x0088, 0x2f7a: 0x0088, 0x2f7b: 0x0088, + 0x2f7c: 0x0088, 0x2f7d: 0x0088, 0x2f7e: 0x0088, 0x2f7f: 0x0088, + // Block 0xbe, offset 0x2f80 + 0x2f80: 0x0088, 0x2f81: 0x0088, 0x2f82: 0x0088, 0x2f83: 0x0088, 0x2f84: 0x0088, 0x2f85: 0x0088, + 0x2f86: 0x0088, 0x2f87: 0x0088, 0x2f88: 0x0088, 0x2f89: 0x0088, 0x2f8a: 0x0088, 0x2f8b: 0x0088, + 0x2f8c: 0x0088, 0x2f8d: 0x0088, 0x2f8e: 0x0088, 0x2f90: 0x0080, 0x2f91: 0x0080, + 0x2f92: 0x0080, 0x2f93: 0x0080, 0x2f94: 0x0080, 0x2f95: 0x0080, 0x2f96: 0x0080, 0x2f97: 0x0080, + 0x2f98: 0x0080, 0x2f99: 0x0080, 0x2f9a: 0x0080, 0x2f9b: 0x0080, 0x2f9c: 0x0080, + 0x2fa0: 0x0088, + // Block 0xbf, offset 0x2fc0 + 0x2fd0: 0x0080, 0x2fd1: 0x0080, + 0x2fd2: 0x0080, 0x2fd3: 0x0080, 0x2fd4: 0x0080, 0x2fd5: 0x0080, 0x2fd6: 0x0080, 0x2fd7: 0x0080, + 0x2fd8: 0x0080, 0x2fd9: 0x0080, 0x2fda: 0x0080, 0x2fdb: 0x0080, 0x2fdc: 0x0080, 0x2fdd: 0x0080, + 0x2fde: 0x0080, 0x2fdf: 0x0080, 0x2fe0: 0x0080, 0x2fe1: 0x0080, 0x2fe2: 0x0080, 0x2fe3: 0x0080, + 0x2fe4: 0x0080, 0x2fe5: 0x0080, 0x2fe6: 0x0080, 0x2fe7: 0x0080, 0x2fe8: 0x0080, 0x2fe9: 0x0080, + 0x2fea: 0x0080, 0x2feb: 0x0080, 0x2fec: 0x0080, 0x2fed: 0x0080, 0x2fee: 0x0080, 0x2fef: 0x0080, + 0x2ff0: 0x0080, 0x2ff1: 0x0080, 0x2ff2: 0x0080, 0x2ff3: 0x0080, 0x2ff4: 0x0080, 0x2ff5: 0x0080, + 0x2ff6: 0x0080, 0x2ff7: 0x0080, 0x2ff8: 0x0080, 0x2ff9: 0x0080, 0x2ffa: 0x0080, 0x2ffb: 0x0080, + 0x2ffc: 0x0080, 0x2ffd: 0x00c3, + // Block 0xc0, offset 0x3000 + 0x3000: 0x00c0, 0x3001: 0x00c0, 0x3002: 0x00c0, 0x3003: 0x00c0, 0x3004: 0x00c0, 0x3005: 0x00c0, + 0x3006: 0x00c0, 0x3007: 0x00c0, 0x3008: 0x00c0, 0x3009: 0x00c0, 0x300a: 0x00c0, 0x300b: 0x00c0, + 0x300c: 0x00c0, 0x300d: 0x00c0, 0x300e: 0x00c0, 0x300f: 0x00c0, 0x3010: 0x00c0, 0x3011: 0x00c0, + 0x3012: 0x00c0, 0x3013: 0x00c0, 0x3014: 0x00c0, 0x3015: 0x00c0, 0x3016: 0x00c0, 0x3017: 0x00c0, + 0x3018: 0x00c0, 0x3019: 0x00c0, 0x301a: 0x00c0, 0x301b: 0x00c0, 0x301c: 0x00c0, + 0x3020: 0x00c0, 0x3021: 0x00c0, 0x3022: 0x00c0, 0x3023: 0x00c0, + 0x3024: 0x00c0, 0x3025: 0x00c0, 0x3026: 0x00c0, 0x3027: 0x00c0, 0x3028: 0x00c0, 0x3029: 0x00c0, + 0x302a: 0x00c0, 0x302b: 0x00c0, 0x302c: 0x00c0, 0x302d: 0x00c0, 0x302e: 0x00c0, 0x302f: 0x00c0, + 0x3030: 0x00c0, 0x3031: 0x00c0, 0x3032: 0x00c0, 0x3033: 0x00c0, 0x3034: 0x00c0, 0x3035: 0x00c0, + 0x3036: 0x00c0, 0x3037: 0x00c0, 0x3038: 0x00c0, 0x3039: 0x00c0, 0x303a: 0x00c0, 0x303b: 0x00c0, + 0x303c: 0x00c0, 0x303d: 0x00c0, 0x303e: 0x00c0, 0x303f: 0x00c0, + // Block 0xc1, offset 0x3040 + 0x3040: 0x00c0, 0x3041: 0x00c0, 0x3042: 0x00c0, 0x3043: 0x00c0, 0x3044: 0x00c0, 0x3045: 0x00c0, + 0x3046: 0x00c0, 0x3047: 0x00c0, 0x3048: 0x00c0, 0x3049: 0x00c0, 0x304a: 0x00c0, 0x304b: 0x00c0, + 0x304c: 0x00c0, 0x304d: 0x00c0, 0x304e: 0x00c0, 0x304f: 0x00c0, 0x3050: 0x00c0, + 0x3060: 0x00c3, 0x3061: 0x0080, 0x3062: 0x0080, 0x3063: 0x0080, + 0x3064: 0x0080, 0x3065: 0x0080, 0x3066: 0x0080, 0x3067: 0x0080, 0x3068: 0x0080, 0x3069: 0x0080, + 0x306a: 0x0080, 0x306b: 0x0080, 0x306c: 0x0080, 0x306d: 0x0080, 0x306e: 0x0080, 0x306f: 0x0080, + 0x3070: 0x0080, 0x3071: 0x0080, 0x3072: 0x0080, 0x3073: 0x0080, 0x3074: 0x0080, 0x3075: 0x0080, + 0x3076: 0x0080, 0x3077: 0x0080, 0x3078: 0x0080, 0x3079: 0x0080, 0x307a: 0x0080, 0x307b: 0x0080, + // Block 0xc2, offset 0x3080 + 0x3080: 0x00c0, 0x3081: 0x00c0, 0x3082: 0x00c0, 0x3083: 0x00c0, 0x3084: 0x00c0, 0x3085: 0x00c0, + 0x3086: 0x00c0, 0x3087: 0x00c0, 0x3088: 0x00c0, 0x3089: 0x00c0, 0x308a: 0x00c0, 0x308b: 0x00c0, + 0x308c: 0x00c0, 0x308d: 0x00c0, 0x308e: 0x00c0, 0x308f: 0x00c0, 0x3090: 0x00c0, 0x3091: 0x00c0, + 0x3092: 0x00c0, 0x3093: 0x00c0, 0x3094: 0x00c0, 0x3095: 0x00c0, 0x3096: 0x00c0, 0x3097: 0x00c0, + 0x3098: 0x00c0, 0x3099: 0x00c0, 0x309a: 0x00c0, 0x309b: 0x00c0, 0x309c: 0x00c0, 0x309d: 0x00c0, + 0x309e: 0x00c0, 0x309f: 0x00c0, 0x30a0: 0x0080, 0x30a1: 0x0080, 0x30a2: 0x0080, 0x30a3: 0x0080, + 0x30ad: 0x00c0, 0x30ae: 0x00c0, 0x30af: 0x00c0, + 0x30b0: 0x00c0, 0x30b1: 0x00c0, 0x30b2: 0x00c0, 0x30b3: 0x00c0, 0x30b4: 0x00c0, 0x30b5: 0x00c0, + 0x30b6: 0x00c0, 0x30b7: 0x00c0, 0x30b8: 0x00c0, 0x30b9: 0x00c0, 0x30ba: 0x00c0, 0x30bb: 0x00c0, + 0x30bc: 0x00c0, 0x30bd: 0x00c0, 0x30be: 0x00c0, 0x30bf: 0x00c0, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x00c0, 0x30c1: 0x0080, 0x30c2: 0x00c0, 0x30c3: 0x00c0, 0x30c4: 0x00c0, 0x30c5: 0x00c0, + 0x30c6: 0x00c0, 0x30c7: 0x00c0, 0x30c8: 0x00c0, 0x30c9: 0x00c0, 0x30ca: 0x0080, + 0x30d0: 0x00c0, 0x30d1: 0x00c0, + 0x30d2: 0x00c0, 0x30d3: 0x00c0, 0x30d4: 0x00c0, 0x30d5: 0x00c0, 0x30d6: 0x00c0, 0x30d7: 0x00c0, + 0x30d8: 0x00c0, 0x30d9: 0x00c0, 0x30da: 0x00c0, 0x30db: 0x00c0, 0x30dc: 0x00c0, 0x30dd: 0x00c0, + 0x30de: 0x00c0, 0x30df: 0x00c0, 0x30e0: 0x00c0, 0x30e1: 0x00c0, 0x30e2: 0x00c0, 0x30e3: 0x00c0, + 0x30e4: 0x00c0, 0x30e5: 0x00c0, 0x30e6: 0x00c0, 0x30e7: 0x00c0, 0x30e8: 0x00c0, 0x30e9: 0x00c0, + 0x30ea: 0x00c0, 0x30eb: 0x00c0, 0x30ec: 0x00c0, 0x30ed: 0x00c0, 0x30ee: 0x00c0, 0x30ef: 0x00c0, + 0x30f0: 0x00c0, 0x30f1: 0x00c0, 0x30f2: 0x00c0, 0x30f3: 0x00c0, 0x30f4: 0x00c0, 0x30f5: 0x00c0, + 0x30f6: 0x00c3, 0x30f7: 0x00c3, 0x30f8: 0x00c3, 0x30f9: 0x00c3, 0x30fa: 0x00c3, + // Block 0xc4, offset 0x3100 + 0x3100: 0x00c0, 0x3101: 0x00c0, 0x3102: 0x00c0, 0x3103: 0x00c0, 0x3104: 0x00c0, 0x3105: 0x00c0, + 0x3106: 0x00c0, 0x3107: 0x00c0, 0x3108: 0x00c0, 0x3109: 0x00c0, 0x310a: 0x00c0, 0x310b: 0x00c0, + 0x310c: 0x00c0, 0x310d: 0x00c0, 0x310e: 0x00c0, 0x310f: 0x00c0, 0x3110: 0x00c0, 0x3111: 0x00c0, + 0x3112: 0x00c0, 0x3113: 0x00c0, 0x3114: 0x00c0, 0x3115: 0x00c0, 0x3116: 0x00c0, 0x3117: 0x00c0, + 0x3118: 0x00c0, 0x3119: 0x00c0, 0x311a: 0x00c0, 0x311b: 0x00c0, 0x311c: 0x00c0, 0x311d: 0x00c0, + 0x311f: 0x0080, 0x3120: 0x00c0, 0x3121: 0x00c0, 0x3122: 0x00c0, 0x3123: 0x00c0, + 0x3124: 0x00c0, 0x3125: 0x00c0, 0x3126: 0x00c0, 0x3127: 0x00c0, 0x3128: 0x00c0, 0x3129: 0x00c0, + 0x312a: 0x00c0, 0x312b: 0x00c0, 0x312c: 0x00c0, 0x312d: 0x00c0, 0x312e: 0x00c0, 0x312f: 0x00c0, + 0x3130: 0x00c0, 0x3131: 0x00c0, 0x3132: 0x00c0, 0x3133: 0x00c0, 0x3134: 0x00c0, 0x3135: 0x00c0, + 0x3136: 0x00c0, 0x3137: 0x00c0, 0x3138: 0x00c0, 0x3139: 0x00c0, 0x313a: 0x00c0, 0x313b: 0x00c0, + 0x313c: 0x00c0, 0x313d: 0x00c0, 0x313e: 0x00c0, 0x313f: 0x00c0, + // Block 0xc5, offset 0x3140 + 0x3140: 0x00c0, 0x3141: 0x00c0, 0x3142: 0x00c0, 0x3143: 0x00c0, + 0x3148: 0x00c0, 0x3149: 0x00c0, 0x314a: 0x00c0, 0x314b: 0x00c0, + 0x314c: 0x00c0, 0x314d: 0x00c0, 0x314e: 0x00c0, 0x314f: 0x00c0, 0x3150: 0x0080, 0x3151: 0x0080, + 0x3152: 0x0080, 0x3153: 0x0080, 0x3154: 0x0080, 0x3155: 0x0080, + // Block 0xc6, offset 0x3180 + 0x3180: 0x00c0, 0x3181: 0x00c0, 0x3182: 0x00c0, 0x3183: 0x00c0, 0x3184: 0x00c0, 0x3185: 0x00c0, + 0x3186: 0x00c0, 0x3187: 0x00c0, 0x3188: 0x00c0, 0x3189: 0x00c0, 0x318a: 0x00c0, 0x318b: 0x00c0, + 0x318c: 0x00c0, 0x318d: 0x00c0, 0x318e: 0x00c0, 0x318f: 0x00c0, 0x3190: 0x00c0, 0x3191: 0x00c0, + 0x3192: 0x00c0, 0x3193: 0x00c0, 0x3194: 0x00c0, 0x3195: 0x00c0, 0x3196: 0x00c0, 0x3197: 0x00c0, + 0x3198: 0x00c0, 0x3199: 0x00c0, 0x319a: 0x00c0, 0x319b: 0x00c0, 0x319c: 0x00c0, 0x319d: 0x00c0, + 0x31a0: 0x00c0, 0x31a1: 0x00c0, 0x31a2: 0x00c0, 0x31a3: 0x00c0, + 0x31a4: 0x00c0, 0x31a5: 0x00c0, 0x31a6: 0x00c0, 0x31a7: 0x00c0, 0x31a8: 0x00c0, 0x31a9: 0x00c0, + 0x31b0: 0x00c0, 0x31b1: 0x00c0, 0x31b2: 0x00c0, 0x31b3: 0x00c0, 0x31b4: 0x00c0, 0x31b5: 0x00c0, + 0x31b6: 0x00c0, 0x31b7: 0x00c0, 0x31b8: 0x00c0, 0x31b9: 0x00c0, 0x31ba: 0x00c0, 0x31bb: 0x00c0, + 0x31bc: 0x00c0, 0x31bd: 0x00c0, 0x31be: 0x00c0, 0x31bf: 0x00c0, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x00c0, 0x31c1: 0x00c0, 0x31c2: 0x00c0, 0x31c3: 0x00c0, 0x31c4: 0x00c0, 0x31c5: 0x00c0, + 0x31c6: 0x00c0, 0x31c7: 0x00c0, 0x31c8: 0x00c0, 0x31c9: 0x00c0, 0x31ca: 0x00c0, 0x31cb: 0x00c0, + 0x31cc: 0x00c0, 0x31cd: 0x00c0, 0x31ce: 0x00c0, 0x31cf: 0x00c0, 0x31d0: 0x00c0, 0x31d1: 0x00c0, + 0x31d2: 0x00c0, 0x31d3: 0x00c0, + 0x31d8: 0x00c0, 0x31d9: 0x00c0, 0x31da: 0x00c0, 0x31db: 0x00c0, 0x31dc: 0x00c0, 0x31dd: 0x00c0, + 0x31de: 0x00c0, 0x31df: 0x00c0, 0x31e0: 0x00c0, 0x31e1: 0x00c0, 0x31e2: 0x00c0, 0x31e3: 0x00c0, + 0x31e4: 0x00c0, 0x31e5: 0x00c0, 0x31e6: 0x00c0, 0x31e7: 0x00c0, 0x31e8: 0x00c0, 0x31e9: 0x00c0, + 0x31ea: 0x00c0, 0x31eb: 0x00c0, 0x31ec: 0x00c0, 0x31ed: 0x00c0, 0x31ee: 0x00c0, 0x31ef: 0x00c0, + 0x31f0: 0x00c0, 0x31f1: 0x00c0, 0x31f2: 0x00c0, 0x31f3: 0x00c0, 0x31f4: 0x00c0, 0x31f5: 0x00c0, + 0x31f6: 0x00c0, 0x31f7: 0x00c0, 0x31f8: 0x00c0, 0x31f9: 0x00c0, 0x31fa: 0x00c0, 0x31fb: 0x00c0, + // Block 0xc8, offset 0x3200 + 0x3200: 0x00c0, 0x3201: 0x00c0, 0x3202: 0x00c0, 0x3203: 0x00c0, 0x3204: 0x00c0, 0x3205: 0x00c0, + 0x3206: 0x00c0, 0x3207: 0x00c0, 0x3208: 0x00c0, 0x3209: 0x00c0, 0x320a: 0x00c0, 0x320b: 0x00c0, + 0x320c: 0x00c0, 0x320d: 0x00c0, 0x320e: 0x00c0, 0x320f: 0x00c0, 0x3210: 0x00c0, 0x3211: 0x00c0, + 0x3212: 0x00c0, 0x3213: 0x00c0, 0x3214: 0x00c0, 0x3215: 0x00c0, 0x3216: 0x00c0, 0x3217: 0x00c0, + 0x3218: 0x00c0, 0x3219: 0x00c0, 0x321a: 0x00c0, 0x321b: 0x00c0, 0x321c: 0x00c0, 0x321d: 0x00c0, + 0x321e: 0x00c0, 0x321f: 0x00c0, 0x3220: 0x00c0, 0x3221: 0x00c0, 0x3222: 0x00c0, 0x3223: 0x00c0, + 0x3224: 0x00c0, 0x3225: 0x00c0, 0x3226: 0x00c0, 0x3227: 0x00c0, + 0x3230: 0x00c0, 0x3231: 0x00c0, 0x3232: 0x00c0, 0x3233: 0x00c0, 0x3234: 0x00c0, 0x3235: 0x00c0, + 0x3236: 0x00c0, 0x3237: 0x00c0, 0x3238: 0x00c0, 0x3239: 0x00c0, 0x323a: 0x00c0, 0x323b: 0x00c0, + 0x323c: 0x00c0, 0x323d: 0x00c0, 0x323e: 0x00c0, 0x323f: 0x00c0, + // Block 0xc9, offset 0x3240 + 0x3240: 0x00c0, 0x3241: 0x00c0, 0x3242: 0x00c0, 0x3243: 0x00c0, 0x3244: 0x00c0, 0x3245: 0x00c0, + 0x3246: 0x00c0, 0x3247: 0x00c0, 0x3248: 0x00c0, 0x3249: 0x00c0, 0x324a: 0x00c0, 0x324b: 0x00c0, + 0x324c: 0x00c0, 0x324d: 0x00c0, 0x324e: 0x00c0, 0x324f: 0x00c0, 0x3250: 0x00c0, 0x3251: 0x00c0, + 0x3252: 0x00c0, 0x3253: 0x00c0, 0x3254: 0x00c0, 0x3255: 0x00c0, 0x3256: 0x00c0, 0x3257: 0x00c0, + 0x3258: 0x00c0, 0x3259: 0x00c0, 0x325a: 0x00c0, 0x325b: 0x00c0, 0x325c: 0x00c0, 0x325d: 0x00c0, + 0x325e: 0x00c0, 0x325f: 0x00c0, 0x3260: 0x00c0, 0x3261: 0x00c0, 0x3262: 0x00c0, 0x3263: 0x00c0, + 0x326f: 0x0080, + 0x3270: 0x00c0, 0x3271: 0x00c0, 0x3272: 0x00c0, 0x3273: 0x00c0, 0x3274: 0x00c0, 0x3275: 0x00c0, + 0x3276: 0x00c0, 0x3277: 0x00c0, 0x3278: 0x00c0, 0x3279: 0x00c0, 0x327a: 0x00c0, + 0x327c: 0x00c0, 0x327d: 0x00c0, 0x327e: 0x00c0, 0x327f: 0x00c0, + // Block 0xca, offset 0x3280 + 0x3280: 0x00c0, 0x3281: 0x00c0, 0x3282: 0x00c0, 0x3283: 0x00c0, 0x3284: 0x00c0, 0x3285: 0x00c0, + 0x3286: 0x00c0, 0x3287: 0x00c0, 0x3288: 0x00c0, 0x3289: 0x00c0, 0x328a: 0x00c0, + 0x328c: 0x00c0, 0x328d: 0x00c0, 0x328e: 0x00c0, 0x328f: 0x00c0, 0x3290: 0x00c0, 0x3291: 0x00c0, + 0x3292: 0x00c0, 0x3294: 0x00c0, 0x3295: 0x00c0, 0x3297: 0x00c0, + 0x3298: 0x00c0, 0x3299: 0x00c0, 0x329a: 0x00c0, 0x329b: 0x00c0, 0x329c: 0x00c0, 0x329d: 0x00c0, + 0x329e: 0x00c0, 0x329f: 0x00c0, 0x32a0: 0x00c0, 0x32a1: 0x00c0, 0x32a3: 0x00c0, + 0x32a4: 0x00c0, 0x32a5: 0x00c0, 0x32a6: 0x00c0, 0x32a7: 0x00c0, 0x32a8: 0x00c0, 0x32a9: 0x00c0, + 0x32aa: 0x00c0, 0x32ab: 0x00c0, 0x32ac: 0x00c0, 0x32ad: 0x00c0, 0x32ae: 0x00c0, 0x32af: 0x00c0, + 0x32b0: 0x00c0, 0x32b1: 0x00c0, 0x32b3: 0x00c0, 0x32b4: 0x00c0, 0x32b5: 0x00c0, + 0x32b6: 0x00c0, 0x32b7: 0x00c0, 0x32b8: 0x00c0, 0x32b9: 0x00c0, 0x32bb: 0x00c0, + 0x32bc: 0x00c0, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x00c0, 0x32c1: 0x00c0, 0x32c2: 0x00c0, 0x32c3: 0x00c0, 0x32c4: 0x00c0, 0x32c5: 0x00c0, + 0x32c6: 0x00c0, 0x32c7: 0x00c0, 0x32c8: 0x00c0, 0x32c9: 0x00c0, 0x32ca: 0x00c0, 0x32cb: 0x00c0, + 0x32cc: 0x00c0, 0x32cd: 0x00c0, 0x32ce: 0x00c0, 0x32cf: 0x00c0, 0x32d0: 0x00c0, 0x32d1: 0x00c0, + 0x32d2: 0x00c0, 0x32d3: 0x00c0, 0x32d4: 0x00c0, 0x32d5: 0x00c0, 0x32d6: 0x00c0, 0x32d7: 0x00c0, + 0x32d8: 0x00c0, 0x32d9: 0x00c0, 0x32da: 0x00c0, 0x32db: 0x00c0, 0x32dc: 0x00c0, 0x32dd: 0x00c0, + 0x32de: 0x00c0, 0x32df: 0x00c0, 0x32e0: 0x00c0, 0x32e1: 0x00c0, 0x32e2: 0x00c0, 0x32e3: 0x00c0, + 0x32e4: 0x00c0, 0x32e5: 0x00c0, 0x32e6: 0x00c0, 0x32e7: 0x00c0, 0x32e8: 0x00c0, 0x32e9: 0x00c0, + 0x32ea: 0x00c0, 0x32eb: 0x00c0, 0x32ec: 0x00c0, 0x32ed: 0x00c0, 0x32ee: 0x00c0, 0x32ef: 0x00c0, + 0x32f0: 0x00c0, 0x32f1: 0x00c0, 0x32f2: 0x00c0, 0x32f3: 0x00c0, 0x32f4: 0x00c0, 0x32f5: 0x00c0, + 0x32f6: 0x00c0, + // Block 0xcc, offset 0x3300 + 0x3300: 0x00c0, 0x3301: 0x00c0, 0x3302: 0x00c0, 0x3303: 0x00c0, 0x3304: 0x00c0, 0x3305: 0x00c0, + 0x3306: 0x00c0, 0x3307: 0x00c0, 0x3308: 0x00c0, 0x3309: 0x00c0, 0x330a: 0x00c0, 0x330b: 0x00c0, + 0x330c: 0x00c0, 0x330d: 0x00c0, 0x330e: 0x00c0, 0x330f: 0x00c0, 0x3310: 0x00c0, 0x3311: 0x00c0, + 0x3312: 0x00c0, 0x3313: 0x00c0, 0x3314: 0x00c0, 0x3315: 0x00c0, + 0x3320: 0x00c0, 0x3321: 0x00c0, 0x3322: 0x00c0, 0x3323: 0x00c0, + 0x3324: 0x00c0, 0x3325: 0x00c0, 0x3326: 0x00c0, 0x3327: 0x00c0, + // Block 0xcd, offset 0x3340 + 0x3340: 0x00c0, 0x3341: 0x0080, 0x3342: 0x0080, 0x3343: 0x0080, 0x3344: 0x0080, 0x3345: 0x0080, + 0x3347: 0x0080, 0x3348: 0x0080, 0x3349: 0x0080, 0x334a: 0x0080, 0x334b: 0x0080, + 0x334c: 0x0080, 0x334d: 0x0080, 0x334e: 0x0080, 0x334f: 0x0080, 0x3350: 0x0080, 0x3351: 0x0080, + 0x3352: 0x0080, 0x3353: 0x0080, 0x3354: 0x0080, 0x3355: 0x0080, 0x3356: 0x0080, 0x3357: 0x0080, + 0x3358: 0x0080, 0x3359: 0x0080, 0x335a: 0x0080, 0x335b: 0x0080, 0x335c: 0x0080, 0x335d: 0x0080, + 0x335e: 0x0080, 0x335f: 0x0080, 0x3360: 0x0080, 0x3361: 0x0080, 0x3362: 0x0080, 0x3363: 0x0080, + 0x3364: 0x0080, 0x3365: 0x0080, 0x3366: 0x0080, 0x3367: 0x0080, 0x3368: 0x0080, 0x3369: 0x0080, + 0x336a: 0x0080, 0x336b: 0x0080, 0x336c: 0x0080, 0x336d: 0x0080, 0x336e: 0x0080, 0x336f: 0x0080, + 0x3370: 0x0080, 0x3372: 0x0080, 0x3373: 0x0080, 0x3374: 0x0080, 0x3375: 0x0080, + 0x3376: 0x0080, 0x3377: 0x0080, 0x3378: 0x0080, 0x3379: 0x0080, 0x337a: 0x0080, + // Block 0xce, offset 0x3380 + 0x3380: 0x00c0, 0x3381: 0x00c0, 0x3382: 0x00c0, 0x3383: 0x00c0, 0x3384: 0x00c0, 0x3385: 0x00c0, + 0x3388: 0x00c0, 0x338a: 0x00c0, 0x338b: 0x00c0, + 0x338c: 0x00c0, 0x338d: 0x00c0, 0x338e: 0x00c0, 0x338f: 0x00c0, 0x3390: 0x00c0, 0x3391: 0x00c0, + 0x3392: 0x00c0, 0x3393: 0x00c0, 0x3394: 0x00c0, 0x3395: 0x00c0, 0x3396: 0x00c0, 0x3397: 0x00c0, + 0x3398: 0x00c0, 0x3399: 0x00c0, 0x339a: 0x00c0, 0x339b: 0x00c0, 0x339c: 0x00c0, 0x339d: 0x00c0, + 0x339e: 0x00c0, 0x339f: 0x00c0, 0x33a0: 0x00c0, 0x33a1: 0x00c0, 0x33a2: 0x00c0, 0x33a3: 0x00c0, + 0x33a4: 0x00c0, 0x33a5: 0x00c0, 0x33a6: 0x00c0, 0x33a7: 0x00c0, 0x33a8: 0x00c0, 0x33a9: 0x00c0, + 0x33aa: 0x00c0, 0x33ab: 0x00c0, 0x33ac: 0x00c0, 0x33ad: 0x00c0, 0x33ae: 0x00c0, 0x33af: 0x00c0, + 0x33b0: 0x00c0, 0x33b1: 0x00c0, 0x33b2: 0x00c0, 0x33b3: 0x00c0, 0x33b4: 0x00c0, 0x33b5: 0x00c0, + 0x33b7: 0x00c0, 0x33b8: 0x00c0, + 0x33bc: 0x00c0, 0x33bf: 0x00c0, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x00c0, 0x33c1: 0x00c0, 0x33c2: 0x00c0, 0x33c3: 0x00c0, 0x33c4: 0x00c0, 0x33c5: 0x00c0, + 0x33c6: 0x00c0, 0x33c7: 0x00c0, 0x33c8: 0x00c0, 0x33c9: 0x00c0, 0x33ca: 0x00c0, 0x33cb: 0x00c0, + 0x33cc: 0x00c0, 0x33cd: 0x00c0, 0x33ce: 0x00c0, 0x33cf: 0x00c0, 0x33d0: 0x00c0, 0x33d1: 0x00c0, + 0x33d2: 0x00c0, 0x33d3: 0x00c0, 0x33d4: 0x00c0, 0x33d5: 0x00c0, 0x33d7: 0x0080, + 0x33d8: 0x0080, 0x33d9: 0x0080, 0x33da: 0x0080, 0x33db: 0x0080, 0x33dc: 0x0080, 0x33dd: 0x0080, + 0x33de: 0x0080, 0x33df: 0x0080, 0x33e0: 0x00c0, 0x33e1: 0x00c0, 0x33e2: 0x00c0, 0x33e3: 0x00c0, + 0x33e4: 0x00c0, 0x33e5: 0x00c0, 0x33e6: 0x00c0, 0x33e7: 0x00c0, 0x33e8: 0x00c0, 0x33e9: 0x00c0, + 0x33ea: 0x00c0, 0x33eb: 0x00c0, 0x33ec: 0x00c0, 0x33ed: 0x00c0, 0x33ee: 0x00c0, 0x33ef: 0x00c0, + 0x33f0: 0x00c0, 0x33f1: 0x00c0, 0x33f2: 0x00c0, 0x33f3: 0x00c0, 0x33f4: 0x00c0, 0x33f5: 0x00c0, + 0x33f6: 0x00c0, 0x33f7: 0x0080, 0x33f8: 0x0080, 0x33f9: 0x0080, 0x33fa: 0x0080, 0x33fb: 0x0080, + 0x33fc: 0x0080, 0x33fd: 0x0080, 0x33fe: 0x0080, 0x33ff: 0x0080, + // Block 0xd0, offset 0x3400 + 0x3400: 0x00c0, 0x3401: 0x00c0, 0x3402: 0x00c0, 0x3403: 0x00c0, 0x3404: 0x00c0, 0x3405: 0x00c0, + 0x3406: 0x00c0, 0x3407: 0x00c0, 0x3408: 0x00c0, 0x3409: 0x00c0, 0x340a: 0x00c0, 0x340b: 0x00c0, + 0x340c: 0x00c0, 0x340d: 0x00c0, 0x340e: 0x00c0, 0x340f: 0x00c0, 0x3410: 0x00c0, 0x3411: 0x00c0, + 0x3412: 0x00c0, 0x3413: 0x00c0, 0x3414: 0x00c0, 0x3415: 0x00c0, 0x3416: 0x00c0, 0x3417: 0x00c0, + 0x3418: 0x00c0, 0x3419: 0x00c0, 0x341a: 0x00c0, 0x341b: 0x00c0, 0x341c: 0x00c0, 0x341d: 0x00c0, + 0x341e: 0x00c0, + 0x3427: 0x0080, 0x3428: 0x0080, 0x3429: 0x0080, + 0x342a: 0x0080, 0x342b: 0x0080, 0x342c: 0x0080, 0x342d: 0x0080, 0x342e: 0x0080, 0x342f: 0x0080, + // Block 0xd1, offset 0x3440 + 0x3460: 0x00c0, 0x3461: 0x00c0, 0x3462: 0x00c0, 0x3463: 0x00c0, + 0x3464: 0x00c0, 0x3465: 0x00c0, 0x3466: 0x00c0, 0x3467: 0x00c0, 0x3468: 0x00c0, 0x3469: 0x00c0, + 0x346a: 0x00c0, 0x346b: 0x00c0, 0x346c: 0x00c0, 0x346d: 0x00c0, 0x346e: 0x00c0, 0x346f: 0x00c0, + 0x3470: 0x00c0, 0x3471: 0x00c0, 0x3472: 0x00c0, 0x3474: 0x00c0, 0x3475: 0x00c0, + 0x347b: 0x0080, + 0x347c: 0x0080, 0x347d: 0x0080, 0x347e: 0x0080, 0x347f: 0x0080, + // Block 0xd2, offset 0x3480 + 0x3480: 0x00c0, 0x3481: 0x00c0, 0x3482: 0x00c0, 0x3483: 0x00c0, 0x3484: 0x00c0, 0x3485: 0x00c0, + 0x3486: 0x00c0, 0x3487: 0x00c0, 0x3488: 0x00c0, 0x3489: 0x00c0, 0x348a: 0x00c0, 0x348b: 0x00c0, + 0x348c: 0x00c0, 0x348d: 0x00c0, 0x348e: 0x00c0, 0x348f: 0x00c0, 0x3490: 0x00c0, 0x3491: 0x00c0, + 0x3492: 0x00c0, 0x3493: 0x00c0, 0x3494: 0x00c0, 0x3495: 0x00c0, 0x3496: 0x0080, 0x3497: 0x0080, + 0x3498: 0x0080, 0x3499: 0x0080, 0x349a: 0x0080, 0x349b: 0x0080, + 0x349f: 0x0080, 0x34a0: 0x00c0, 0x34a1: 0x00c0, 0x34a2: 0x00c0, 0x34a3: 0x00c0, + 0x34a4: 0x00c0, 0x34a5: 0x00c0, 0x34a6: 0x00c0, 0x34a7: 0x00c0, 0x34a8: 0x00c0, 0x34a9: 0x00c0, + 0x34aa: 0x00c0, 0x34ab: 0x00c0, 0x34ac: 0x00c0, 0x34ad: 0x00c0, 0x34ae: 0x00c0, 0x34af: 0x00c0, + 0x34b0: 0x00c0, 0x34b1: 0x00c0, 0x34b2: 0x00c0, 0x34b3: 0x00c0, 0x34b4: 0x00c0, 0x34b5: 0x00c0, + 0x34b6: 0x00c0, 0x34b7: 0x00c0, 0x34b8: 0x00c0, 0x34b9: 0x00c0, + 0x34bf: 0x0080, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x00c0, 0x34c1: 0x00c0, 0x34c2: 0x00c0, 0x34c3: 0x00c0, 0x34c4: 0x00c0, 0x34c5: 0x00c0, + 0x34c6: 0x00c0, 0x34c7: 0x00c0, 0x34c8: 0x00c0, 0x34c9: 0x00c0, 0x34ca: 0x00c0, 0x34cb: 0x00c0, + 0x34cc: 0x00c0, 0x34cd: 0x00c0, 0x34ce: 0x00c0, 0x34cf: 0x00c0, 0x34d0: 0x00c0, 0x34d1: 0x00c0, + 0x34d2: 0x00c0, 0x34d3: 0x00c0, 0x34d4: 0x00c0, 0x34d5: 0x00c0, 0x34d6: 0x00c0, 0x34d7: 0x00c0, + 0x34d8: 0x00c0, 0x34d9: 0x00c0, 0x34da: 0x00c0, 0x34db: 0x00c0, 0x34dc: 0x00c0, 0x34dd: 0x00c0, + 0x34de: 0x00c0, 0x34df: 0x00c0, 0x34e0: 0x00c0, 0x34e1: 0x00c0, 0x34e2: 0x00c0, 0x34e3: 0x00c0, + 0x34e4: 0x00c0, 0x34e5: 0x00c0, 0x34e6: 0x00c0, 0x34e7: 0x00c0, 0x34e8: 0x00c0, 0x34e9: 0x00c0, + 0x34ea: 0x00c0, 0x34eb: 0x00c0, 0x34ec: 0x00c0, 0x34ed: 0x00c0, 0x34ee: 0x00c0, 0x34ef: 0x00c0, + 0x34f0: 0x00c0, 0x34f1: 0x00c0, 0x34f2: 0x00c0, 0x34f3: 0x00c0, 0x34f4: 0x00c0, 0x34f5: 0x00c0, + 0x34f6: 0x00c0, 0x34f7: 0x00c0, + 0x34fc: 0x0080, 0x34fd: 0x0080, 0x34fe: 0x00c0, 0x34ff: 0x00c0, + // Block 0xd4, offset 0x3500 + 0x3500: 0x00c0, 0x3501: 0x00c3, 0x3502: 0x00c3, 0x3503: 0x00c3, 0x3505: 0x00c3, + 0x3506: 0x00c3, + 0x350c: 0x00c3, 0x350d: 0x00c3, 0x350e: 0x00c3, 0x350f: 0x00c3, 0x3510: 0x00c0, 0x3511: 0x00c0, + 0x3512: 0x00c0, 0x3513: 0x00c0, 0x3515: 0x00c0, 0x3516: 0x00c0, 0x3517: 0x00c0, + 0x3519: 0x00c0, 0x351a: 0x00c0, 0x351b: 0x00c0, 0x351c: 0x00c0, 0x351d: 0x00c0, + 0x351e: 0x00c0, 0x351f: 0x00c0, 0x3520: 0x00c0, 0x3521: 0x00c0, 0x3522: 0x00c0, 0x3523: 0x00c0, + 0x3524: 0x00c0, 0x3525: 0x00c0, 0x3526: 0x00c0, 0x3527: 0x00c0, 0x3528: 0x00c0, 0x3529: 0x00c0, + 0x352a: 0x00c0, 0x352b: 0x00c0, 0x352c: 0x00c0, 0x352d: 0x00c0, 0x352e: 0x00c0, 0x352f: 0x00c0, + 0x3530: 0x00c0, 0x3531: 0x00c0, 0x3532: 0x00c0, 0x3533: 0x00c0, 0x3534: 0x00c0, 0x3535: 0x00c0, + 0x3538: 0x00c3, 0x3539: 0x00c3, 0x353a: 0x00c3, + 0x353f: 0x00c6, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0080, 0x3541: 0x0080, 0x3542: 0x0080, 0x3543: 0x0080, 0x3544: 0x0080, 0x3545: 0x0080, + 0x3546: 0x0080, 0x3547: 0x0080, 0x3548: 0x0080, + 0x3550: 0x0080, 0x3551: 0x0080, + 0x3552: 0x0080, 0x3553: 0x0080, 0x3554: 0x0080, 0x3555: 0x0080, 0x3556: 0x0080, 0x3557: 0x0080, + 0x3558: 0x0080, + 0x3560: 0x00c0, 0x3561: 0x00c0, 0x3562: 0x00c0, 0x3563: 0x00c0, + 0x3564: 0x00c0, 0x3565: 0x00c0, 0x3566: 0x00c0, 0x3567: 0x00c0, 0x3568: 0x00c0, 0x3569: 0x00c0, + 0x356a: 0x00c0, 0x356b: 0x00c0, 0x356c: 0x00c0, 0x356d: 0x00c0, 0x356e: 0x00c0, 0x356f: 0x00c0, + 0x3570: 0x00c0, 0x3571: 0x00c0, 0x3572: 0x00c0, 0x3573: 0x00c0, 0x3574: 0x00c0, 0x3575: 0x00c0, + 0x3576: 0x00c0, 0x3577: 0x00c0, 0x3578: 0x00c0, 0x3579: 0x00c0, 0x357a: 0x00c0, 0x357b: 0x00c0, + 0x357c: 0x00c0, 0x357d: 0x0080, 0x357e: 0x0080, 0x357f: 0x0080, + // Block 0xd6, offset 0x3580 + 0x3580: 0x00c0, 0x3581: 0x00c0, 0x3582: 0x00c0, 0x3583: 0x00c0, 0x3584: 0x00c0, 0x3585: 0x00c0, + 0x3586: 0x00c0, 0x3587: 0x00c0, 0x3588: 0x00c0, 0x3589: 0x00c0, 0x358a: 0x00c0, 0x358b: 0x00c0, + 0x358c: 0x00c0, 0x358d: 0x00c0, 0x358e: 0x00c0, 0x358f: 0x00c0, 0x3590: 0x00c0, 0x3591: 0x00c0, + 0x3592: 0x00c0, 0x3593: 0x00c0, 0x3594: 0x00c0, 0x3595: 0x00c0, 0x3596: 0x00c0, 0x3597: 0x00c0, + 0x3598: 0x00c0, 0x3599: 0x00c0, 0x359a: 0x00c0, 0x359b: 0x00c0, 0x359c: 0x00c0, 0x359d: 0x0080, + 0x359e: 0x0080, 0x359f: 0x0080, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x00c2, 0x35c1: 0x00c2, 0x35c2: 0x00c2, 0x35c3: 0x00c2, 0x35c4: 0x00c2, 0x35c5: 0x00c4, + 0x35c6: 0x00c0, 0x35c7: 0x00c4, 0x35c8: 0x0080, 0x35c9: 0x00c4, 0x35ca: 0x00c4, 0x35cb: 0x00c0, + 0x35cc: 0x00c0, 0x35cd: 0x00c1, 0x35ce: 0x00c4, 0x35cf: 0x00c4, 0x35d0: 0x00c4, 0x35d1: 0x00c4, + 0x35d2: 0x00c4, 0x35d3: 0x00c2, 0x35d4: 0x00c2, 0x35d5: 0x00c2, 0x35d6: 0x00c2, 0x35d7: 0x00c1, + 0x35d8: 0x00c2, 0x35d9: 0x00c2, 0x35da: 0x00c2, 0x35db: 0x00c2, 0x35dc: 0x00c2, 0x35dd: 0x00c4, + 0x35de: 0x00c2, 0x35df: 0x00c2, 0x35e0: 0x00c2, 0x35e1: 0x00c4, 0x35e2: 0x00c0, 0x35e3: 0x00c0, + 0x35e4: 0x00c4, 0x35e5: 0x00c3, 0x35e6: 0x00c3, + 0x35eb: 0x0082, 0x35ec: 0x0082, 0x35ed: 0x0082, 0x35ee: 0x0082, 0x35ef: 0x0084, + 0x35f0: 0x0080, 0x35f1: 0x0080, 0x35f2: 0x0080, 0x35f3: 0x0080, 0x35f4: 0x0080, 0x35f5: 0x0080, + 0x35f6: 0x0080, + // Block 0xd8, offset 0x3600 + 0x3600: 0x00c0, 0x3601: 0x00c0, 0x3602: 0x00c0, 0x3603: 0x00c0, 0x3604: 0x00c0, 0x3605: 0x00c0, + 0x3606: 0x00c0, 0x3607: 0x00c0, 0x3608: 0x00c0, 0x3609: 0x00c0, 0x360a: 0x00c0, 0x360b: 0x00c0, + 0x360c: 0x00c0, 0x360d: 0x00c0, 0x360e: 0x00c0, 0x360f: 0x00c0, 0x3610: 0x00c0, 0x3611: 0x00c0, + 0x3612: 0x00c0, 0x3613: 0x00c0, 0x3614: 0x00c0, 0x3615: 0x00c0, 0x3616: 0x00c0, 0x3617: 0x00c0, + 0x3618: 0x00c0, 0x3619: 0x00c0, 0x361a: 0x00c0, 0x361b: 0x00c0, 0x361c: 0x00c0, 0x361d: 0x00c0, + 0x361e: 0x00c0, 0x361f: 0x00c0, 0x3620: 0x00c0, 0x3621: 0x00c0, 0x3622: 0x00c0, 0x3623: 0x00c0, + 0x3624: 0x00c0, 0x3625: 0x00c0, 0x3626: 0x00c0, 0x3627: 0x00c0, 0x3628: 0x00c0, 0x3629: 0x00c0, + 0x362a: 0x00c0, 0x362b: 0x00c0, 0x362c: 0x00c0, 0x362d: 0x00c0, 0x362e: 0x00c0, 0x362f: 0x00c0, + 0x3630: 0x00c0, 0x3631: 0x00c0, 0x3632: 0x00c0, 0x3633: 0x00c0, 0x3634: 0x00c0, 0x3635: 0x00c0, + 0x3639: 0x0080, 0x363a: 0x0080, 0x363b: 0x0080, + 0x363c: 0x0080, 0x363d: 0x0080, 0x363e: 0x0080, 0x363f: 0x0080, + // Block 0xd9, offset 0x3640 + 0x3640: 0x00c0, 0x3641: 0x00c0, 0x3642: 0x00c0, 0x3643: 0x00c0, 0x3644: 0x00c0, 0x3645: 0x00c0, + 0x3646: 0x00c0, 0x3647: 0x00c0, 0x3648: 0x00c0, 0x3649: 0x00c0, 0x364a: 0x00c0, 0x364b: 0x00c0, + 0x364c: 0x00c0, 0x364d: 0x00c0, 0x364e: 0x00c0, 0x364f: 0x00c0, 0x3650: 0x00c0, 0x3651: 0x00c0, + 0x3652: 0x00c0, 0x3653: 0x00c0, 0x3654: 0x00c0, 0x3655: 0x00c0, + 0x3658: 0x0080, 0x3659: 0x0080, 0x365a: 0x0080, 0x365b: 0x0080, 0x365c: 0x0080, 0x365d: 0x0080, + 0x365e: 0x0080, 0x365f: 0x0080, 0x3660: 0x00c0, 0x3661: 0x00c0, 0x3662: 0x00c0, 0x3663: 0x00c0, + 0x3664: 0x00c0, 0x3665: 0x00c0, 0x3666: 0x00c0, 0x3667: 0x00c0, 0x3668: 0x00c0, 0x3669: 0x00c0, + 0x366a: 0x00c0, 0x366b: 0x00c0, 0x366c: 0x00c0, 0x366d: 0x00c0, 0x366e: 0x00c0, 0x366f: 0x00c0, + 0x3670: 0x00c0, 0x3671: 0x00c0, 0x3672: 0x00c0, + 0x3678: 0x0080, 0x3679: 0x0080, 0x367a: 0x0080, 0x367b: 0x0080, + 0x367c: 0x0080, 0x367d: 0x0080, 0x367e: 0x0080, 0x367f: 0x0080, + // Block 0xda, offset 0x3680 + 0x3680: 0x00c2, 0x3681: 0x00c4, 0x3682: 0x00c2, 0x3683: 0x00c4, 0x3684: 0x00c4, 0x3685: 0x00c4, + 0x3686: 0x00c2, 0x3687: 0x00c2, 0x3688: 0x00c2, 0x3689: 0x00c4, 0x368a: 0x00c2, 0x368b: 0x00c2, + 0x368c: 0x00c4, 0x368d: 0x00c2, 0x368e: 0x00c4, 0x368f: 0x00c4, 0x3690: 0x00c2, 0x3691: 0x00c4, + 0x3699: 0x0080, 0x369a: 0x0080, 0x369b: 0x0080, 0x369c: 0x0080, + 0x36a9: 0x0084, + 0x36aa: 0x0084, 0x36ab: 0x0084, 0x36ac: 0x0084, 0x36ad: 0x0082, 0x36ae: 0x0082, 0x36af: 0x0080, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x00c0, 0x36c1: 0x00c0, 0x36c2: 0x00c0, 0x36c3: 0x00c0, 0x36c4: 0x00c0, 0x36c5: 0x00c0, + 0x36c6: 0x00c0, 0x36c7: 0x00c0, 0x36c8: 0x00c0, + // Block 0xdc, offset 0x3700 + 0x3700: 0x00c0, 0x3701: 0x00c0, 0x3702: 0x00c0, 0x3703: 0x00c0, 0x3704: 0x00c0, 0x3705: 0x00c0, + 0x3706: 0x00c0, 0x3707: 0x00c0, 0x3708: 0x00c0, 0x3709: 0x00c0, 0x370a: 0x00c0, 0x370b: 0x00c0, + 0x370c: 0x00c0, 0x370d: 0x00c0, 0x370e: 0x00c0, 0x370f: 0x00c0, 0x3710: 0x00c0, 0x3711: 0x00c0, + 0x3712: 0x00c0, 0x3713: 0x00c0, 0x3714: 0x00c0, 0x3715: 0x00c0, 0x3716: 0x00c0, 0x3717: 0x00c0, + 0x3718: 0x00c0, 0x3719: 0x00c0, 0x371a: 0x00c0, 0x371b: 0x00c0, 0x371c: 0x00c0, 0x371d: 0x00c0, + 0x371e: 0x00c0, 0x371f: 0x00c0, 0x3720: 0x00c0, 0x3721: 0x00c0, 0x3722: 0x00c0, 0x3723: 0x00c0, + 0x3724: 0x00c0, 0x3725: 0x00c0, 0x3726: 0x00c0, 0x3727: 0x00c0, 0x3728: 0x00c0, 0x3729: 0x00c0, + 0x372a: 0x00c0, 0x372b: 0x00c0, 0x372c: 0x00c0, 0x372d: 0x00c0, 0x372e: 0x00c0, 0x372f: 0x00c0, + 0x3730: 0x00c0, 0x3731: 0x00c0, 0x3732: 0x00c0, + // Block 0xdd, offset 0x3740 + 0x3740: 0x00c0, 0x3741: 0x00c0, 0x3742: 0x00c0, 0x3743: 0x00c0, 0x3744: 0x00c0, 0x3745: 0x00c0, + 0x3746: 0x00c0, 0x3747: 0x00c0, 0x3748: 0x00c0, 0x3749: 0x00c0, 0x374a: 0x00c0, 0x374b: 0x00c0, + 0x374c: 0x00c0, 0x374d: 0x00c0, 0x374e: 0x00c0, 0x374f: 0x00c0, 0x3750: 0x00c0, 0x3751: 0x00c0, + 0x3752: 0x00c0, 0x3753: 0x00c0, 0x3754: 0x00c0, 0x3755: 0x00c0, 0x3756: 0x00c0, 0x3757: 0x00c0, + 0x3758: 0x00c0, 0x3759: 0x00c0, 0x375a: 0x00c0, 0x375b: 0x00c0, 0x375c: 0x00c0, 0x375d: 0x00c0, + 0x375e: 0x00c0, 0x375f: 0x00c0, 0x3760: 0x00c0, 0x3761: 0x00c0, 0x3762: 0x00c0, 0x3763: 0x00c0, + 0x3764: 0x00c0, 0x3765: 0x00c0, 0x3766: 0x00c0, 0x3767: 0x00c0, 0x3768: 0x00c0, 0x3769: 0x00c0, + 0x376a: 0x00c0, 0x376b: 0x00c0, 0x376c: 0x00c0, 0x376d: 0x00c0, 0x376e: 0x00c0, 0x376f: 0x00c0, + 0x3770: 0x00c0, 0x3771: 0x00c0, 0x3772: 0x00c0, + 0x377a: 0x0080, 0x377b: 0x0080, + 0x377c: 0x0080, 0x377d: 0x0080, 0x377e: 0x0080, 0x377f: 0x0080, + // Block 0xde, offset 0x3780 + 0x3780: 0x00c1, 0x3781: 0x00c2, 0x3782: 0x00c2, 0x3783: 0x00c2, 0x3784: 0x00c2, 0x3785: 0x00c2, + 0x3786: 0x00c2, 0x3787: 0x00c2, 0x3788: 0x00c2, 0x3789: 0x00c2, 0x378a: 0x00c2, 0x378b: 0x00c2, + 0x378c: 0x00c2, 0x378d: 0x00c2, 0x378e: 0x00c2, 0x378f: 0x00c2, 0x3790: 0x00c2, 0x3791: 0x00c2, + 0x3792: 0x00c2, 0x3793: 0x00c2, 0x3794: 0x00c2, 0x3795: 0x00c2, 0x3796: 0x00c2, 0x3797: 0x00c2, + 0x3798: 0x00c2, 0x3799: 0x00c2, 0x379a: 0x00c2, 0x379b: 0x00c2, 0x379c: 0x00c2, 0x379d: 0x00c2, + 0x379e: 0x00c2, 0x379f: 0x00c2, 0x37a0: 0x00c2, 0x37a1: 0x00c2, 0x37a2: 0x00c4, 0x37a3: 0x00c2, + 0x37a4: 0x00c3, 0x37a5: 0x00c3, 0x37a6: 0x00c3, 0x37a7: 0x00c3, + 0x37b0: 0x00c0, 0x37b1: 0x00c0, 0x37b2: 0x00c0, 0x37b3: 0x00c0, 0x37b4: 0x00c0, 0x37b5: 0x00c0, + 0x37b6: 0x00c0, 0x37b7: 0x00c0, 0x37b8: 0x00c0, 0x37b9: 0x00c0, + // Block 0xdf, offset 0x37c0 + 0x37e0: 0x0080, 0x37e1: 0x0080, 0x37e2: 0x0080, 0x37e3: 0x0080, + 0x37e4: 0x0080, 0x37e5: 0x0080, 0x37e6: 0x0080, 0x37e7: 0x0080, 0x37e8: 0x0080, 0x37e9: 0x0080, + 0x37ea: 0x0080, 0x37eb: 0x0080, 0x37ec: 0x0080, 0x37ed: 0x0080, 0x37ee: 0x0080, 0x37ef: 0x0080, + 0x37f0: 0x0080, 0x37f1: 0x0080, 0x37f2: 0x0080, 0x37f3: 0x0080, 0x37f4: 0x0080, 0x37f5: 0x0080, + 0x37f6: 0x0080, 0x37f7: 0x0080, 0x37f8: 0x0080, 0x37f9: 0x0080, 0x37fa: 0x0080, 0x37fb: 0x0080, + 0x37fc: 0x0080, 0x37fd: 0x0080, 0x37fe: 0x0080, + // Block 0xe0, offset 0x3800 + 0x3800: 0x00c0, 0x3801: 0x00c0, 0x3802: 0x00c0, 0x3803: 0x00c0, 0x3804: 0x00c0, 0x3805: 0x00c0, + 0x3806: 0x00c0, 0x3807: 0x00c0, 0x3808: 0x00c0, 0x3809: 0x00c0, 0x380a: 0x00c0, 0x380b: 0x00c0, + 0x380c: 0x00c0, 0x380d: 0x00c0, 0x380e: 0x00c0, 0x380f: 0x00c0, 0x3810: 0x00c0, 0x3811: 0x00c0, + 0x3812: 0x00c0, 0x3813: 0x00c0, 0x3814: 0x00c0, 0x3815: 0x00c0, 0x3816: 0x00c0, 0x3817: 0x00c0, + 0x3818: 0x00c0, 0x3819: 0x00c0, 0x381a: 0x00c0, 0x381b: 0x00c0, 0x381c: 0x00c0, 0x381d: 0x00c0, + 0x381e: 0x00c0, 0x381f: 0x00c0, 0x3820: 0x00c0, 0x3821: 0x00c0, 0x3822: 0x00c0, 0x3823: 0x00c0, + 0x3824: 0x00c0, 0x3825: 0x00c0, 0x3826: 0x00c0, 0x3827: 0x00c0, 0x3828: 0x00c0, 0x3829: 0x00c0, + 0x382b: 0x00c3, 0x382c: 0x00c3, 0x382d: 0x0080, + 0x3830: 0x00c0, 0x3831: 0x00c0, + // Block 0xe1, offset 0x3840 + 0x387d: 0x00c3, 0x387e: 0x00c3, 0x387f: 0x00c3, + // Block 0xe2, offset 0x3880 + 0x3880: 0x00c0, 0x3881: 0x00c0, 0x3882: 0x00c0, 0x3883: 0x00c0, 0x3884: 0x00c0, 0x3885: 0x00c0, + 0x3886: 0x00c0, 0x3887: 0x00c0, 0x3888: 0x00c0, 0x3889: 0x00c0, 0x388a: 0x00c0, 0x388b: 0x00c0, + 0x388c: 0x00c0, 0x388d: 0x00c0, 0x388e: 0x00c0, 0x388f: 0x00c0, 0x3890: 0x00c0, 0x3891: 0x00c0, + 0x3892: 0x00c0, 0x3893: 0x00c0, 0x3894: 0x00c0, 0x3895: 0x00c0, 0x3896: 0x00c0, 0x3897: 0x00c0, + 0x3898: 0x00c0, 0x3899: 0x00c0, 0x389a: 0x00c0, 0x389b: 0x00c0, 0x389c: 0x00c0, 0x389d: 0x0080, + 0x389e: 0x0080, 0x389f: 0x0080, 0x38a0: 0x0080, 0x38a1: 0x0080, 0x38a2: 0x0080, 0x38a3: 0x0080, + 0x38a4: 0x0080, 0x38a5: 0x0080, 0x38a6: 0x0080, 0x38a7: 0x00c0, + 0x38b0: 0x00c2, 0x38b1: 0x00c2, 0x38b2: 0x00c2, 0x38b3: 0x00c4, 0x38b4: 0x00c2, 0x38b5: 0x00c2, + 0x38b6: 0x00c2, 0x38b7: 0x00c2, 0x38b8: 0x00c2, 0x38b9: 0x00c2, 0x38ba: 0x00c2, 0x38bb: 0x00c2, + 0x38bc: 0x00c2, 0x38bd: 0x00c2, 0x38be: 0x00c2, 0x38bf: 0x00c2, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x00c2, 0x38c1: 0x00c2, 0x38c2: 0x00c2, 0x38c3: 0x00c2, 0x38c4: 0x00c2, 0x38c5: 0x00c0, + 0x38c6: 0x00c3, 0x38c7: 0x00c3, 0x38c8: 0x00c3, 0x38c9: 0x00c3, 0x38ca: 0x00c3, 0x38cb: 0x00c3, + 0x38cc: 0x00c3, 0x38cd: 0x00c3, 0x38ce: 0x00c3, 0x38cf: 0x00c3, 0x38d0: 0x00c3, 0x38d1: 0x0082, + 0x38d2: 0x0082, 0x38d3: 0x0082, 0x38d4: 0x0084, 0x38d5: 0x0080, 0x38d6: 0x0080, 0x38d7: 0x0080, + 0x38d8: 0x0080, 0x38d9: 0x0080, + 0x38f0: 0x00c2, 0x38f1: 0x00c2, 0x38f2: 0x00c2, 0x38f3: 0x00c2, 0x38f4: 0x00c4, 0x38f5: 0x00c4, + 0x38f6: 0x00c2, 0x38f7: 0x00c2, 0x38f8: 0x00c2, 0x38f9: 0x00c2, 0x38fa: 0x00c2, 0x38fb: 0x00c2, + 0x38fc: 0x00c2, 0x38fd: 0x00c2, 0x38fe: 0x00c2, 0x38ff: 0x00c2, + // Block 0xe4, offset 0x3900 + 0x3900: 0x00c2, 0x3901: 0x00c2, 0x3902: 0x00c3, 0x3903: 0x00c3, 0x3904: 0x00c3, 0x3905: 0x00c3, + 0x3906: 0x0080, 0x3907: 0x0080, 0x3908: 0x0080, 0x3909: 0x0080, + 0x3930: 0x00c2, 0x3931: 0x00c0, 0x3932: 0x00c2, 0x3933: 0x00c2, 0x3934: 0x00c4, 0x3935: 0x00c4, + 0x3936: 0x00c4, 0x3937: 0x00c0, 0x3938: 0x00c2, 0x3939: 0x00c4, 0x393a: 0x00c4, 0x393b: 0x00c2, + 0x393c: 0x00c2, 0x393d: 0x00c4, 0x393e: 0x00c2, 0x393f: 0x00c2, + // Block 0xe5, offset 0x3940 + 0x3940: 0x00c0, 0x3941: 0x00c2, 0x3942: 0x00c4, 0x3943: 0x00c4, 0x3944: 0x00c2, 0x3945: 0x0080, + 0x3946: 0x0080, 0x3947: 0x0080, 0x3948: 0x0080, 0x3949: 0x0084, 0x394a: 0x0082, 0x394b: 0x0081, + 0x3960: 0x00c0, 0x3961: 0x00c0, 0x3962: 0x00c0, 0x3963: 0x00c0, + 0x3964: 0x00c0, 0x3965: 0x00c0, 0x3966: 0x00c0, 0x3967: 0x00c0, 0x3968: 0x00c0, 0x3969: 0x00c0, + 0x396a: 0x00c0, 0x396b: 0x00c0, 0x396c: 0x00c0, 0x396d: 0x00c0, 0x396e: 0x00c0, 0x396f: 0x00c0, + 0x3970: 0x00c0, 0x3971: 0x00c0, 0x3972: 0x00c0, 0x3973: 0x00c0, 0x3974: 0x00c0, 0x3975: 0x00c0, + 0x3976: 0x00c0, + // Block 0xe6, offset 0x3980 + 0x3980: 0x00c0, 0x3981: 0x00c3, 0x3982: 0x00c0, 0x3983: 0x00c0, 0x3984: 0x00c0, 0x3985: 0x00c0, + 0x3986: 0x00c0, 0x3987: 0x00c0, 0x3988: 0x00c0, 0x3989: 0x00c0, 0x398a: 0x00c0, 0x398b: 0x00c0, + 0x398c: 0x00c0, 0x398d: 0x00c0, 0x398e: 0x00c0, 0x398f: 0x00c0, 0x3990: 0x00c0, 0x3991: 0x00c0, + 0x3992: 0x00c0, 0x3993: 0x00c0, 0x3994: 0x00c0, 0x3995: 0x00c0, 0x3996: 0x00c0, 0x3997: 0x00c0, + 0x3998: 0x00c0, 0x3999: 0x00c0, 0x399a: 0x00c0, 0x399b: 0x00c0, 0x399c: 0x00c0, 0x399d: 0x00c0, + 0x399e: 0x00c0, 0x399f: 0x00c0, 0x39a0: 0x00c0, 0x39a1: 0x00c0, 0x39a2: 0x00c0, 0x39a3: 0x00c0, + 0x39a4: 0x00c0, 0x39a5: 0x00c0, 0x39a6: 0x00c0, 0x39a7: 0x00c0, 0x39a8: 0x00c0, 0x39a9: 0x00c0, + 0x39aa: 0x00c0, 0x39ab: 0x00c0, 0x39ac: 0x00c0, 0x39ad: 0x00c0, 0x39ae: 0x00c0, 0x39af: 0x00c0, + 0x39b0: 0x00c0, 0x39b1: 0x00c0, 0x39b2: 0x00c0, 0x39b3: 0x00c0, 0x39b4: 0x00c0, 0x39b5: 0x00c0, + 0x39b6: 0x00c0, 0x39b7: 0x00c0, 0x39b8: 0x00c3, 0x39b9: 0x00c3, 0x39ba: 0x00c3, 0x39bb: 0x00c3, + 0x39bc: 0x00c3, 0x39bd: 0x00c3, 0x39be: 0x00c3, 0x39bf: 0x00c3, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x00c3, 0x39c1: 0x00c3, 0x39c2: 0x00c3, 0x39c3: 0x00c3, 0x39c4: 0x00c3, 0x39c5: 0x00c3, + 0x39c6: 0x00c6, 0x39c7: 0x0080, 0x39c8: 0x0080, 0x39c9: 0x0080, 0x39ca: 0x0080, 0x39cb: 0x0080, + 0x39cc: 0x0080, 0x39cd: 0x0080, + 0x39d2: 0x0080, 0x39d3: 0x0080, 0x39d4: 0x0080, 0x39d5: 0x0080, 0x39d6: 0x0080, 0x39d7: 0x0080, + 0x39d8: 0x0080, 0x39d9: 0x0080, 0x39da: 0x0080, 0x39db: 0x0080, 0x39dc: 0x0080, 0x39dd: 0x0080, + 0x39de: 0x0080, 0x39df: 0x0080, 0x39e0: 0x0080, 0x39e1: 0x0080, 0x39e2: 0x0080, 0x39e3: 0x0080, + 0x39e4: 0x0080, 0x39e5: 0x0080, 0x39e6: 0x00c0, 0x39e7: 0x00c0, 0x39e8: 0x00c0, 0x39e9: 0x00c0, + 0x39ea: 0x00c0, 0x39eb: 0x00c0, 0x39ec: 0x00c0, 0x39ed: 0x00c0, 0x39ee: 0x00c0, 0x39ef: 0x00c0, + 0x39f0: 0x00c6, 0x39f1: 0x00c0, 0x39f2: 0x00c0, 0x39f3: 0x00c3, 0x39f4: 0x00c3, 0x39f5: 0x00c0, + 0x39ff: 0x00c6, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x00c3, 0x3a01: 0x00c3, 0x3a02: 0x00c0, 0x3a03: 0x00c0, 0x3a04: 0x00c0, 0x3a05: 0x00c0, + 0x3a06: 0x00c0, 0x3a07: 0x00c0, 0x3a08: 0x00c0, 0x3a09: 0x00c0, 0x3a0a: 0x00c0, 0x3a0b: 0x00c0, + 0x3a0c: 0x00c0, 0x3a0d: 0x00c0, 0x3a0e: 0x00c0, 0x3a0f: 0x00c0, 0x3a10: 0x00c0, 0x3a11: 0x00c0, + 0x3a12: 0x00c0, 0x3a13: 0x00c0, 0x3a14: 0x00c0, 0x3a15: 0x00c0, 0x3a16: 0x00c0, 0x3a17: 0x00c0, + 0x3a18: 0x00c0, 0x3a19: 0x00c0, 0x3a1a: 0x00c0, 0x3a1b: 0x00c0, 0x3a1c: 0x00c0, 0x3a1d: 0x00c0, + 0x3a1e: 0x00c0, 0x3a1f: 0x00c0, 0x3a20: 0x00c0, 0x3a21: 0x00c0, 0x3a22: 0x00c0, 0x3a23: 0x00c0, + 0x3a24: 0x00c0, 0x3a25: 0x00c0, 0x3a26: 0x00c0, 0x3a27: 0x00c0, 0x3a28: 0x00c0, 0x3a29: 0x00c0, + 0x3a2a: 0x00c0, 0x3a2b: 0x00c0, 0x3a2c: 0x00c0, 0x3a2d: 0x00c0, 0x3a2e: 0x00c0, 0x3a2f: 0x00c0, + 0x3a30: 0x00c0, 0x3a31: 0x00c0, 0x3a32: 0x00c0, 0x3a33: 0x00c3, 0x3a34: 0x00c3, 0x3a35: 0x00c3, + 0x3a36: 0x00c3, 0x3a37: 0x00c0, 0x3a38: 0x00c0, 0x3a39: 0x00c6, 0x3a3a: 0x00c3, 0x3a3b: 0x0080, + 0x3a3c: 0x0080, 0x3a3d: 0x0040, 0x3a3e: 0x0080, 0x3a3f: 0x0080, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0080, 0x3a41: 0x0080, 0x3a42: 0x00c3, + 0x3a4d: 0x0040, 0x3a50: 0x00c0, 0x3a51: 0x00c0, + 0x3a52: 0x00c0, 0x3a53: 0x00c0, 0x3a54: 0x00c0, 0x3a55: 0x00c0, 0x3a56: 0x00c0, 0x3a57: 0x00c0, + 0x3a58: 0x00c0, 0x3a59: 0x00c0, 0x3a5a: 0x00c0, 0x3a5b: 0x00c0, 0x3a5c: 0x00c0, 0x3a5d: 0x00c0, + 0x3a5e: 0x00c0, 0x3a5f: 0x00c0, 0x3a60: 0x00c0, 0x3a61: 0x00c0, 0x3a62: 0x00c0, 0x3a63: 0x00c0, + 0x3a64: 0x00c0, 0x3a65: 0x00c0, 0x3a66: 0x00c0, 0x3a67: 0x00c0, 0x3a68: 0x00c0, + 0x3a70: 0x00c0, 0x3a71: 0x00c0, 0x3a72: 0x00c0, 0x3a73: 0x00c0, 0x3a74: 0x00c0, 0x3a75: 0x00c0, + 0x3a76: 0x00c0, 0x3a77: 0x00c0, 0x3a78: 0x00c0, 0x3a79: 0x00c0, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x00c3, 0x3a81: 0x00c3, 0x3a82: 0x00c3, 0x3a83: 0x00c0, 0x3a84: 0x00c0, 0x3a85: 0x00c0, + 0x3a86: 0x00c0, 0x3a87: 0x00c0, 0x3a88: 0x00c0, 0x3a89: 0x00c0, 0x3a8a: 0x00c0, 0x3a8b: 0x00c0, + 0x3a8c: 0x00c0, 0x3a8d: 0x00c0, 0x3a8e: 0x00c0, 0x3a8f: 0x00c0, 0x3a90: 0x00c0, 0x3a91: 0x00c0, + 0x3a92: 0x00c0, 0x3a93: 0x00c0, 0x3a94: 0x00c0, 0x3a95: 0x00c0, 0x3a96: 0x00c0, 0x3a97: 0x00c0, + 0x3a98: 0x00c0, 0x3a99: 0x00c0, 0x3a9a: 0x00c0, 0x3a9b: 0x00c0, 0x3a9c: 0x00c0, 0x3a9d: 0x00c0, + 0x3a9e: 0x00c0, 0x3a9f: 0x00c0, 0x3aa0: 0x00c0, 0x3aa1: 0x00c0, 0x3aa2: 0x00c0, 0x3aa3: 0x00c0, + 0x3aa4: 0x00c0, 0x3aa5: 0x00c0, 0x3aa6: 0x00c0, 0x3aa7: 0x00c3, 0x3aa8: 0x00c3, 0x3aa9: 0x00c3, + 0x3aaa: 0x00c3, 0x3aab: 0x00c3, 0x3aac: 0x00c0, 0x3aad: 0x00c3, 0x3aae: 0x00c3, 0x3aaf: 0x00c3, + 0x3ab0: 0x00c3, 0x3ab1: 0x00c3, 0x3ab2: 0x00c3, 0x3ab3: 0x00c6, 0x3ab4: 0x00c6, + 0x3ab6: 0x00c0, 0x3ab7: 0x00c0, 0x3ab8: 0x00c0, 0x3ab9: 0x00c0, 0x3aba: 0x00c0, 0x3abb: 0x00c0, + 0x3abc: 0x00c0, 0x3abd: 0x00c0, 0x3abe: 0x00c0, 0x3abf: 0x00c0, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x0080, 0x3ac1: 0x0080, 0x3ac2: 0x0080, 0x3ac3: 0x0080, 0x3ac4: 0x00c0, 0x3ac5: 0x00c0, + 0x3ac6: 0x00c0, 0x3ac7: 0x00c0, + 0x3ad0: 0x00c0, 0x3ad1: 0x00c0, + 0x3ad2: 0x00c0, 0x3ad3: 0x00c0, 0x3ad4: 0x00c0, 0x3ad5: 0x00c0, 0x3ad6: 0x00c0, 0x3ad7: 0x00c0, + 0x3ad8: 0x00c0, 0x3ad9: 0x00c0, 0x3ada: 0x00c0, 0x3adb: 0x00c0, 0x3adc: 0x00c0, 0x3add: 0x00c0, + 0x3ade: 0x00c0, 0x3adf: 0x00c0, 0x3ae0: 0x00c0, 0x3ae1: 0x00c0, 0x3ae2: 0x00c0, 0x3ae3: 0x00c0, + 0x3ae4: 0x00c0, 0x3ae5: 0x00c0, 0x3ae6: 0x00c0, 0x3ae7: 0x00c0, 0x3ae8: 0x00c0, 0x3ae9: 0x00c0, + 0x3aea: 0x00c0, 0x3aeb: 0x00c0, 0x3aec: 0x00c0, 0x3aed: 0x00c0, 0x3aee: 0x00c0, 0x3aef: 0x00c0, + 0x3af0: 0x00c0, 0x3af1: 0x00c0, 0x3af2: 0x00c0, 0x3af3: 0x00c3, 0x3af4: 0x0080, 0x3af5: 0x0080, + 0x3af6: 0x00c0, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x00c3, 0x3b01: 0x00c3, 0x3b02: 0x00c0, 0x3b03: 0x00c0, 0x3b04: 0x00c0, 0x3b05: 0x00c0, + 0x3b06: 0x00c0, 0x3b07: 0x00c0, 0x3b08: 0x00c0, 0x3b09: 0x00c0, 0x3b0a: 0x00c0, 0x3b0b: 0x00c0, + 0x3b0c: 0x00c0, 0x3b0d: 0x00c0, 0x3b0e: 0x00c0, 0x3b0f: 0x00c0, 0x3b10: 0x00c0, 0x3b11: 0x00c0, + 0x3b12: 0x00c0, 0x3b13: 0x00c0, 0x3b14: 0x00c0, 0x3b15: 0x00c0, 0x3b16: 0x00c0, 0x3b17: 0x00c0, + 0x3b18: 0x00c0, 0x3b19: 0x00c0, 0x3b1a: 0x00c0, 0x3b1b: 0x00c0, 0x3b1c: 0x00c0, 0x3b1d: 0x00c0, + 0x3b1e: 0x00c0, 0x3b1f: 0x00c0, 0x3b20: 0x00c0, 0x3b21: 0x00c0, 0x3b22: 0x00c0, 0x3b23: 0x00c0, + 0x3b24: 0x00c0, 0x3b25: 0x00c0, 0x3b26: 0x00c0, 0x3b27: 0x00c0, 0x3b28: 0x00c0, 0x3b29: 0x00c0, + 0x3b2a: 0x00c0, 0x3b2b: 0x00c0, 0x3b2c: 0x00c0, 0x3b2d: 0x00c0, 0x3b2e: 0x00c0, 0x3b2f: 0x00c0, + 0x3b30: 0x00c0, 0x3b31: 0x00c0, 0x3b32: 0x00c0, 0x3b33: 0x00c0, 0x3b34: 0x00c0, 0x3b35: 0x00c0, + 0x3b36: 0x00c3, 0x3b37: 0x00c3, 0x3b38: 0x00c3, 0x3b39: 0x00c3, 0x3b3a: 0x00c3, 0x3b3b: 0x00c3, + 0x3b3c: 0x00c3, 0x3b3d: 0x00c3, 0x3b3e: 0x00c3, 0x3b3f: 0x00c0, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x00c5, 0x3b41: 0x00c0, 0x3b42: 0x00c0, 0x3b43: 0x00c0, 0x3b44: 0x00c0, 0x3b45: 0x0080, + 0x3b46: 0x0080, 0x3b47: 0x0080, 0x3b48: 0x0080, 0x3b49: 0x00c3, 0x3b4a: 0x00c3, 0x3b4b: 0x00c3, + 0x3b4c: 0x00c3, 0x3b4d: 0x0080, 0x3b4e: 0x00c0, 0x3b4f: 0x00c3, 0x3b50: 0x00c0, 0x3b51: 0x00c0, + 0x3b52: 0x00c0, 0x3b53: 0x00c0, 0x3b54: 0x00c0, 0x3b55: 0x00c0, 0x3b56: 0x00c0, 0x3b57: 0x00c0, + 0x3b58: 0x00c0, 0x3b59: 0x00c0, 0x3b5a: 0x00c0, 0x3b5b: 0x0080, 0x3b5c: 0x00c0, 0x3b5d: 0x0080, + 0x3b5e: 0x0080, 0x3b5f: 0x0080, 0x3b61: 0x0080, 0x3b62: 0x0080, 0x3b63: 0x0080, + 0x3b64: 0x0080, 0x3b65: 0x0080, 0x3b66: 0x0080, 0x3b67: 0x0080, 0x3b68: 0x0080, 0x3b69: 0x0080, + 0x3b6a: 0x0080, 0x3b6b: 0x0080, 0x3b6c: 0x0080, 0x3b6d: 0x0080, 0x3b6e: 0x0080, 0x3b6f: 0x0080, + 0x3b70: 0x0080, 0x3b71: 0x0080, 0x3b72: 0x0080, 0x3b73: 0x0080, 0x3b74: 0x0080, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x00c0, 0x3b81: 0x00c0, 0x3b82: 0x00c0, 0x3b83: 0x00c0, 0x3b84: 0x00c0, 0x3b85: 0x00c0, + 0x3b86: 0x00c0, 0x3b87: 0x00c0, 0x3b88: 0x00c0, 0x3b89: 0x00c0, 0x3b8a: 0x00c0, 0x3b8b: 0x00c0, + 0x3b8c: 0x00c0, 0x3b8d: 0x00c0, 0x3b8e: 0x00c0, 0x3b8f: 0x00c0, 0x3b90: 0x00c0, 0x3b91: 0x00c0, + 0x3b93: 0x00c0, 0x3b94: 0x00c0, 0x3b95: 0x00c0, 0x3b96: 0x00c0, 0x3b97: 0x00c0, + 0x3b98: 0x00c0, 0x3b99: 0x00c0, 0x3b9a: 0x00c0, 0x3b9b: 0x00c0, 0x3b9c: 0x00c0, 0x3b9d: 0x00c0, + 0x3b9e: 0x00c0, 0x3b9f: 0x00c0, 0x3ba0: 0x00c0, 0x3ba1: 0x00c0, 0x3ba2: 0x00c0, 0x3ba3: 0x00c0, + 0x3ba4: 0x00c0, 0x3ba5: 0x00c0, 0x3ba6: 0x00c0, 0x3ba7: 0x00c0, 0x3ba8: 0x00c0, 0x3ba9: 0x00c0, + 0x3baa: 0x00c0, 0x3bab: 0x00c0, 0x3bac: 0x00c0, 0x3bad: 0x00c0, 0x3bae: 0x00c0, 0x3baf: 0x00c3, + 0x3bb0: 0x00c3, 0x3bb1: 0x00c3, 0x3bb2: 0x00c0, 0x3bb3: 0x00c0, 0x3bb4: 0x00c3, 0x3bb5: 0x00c5, + 0x3bb6: 0x00c3, 0x3bb7: 0x00c3, 0x3bb8: 0x0080, 0x3bb9: 0x0080, 0x3bba: 0x0080, 0x3bbb: 0x0080, + 0x3bbc: 0x0080, 0x3bbd: 0x0080, 0x3bbe: 0x00c3, 0x3bbf: 0x00c0, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x00c0, 0x3bc1: 0x00c3, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0x00c0, 0x3c01: 0x00c0, 0x3c02: 0x00c0, 0x3c03: 0x00c0, 0x3c04: 0x00c0, 0x3c05: 0x00c0, + 0x3c06: 0x00c0, 0x3c08: 0x00c0, 0x3c0a: 0x00c0, 0x3c0b: 0x00c0, + 0x3c0c: 0x00c0, 0x3c0d: 0x00c0, 0x3c0f: 0x00c0, 0x3c10: 0x00c0, 0x3c11: 0x00c0, + 0x3c12: 0x00c0, 0x3c13: 0x00c0, 0x3c14: 0x00c0, 0x3c15: 0x00c0, 0x3c16: 0x00c0, 0x3c17: 0x00c0, + 0x3c18: 0x00c0, 0x3c19: 0x00c0, 0x3c1a: 0x00c0, 0x3c1b: 0x00c0, 0x3c1c: 0x00c0, 0x3c1d: 0x00c0, + 0x3c1f: 0x00c0, 0x3c20: 0x00c0, 0x3c21: 0x00c0, 0x3c22: 0x00c0, 0x3c23: 0x00c0, + 0x3c24: 0x00c0, 0x3c25: 0x00c0, 0x3c26: 0x00c0, 0x3c27: 0x00c0, 0x3c28: 0x00c0, 0x3c29: 0x0080, + 0x3c30: 0x00c0, 0x3c31: 0x00c0, 0x3c32: 0x00c0, 0x3c33: 0x00c0, 0x3c34: 0x00c0, 0x3c35: 0x00c0, + 0x3c36: 0x00c0, 0x3c37: 0x00c0, 0x3c38: 0x00c0, 0x3c39: 0x00c0, 0x3c3a: 0x00c0, 0x3c3b: 0x00c0, + 0x3c3c: 0x00c0, 0x3c3d: 0x00c0, 0x3c3e: 0x00c0, 0x3c3f: 0x00c0, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x00c0, 0x3c41: 0x00c0, 0x3c42: 0x00c0, 0x3c43: 0x00c0, 0x3c44: 0x00c0, 0x3c45: 0x00c0, + 0x3c46: 0x00c0, 0x3c47: 0x00c0, 0x3c48: 0x00c0, 0x3c49: 0x00c0, 0x3c4a: 0x00c0, 0x3c4b: 0x00c0, + 0x3c4c: 0x00c0, 0x3c4d: 0x00c0, 0x3c4e: 0x00c0, 0x3c4f: 0x00c0, 0x3c50: 0x00c0, 0x3c51: 0x00c0, + 0x3c52: 0x00c0, 0x3c53: 0x00c0, 0x3c54: 0x00c0, 0x3c55: 0x00c0, 0x3c56: 0x00c0, 0x3c57: 0x00c0, + 0x3c58: 0x00c0, 0x3c59: 0x00c0, 0x3c5a: 0x00c0, 0x3c5b: 0x00c0, 0x3c5c: 0x00c0, 0x3c5d: 0x00c0, + 0x3c5e: 0x00c0, 0x3c5f: 0x00c3, 0x3c60: 0x00c0, 0x3c61: 0x00c0, 0x3c62: 0x00c0, 0x3c63: 0x00c3, + 0x3c64: 0x00c3, 0x3c65: 0x00c3, 0x3c66: 0x00c3, 0x3c67: 0x00c3, 0x3c68: 0x00c3, 0x3c69: 0x00c3, + 0x3c6a: 0x00c6, + 0x3c70: 0x00c0, 0x3c71: 0x00c0, 0x3c72: 0x00c0, 0x3c73: 0x00c0, 0x3c74: 0x00c0, 0x3c75: 0x00c0, + 0x3c76: 0x00c0, 0x3c77: 0x00c0, 0x3c78: 0x00c0, 0x3c79: 0x00c0, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0x00c3, 0x3c81: 0x00c3, 0x3c82: 0x00c0, 0x3c83: 0x00c0, 0x3c85: 0x00c0, + 0x3c86: 0x00c0, 0x3c87: 0x00c0, 0x3c88: 0x00c0, 0x3c89: 0x00c0, 0x3c8a: 0x00c0, 0x3c8b: 0x00c0, + 0x3c8c: 0x00c0, 0x3c8f: 0x00c0, 0x3c90: 0x00c0, + 0x3c93: 0x00c0, 0x3c94: 0x00c0, 0x3c95: 0x00c0, 0x3c96: 0x00c0, 0x3c97: 0x00c0, + 0x3c98: 0x00c0, 0x3c99: 0x00c0, 0x3c9a: 0x00c0, 0x3c9b: 0x00c0, 0x3c9c: 0x00c0, 0x3c9d: 0x00c0, + 0x3c9e: 0x00c0, 0x3c9f: 0x00c0, 0x3ca0: 0x00c0, 0x3ca1: 0x00c0, 0x3ca2: 0x00c0, 0x3ca3: 0x00c0, + 0x3ca4: 0x00c0, 0x3ca5: 0x00c0, 0x3ca6: 0x00c0, 0x3ca7: 0x00c0, 0x3ca8: 0x00c0, + 0x3caa: 0x00c0, 0x3cab: 0x00c0, 0x3cac: 0x00c0, 0x3cad: 0x00c0, 0x3cae: 0x00c0, 0x3caf: 0x00c0, + 0x3cb0: 0x00c0, 0x3cb2: 0x00c0, 0x3cb3: 0x00c0, 0x3cb5: 0x00c0, + 0x3cb6: 0x00c0, 0x3cb7: 0x00c0, 0x3cb8: 0x00c0, 0x3cb9: 0x00c0, 0x3cbb: 0x00c3, + 0x3cbc: 0x00c3, 0x3cbd: 0x00c0, 0x3cbe: 0x00c0, 0x3cbf: 0x00c0, + // Block 0xf3, offset 0x3cc0 + 0x3cc0: 0x00c3, 0x3cc1: 0x00c0, 0x3cc2: 0x00c0, 0x3cc3: 0x00c0, 0x3cc4: 0x00c0, + 0x3cc7: 0x00c0, 0x3cc8: 0x00c0, 0x3ccb: 0x00c0, + 0x3ccc: 0x00c0, 0x3ccd: 0x00c5, 0x3cd0: 0x00c0, + 0x3cd7: 0x00c0, + 0x3cdd: 0x00c0, + 0x3cde: 0x00c0, 0x3cdf: 0x00c0, 0x3ce0: 0x00c0, 0x3ce1: 0x00c0, 0x3ce2: 0x00c0, 0x3ce3: 0x00c0, + 0x3ce6: 0x00c3, 0x3ce7: 0x00c3, 0x3ce8: 0x00c3, 0x3ce9: 0x00c3, + 0x3cea: 0x00c3, 0x3ceb: 0x00c3, 0x3cec: 0x00c3, + 0x3cf0: 0x00c3, 0x3cf1: 0x00c3, 0x3cf2: 0x00c3, 0x3cf3: 0x00c3, 0x3cf4: 0x00c3, + // Block 0xf4, offset 0x3d00 + 0x3d00: 0x00c0, 0x3d01: 0x00c0, 0x3d02: 0x00c0, 0x3d03: 0x00c0, 0x3d04: 0x00c0, 0x3d05: 0x00c0, + 0x3d06: 0x00c0, 0x3d07: 0x00c0, 0x3d08: 0x00c0, 0x3d09: 0x00c0, 0x3d0a: 0x00c0, 0x3d0b: 0x00c0, + 0x3d0c: 0x00c0, 0x3d0d: 0x00c0, 0x3d0e: 0x00c0, 0x3d0f: 0x00c0, 0x3d10: 0x00c0, 0x3d11: 0x00c0, + 0x3d12: 0x00c0, 0x3d13: 0x00c0, 0x3d14: 0x00c0, 0x3d15: 0x00c0, 0x3d16: 0x00c0, 0x3d17: 0x00c0, + 0x3d18: 0x00c0, 0x3d19: 0x00c0, 0x3d1a: 0x00c0, 0x3d1b: 0x00c0, 0x3d1c: 0x00c0, 0x3d1d: 0x00c0, + 0x3d1e: 0x00c0, 0x3d1f: 0x00c0, 0x3d20: 0x00c0, 0x3d21: 0x00c0, 0x3d22: 0x00c0, 0x3d23: 0x00c0, + 0x3d24: 0x00c0, 0x3d25: 0x00c0, 0x3d26: 0x00c0, 0x3d27: 0x00c0, 0x3d28: 0x00c0, 0x3d29: 0x00c0, + 0x3d2a: 0x00c0, 0x3d2b: 0x00c0, 0x3d2c: 0x00c0, 0x3d2d: 0x00c0, 0x3d2e: 0x00c0, 0x3d2f: 0x00c0, + 0x3d30: 0x00c0, 0x3d31: 0x00c0, 0x3d32: 0x00c0, 0x3d33: 0x00c0, 0x3d34: 0x00c0, 0x3d35: 0x00c0, + 0x3d36: 0x00c0, 0x3d37: 0x00c0, 0x3d38: 0x00c3, 0x3d39: 0x00c3, 0x3d3a: 0x00c3, 0x3d3b: 0x00c3, + 0x3d3c: 0x00c3, 0x3d3d: 0x00c3, 0x3d3e: 0x00c3, 0x3d3f: 0x00c3, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x00c0, 0x3d41: 0x00c0, 0x3d42: 0x00c6, 0x3d43: 0x00c3, 0x3d44: 0x00c3, 0x3d45: 0x00c0, + 0x3d46: 0x00c3, 0x3d47: 0x00c0, 0x3d48: 0x00c0, 0x3d49: 0x00c0, 0x3d4a: 0x00c0, 0x3d4b: 0x0080, + 0x3d4c: 0x0080, 0x3d4d: 0x0080, 0x3d4e: 0x0080, 0x3d4f: 0x0080, 0x3d50: 0x00c0, 0x3d51: 0x00c0, + 0x3d52: 0x00c0, 0x3d53: 0x00c0, 0x3d54: 0x00c0, 0x3d55: 0x00c0, 0x3d56: 0x00c0, 0x3d57: 0x00c0, + 0x3d58: 0x00c0, 0x3d59: 0x00c0, 0x3d5a: 0x0080, 0x3d5b: 0x0080, 0x3d5d: 0x0080, + 0x3d5e: 0x00c3, 0x3d5f: 0x00c0, 0x3d60: 0x00c0, 0x3d61: 0x00c0, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x00c0, 0x3d81: 0x00c0, 0x3d82: 0x00c0, 0x3d83: 0x00c0, 0x3d84: 0x00c0, 0x3d85: 0x00c0, + 0x3d86: 0x00c0, 0x3d87: 0x00c0, 0x3d88: 0x00c0, 0x3d89: 0x00c0, 0x3d8a: 0x00c0, 0x3d8b: 0x00c0, + 0x3d8c: 0x00c0, 0x3d8d: 0x00c0, 0x3d8e: 0x00c0, 0x3d8f: 0x00c0, 0x3d90: 0x00c0, 0x3d91: 0x00c0, + 0x3d92: 0x00c0, 0x3d93: 0x00c0, 0x3d94: 0x00c0, 0x3d95: 0x00c0, 0x3d96: 0x00c0, 0x3d97: 0x00c0, + 0x3d98: 0x00c0, 0x3d99: 0x00c0, 0x3d9a: 0x00c0, 0x3d9b: 0x00c0, 0x3d9c: 0x00c0, 0x3d9d: 0x00c0, + 0x3d9e: 0x00c0, 0x3d9f: 0x00c0, 0x3da0: 0x00c0, 0x3da1: 0x00c0, 0x3da2: 0x00c0, 0x3da3: 0x00c0, + 0x3da4: 0x00c0, 0x3da5: 0x00c0, 0x3da6: 0x00c0, 0x3da7: 0x00c0, 0x3da8: 0x00c0, 0x3da9: 0x00c0, + 0x3daa: 0x00c0, 0x3dab: 0x00c0, 0x3dac: 0x00c0, 0x3dad: 0x00c0, 0x3dae: 0x00c0, 0x3daf: 0x00c0, + 0x3db0: 0x00c0, 0x3db1: 0x00c0, 0x3db2: 0x00c0, 0x3db3: 0x00c3, 0x3db4: 0x00c3, 0x3db5: 0x00c3, + 0x3db6: 0x00c3, 0x3db7: 0x00c3, 0x3db8: 0x00c3, 0x3db9: 0x00c0, 0x3dba: 0x00c3, 0x3dbb: 0x00c0, + 0x3dbc: 0x00c0, 0x3dbd: 0x00c0, 0x3dbe: 0x00c0, 0x3dbf: 0x00c3, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x00c3, 0x3dc1: 0x00c0, 0x3dc2: 0x00c6, 0x3dc3: 0x00c3, 0x3dc4: 0x00c0, 0x3dc5: 0x00c0, + 0x3dc6: 0x0080, 0x3dc7: 0x00c0, + 0x3dd0: 0x00c0, 0x3dd1: 0x00c0, + 0x3dd2: 0x00c0, 0x3dd3: 0x00c0, 0x3dd4: 0x00c0, 0x3dd5: 0x00c0, 0x3dd6: 0x00c0, 0x3dd7: 0x00c0, + 0x3dd8: 0x00c0, 0x3dd9: 0x00c0, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x00c0, 0x3e01: 0x00c0, 0x3e02: 0x00c0, 0x3e03: 0x00c0, 0x3e04: 0x00c0, 0x3e05: 0x00c0, + 0x3e06: 0x00c0, 0x3e07: 0x00c0, 0x3e08: 0x00c0, 0x3e09: 0x00c0, 0x3e0a: 0x00c0, 0x3e0b: 0x00c0, + 0x3e0c: 0x00c0, 0x3e0d: 0x00c0, 0x3e0e: 0x00c0, 0x3e0f: 0x00c0, 0x3e10: 0x00c0, 0x3e11: 0x00c0, + 0x3e12: 0x00c0, 0x3e13: 0x00c0, 0x3e14: 0x00c0, 0x3e15: 0x00c0, 0x3e16: 0x00c0, 0x3e17: 0x00c0, + 0x3e18: 0x00c0, 0x3e19: 0x00c0, 0x3e1a: 0x00c0, 0x3e1b: 0x00c0, 0x3e1c: 0x00c0, 0x3e1d: 0x00c0, + 0x3e1e: 0x00c0, 0x3e1f: 0x00c0, 0x3e20: 0x00c0, 0x3e21: 0x00c0, 0x3e22: 0x00c0, 0x3e23: 0x00c0, + 0x3e24: 0x00c0, 0x3e25: 0x00c0, 0x3e26: 0x00c0, 0x3e27: 0x00c0, 0x3e28: 0x00c0, 0x3e29: 0x00c0, + 0x3e2a: 0x00c0, 0x3e2b: 0x00c0, 0x3e2c: 0x00c0, 0x3e2d: 0x00c0, 0x3e2e: 0x00c0, 0x3e2f: 0x00c0, + 0x3e30: 0x00c0, 0x3e31: 0x00c0, 0x3e32: 0x00c3, 0x3e33: 0x00c3, 0x3e34: 0x00c3, 0x3e35: 0x00c3, + 0x3e38: 0x00c0, 0x3e39: 0x00c0, 0x3e3a: 0x00c0, 0x3e3b: 0x00c0, + 0x3e3c: 0x00c3, 0x3e3d: 0x00c3, 0x3e3e: 0x00c0, 0x3e3f: 0x00c6, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x00c3, 0x3e41: 0x0080, 0x3e42: 0x0080, 0x3e43: 0x0080, 0x3e44: 0x0080, 0x3e45: 0x0080, + 0x3e46: 0x0080, 0x3e47: 0x0080, 0x3e48: 0x0080, 0x3e49: 0x0080, 0x3e4a: 0x0080, 0x3e4b: 0x0080, + 0x3e4c: 0x0080, 0x3e4d: 0x0080, 0x3e4e: 0x0080, 0x3e4f: 0x0080, 0x3e50: 0x0080, 0x3e51: 0x0080, + 0x3e52: 0x0080, 0x3e53: 0x0080, 0x3e54: 0x0080, 0x3e55: 0x0080, 0x3e56: 0x0080, 0x3e57: 0x0080, + 0x3e58: 0x00c0, 0x3e59: 0x00c0, 0x3e5a: 0x00c0, 0x3e5b: 0x00c0, 0x3e5c: 0x00c3, 0x3e5d: 0x00c3, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x00c0, 0x3e81: 0x00c0, 0x3e82: 0x00c0, 0x3e83: 0x00c0, 0x3e84: 0x00c0, 0x3e85: 0x00c0, + 0x3e86: 0x00c0, 0x3e87: 0x00c0, 0x3e88: 0x00c0, 0x3e89: 0x00c0, 0x3e8a: 0x00c0, 0x3e8b: 0x00c0, + 0x3e8c: 0x00c0, 0x3e8d: 0x00c0, 0x3e8e: 0x00c0, 0x3e8f: 0x00c0, 0x3e90: 0x00c0, 0x3e91: 0x00c0, + 0x3e92: 0x00c0, 0x3e93: 0x00c0, 0x3e94: 0x00c0, 0x3e95: 0x00c0, 0x3e96: 0x00c0, 0x3e97: 0x00c0, + 0x3e98: 0x00c0, 0x3e99: 0x00c0, 0x3e9a: 0x00c0, 0x3e9b: 0x00c0, 0x3e9c: 0x00c0, 0x3e9d: 0x00c0, + 0x3e9e: 0x00c0, 0x3e9f: 0x00c0, 0x3ea0: 0x00c0, 0x3ea1: 0x00c0, 0x3ea2: 0x00c0, 0x3ea3: 0x00c0, + 0x3ea4: 0x00c0, 0x3ea5: 0x00c0, 0x3ea6: 0x00c0, 0x3ea7: 0x00c0, 0x3ea8: 0x00c0, 0x3ea9: 0x00c0, + 0x3eaa: 0x00c0, 0x3eab: 0x00c0, 0x3eac: 0x00c0, 0x3ead: 0x00c0, 0x3eae: 0x00c0, 0x3eaf: 0x00c0, + 0x3eb0: 0x00c0, 0x3eb1: 0x00c0, 0x3eb2: 0x00c0, 0x3eb3: 0x00c3, 0x3eb4: 0x00c3, 0x3eb5: 0x00c3, + 0x3eb6: 0x00c3, 0x3eb7: 0x00c3, 0x3eb8: 0x00c3, 0x3eb9: 0x00c3, 0x3eba: 0x00c3, 0x3ebb: 0x00c0, + 0x3ebc: 0x00c0, 0x3ebd: 0x00c3, 0x3ebe: 0x00c0, 0x3ebf: 0x00c6, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x00c3, 0x3ec1: 0x0080, 0x3ec2: 0x0080, 0x3ec3: 0x0080, 0x3ec4: 0x00c0, + 0x3ed0: 0x00c0, 0x3ed1: 0x00c0, + 0x3ed2: 0x00c0, 0x3ed3: 0x00c0, 0x3ed4: 0x00c0, 0x3ed5: 0x00c0, 0x3ed6: 0x00c0, 0x3ed7: 0x00c0, + 0x3ed8: 0x00c0, 0x3ed9: 0x00c0, + 0x3ee0: 0x0080, 0x3ee1: 0x0080, 0x3ee2: 0x0080, 0x3ee3: 0x0080, + 0x3ee4: 0x0080, 0x3ee5: 0x0080, 0x3ee6: 0x0080, 0x3ee7: 0x0080, 0x3ee8: 0x0080, 0x3ee9: 0x0080, + 0x3eea: 0x0080, 0x3eeb: 0x0080, 0x3eec: 0x0080, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x00c0, 0x3f01: 0x00c0, 0x3f02: 0x00c0, 0x3f03: 0x00c0, 0x3f04: 0x00c0, 0x3f05: 0x00c0, + 0x3f06: 0x00c0, 0x3f07: 0x00c0, 0x3f08: 0x00c0, 0x3f09: 0x00c0, 0x3f0a: 0x00c0, 0x3f0b: 0x00c0, + 0x3f0c: 0x00c0, 0x3f0d: 0x00c0, 0x3f0e: 0x00c0, 0x3f0f: 0x00c0, 0x3f10: 0x00c0, 0x3f11: 0x00c0, + 0x3f12: 0x00c0, 0x3f13: 0x00c0, 0x3f14: 0x00c0, 0x3f15: 0x00c0, 0x3f16: 0x00c0, 0x3f17: 0x00c0, + 0x3f18: 0x00c0, 0x3f19: 0x00c0, 0x3f1a: 0x00c0, 0x3f1b: 0x00c0, 0x3f1c: 0x00c0, 0x3f1d: 0x00c0, + 0x3f1e: 0x00c0, 0x3f1f: 0x00c0, 0x3f20: 0x00c0, 0x3f21: 0x00c0, 0x3f22: 0x00c0, 0x3f23: 0x00c0, + 0x3f24: 0x00c0, 0x3f25: 0x00c0, 0x3f26: 0x00c0, 0x3f27: 0x00c0, 0x3f28: 0x00c0, 0x3f29: 0x00c0, + 0x3f2a: 0x00c0, 0x3f2b: 0x00c3, 0x3f2c: 0x00c0, 0x3f2d: 0x00c3, 0x3f2e: 0x00c0, 0x3f2f: 0x00c0, + 0x3f30: 0x00c3, 0x3f31: 0x00c3, 0x3f32: 0x00c3, 0x3f33: 0x00c3, 0x3f34: 0x00c3, 0x3f35: 0x00c3, + 0x3f36: 0x00c5, 0x3f37: 0x00c3, 0x3f38: 0x00c0, 0x3f39: 0x0080, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x00c0, 0x3f41: 0x00c0, 0x3f42: 0x00c0, 0x3f43: 0x00c0, 0x3f44: 0x00c0, 0x3f45: 0x00c0, + 0x3f46: 0x00c0, 0x3f47: 0x00c0, 0x3f48: 0x00c0, 0x3f49: 0x00c0, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x00c0, 0x3f81: 0x00c0, 0x3f82: 0x00c0, 0x3f83: 0x00c0, 0x3f84: 0x00c0, 0x3f85: 0x00c0, + 0x3f86: 0x00c0, 0x3f87: 0x00c0, 0x3f88: 0x00c0, 0x3f89: 0x00c0, 0x3f8a: 0x00c0, 0x3f8b: 0x00c0, + 0x3f8c: 0x00c0, 0x3f8d: 0x00c0, 0x3f8e: 0x00c0, 0x3f8f: 0x00c0, 0x3f90: 0x00c0, 0x3f91: 0x00c0, + 0x3f92: 0x00c0, 0x3f93: 0x00c0, 0x3f94: 0x00c0, 0x3f95: 0x00c0, 0x3f96: 0x00c0, 0x3f97: 0x00c0, + 0x3f98: 0x00c0, 0x3f99: 0x00c0, 0x3f9a: 0x00c0, 0x3f9d: 0x00c3, + 0x3f9e: 0x00c3, 0x3f9f: 0x00c3, 0x3fa0: 0x00c0, 0x3fa1: 0x00c0, 0x3fa2: 0x00c3, 0x3fa3: 0x00c3, + 0x3fa4: 0x00c3, 0x3fa5: 0x00c3, 0x3fa6: 0x00c0, 0x3fa7: 0x00c3, 0x3fa8: 0x00c3, 0x3fa9: 0x00c3, + 0x3faa: 0x00c3, 0x3fab: 0x00c6, + 0x3fb0: 0x00c0, 0x3fb1: 0x00c0, 0x3fb2: 0x00c0, 0x3fb3: 0x00c0, 0x3fb4: 0x00c0, 0x3fb5: 0x00c0, + 0x3fb6: 0x00c0, 0x3fb7: 0x00c0, 0x3fb8: 0x00c0, 0x3fb9: 0x00c0, 0x3fba: 0x0080, 0x3fbb: 0x0080, + 0x3fbc: 0x0080, 0x3fbd: 0x0080, 0x3fbe: 0x0080, 0x3fbf: 0x0080, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x00c0, 0x3fc1: 0x00c0, 0x3fc2: 0x00c0, 0x3fc3: 0x00c0, 0x3fc4: 0x00c0, 0x3fc5: 0x00c0, + 0x3fc6: 0x00c0, + // Block 0x100, offset 0x4000 + 0x4000: 0x00c0, 0x4001: 0x00c0, 0x4002: 0x00c0, 0x4003: 0x00c0, 0x4004: 0x00c0, 0x4005: 0x00c0, + 0x4006: 0x00c0, 0x4007: 0x00c0, 0x4008: 0x00c0, 0x4009: 0x00c0, 0x400a: 0x00c0, 0x400b: 0x00c0, + 0x400c: 0x00c0, 0x400d: 0x00c0, 0x400e: 0x00c0, 0x400f: 0x00c0, 0x4010: 0x00c0, 0x4011: 0x00c0, + 0x4012: 0x00c0, 0x4013: 0x00c0, 0x4014: 0x00c0, 0x4015: 0x00c0, 0x4016: 0x00c0, 0x4017: 0x00c0, + 0x4018: 0x00c0, 0x4019: 0x00c0, 0x401a: 0x00c0, 0x401b: 0x00c0, 0x401c: 0x00c0, 0x401d: 0x00c0, + 0x401e: 0x00c0, 0x401f: 0x00c0, 0x4020: 0x00c0, 0x4021: 0x00c0, 0x4022: 0x00c0, 0x4023: 0x00c0, + 0x4024: 0x00c0, 0x4025: 0x00c0, 0x4026: 0x00c0, 0x4027: 0x00c0, 0x4028: 0x00c0, 0x4029: 0x00c0, + 0x402a: 0x00c0, 0x402b: 0x00c0, 0x402c: 0x00c0, 0x402d: 0x00c0, 0x402e: 0x00c0, 0x402f: 0x00c3, + 0x4030: 0x00c3, 0x4031: 0x00c3, 0x4032: 0x00c3, 0x4033: 0x00c3, 0x4034: 0x00c3, 0x4035: 0x00c3, + 0x4036: 0x00c3, 0x4037: 0x00c3, 0x4038: 0x00c0, 0x4039: 0x00c6, 0x403a: 0x00c3, 0x403b: 0x0080, + // Block 0x101, offset 0x4040 + 0x4060: 0x00c0, 0x4061: 0x00c0, 0x4062: 0x00c0, 0x4063: 0x00c0, + 0x4064: 0x00c0, 0x4065: 0x00c0, 0x4066: 0x00c0, 0x4067: 0x00c0, 0x4068: 0x00c0, 0x4069: 0x00c0, + 0x406a: 0x00c0, 0x406b: 0x00c0, 0x406c: 0x00c0, 0x406d: 0x00c0, 0x406e: 0x00c0, 0x406f: 0x00c0, + 0x4070: 0x00c0, 0x4071: 0x00c0, 0x4072: 0x00c0, 0x4073: 0x00c0, 0x4074: 0x00c0, 0x4075: 0x00c0, + 0x4076: 0x00c0, 0x4077: 0x00c0, 0x4078: 0x00c0, 0x4079: 0x00c0, 0x407a: 0x00c0, 0x407b: 0x00c0, + 0x407c: 0x00c0, 0x407d: 0x00c0, 0x407e: 0x00c0, 0x407f: 0x00c0, + // Block 0x102, offset 0x4080 + 0x4080: 0x00c0, 0x4081: 0x00c0, 0x4082: 0x00c0, 0x4083: 0x00c0, 0x4084: 0x00c0, 0x4085: 0x00c0, + 0x4086: 0x00c0, 0x4087: 0x00c0, 0x4088: 0x00c0, 0x4089: 0x00c0, 0x408a: 0x00c0, 0x408b: 0x00c0, + 0x408c: 0x00c0, 0x408d: 0x00c0, 0x408e: 0x00c0, 0x408f: 0x00c0, 0x4090: 0x00c0, 0x4091: 0x00c0, + 0x4092: 0x00c0, 0x4093: 0x00c0, 0x4094: 0x00c0, 0x4095: 0x00c0, 0x4096: 0x00c0, 0x4097: 0x00c0, + 0x4098: 0x00c0, 0x4099: 0x00c0, 0x409a: 0x00c0, 0x409b: 0x00c0, 0x409c: 0x00c0, 0x409d: 0x00c0, + 0x409e: 0x00c0, 0x409f: 0x00c0, 0x40a0: 0x00c0, 0x40a1: 0x00c0, 0x40a2: 0x00c0, 0x40a3: 0x00c0, + 0x40a4: 0x00c0, 0x40a5: 0x00c0, 0x40a6: 0x00c0, 0x40a7: 0x00c0, 0x40a8: 0x00c0, 0x40a9: 0x00c0, + 0x40aa: 0x0080, 0x40ab: 0x0080, 0x40ac: 0x0080, 0x40ad: 0x0080, 0x40ae: 0x0080, 0x40af: 0x0080, + 0x40b0: 0x0080, 0x40b1: 0x0080, 0x40b2: 0x0080, + 0x40bf: 0x00c0, + // Block 0x103, offset 0x40c0 + 0x40c0: 0x00c0, 0x40c1: 0x00c0, 0x40c2: 0x00c0, 0x40c3: 0x00c0, 0x40c4: 0x00c0, 0x40c5: 0x00c0, + 0x40c6: 0x00c0, 0x40c9: 0x00c0, + 0x40cc: 0x00c0, 0x40cd: 0x00c0, 0x40ce: 0x00c0, 0x40cf: 0x00c0, 0x40d0: 0x00c0, 0x40d1: 0x00c0, + 0x40d2: 0x00c0, 0x40d3: 0x00c0, 0x40d5: 0x00c0, 0x40d6: 0x00c0, + 0x40d8: 0x00c0, 0x40d9: 0x00c0, 0x40da: 0x00c0, 0x40db: 0x00c0, 0x40dc: 0x00c0, 0x40dd: 0x00c0, + 0x40de: 0x00c0, 0x40df: 0x00c0, 0x40e0: 0x00c0, 0x40e1: 0x00c0, 0x40e2: 0x00c0, 0x40e3: 0x00c0, + 0x40e4: 0x00c0, 0x40e5: 0x00c0, 0x40e6: 0x00c0, 0x40e7: 0x00c0, 0x40e8: 0x00c0, 0x40e9: 0x00c0, + 0x40ea: 0x00c0, 0x40eb: 0x00c0, 0x40ec: 0x00c0, 0x40ed: 0x00c0, 0x40ee: 0x00c0, 0x40ef: 0x00c0, + 0x40f0: 0x00c0, 0x40f1: 0x00c0, 0x40f2: 0x00c0, 0x40f3: 0x00c0, 0x40f4: 0x00c0, 0x40f5: 0x00c0, + 0x40f7: 0x00c0, 0x40f8: 0x00c0, 0x40fb: 0x00c3, + 0x40fc: 0x00c3, 0x40fd: 0x00c5, 0x40fe: 0x00c6, 0x40ff: 0x00c0, + // Block 0x104, offset 0x4100 + 0x4100: 0x00c0, 0x4101: 0x00c0, 0x4102: 0x00c0, 0x4103: 0x00c3, 0x4104: 0x0080, 0x4105: 0x0080, + 0x4106: 0x0080, + 0x4110: 0x00c0, 0x4111: 0x00c0, + 0x4112: 0x00c0, 0x4113: 0x00c0, 0x4114: 0x00c0, 0x4115: 0x00c0, 0x4116: 0x00c0, 0x4117: 0x00c0, + 0x4118: 0x00c0, 0x4119: 0x00c0, + // Block 0x105, offset 0x4140 + 0x4160: 0x00c0, 0x4161: 0x00c0, 0x4162: 0x00c0, 0x4163: 0x00c0, + 0x4164: 0x00c0, 0x4165: 0x00c0, 0x4166: 0x00c0, 0x4167: 0x00c0, + 0x416a: 0x00c0, 0x416b: 0x00c0, 0x416c: 0x00c0, 0x416d: 0x00c0, 0x416e: 0x00c0, 0x416f: 0x00c0, + 0x4170: 0x00c0, 0x4171: 0x00c0, 0x4172: 0x00c0, 0x4173: 0x00c0, 0x4174: 0x00c0, 0x4175: 0x00c0, + 0x4176: 0x00c0, 0x4177: 0x00c0, 0x4178: 0x00c0, 0x4179: 0x00c0, 0x417a: 0x00c0, 0x417b: 0x00c0, + 0x417c: 0x00c0, 0x417d: 0x00c0, 0x417e: 0x00c0, 0x417f: 0x00c0, + // Block 0x106, offset 0x4180 + 0x4180: 0x00c0, 0x4181: 0x00c0, 0x4182: 0x00c0, 0x4183: 0x00c0, 0x4184: 0x00c0, 0x4185: 0x00c0, + 0x4186: 0x00c0, 0x4187: 0x00c0, 0x4188: 0x00c0, 0x4189: 0x00c0, 0x418a: 0x00c0, 0x418b: 0x00c0, + 0x418c: 0x00c0, 0x418d: 0x00c0, 0x418e: 0x00c0, 0x418f: 0x00c0, 0x4190: 0x00c0, 0x4191: 0x00c0, + 0x4192: 0x00c0, 0x4193: 0x00c0, 0x4194: 0x00c3, 0x4195: 0x00c3, 0x4196: 0x00c3, 0x4197: 0x00c3, + 0x419a: 0x00c3, 0x419b: 0x00c3, 0x419c: 0x00c0, 0x419d: 0x00c0, + 0x419e: 0x00c0, 0x419f: 0x00c0, 0x41a0: 0x00c6, 0x41a1: 0x00c0, 0x41a2: 0x0080, 0x41a3: 0x00c0, + 0x41a4: 0x00c0, + // Block 0x107, offset 0x41c0 + 0x41c0: 0x00c0, 0x41c1: 0x00c3, 0x41c2: 0x00c3, 0x41c3: 0x00c3, 0x41c4: 0x00c3, 0x41c5: 0x00c3, + 0x41c6: 0x00c3, 0x41c7: 0x00c3, 0x41c8: 0x00c3, 0x41c9: 0x00c3, 0x41ca: 0x00c3, 0x41cb: 0x00c0, + 0x41cc: 0x00c0, 0x41cd: 0x00c0, 0x41ce: 0x00c0, 0x41cf: 0x00c0, 0x41d0: 0x00c0, 0x41d1: 0x00c0, + 0x41d2: 0x00c0, 0x41d3: 0x00c0, 0x41d4: 0x00c0, 0x41d5: 0x00c0, 0x41d6: 0x00c0, 0x41d7: 0x00c0, + 0x41d8: 0x00c0, 0x41d9: 0x00c0, 0x41da: 0x00c0, 0x41db: 0x00c0, 0x41dc: 0x00c0, 0x41dd: 0x00c0, + 0x41de: 0x00c0, 0x41df: 0x00c0, 0x41e0: 0x00c0, 0x41e1: 0x00c0, 0x41e2: 0x00c0, 0x41e3: 0x00c0, + 0x41e4: 0x00c0, 0x41e5: 0x00c0, 0x41e6: 0x00c0, 0x41e7: 0x00c0, 0x41e8: 0x00c0, 0x41e9: 0x00c0, + 0x41ea: 0x00c0, 0x41eb: 0x00c0, 0x41ec: 0x00c0, 0x41ed: 0x00c0, 0x41ee: 0x00c0, 0x41ef: 0x00c0, + 0x41f0: 0x00c0, 0x41f1: 0x00c0, 0x41f2: 0x00c0, 0x41f3: 0x00c3, 0x41f4: 0x00c6, 0x41f5: 0x00c3, + 0x41f6: 0x00c3, 0x41f7: 0x00c3, 0x41f8: 0x00c3, 0x41f9: 0x00c0, 0x41fa: 0x00c0, 0x41fb: 0x00c3, + 0x41fc: 0x00c3, 0x41fd: 0x00c3, 0x41fe: 0x00c3, 0x41ff: 0x0080, + // Block 0x108, offset 0x4200 + 0x4200: 0x0080, 0x4201: 0x0080, 0x4202: 0x0080, 0x4203: 0x0080, 0x4204: 0x0080, 0x4205: 0x0080, + 0x4206: 0x0080, 0x4207: 0x00c6, + 0x4210: 0x00c0, 0x4211: 0x00c3, + 0x4212: 0x00c3, 0x4213: 0x00c3, 0x4214: 0x00c3, 0x4215: 0x00c3, 0x4216: 0x00c3, 0x4217: 0x00c0, + 0x4218: 0x00c0, 0x4219: 0x00c3, 0x421a: 0x00c3, 0x421b: 0x00c3, 0x421c: 0x00c0, 0x421d: 0x00c0, + 0x421e: 0x00c0, 0x421f: 0x00c0, 0x4220: 0x00c0, 0x4221: 0x00c0, 0x4222: 0x00c0, 0x4223: 0x00c0, + 0x4224: 0x00c0, 0x4225: 0x00c0, 0x4226: 0x00c0, 0x4227: 0x00c0, 0x4228: 0x00c0, 0x4229: 0x00c0, + 0x422a: 0x00c0, 0x422b: 0x00c0, 0x422c: 0x00c0, 0x422d: 0x00c0, 0x422e: 0x00c0, 0x422f: 0x00c0, + 0x4230: 0x00c0, 0x4231: 0x00c0, 0x4232: 0x00c0, 0x4233: 0x00c0, 0x4234: 0x00c0, 0x4235: 0x00c0, + 0x4236: 0x00c0, 0x4237: 0x00c0, 0x4238: 0x00c0, 0x4239: 0x00c0, 0x423a: 0x00c0, 0x423b: 0x00c0, + 0x423c: 0x00c0, 0x423d: 0x00c0, 0x423e: 0x00c0, 0x423f: 0x00c0, + // Block 0x109, offset 0x4240 + 0x4240: 0x00c0, 0x4241: 0x00c0, 0x4242: 0x00c0, 0x4243: 0x00c0, 0x4244: 0x00c0, 0x4245: 0x00c0, + 0x4246: 0x00c0, 0x4247: 0x00c0, 0x4248: 0x00c0, 0x4249: 0x00c0, 0x424a: 0x00c3, 0x424b: 0x00c3, + 0x424c: 0x00c3, 0x424d: 0x00c3, 0x424e: 0x00c3, 0x424f: 0x00c3, 0x4250: 0x00c3, 0x4251: 0x00c3, + 0x4252: 0x00c3, 0x4253: 0x00c3, 0x4254: 0x00c3, 0x4255: 0x00c3, 0x4256: 0x00c3, 0x4257: 0x00c0, + 0x4258: 0x00c3, 0x4259: 0x00c6, 0x425a: 0x0080, 0x425b: 0x0080, 0x425c: 0x0080, 0x425d: 0x00c0, + 0x425e: 0x0080, 0x425f: 0x0080, 0x4260: 0x0080, 0x4261: 0x0080, 0x4262: 0x0080, + 0x4270: 0x00c0, 0x4271: 0x00c0, 0x4272: 0x00c0, 0x4273: 0x00c0, 0x4274: 0x00c0, 0x4275: 0x00c0, + 0x4276: 0x00c0, 0x4277: 0x00c0, 0x4278: 0x00c0, 0x4279: 0x00c0, 0x427a: 0x00c0, 0x427b: 0x00c0, + 0x427c: 0x00c0, 0x427d: 0x00c0, 0x427e: 0x00c0, 0x427f: 0x00c0, + // Block 0x10a, offset 0x4280 + 0x4280: 0x00c0, 0x4281: 0x00c0, 0x4282: 0x00c0, 0x4283: 0x00c0, 0x4284: 0x00c0, 0x4285: 0x00c0, + 0x4286: 0x00c0, 0x4287: 0x00c0, 0x4288: 0x00c0, 0x4289: 0x00c0, 0x428a: 0x00c0, 0x428b: 0x00c0, + 0x428c: 0x00c0, 0x428d: 0x00c0, 0x428e: 0x00c0, 0x428f: 0x00c0, 0x4290: 0x00c0, 0x4291: 0x00c0, + 0x4292: 0x00c0, 0x4293: 0x00c0, 0x4294: 0x00c0, 0x4295: 0x00c0, 0x4296: 0x00c0, 0x4297: 0x00c0, + 0x4298: 0x00c0, 0x4299: 0x00c0, 0x429a: 0x00c0, 0x429b: 0x00c0, 0x429c: 0x00c0, 0x429d: 0x00c0, + 0x429e: 0x00c0, 0x429f: 0x00c0, 0x42a0: 0x00c0, 0x42a1: 0x00c0, 0x42a2: 0x00c0, 0x42a3: 0x00c0, + 0x42a4: 0x00c0, 0x42a5: 0x00c0, 0x42a6: 0x00c0, 0x42a7: 0x00c0, 0x42a8: 0x00c0, 0x42a9: 0x00c0, + 0x42aa: 0x00c0, 0x42ab: 0x00c0, 0x42ac: 0x00c0, 0x42ad: 0x00c0, 0x42ae: 0x00c0, 0x42af: 0x00c0, + 0x42b0: 0x00c0, 0x42b1: 0x00c0, 0x42b2: 0x00c0, 0x42b3: 0x00c0, 0x42b4: 0x00c0, 0x42b5: 0x00c0, + 0x42b6: 0x00c0, 0x42b7: 0x00c0, 0x42b8: 0x00c0, + // Block 0x10b, offset 0x42c0 + 0x42c0: 0x0080, 0x42c1: 0x0080, 0x42c2: 0x0080, 0x42c3: 0x0080, 0x42c4: 0x0080, 0x42c5: 0x0080, + 0x42c6: 0x0080, 0x42c7: 0x0080, 0x42c8: 0x0080, 0x42c9: 0x0080, + // Block 0x10c, offset 0x4300 + 0x4300: 0x00c0, 0x4301: 0x00c0, 0x4302: 0x00c0, 0x4303: 0x00c0, 0x4304: 0x00c0, 0x4305: 0x00c0, + 0x4306: 0x00c0, 0x4307: 0x00c0, 0x4308: 0x00c0, 0x430a: 0x00c0, 0x430b: 0x00c0, + 0x430c: 0x00c0, 0x430d: 0x00c0, 0x430e: 0x00c0, 0x430f: 0x00c0, 0x4310: 0x00c0, 0x4311: 0x00c0, + 0x4312: 0x00c0, 0x4313: 0x00c0, 0x4314: 0x00c0, 0x4315: 0x00c0, 0x4316: 0x00c0, 0x4317: 0x00c0, + 0x4318: 0x00c0, 0x4319: 0x00c0, 0x431a: 0x00c0, 0x431b: 0x00c0, 0x431c: 0x00c0, 0x431d: 0x00c0, + 0x431e: 0x00c0, 0x431f: 0x00c0, 0x4320: 0x00c0, 0x4321: 0x00c0, 0x4322: 0x00c0, 0x4323: 0x00c0, + 0x4324: 0x00c0, 0x4325: 0x00c0, 0x4326: 0x00c0, 0x4327: 0x00c0, 0x4328: 0x00c0, 0x4329: 0x00c0, + 0x432a: 0x00c0, 0x432b: 0x00c0, 0x432c: 0x00c0, 0x432d: 0x00c0, 0x432e: 0x00c0, 0x432f: 0x00c0, + 0x4330: 0x00c3, 0x4331: 0x00c3, 0x4332: 0x00c3, 0x4333: 0x00c3, 0x4334: 0x00c3, 0x4335: 0x00c3, + 0x4336: 0x00c3, 0x4338: 0x00c3, 0x4339: 0x00c3, 0x433a: 0x00c3, 0x433b: 0x00c3, + 0x433c: 0x00c3, 0x433d: 0x00c3, 0x433e: 0x00c0, 0x433f: 0x00c6, + // Block 0x10d, offset 0x4340 + 0x4340: 0x00c0, 0x4341: 0x0080, 0x4342: 0x0080, 0x4343: 0x0080, 0x4344: 0x0080, 0x4345: 0x0080, + 0x4350: 0x00c0, 0x4351: 0x00c0, + 0x4352: 0x00c0, 0x4353: 0x00c0, 0x4354: 0x00c0, 0x4355: 0x00c0, 0x4356: 0x00c0, 0x4357: 0x00c0, + 0x4358: 0x00c0, 0x4359: 0x00c0, 0x435a: 0x0080, 0x435b: 0x0080, 0x435c: 0x0080, 0x435d: 0x0080, + 0x435e: 0x0080, 0x435f: 0x0080, 0x4360: 0x0080, 0x4361: 0x0080, 0x4362: 0x0080, 0x4363: 0x0080, + 0x4364: 0x0080, 0x4365: 0x0080, 0x4366: 0x0080, 0x4367: 0x0080, 0x4368: 0x0080, 0x4369: 0x0080, + 0x436a: 0x0080, 0x436b: 0x0080, 0x436c: 0x0080, + 0x4370: 0x0080, 0x4371: 0x0080, 0x4372: 0x00c0, 0x4373: 0x00c0, 0x4374: 0x00c0, 0x4375: 0x00c0, + 0x4376: 0x00c0, 0x4377: 0x00c0, 0x4378: 0x00c0, 0x4379: 0x00c0, 0x437a: 0x00c0, 0x437b: 0x00c0, + 0x437c: 0x00c0, 0x437d: 0x00c0, 0x437e: 0x00c0, 0x437f: 0x00c0, + // Block 0x10e, offset 0x4380 + 0x4380: 0x00c0, 0x4381: 0x00c0, 0x4382: 0x00c0, 0x4383: 0x00c0, 0x4384: 0x00c0, 0x4385: 0x00c0, + 0x4386: 0x00c0, 0x4387: 0x00c0, 0x4388: 0x00c0, 0x4389: 0x00c0, 0x438a: 0x00c0, 0x438b: 0x00c0, + 0x438c: 0x00c0, 0x438d: 0x00c0, 0x438e: 0x00c0, 0x438f: 0x00c0, + 0x4392: 0x00c3, 0x4393: 0x00c3, 0x4394: 0x00c3, 0x4395: 0x00c3, 0x4396: 0x00c3, 0x4397: 0x00c3, + 0x4398: 0x00c3, 0x4399: 0x00c3, 0x439a: 0x00c3, 0x439b: 0x00c3, 0x439c: 0x00c3, 0x439d: 0x00c3, + 0x439e: 0x00c3, 0x439f: 0x00c3, 0x43a0: 0x00c3, 0x43a1: 0x00c3, 0x43a2: 0x00c3, 0x43a3: 0x00c3, + 0x43a4: 0x00c3, 0x43a5: 0x00c3, 0x43a6: 0x00c3, 0x43a7: 0x00c3, 0x43a9: 0x00c0, + 0x43aa: 0x00c3, 0x43ab: 0x00c3, 0x43ac: 0x00c3, 0x43ad: 0x00c3, 0x43ae: 0x00c3, 0x43af: 0x00c3, + 0x43b0: 0x00c3, 0x43b1: 0x00c0, 0x43b2: 0x00c3, 0x43b3: 0x00c3, 0x43b4: 0x00c0, 0x43b5: 0x00c3, + 0x43b6: 0x00c3, + // Block 0x10f, offset 0x43c0 + 0x43c0: 0x00c0, 0x43c1: 0x00c0, 0x43c2: 0x00c0, 0x43c3: 0x00c0, 0x43c4: 0x00c0, 0x43c5: 0x00c0, + 0x43c6: 0x00c0, 0x43c8: 0x00c0, 0x43c9: 0x00c0, 0x43cb: 0x00c0, + 0x43cc: 0x00c0, 0x43cd: 0x00c0, 0x43ce: 0x00c0, 0x43cf: 0x00c0, 0x43d0: 0x00c0, 0x43d1: 0x00c0, + 0x43d2: 0x00c0, 0x43d3: 0x00c0, 0x43d4: 0x00c0, 0x43d5: 0x00c0, 0x43d6: 0x00c0, 0x43d7: 0x00c0, + 0x43d8: 0x00c0, 0x43d9: 0x00c0, 0x43da: 0x00c0, 0x43db: 0x00c0, 0x43dc: 0x00c0, 0x43dd: 0x00c0, + 0x43de: 0x00c0, 0x43df: 0x00c0, 0x43e0: 0x00c0, 0x43e1: 0x00c0, 0x43e2: 0x00c0, 0x43e3: 0x00c0, + 0x43e4: 0x00c0, 0x43e5: 0x00c0, 0x43e6: 0x00c0, 0x43e7: 0x00c0, 0x43e8: 0x00c0, 0x43e9: 0x00c0, + 0x43ea: 0x00c0, 0x43eb: 0x00c0, 0x43ec: 0x00c0, 0x43ed: 0x00c0, 0x43ee: 0x00c0, 0x43ef: 0x00c0, + 0x43f0: 0x00c0, 0x43f1: 0x00c3, 0x43f2: 0x00c3, 0x43f3: 0x00c3, 0x43f4: 0x00c3, 0x43f5: 0x00c3, + 0x43f6: 0x00c3, 0x43fa: 0x00c3, + 0x43fc: 0x00c3, 0x43fd: 0x00c3, 0x43ff: 0x00c3, + // Block 0x110, offset 0x4400 + 0x4400: 0x00c3, 0x4401: 0x00c3, 0x4402: 0x00c3, 0x4403: 0x00c3, 0x4404: 0x00c6, 0x4405: 0x00c6, + 0x4406: 0x00c0, 0x4407: 0x00c3, + 0x4410: 0x00c0, 0x4411: 0x00c0, + 0x4412: 0x00c0, 0x4413: 0x00c0, 0x4414: 0x00c0, 0x4415: 0x00c0, 0x4416: 0x00c0, 0x4417: 0x00c0, + 0x4418: 0x00c0, 0x4419: 0x00c0, + 0x4420: 0x00c0, 0x4421: 0x00c0, 0x4422: 0x00c0, 0x4423: 0x00c0, + 0x4424: 0x00c0, 0x4425: 0x00c0, 0x4427: 0x00c0, 0x4428: 0x00c0, + 0x442a: 0x00c0, 0x442b: 0x00c0, 0x442c: 0x00c0, 0x442d: 0x00c0, 0x442e: 0x00c0, 0x442f: 0x00c0, + 0x4430: 0x00c0, 0x4431: 0x00c0, 0x4432: 0x00c0, 0x4433: 0x00c0, 0x4434: 0x00c0, 0x4435: 0x00c0, + 0x4436: 0x00c0, 0x4437: 0x00c0, 0x4438: 0x00c0, 0x4439: 0x00c0, 0x443a: 0x00c0, 0x443b: 0x00c0, + 0x443c: 0x00c0, 0x443d: 0x00c0, 0x443e: 0x00c0, 0x443f: 0x00c0, + // Block 0x111, offset 0x4440 + 0x4440: 0x00c0, 0x4441: 0x00c0, 0x4442: 0x00c0, 0x4443: 0x00c0, 0x4444: 0x00c0, 0x4445: 0x00c0, + 0x4446: 0x00c0, 0x4447: 0x00c0, 0x4448: 0x00c0, 0x4449: 0x00c0, 0x444a: 0x00c0, 0x444b: 0x00c0, + 0x444c: 0x00c0, 0x444d: 0x00c0, 0x444e: 0x00c0, 0x4450: 0x00c3, 0x4451: 0x00c3, + 0x4453: 0x00c0, 0x4454: 0x00c0, 0x4455: 0x00c3, 0x4456: 0x00c0, 0x4457: 0x00c6, + 0x4458: 0x00c0, + 0x4460: 0x00c0, 0x4461: 0x00c0, 0x4462: 0x00c0, 0x4463: 0x00c0, + 0x4464: 0x00c0, 0x4465: 0x00c0, 0x4466: 0x00c0, 0x4467: 0x00c0, 0x4468: 0x00c0, 0x4469: 0x00c0, + // Block 0x112, offset 0x4480 + 0x44a0: 0x00c0, 0x44a1: 0x00c0, 0x44a2: 0x00c0, 0x44a3: 0x00c0, + 0x44a4: 0x00c0, 0x44a5: 0x00c0, 0x44a6: 0x00c0, 0x44a7: 0x00c0, 0x44a8: 0x00c0, 0x44a9: 0x00c0, + 0x44aa: 0x00c0, 0x44ab: 0x00c0, 0x44ac: 0x00c0, 0x44ad: 0x00c0, 0x44ae: 0x00c0, 0x44af: 0x00c0, + 0x44b0: 0x00c0, 0x44b1: 0x00c0, 0x44b2: 0x00c0, 0x44b3: 0x00c3, 0x44b4: 0x00c3, 0x44b5: 0x00c0, + 0x44b6: 0x00c0, 0x44b7: 0x0080, 0x44b8: 0x0080, + // Block 0x113, offset 0x44c0 + 0x44c0: 0x00c3, 0x44c1: 0x00c3, 0x44c2: 0x00c0, 0x44c3: 0x00c0, 0x44c4: 0x00c0, 0x44c5: 0x00c0, + 0x44c6: 0x00c0, 0x44c7: 0x00c0, 0x44c8: 0x00c0, 0x44c9: 0x00c0, 0x44ca: 0x00c0, 0x44cb: 0x00c0, + 0x44cc: 0x00c0, 0x44cd: 0x00c0, 0x44ce: 0x00c0, 0x44cf: 0x00c0, 0x44d0: 0x00c0, + 0x44d2: 0x00c0, 0x44d3: 0x00c0, 0x44d4: 0x00c0, 0x44d5: 0x00c0, 0x44d6: 0x00c0, 0x44d7: 0x00c0, + 0x44d8: 0x00c0, 0x44d9: 0x00c0, 0x44da: 0x00c0, 0x44db: 0x00c0, 0x44dc: 0x00c0, 0x44dd: 0x00c0, + 0x44de: 0x00c0, 0x44df: 0x00c0, 0x44e0: 0x00c0, 0x44e1: 0x00c0, 0x44e2: 0x00c0, 0x44e3: 0x00c0, + 0x44e4: 0x00c0, 0x44e5: 0x00c0, 0x44e6: 0x00c0, 0x44e7: 0x00c0, 0x44e8: 0x00c0, 0x44e9: 0x00c0, + 0x44ea: 0x00c0, 0x44eb: 0x00c0, 0x44ec: 0x00c0, 0x44ed: 0x00c0, 0x44ee: 0x00c0, 0x44ef: 0x00c0, + 0x44f0: 0x00c0, 0x44f1: 0x00c0, 0x44f2: 0x00c0, 0x44f3: 0x00c0, 0x44f4: 0x00c0, 0x44f5: 0x00c0, + 0x44f6: 0x00c3, 0x44f7: 0x00c3, 0x44f8: 0x00c3, 0x44f9: 0x00c3, 0x44fa: 0x00c3, + 0x44fe: 0x00c0, 0x44ff: 0x00c0, + // Block 0x114, offset 0x4500 + 0x4500: 0x00c3, 0x4501: 0x00c5, 0x4502: 0x00c6, 0x4503: 0x0080, 0x4504: 0x0080, 0x4505: 0x0080, + 0x4506: 0x0080, 0x4507: 0x0080, 0x4508: 0x0080, 0x4509: 0x0080, 0x450a: 0x0080, 0x450b: 0x0080, + 0x450c: 0x0080, 0x450d: 0x0080, 0x450e: 0x0080, 0x450f: 0x0080, 0x4510: 0x00c0, 0x4511: 0x00c0, + 0x4512: 0x00c0, 0x4513: 0x00c0, 0x4514: 0x00c0, 0x4515: 0x00c0, 0x4516: 0x00c0, 0x4517: 0x00c0, + 0x4518: 0x00c0, 0x4519: 0x00c0, + // Block 0x115, offset 0x4540 + 0x4570: 0x00c0, + // Block 0x116, offset 0x4580 + 0x4580: 0x0080, 0x4581: 0x0080, 0x4582: 0x0080, 0x4583: 0x0080, 0x4584: 0x0080, 0x4585: 0x0080, + 0x4586: 0x0080, 0x4587: 0x0080, 0x4588: 0x0080, 0x4589: 0x0080, 0x458a: 0x0080, 0x458b: 0x0080, + 0x458c: 0x0080, 0x458d: 0x0080, 0x458e: 0x0080, 0x458f: 0x0080, 0x4590: 0x0080, 0x4591: 0x0080, + 0x4592: 0x0080, 0x4593: 0x0080, 0x4594: 0x0080, 0x4595: 0x0080, 0x4596: 0x0080, 0x4597: 0x0080, + 0x4598: 0x0080, 0x4599: 0x0080, 0x459a: 0x0080, 0x459b: 0x0080, 0x459c: 0x0080, 0x459d: 0x0080, + 0x459e: 0x0080, 0x459f: 0x0080, 0x45a0: 0x0080, 0x45a1: 0x0080, 0x45a2: 0x0080, 0x45a3: 0x0080, + 0x45a4: 0x0080, 0x45a5: 0x0080, 0x45a6: 0x0080, 0x45a7: 0x0080, 0x45a8: 0x0080, 0x45a9: 0x0080, + 0x45aa: 0x0080, 0x45ab: 0x0080, 0x45ac: 0x0080, 0x45ad: 0x0080, 0x45ae: 0x0080, 0x45af: 0x0080, + 0x45b0: 0x0080, 0x45b1: 0x0080, + 0x45bf: 0x0080, + // Block 0x117, offset 0x45c0 + 0x45c0: 0x00c0, 0x45c1: 0x00c0, 0x45c2: 0x00c0, 0x45c3: 0x00c0, 0x45c4: 0x00c0, 0x45c5: 0x00c0, + 0x45c6: 0x00c0, 0x45c7: 0x00c0, 0x45c8: 0x00c0, 0x45c9: 0x00c0, 0x45ca: 0x00c0, 0x45cb: 0x00c0, + 0x45cc: 0x00c0, 0x45cd: 0x00c0, 0x45ce: 0x00c0, 0x45cf: 0x00c0, 0x45d0: 0x00c0, 0x45d1: 0x00c0, + 0x45d2: 0x00c0, 0x45d3: 0x00c0, 0x45d4: 0x00c0, 0x45d5: 0x00c0, 0x45d6: 0x00c0, 0x45d7: 0x00c0, + 0x45d8: 0x00c0, 0x45d9: 0x00c0, + // Block 0x118, offset 0x4600 + 0x4600: 0x0080, 0x4601: 0x0080, 0x4602: 0x0080, 0x4603: 0x0080, 0x4604: 0x0080, 0x4605: 0x0080, + 0x4606: 0x0080, 0x4607: 0x0080, 0x4608: 0x0080, 0x4609: 0x0080, 0x460a: 0x0080, 0x460b: 0x0080, + 0x460c: 0x0080, 0x460d: 0x0080, 0x460e: 0x0080, 0x460f: 0x0080, 0x4610: 0x0080, 0x4611: 0x0080, + 0x4612: 0x0080, 0x4613: 0x0080, 0x4614: 0x0080, 0x4615: 0x0080, 0x4616: 0x0080, 0x4617: 0x0080, + 0x4618: 0x0080, 0x4619: 0x0080, 0x461a: 0x0080, 0x461b: 0x0080, 0x461c: 0x0080, 0x461d: 0x0080, + 0x461e: 0x0080, 0x461f: 0x0080, 0x4620: 0x0080, 0x4621: 0x0080, 0x4622: 0x0080, 0x4623: 0x0080, + 0x4624: 0x0080, 0x4625: 0x0080, 0x4626: 0x0080, 0x4627: 0x0080, 0x4628: 0x0080, 0x4629: 0x0080, + 0x462a: 0x0080, 0x462b: 0x0080, 0x462c: 0x0080, 0x462d: 0x0080, 0x462e: 0x0080, + 0x4630: 0x0080, 0x4631: 0x0080, 0x4632: 0x0080, 0x4633: 0x0080, 0x4634: 0x0080, + // Block 0x119, offset 0x4640 + 0x4640: 0x00c0, 0x4641: 0x00c0, 0x4642: 0x00c0, 0x4643: 0x00c0, + // Block 0x11a, offset 0x4680 + 0x4690: 0x00c0, 0x4691: 0x00c0, + 0x4692: 0x00c0, 0x4693: 0x00c0, 0x4694: 0x00c0, 0x4695: 0x00c0, 0x4696: 0x00c0, 0x4697: 0x00c0, + 0x4698: 0x00c0, 0x4699: 0x00c0, 0x469a: 0x00c0, 0x469b: 0x00c0, 0x469c: 0x00c0, 0x469d: 0x00c0, + 0x469e: 0x00c0, 0x469f: 0x00c0, 0x46a0: 0x00c0, 0x46a1: 0x00c0, 0x46a2: 0x00c0, 0x46a3: 0x00c0, + 0x46a4: 0x00c0, 0x46a5: 0x00c0, 0x46a6: 0x00c0, 0x46a7: 0x00c0, 0x46a8: 0x00c0, 0x46a9: 0x00c0, + 0x46aa: 0x00c0, 0x46ab: 0x00c0, 0x46ac: 0x00c0, 0x46ad: 0x00c0, 0x46ae: 0x00c0, 0x46af: 0x00c0, + 0x46b0: 0x00c0, 0x46b1: 0x00c0, 0x46b2: 0x00c0, 0x46b3: 0x00c0, 0x46b4: 0x00c0, 0x46b5: 0x00c0, + 0x46b6: 0x00c0, 0x46b7: 0x00c0, 0x46b8: 0x00c0, 0x46b9: 0x00c0, 0x46ba: 0x00c0, 0x46bb: 0x00c0, + 0x46bc: 0x00c0, 0x46bd: 0x00c0, 0x46be: 0x00c0, 0x46bf: 0x00c0, + // Block 0x11b, offset 0x46c0 + 0x46c0: 0x00c0, 0x46c1: 0x00c0, 0x46c2: 0x00c0, 0x46c3: 0x00c0, 0x46c4: 0x00c0, 0x46c5: 0x00c0, + 0x46c6: 0x00c0, 0x46c7: 0x00c0, 0x46c8: 0x00c0, 0x46c9: 0x00c0, 0x46ca: 0x00c0, 0x46cb: 0x00c0, + 0x46cc: 0x00c0, 0x46cd: 0x00c0, 0x46ce: 0x00c0, 0x46cf: 0x00c0, 0x46d0: 0x00c0, 0x46d1: 0x00c0, + 0x46d2: 0x00c0, 0x46d3: 0x00c0, 0x46d4: 0x00c0, 0x46d5: 0x00c0, 0x46d6: 0x00c0, 0x46d7: 0x00c0, + 0x46d8: 0x00c0, 0x46d9: 0x00c0, 0x46da: 0x00c0, 0x46db: 0x00c0, 0x46dc: 0x00c0, 0x46dd: 0x00c0, + 0x46de: 0x00c0, 0x46df: 0x00c0, 0x46e0: 0x00c0, 0x46e1: 0x00c0, 0x46e2: 0x00c0, 0x46e3: 0x00c0, + 0x46e4: 0x00c0, 0x46e5: 0x00c0, 0x46e6: 0x00c0, 0x46e7: 0x00c0, 0x46e8: 0x00c0, 0x46e9: 0x00c0, + 0x46ea: 0x00c0, 0x46eb: 0x00c0, 0x46ec: 0x00c0, 0x46ed: 0x00c0, 0x46ee: 0x00c0, 0x46ef: 0x00c0, + 0x46f0: 0x00c0, 0x46f1: 0x0080, 0x46f2: 0x0080, + // Block 0x11c, offset 0x4700 + 0x4700: 0x00c0, 0x4701: 0x00c0, 0x4702: 0x00c0, 0x4703: 0x00c0, 0x4704: 0x00c0, 0x4705: 0x00c0, + 0x4706: 0x00c0, 0x4707: 0x00c0, 0x4708: 0x00c0, 0x4709: 0x00c0, 0x470a: 0x00c0, 0x470b: 0x00c0, + 0x470c: 0x00c0, 0x470d: 0x00c0, 0x470e: 0x00c0, 0x470f: 0x00c0, 0x4710: 0x00c0, 0x4711: 0x00c0, + 0x4712: 0x00c0, 0x4713: 0x00c0, 0x4714: 0x00c0, 0x4715: 0x00c0, 0x4716: 0x00c0, 0x4717: 0x00c0, + 0x4718: 0x00c0, 0x4719: 0x00c0, 0x471a: 0x00c0, 0x471b: 0x00c0, 0x471c: 0x00c0, 0x471d: 0x00c0, + 0x471e: 0x00c0, 0x471f: 0x00c0, 0x4720: 0x00c0, 0x4721: 0x00c0, 0x4722: 0x00c0, 0x4723: 0x00c0, + 0x4724: 0x00c0, 0x4725: 0x00c0, 0x4726: 0x00c0, 0x4727: 0x00c0, 0x4728: 0x00c0, 0x4729: 0x00c0, + 0x472a: 0x00c0, 0x472b: 0x00c0, 0x472c: 0x00c0, 0x472d: 0x00c0, 0x472e: 0x00c0, 0x472f: 0x00c0, + 0x4730: 0x0040, 0x4731: 0x0040, 0x4732: 0x0040, 0x4733: 0x0040, 0x4734: 0x0040, 0x4735: 0x0040, + 0x4736: 0x0040, 0x4737: 0x0040, 0x4738: 0x0040, 0x4739: 0x0040, 0x473a: 0x0040, 0x473b: 0x0040, + 0x473c: 0x0040, 0x473d: 0x0040, 0x473e: 0x0040, 0x473f: 0x0040, + // Block 0x11d, offset 0x4740 + 0x4740: 0x00c3, 0x4741: 0x00c0, 0x4742: 0x00c0, 0x4743: 0x00c0, 0x4744: 0x00c0, 0x4745: 0x00c0, + 0x4746: 0x00c0, 0x4747: 0x00c3, 0x4748: 0x00c3, 0x4749: 0x00c3, 0x474a: 0x00c3, 0x474b: 0x00c3, + 0x474c: 0x00c3, 0x474d: 0x00c3, 0x474e: 0x00c3, 0x474f: 0x00c3, 0x4750: 0x00c3, 0x4751: 0x00c3, + 0x4752: 0x00c3, 0x4753: 0x00c3, 0x4754: 0x00c3, 0x4755: 0x00c3, + // Block 0x11e, offset 0x4780 + 0x4780: 0x00c0, 0x4781: 0x00c0, 0x4782: 0x00c0, 0x4783: 0x00c0, 0x4784: 0x00c0, 0x4785: 0x00c0, + 0x4786: 0x00c0, 0x4787: 0x00c0, 0x4788: 0x00c0, 0x4789: 0x00c0, 0x478a: 0x00c0, 0x478b: 0x00c0, + 0x478c: 0x00c0, 0x478d: 0x00c0, 0x478e: 0x00c0, 0x478f: 0x00c0, 0x4790: 0x00c0, 0x4791: 0x00c0, + 0x4792: 0x00c0, 0x4793: 0x00c0, 0x4794: 0x00c0, 0x4795: 0x00c0, 0x4796: 0x00c0, 0x4797: 0x00c0, + 0x4798: 0x00c0, 0x4799: 0x00c0, 0x479a: 0x00c0, 0x479b: 0x00c0, 0x479c: 0x00c0, 0x479d: 0x00c0, + 0x479e: 0x00c0, 0x47a0: 0x00c0, 0x47a1: 0x00c0, 0x47a2: 0x00c0, 0x47a3: 0x00c0, + 0x47a4: 0x00c0, 0x47a5: 0x00c0, 0x47a6: 0x00c0, 0x47a7: 0x00c0, 0x47a8: 0x00c0, 0x47a9: 0x00c0, + 0x47ae: 0x0080, 0x47af: 0x0080, + 0x47b0: 0x00c0, 0x47b1: 0x00c0, 0x47b2: 0x00c0, 0x47b3: 0x00c0, 0x47b4: 0x00c0, 0x47b5: 0x00c0, + 0x47b6: 0x00c0, 0x47b7: 0x00c0, 0x47b8: 0x00c0, 0x47b9: 0x00c0, 0x47ba: 0x00c0, 0x47bb: 0x00c0, + 0x47bc: 0x00c0, 0x47bd: 0x00c0, 0x47be: 0x00c0, 0x47bf: 0x00c0, + // Block 0x11f, offset 0x47c0 + 0x47c0: 0x00c0, 0x47c1: 0x00c0, 0x47c2: 0x00c0, 0x47c3: 0x00c0, 0x47c4: 0x00c0, 0x47c5: 0x00c0, + 0x47c6: 0x00c0, 0x47c7: 0x00c0, 0x47c8: 0x00c0, 0x47c9: 0x00c0, 0x47ca: 0x00c0, 0x47cb: 0x00c0, + 0x47cc: 0x00c0, 0x47cd: 0x00c0, 0x47ce: 0x00c0, 0x47cf: 0x00c0, 0x47d0: 0x00c0, 0x47d1: 0x00c0, + 0x47d2: 0x00c0, 0x47d3: 0x00c0, 0x47d4: 0x00c0, 0x47d5: 0x00c0, 0x47d6: 0x00c0, 0x47d7: 0x00c0, + 0x47d8: 0x00c0, 0x47d9: 0x00c0, 0x47da: 0x00c0, 0x47db: 0x00c0, 0x47dc: 0x00c0, 0x47dd: 0x00c0, + 0x47de: 0x00c0, 0x47df: 0x00c0, 0x47e0: 0x00c0, 0x47e1: 0x00c0, 0x47e2: 0x00c0, 0x47e3: 0x00c0, + 0x47e4: 0x00c0, 0x47e5: 0x00c0, 0x47e6: 0x00c0, 0x47e7: 0x00c0, 0x47e8: 0x00c0, 0x47e9: 0x00c0, + 0x47ea: 0x00c0, 0x47eb: 0x00c0, 0x47ec: 0x00c0, 0x47ed: 0x00c0, 0x47ee: 0x00c0, 0x47ef: 0x00c0, + 0x47f0: 0x00c0, 0x47f1: 0x00c0, 0x47f2: 0x00c0, 0x47f3: 0x00c0, 0x47f4: 0x00c0, 0x47f5: 0x00c0, + 0x47f6: 0x00c0, 0x47f7: 0x00c0, 0x47f8: 0x00c0, 0x47f9: 0x00c0, 0x47fa: 0x00c0, 0x47fb: 0x00c0, + 0x47fc: 0x00c0, 0x47fd: 0x00c0, 0x47fe: 0x00c0, + // Block 0x120, offset 0x4800 + 0x4800: 0x00c0, 0x4801: 0x00c0, 0x4802: 0x00c0, 0x4803: 0x00c0, 0x4804: 0x00c0, 0x4805: 0x00c0, + 0x4806: 0x00c0, 0x4807: 0x00c0, 0x4808: 0x00c0, 0x4809: 0x00c0, + 0x4810: 0x00c0, 0x4811: 0x00c0, + 0x4812: 0x00c0, 0x4813: 0x00c0, 0x4814: 0x00c0, 0x4815: 0x00c0, 0x4816: 0x00c0, 0x4817: 0x00c0, + 0x4818: 0x00c0, 0x4819: 0x00c0, 0x481a: 0x00c0, 0x481b: 0x00c0, 0x481c: 0x00c0, 0x481d: 0x00c0, + 0x481e: 0x00c0, 0x481f: 0x00c0, 0x4820: 0x00c0, 0x4821: 0x00c0, 0x4822: 0x00c0, 0x4823: 0x00c0, + 0x4824: 0x00c0, 0x4825: 0x00c0, 0x4826: 0x00c0, 0x4827: 0x00c0, 0x4828: 0x00c0, 0x4829: 0x00c0, + 0x482a: 0x00c0, 0x482b: 0x00c0, 0x482c: 0x00c0, 0x482d: 0x00c0, + 0x4830: 0x00c3, 0x4831: 0x00c3, 0x4832: 0x00c3, 0x4833: 0x00c3, 0x4834: 0x00c3, 0x4835: 0x0080, + // Block 0x121, offset 0x4840 + 0x4840: 0x00c0, 0x4841: 0x00c0, 0x4842: 0x00c0, 0x4843: 0x00c0, 0x4844: 0x00c0, 0x4845: 0x00c0, + 0x4846: 0x00c0, 0x4847: 0x00c0, 0x4848: 0x00c0, 0x4849: 0x00c0, 0x484a: 0x00c0, 0x484b: 0x00c0, + 0x484c: 0x00c0, 0x484d: 0x00c0, 0x484e: 0x00c0, 0x484f: 0x00c0, 0x4850: 0x00c0, 0x4851: 0x00c0, + 0x4852: 0x00c0, 0x4853: 0x00c0, 0x4854: 0x00c0, 0x4855: 0x00c0, 0x4856: 0x00c0, 0x4857: 0x00c0, + 0x4858: 0x00c0, 0x4859: 0x00c0, 0x485a: 0x00c0, 0x485b: 0x00c0, 0x485c: 0x00c0, 0x485d: 0x00c0, + 0x485e: 0x00c0, 0x485f: 0x00c0, 0x4860: 0x00c0, 0x4861: 0x00c0, 0x4862: 0x00c0, 0x4863: 0x00c0, + 0x4864: 0x00c0, 0x4865: 0x00c0, 0x4866: 0x00c0, 0x4867: 0x00c0, 0x4868: 0x00c0, 0x4869: 0x00c0, + 0x486a: 0x00c0, 0x486b: 0x00c0, 0x486c: 0x00c0, 0x486d: 0x00c0, 0x486e: 0x00c0, 0x486f: 0x00c0, + 0x4870: 0x00c3, 0x4871: 0x00c3, 0x4872: 0x00c3, 0x4873: 0x00c3, 0x4874: 0x00c3, 0x4875: 0x00c3, + 0x4876: 0x00c3, 0x4877: 0x0080, 0x4878: 0x0080, 0x4879: 0x0080, 0x487a: 0x0080, 0x487b: 0x0080, + 0x487c: 0x0080, 0x487d: 0x0080, 0x487e: 0x0080, 0x487f: 0x0080, + // Block 0x122, offset 0x4880 + 0x4880: 0x00c0, 0x4881: 0x00c0, 0x4882: 0x00c0, 0x4883: 0x00c0, 0x4884: 0x0080, 0x4885: 0x0080, + 0x4890: 0x00c0, 0x4891: 0x00c0, + 0x4892: 0x00c0, 0x4893: 0x00c0, 0x4894: 0x00c0, 0x4895: 0x00c0, 0x4896: 0x00c0, 0x4897: 0x00c0, + 0x4898: 0x00c0, 0x4899: 0x00c0, 0x489b: 0x0080, 0x489c: 0x0080, 0x489d: 0x0080, + 0x489e: 0x0080, 0x489f: 0x0080, 0x48a0: 0x0080, 0x48a1: 0x0080, 0x48a3: 0x00c0, + 0x48a4: 0x00c0, 0x48a5: 0x00c0, 0x48a6: 0x00c0, 0x48a7: 0x00c0, 0x48a8: 0x00c0, 0x48a9: 0x00c0, + 0x48aa: 0x00c0, 0x48ab: 0x00c0, 0x48ac: 0x00c0, 0x48ad: 0x00c0, 0x48ae: 0x00c0, 0x48af: 0x00c0, + 0x48b0: 0x00c0, 0x48b1: 0x00c0, 0x48b2: 0x00c0, 0x48b3: 0x00c0, 0x48b4: 0x00c0, 0x48b5: 0x00c0, + 0x48b6: 0x00c0, 0x48b7: 0x00c0, + 0x48bd: 0x00c0, 0x48be: 0x00c0, 0x48bf: 0x00c0, + // Block 0x123, offset 0x48c0 + 0x48c0: 0x00c0, 0x48c1: 0x00c0, 0x48c2: 0x00c0, 0x48c3: 0x00c0, 0x48c4: 0x00c0, 0x48c5: 0x00c0, + 0x48c6: 0x00c0, 0x48c7: 0x00c0, 0x48c8: 0x00c0, 0x48c9: 0x00c0, 0x48ca: 0x00c0, 0x48cb: 0x00c0, + 0x48cc: 0x00c0, 0x48cd: 0x00c0, 0x48ce: 0x00c0, 0x48cf: 0x00c0, + // Block 0x124, offset 0x4900 + 0x4900: 0x0080, 0x4901: 0x0080, 0x4902: 0x0080, 0x4903: 0x0080, 0x4904: 0x0080, 0x4905: 0x0080, + 0x4906: 0x0080, 0x4907: 0x0080, 0x4908: 0x0080, 0x4909: 0x0080, 0x490a: 0x0080, 0x490b: 0x0080, + 0x490c: 0x0080, 0x490d: 0x0080, 0x490e: 0x0080, 0x490f: 0x0080, 0x4910: 0x0080, 0x4911: 0x0080, + 0x4912: 0x0080, 0x4913: 0x0080, 0x4914: 0x0080, 0x4915: 0x0080, 0x4916: 0x0080, 0x4917: 0x0080, + 0x4918: 0x0080, 0x4919: 0x0080, 0x491a: 0x0080, + // Block 0x125, offset 0x4940 + 0x4940: 0x00c0, 0x4941: 0x00c0, 0x4942: 0x00c0, 0x4943: 0x00c0, 0x4944: 0x00c0, 0x4945: 0x00c0, + 0x4946: 0x00c0, 0x4947: 0x00c0, 0x4948: 0x00c0, 0x4949: 0x00c0, 0x494a: 0x00c0, + 0x494f: 0x00c3, 0x4950: 0x00c0, 0x4951: 0x00c0, + 0x4952: 0x00c0, 0x4953: 0x00c0, 0x4954: 0x00c0, 0x4955: 0x00c0, 0x4956: 0x00c0, 0x4957: 0x00c0, + 0x4958: 0x00c0, 0x4959: 0x00c0, 0x495a: 0x00c0, 0x495b: 0x00c0, 0x495c: 0x00c0, 0x495d: 0x00c0, + 0x495e: 0x00c0, 0x495f: 0x00c0, 0x4960: 0x00c0, 0x4961: 0x00c0, 0x4962: 0x00c0, 0x4963: 0x00c0, + 0x4964: 0x00c0, 0x4965: 0x00c0, 0x4966: 0x00c0, 0x4967: 0x00c0, 0x4968: 0x00c0, 0x4969: 0x00c0, + 0x496a: 0x00c0, 0x496b: 0x00c0, 0x496c: 0x00c0, 0x496d: 0x00c0, 0x496e: 0x00c0, 0x496f: 0x00c0, + 0x4970: 0x00c0, 0x4971: 0x00c0, 0x4972: 0x00c0, 0x4973: 0x00c0, 0x4974: 0x00c0, 0x4975: 0x00c0, + 0x4976: 0x00c0, 0x4977: 0x00c0, 0x4978: 0x00c0, 0x4979: 0x00c0, 0x497a: 0x00c0, 0x497b: 0x00c0, + 0x497c: 0x00c0, 0x497d: 0x00c0, 0x497e: 0x00c0, 0x497f: 0x00c0, + // Block 0x126, offset 0x4980 + 0x4980: 0x00c0, 0x4981: 0x00c0, 0x4982: 0x00c0, 0x4983: 0x00c0, 0x4984: 0x00c0, 0x4985: 0x00c0, + 0x4986: 0x00c0, 0x4987: 0x00c0, + 0x498f: 0x00c3, 0x4990: 0x00c3, 0x4991: 0x00c3, + 0x4992: 0x00c3, 0x4993: 0x00c0, 0x4994: 0x00c0, 0x4995: 0x00c0, 0x4996: 0x00c0, 0x4997: 0x00c0, + 0x4998: 0x00c0, 0x4999: 0x00c0, 0x499a: 0x00c0, 0x499b: 0x00c0, 0x499c: 0x00c0, 0x499d: 0x00c0, + 0x499e: 0x00c0, 0x499f: 0x00c0, + // Block 0x127, offset 0x49c0 + 0x49e0: 0x00c0, 0x49e1: 0x00c0, 0x49e2: 0x008c, 0x49e3: 0x00cc, + 0x49e4: 0x00c3, + 0x49f0: 0x00cc, 0x49f1: 0x00cc, + // Block 0x128, offset 0x4a00 + 0x4a00: 0x00c0, 0x4a01: 0x00c0, 0x4a02: 0x00c0, 0x4a03: 0x00c0, 0x4a04: 0x00c0, 0x4a05: 0x00c0, + 0x4a06: 0x00c0, 0x4a07: 0x00c0, 0x4a08: 0x00c0, 0x4a09: 0x00c0, 0x4a0a: 0x00c0, 0x4a0b: 0x00c0, + 0x4a0c: 0x00c0, 0x4a0d: 0x00c0, 0x4a0e: 0x00c0, 0x4a0f: 0x00c0, 0x4a10: 0x00c0, 0x4a11: 0x00c0, + 0x4a12: 0x00c0, 0x4a13: 0x00c0, 0x4a14: 0x00c0, 0x4a15: 0x00c0, 0x4a16: 0x00c0, 0x4a17: 0x00c0, + 0x4a18: 0x00c0, 0x4a19: 0x00c0, 0x4a1a: 0x00c0, 0x4a1b: 0x00c0, 0x4a1c: 0x00c0, 0x4a1d: 0x00c0, + 0x4a1e: 0x00c0, 0x4a1f: 0x00c0, 0x4a20: 0x00c0, 0x4a21: 0x00c0, 0x4a22: 0x00c0, 0x4a23: 0x00c0, + 0x4a24: 0x00c0, 0x4a25: 0x00c0, 0x4a26: 0x00c0, 0x4a27: 0x00c0, 0x4a28: 0x00c0, 0x4a29: 0x00c0, + 0x4a2a: 0x00c0, 0x4a2b: 0x00c0, 0x4a2c: 0x00c0, 0x4a2d: 0x00c0, 0x4a2e: 0x00c0, 0x4a2f: 0x00c0, + 0x4a30: 0x00c0, 0x4a31: 0x00c0, 0x4a32: 0x00c0, 0x4a33: 0x00c0, 0x4a34: 0x00c0, 0x4a35: 0x00c0, + 0x4a36: 0x00c0, 0x4a37: 0x00c0, + // Block 0x129, offset 0x4a40 + 0x4a40: 0x00c0, 0x4a41: 0x00c0, 0x4a42: 0x00c0, 0x4a43: 0x00c0, 0x4a44: 0x00c0, 0x4a45: 0x00c0, + 0x4a46: 0x00c0, 0x4a47: 0x00c0, 0x4a48: 0x00c0, 0x4a49: 0x00c0, 0x4a4a: 0x00c0, 0x4a4b: 0x00c0, + 0x4a4c: 0x00c0, 0x4a4d: 0x00c0, 0x4a4e: 0x00c0, 0x4a4f: 0x00c0, 0x4a50: 0x00c0, 0x4a51: 0x00c0, + 0x4a52: 0x00c0, 0x4a53: 0x00c0, 0x4a54: 0x00c0, 0x4a55: 0x00c0, + // Block 0x12a, offset 0x4a80 + 0x4ab0: 0x00cc, 0x4ab1: 0x00cc, 0x4ab2: 0x00cc, 0x4ab3: 0x00cc, 0x4ab5: 0x00cc, + 0x4ab6: 0x00cc, 0x4ab7: 0x00cc, 0x4ab8: 0x00cc, 0x4ab9: 0x00cc, 0x4aba: 0x00cc, 0x4abb: 0x00cc, + 0x4abd: 0x00cc, 0x4abe: 0x00cc, + // Block 0x12b, offset 0x4ac0 + 0x4ac0: 0x00cc, 0x4ac1: 0x00cc, 0x4ac2: 0x00cc, 0x4ac3: 0x00cc, 0x4ac4: 0x00cc, 0x4ac5: 0x00cc, + 0x4ac6: 0x00cc, 0x4ac7: 0x00cc, 0x4ac8: 0x00cc, 0x4ac9: 0x00cc, 0x4aca: 0x00cc, 0x4acb: 0x00cc, + 0x4acc: 0x00cc, 0x4acd: 0x00cc, 0x4ace: 0x00cc, 0x4acf: 0x00cc, 0x4ad0: 0x00cc, 0x4ad1: 0x00cc, + 0x4ad2: 0x00cc, 0x4ad3: 0x00cc, 0x4ad4: 0x00cc, 0x4ad5: 0x00cc, 0x4ad6: 0x00cc, 0x4ad7: 0x00cc, + 0x4ad8: 0x00cc, 0x4ad9: 0x00cc, 0x4ada: 0x00cc, 0x4adb: 0x00cc, 0x4adc: 0x00cc, 0x4add: 0x00cc, + 0x4ade: 0x00cc, 0x4adf: 0x00cc, 0x4ae0: 0x00cc, 0x4ae1: 0x00cc, 0x4ae2: 0x00cc, + 0x4af2: 0x00cc, + // Block 0x12c, offset 0x4b00 + 0x4b10: 0x00cc, 0x4b11: 0x00cc, + 0x4b12: 0x00cc, 0x4b15: 0x00cc, + 0x4b24: 0x00cc, 0x4b25: 0x00cc, 0x4b26: 0x00cc, 0x4b27: 0x00cc, + 0x4b30: 0x00c0, 0x4b31: 0x00c0, 0x4b32: 0x00c0, 0x4b33: 0x00c0, 0x4b34: 0x00c0, 0x4b35: 0x00c0, + 0x4b36: 0x00c0, 0x4b37: 0x00c0, 0x4b38: 0x00c0, 0x4b39: 0x00c0, 0x4b3a: 0x00c0, 0x4b3b: 0x00c0, + 0x4b3c: 0x00c0, 0x4b3d: 0x00c0, 0x4b3e: 0x00c0, 0x4b3f: 0x00c0, + // Block 0x12d, offset 0x4b40 + 0x4b40: 0x00c0, 0x4b41: 0x00c0, 0x4b42: 0x00c0, 0x4b43: 0x00c0, 0x4b44: 0x00c0, 0x4b45: 0x00c0, + 0x4b46: 0x00c0, 0x4b47: 0x00c0, 0x4b48: 0x00c0, 0x4b49: 0x00c0, 0x4b4a: 0x00c0, 0x4b4b: 0x00c0, + 0x4b4c: 0x00c0, 0x4b4d: 0x00c0, 0x4b4e: 0x00c0, 0x4b4f: 0x00c0, 0x4b50: 0x00c0, 0x4b51: 0x00c0, + 0x4b52: 0x00c0, 0x4b53: 0x00c0, 0x4b54: 0x00c0, 0x4b55: 0x00c0, 0x4b56: 0x00c0, 0x4b57: 0x00c0, + 0x4b58: 0x00c0, 0x4b59: 0x00c0, 0x4b5a: 0x00c0, 0x4b5b: 0x00c0, 0x4b5c: 0x00c0, 0x4b5d: 0x00c0, + 0x4b5e: 0x00c0, 0x4b5f: 0x00c0, 0x4b60: 0x00c0, 0x4b61: 0x00c0, 0x4b62: 0x00c0, 0x4b63: 0x00c0, + 0x4b64: 0x00c0, 0x4b65: 0x00c0, 0x4b66: 0x00c0, 0x4b67: 0x00c0, 0x4b68: 0x00c0, 0x4b69: 0x00c0, + 0x4b6a: 0x00c0, 0x4b6b: 0x00c0, 0x4b6c: 0x00c0, 0x4b6d: 0x00c0, 0x4b6e: 0x00c0, 0x4b6f: 0x00c0, + 0x4b70: 0x00c0, 0x4b71: 0x00c0, 0x4b72: 0x00c0, 0x4b73: 0x00c0, 0x4b74: 0x00c0, 0x4b75: 0x00c0, + 0x4b76: 0x00c0, 0x4b77: 0x00c0, 0x4b78: 0x00c0, 0x4b79: 0x00c0, 0x4b7a: 0x00c0, 0x4b7b: 0x00c0, + // Block 0x12e, offset 0x4b80 + 0x4b80: 0x00c0, 0x4b81: 0x00c0, 0x4b82: 0x00c0, 0x4b83: 0x00c0, 0x4b84: 0x00c0, 0x4b85: 0x00c0, + 0x4b86: 0x00c0, 0x4b87: 0x00c0, 0x4b88: 0x00c0, 0x4b89: 0x00c0, 0x4b8a: 0x00c0, 0x4b8b: 0x00c0, + 0x4b8c: 0x00c0, 0x4b8d: 0x00c0, 0x4b8e: 0x00c0, 0x4b8f: 0x00c0, 0x4b90: 0x00c0, 0x4b91: 0x00c0, + 0x4b92: 0x00c0, 0x4b93: 0x00c0, 0x4b94: 0x00c0, 0x4b95: 0x00c0, 0x4b96: 0x00c0, 0x4b97: 0x00c0, + 0x4b98: 0x00c0, 0x4b99: 0x00c0, 0x4b9a: 0x00c0, 0x4b9b: 0x00c0, 0x4b9c: 0x00c0, 0x4b9d: 0x00c0, + 0x4b9e: 0x00c0, 0x4b9f: 0x00c0, 0x4ba0: 0x00c0, 0x4ba1: 0x00c0, 0x4ba2: 0x00c0, 0x4ba3: 0x00c0, + 0x4ba4: 0x00c0, 0x4ba5: 0x00c0, 0x4ba6: 0x00c0, 0x4ba7: 0x00c0, 0x4ba8: 0x00c0, 0x4ba9: 0x00c0, + 0x4baa: 0x00c0, + 0x4bb0: 0x00c0, 0x4bb1: 0x00c0, 0x4bb2: 0x00c0, 0x4bb3: 0x00c0, 0x4bb4: 0x00c0, 0x4bb5: 0x00c0, + 0x4bb6: 0x00c0, 0x4bb7: 0x00c0, 0x4bb8: 0x00c0, 0x4bb9: 0x00c0, 0x4bba: 0x00c0, 0x4bbb: 0x00c0, + 0x4bbc: 0x00c0, + // Block 0x12f, offset 0x4bc0 + 0x4bc0: 0x00c0, 0x4bc1: 0x00c0, 0x4bc2: 0x00c0, 0x4bc3: 0x00c0, 0x4bc4: 0x00c0, 0x4bc5: 0x00c0, + 0x4bc6: 0x00c0, 0x4bc7: 0x00c0, 0x4bc8: 0x00c0, + 0x4bd0: 0x00c0, 0x4bd1: 0x00c0, + 0x4bd2: 0x00c0, 0x4bd3: 0x00c0, 0x4bd4: 0x00c0, 0x4bd5: 0x00c0, 0x4bd6: 0x00c0, 0x4bd7: 0x00c0, + 0x4bd8: 0x00c0, 0x4bd9: 0x00c0, 0x4bdc: 0x0080, 0x4bdd: 0x00c3, + 0x4bde: 0x00c3, 0x4bdf: 0x0080, 0x4be0: 0x0040, 0x4be1: 0x0040, 0x4be2: 0x0040, 0x4be3: 0x0040, + // Block 0x130, offset 0x4c00 + 0x4c00: 0x00c3, 0x4c01: 0x00c3, 0x4c02: 0x00c3, 0x4c03: 0x00c3, 0x4c04: 0x00c3, 0x4c05: 0x00c3, + 0x4c06: 0x00c3, 0x4c07: 0x00c3, 0x4c08: 0x00c3, 0x4c09: 0x00c3, 0x4c0a: 0x00c3, 0x4c0b: 0x00c3, + 0x4c0c: 0x00c3, 0x4c0d: 0x00c3, 0x4c0e: 0x00c3, 0x4c0f: 0x00c3, 0x4c10: 0x00c3, 0x4c11: 0x00c3, + 0x4c12: 0x00c3, 0x4c13: 0x00c3, 0x4c14: 0x00c3, 0x4c15: 0x00c3, 0x4c16: 0x00c3, 0x4c17: 0x00c3, + 0x4c18: 0x00c3, 0x4c19: 0x00c3, 0x4c1a: 0x00c3, 0x4c1b: 0x00c3, 0x4c1c: 0x00c3, 0x4c1d: 0x00c3, + 0x4c1e: 0x00c3, 0x4c1f: 0x00c3, 0x4c20: 0x00c3, 0x4c21: 0x00c3, 0x4c22: 0x00c3, 0x4c23: 0x00c3, + 0x4c24: 0x00c3, 0x4c25: 0x00c3, 0x4c26: 0x00c3, 0x4c27: 0x00c3, 0x4c28: 0x00c3, 0x4c29: 0x00c3, + 0x4c2a: 0x00c3, 0x4c2b: 0x00c3, 0x4c2c: 0x00c3, 0x4c2d: 0x00c3, + 0x4c30: 0x00c3, 0x4c31: 0x00c3, 0x4c32: 0x00c3, 0x4c33: 0x00c3, 0x4c34: 0x00c3, 0x4c35: 0x00c3, + 0x4c36: 0x00c3, 0x4c37: 0x00c3, 0x4c38: 0x00c3, 0x4c39: 0x00c3, 0x4c3a: 0x00c3, 0x4c3b: 0x00c3, + 0x4c3c: 0x00c3, 0x4c3d: 0x00c3, 0x4c3e: 0x00c3, 0x4c3f: 0x00c3, + // Block 0x131, offset 0x4c40 + 0x4c40: 0x00c3, 0x4c41: 0x00c3, 0x4c42: 0x00c3, 0x4c43: 0x00c3, 0x4c44: 0x00c3, 0x4c45: 0x00c3, + 0x4c46: 0x00c3, + 0x4c50: 0x0080, 0x4c51: 0x0080, + 0x4c52: 0x0080, 0x4c53: 0x0080, 0x4c54: 0x0080, 0x4c55: 0x0080, 0x4c56: 0x0080, 0x4c57: 0x0080, + 0x4c58: 0x0080, 0x4c59: 0x0080, 0x4c5a: 0x0080, 0x4c5b: 0x0080, 0x4c5c: 0x0080, 0x4c5d: 0x0080, + 0x4c5e: 0x0080, 0x4c5f: 0x0080, 0x4c60: 0x0080, 0x4c61: 0x0080, 0x4c62: 0x0080, 0x4c63: 0x0080, + 0x4c64: 0x0080, 0x4c65: 0x0080, 0x4c66: 0x0080, 0x4c67: 0x0080, 0x4c68: 0x0080, 0x4c69: 0x0080, + 0x4c6a: 0x0080, 0x4c6b: 0x0080, 0x4c6c: 0x0080, 0x4c6d: 0x0080, 0x4c6e: 0x0080, 0x4c6f: 0x0080, + 0x4c70: 0x0080, 0x4c71: 0x0080, 0x4c72: 0x0080, 0x4c73: 0x0080, 0x4c74: 0x0080, 0x4c75: 0x0080, + 0x4c76: 0x0080, 0x4c77: 0x0080, 0x4c78: 0x0080, 0x4c79: 0x0080, 0x4c7a: 0x0080, 0x4c7b: 0x0080, + 0x4c7c: 0x0080, 0x4c7d: 0x0080, 0x4c7e: 0x0080, 0x4c7f: 0x0080, + // Block 0x132, offset 0x4c80 + 0x4c80: 0x0080, 0x4c81: 0x0080, 0x4c82: 0x0080, 0x4c83: 0x0080, + // Block 0x133, offset 0x4cc0 + 0x4cc0: 0x0080, 0x4cc1: 0x0080, 0x4cc2: 0x0080, 0x4cc3: 0x0080, 0x4cc4: 0x0080, 0x4cc5: 0x0080, + 0x4cc6: 0x0080, 0x4cc7: 0x0080, 0x4cc8: 0x0080, 0x4cc9: 0x0080, 0x4cca: 0x0080, 0x4ccb: 0x0080, + 0x4ccc: 0x0080, 0x4ccd: 0x0080, 0x4cce: 0x0080, 0x4ccf: 0x0080, 0x4cd0: 0x0080, 0x4cd1: 0x0080, + 0x4cd2: 0x0080, 0x4cd3: 0x0080, 0x4cd4: 0x0080, 0x4cd5: 0x0080, 0x4cd6: 0x0080, 0x4cd7: 0x0080, + 0x4cd8: 0x0080, 0x4cd9: 0x0080, 0x4cda: 0x0080, 0x4cdb: 0x0080, 0x4cdc: 0x0080, 0x4cdd: 0x0080, + 0x4cde: 0x0080, 0x4cdf: 0x0080, 0x4ce0: 0x0080, 0x4ce1: 0x0080, 0x4ce2: 0x0080, 0x4ce3: 0x0080, + 0x4ce4: 0x0080, 0x4ce5: 0x0080, 0x4ce6: 0x0080, 0x4ce7: 0x0080, 0x4ce8: 0x0080, 0x4ce9: 0x0080, + 0x4cea: 0x0080, 0x4ceb: 0x0080, 0x4cec: 0x0080, 0x4ced: 0x0080, 0x4cee: 0x0080, 0x4cef: 0x0080, + 0x4cf0: 0x0080, 0x4cf1: 0x0080, 0x4cf2: 0x0080, 0x4cf3: 0x0080, 0x4cf4: 0x0080, 0x4cf5: 0x0080, + // Block 0x134, offset 0x4d00 + 0x4d00: 0x0080, 0x4d01: 0x0080, 0x4d02: 0x0080, 0x4d03: 0x0080, 0x4d04: 0x0080, 0x4d05: 0x0080, + 0x4d06: 0x0080, 0x4d07: 0x0080, 0x4d08: 0x0080, 0x4d09: 0x0080, 0x4d0a: 0x0080, 0x4d0b: 0x0080, + 0x4d0c: 0x0080, 0x4d0d: 0x0080, 0x4d0e: 0x0080, 0x4d0f: 0x0080, 0x4d10: 0x0080, 0x4d11: 0x0080, + 0x4d12: 0x0080, 0x4d13: 0x0080, 0x4d14: 0x0080, 0x4d15: 0x0080, 0x4d16: 0x0080, 0x4d17: 0x0080, + 0x4d18: 0x0080, 0x4d19: 0x0080, 0x4d1a: 0x0080, 0x4d1b: 0x0080, 0x4d1c: 0x0080, 0x4d1d: 0x0080, + 0x4d1e: 0x0080, 0x4d1f: 0x0080, 0x4d20: 0x0080, 0x4d21: 0x0080, 0x4d22: 0x0080, 0x4d23: 0x0080, + 0x4d24: 0x0080, 0x4d25: 0x0080, 0x4d26: 0x0080, 0x4d29: 0x0080, + 0x4d2a: 0x0080, 0x4d2b: 0x0080, 0x4d2c: 0x0080, 0x4d2d: 0x0080, 0x4d2e: 0x0080, 0x4d2f: 0x0080, + 0x4d30: 0x0080, 0x4d31: 0x0080, 0x4d32: 0x0080, 0x4d33: 0x0080, 0x4d34: 0x0080, 0x4d35: 0x0080, + 0x4d36: 0x0080, 0x4d37: 0x0080, 0x4d38: 0x0080, 0x4d39: 0x0080, 0x4d3a: 0x0080, 0x4d3b: 0x0080, + 0x4d3c: 0x0080, 0x4d3d: 0x0080, 0x4d3e: 0x0080, 0x4d3f: 0x0080, + // Block 0x135, offset 0x4d40 + 0x4d40: 0x0080, 0x4d41: 0x0080, 0x4d42: 0x0080, 0x4d43: 0x0080, 0x4d44: 0x0080, 0x4d45: 0x0080, + 0x4d46: 0x0080, 0x4d47: 0x0080, 0x4d48: 0x0080, 0x4d49: 0x0080, 0x4d4a: 0x0080, 0x4d4b: 0x0080, + 0x4d4c: 0x0080, 0x4d4d: 0x0080, 0x4d4e: 0x0080, 0x4d4f: 0x0080, 0x4d50: 0x0080, 0x4d51: 0x0080, + 0x4d52: 0x0080, 0x4d53: 0x0080, 0x4d54: 0x0080, 0x4d55: 0x0080, 0x4d56: 0x0080, 0x4d57: 0x0080, + 0x4d58: 0x0080, 0x4d59: 0x0080, 0x4d5a: 0x0080, 0x4d5b: 0x0080, 0x4d5c: 0x0080, 0x4d5d: 0x0080, + 0x4d5e: 0x0080, 0x4d5f: 0x0080, 0x4d60: 0x0080, 0x4d61: 0x0080, 0x4d62: 0x0080, 0x4d63: 0x0080, + 0x4d64: 0x0080, 0x4d65: 0x00c0, 0x4d66: 0x00c0, 0x4d67: 0x00c3, 0x4d68: 0x00c3, 0x4d69: 0x00c3, + 0x4d6a: 0x0080, 0x4d6b: 0x0080, 0x4d6c: 0x0080, 0x4d6d: 0x00c0, 0x4d6e: 0x00c0, 0x4d6f: 0x00c0, + 0x4d70: 0x00c0, 0x4d71: 0x00c0, 0x4d72: 0x00c0, 0x4d73: 0x0040, 0x4d74: 0x0040, 0x4d75: 0x0040, + 0x4d76: 0x0040, 0x4d77: 0x0040, 0x4d78: 0x0040, 0x4d79: 0x0040, 0x4d7a: 0x0040, 0x4d7b: 0x00c3, + 0x4d7c: 0x00c3, 0x4d7d: 0x00c3, 0x4d7e: 0x00c3, 0x4d7f: 0x00c3, + // Block 0x136, offset 0x4d80 + 0x4d80: 0x00c3, 0x4d81: 0x00c3, 0x4d82: 0x00c3, 0x4d83: 0x0080, 0x4d84: 0x0080, 0x4d85: 0x00c3, + 0x4d86: 0x00c3, 0x4d87: 0x00c3, 0x4d88: 0x00c3, 0x4d89: 0x00c3, 0x4d8a: 0x00c3, 0x4d8b: 0x00c3, + 0x4d8c: 0x0080, 0x4d8d: 0x0080, 0x4d8e: 0x0080, 0x4d8f: 0x0080, 0x4d90: 0x0080, 0x4d91: 0x0080, + 0x4d92: 0x0080, 0x4d93: 0x0080, 0x4d94: 0x0080, 0x4d95: 0x0080, 0x4d96: 0x0080, 0x4d97: 0x0080, + 0x4d98: 0x0080, 0x4d99: 0x0080, 0x4d9a: 0x0080, 0x4d9b: 0x0080, 0x4d9c: 0x0080, 0x4d9d: 0x0080, + 0x4d9e: 0x0080, 0x4d9f: 0x0080, 0x4da0: 0x0080, 0x4da1: 0x0080, 0x4da2: 0x0080, 0x4da3: 0x0080, + 0x4da4: 0x0080, 0x4da5: 0x0080, 0x4da6: 0x0080, 0x4da7: 0x0080, 0x4da8: 0x0080, 0x4da9: 0x0080, + 0x4daa: 0x00c3, 0x4dab: 0x00c3, 0x4dac: 0x00c3, 0x4dad: 0x00c3, 0x4dae: 0x0080, 0x4daf: 0x0080, + 0x4db0: 0x0080, 0x4db1: 0x0080, 0x4db2: 0x0080, 0x4db3: 0x0080, 0x4db4: 0x0080, 0x4db5: 0x0080, + 0x4db6: 0x0080, 0x4db7: 0x0080, 0x4db8: 0x0080, 0x4db9: 0x0080, 0x4dba: 0x0080, 0x4dbb: 0x0080, + 0x4dbc: 0x0080, 0x4dbd: 0x0080, 0x4dbe: 0x0080, 0x4dbf: 0x0080, + // Block 0x137, offset 0x4dc0 + 0x4dc0: 0x0080, 0x4dc1: 0x0080, 0x4dc2: 0x0080, 0x4dc3: 0x0080, 0x4dc4: 0x0080, 0x4dc5: 0x0080, + 0x4dc6: 0x0080, 0x4dc7: 0x0080, 0x4dc8: 0x0080, 0x4dc9: 0x0080, 0x4dca: 0x0080, 0x4dcb: 0x0080, + 0x4dcc: 0x0080, 0x4dcd: 0x0080, 0x4dce: 0x0080, 0x4dcf: 0x0080, 0x4dd0: 0x0080, 0x4dd1: 0x0080, + 0x4dd2: 0x0080, 0x4dd3: 0x0080, 0x4dd4: 0x0080, 0x4dd5: 0x0080, 0x4dd6: 0x0080, 0x4dd7: 0x0080, + 0x4dd8: 0x0080, 0x4dd9: 0x0080, 0x4dda: 0x0080, 0x4ddb: 0x0080, 0x4ddc: 0x0080, 0x4ddd: 0x0080, + 0x4dde: 0x0080, 0x4ddf: 0x0080, 0x4de0: 0x0080, 0x4de1: 0x0080, 0x4de2: 0x0080, 0x4de3: 0x0080, + 0x4de4: 0x0080, 0x4de5: 0x0080, 0x4de6: 0x0080, 0x4de7: 0x0080, 0x4de8: 0x0080, 0x4de9: 0x0080, + 0x4dea: 0x0080, + // Block 0x138, offset 0x4e00 + 0x4e00: 0x0088, 0x4e01: 0x0088, 0x4e02: 0x00c9, 0x4e03: 0x00c9, 0x4e04: 0x00c9, 0x4e05: 0x0088, + // Block 0x139, offset 0x4e40 + 0x4e40: 0x0080, 0x4e41: 0x0080, 0x4e42: 0x0080, 0x4e43: 0x0080, 0x4e44: 0x0080, 0x4e45: 0x0080, + 0x4e46: 0x0080, 0x4e47: 0x0080, 0x4e48: 0x0080, 0x4e49: 0x0080, 0x4e4a: 0x0080, 0x4e4b: 0x0080, + 0x4e4c: 0x0080, 0x4e4d: 0x0080, 0x4e4e: 0x0080, 0x4e4f: 0x0080, 0x4e50: 0x0080, 0x4e51: 0x0080, + 0x4e52: 0x0080, 0x4e53: 0x0080, + 0x4e60: 0x0080, 0x4e61: 0x0080, 0x4e62: 0x0080, 0x4e63: 0x0080, + 0x4e64: 0x0080, 0x4e65: 0x0080, 0x4e66: 0x0080, 0x4e67: 0x0080, 0x4e68: 0x0080, 0x4e69: 0x0080, + 0x4e6a: 0x0080, 0x4e6b: 0x0080, 0x4e6c: 0x0080, 0x4e6d: 0x0080, 0x4e6e: 0x0080, 0x4e6f: 0x0080, + 0x4e70: 0x0080, 0x4e71: 0x0080, 0x4e72: 0x0080, 0x4e73: 0x0080, + // Block 0x13a, offset 0x4e80 + 0x4e80: 0x0080, 0x4e81: 0x0080, 0x4e82: 0x0080, 0x4e83: 0x0080, 0x4e84: 0x0080, 0x4e85: 0x0080, + 0x4e86: 0x0080, 0x4e87: 0x0080, 0x4e88: 0x0080, 0x4e89: 0x0080, 0x4e8a: 0x0080, 0x4e8b: 0x0080, + 0x4e8c: 0x0080, 0x4e8d: 0x0080, 0x4e8e: 0x0080, 0x4e8f: 0x0080, 0x4e90: 0x0080, 0x4e91: 0x0080, + 0x4e92: 0x0080, 0x4e93: 0x0080, 0x4e94: 0x0080, 0x4e95: 0x0080, 0x4e96: 0x0080, + 0x4ea0: 0x0080, 0x4ea1: 0x0080, 0x4ea2: 0x0080, 0x4ea3: 0x0080, + 0x4ea4: 0x0080, 0x4ea5: 0x0080, 0x4ea6: 0x0080, 0x4ea7: 0x0080, 0x4ea8: 0x0080, 0x4ea9: 0x0080, + 0x4eaa: 0x0080, 0x4eab: 0x0080, 0x4eac: 0x0080, 0x4ead: 0x0080, 0x4eae: 0x0080, 0x4eaf: 0x0080, + 0x4eb0: 0x0080, 0x4eb1: 0x0080, 0x4eb2: 0x0080, 0x4eb3: 0x0080, 0x4eb4: 0x0080, 0x4eb5: 0x0080, + 0x4eb6: 0x0080, 0x4eb7: 0x0080, 0x4eb8: 0x0080, + // Block 0x13b, offset 0x4ec0 + 0x4ec0: 0x0080, 0x4ec1: 0x0080, 0x4ec2: 0x0080, 0x4ec3: 0x0080, 0x4ec4: 0x0080, 0x4ec5: 0x0080, + 0x4ec6: 0x0080, 0x4ec7: 0x0080, 0x4ec8: 0x0080, 0x4ec9: 0x0080, 0x4eca: 0x0080, 0x4ecb: 0x0080, + 0x4ecc: 0x0080, 0x4ecd: 0x0080, 0x4ece: 0x0080, 0x4ecf: 0x0080, 0x4ed0: 0x0080, 0x4ed1: 0x0080, + 0x4ed2: 0x0080, 0x4ed3: 0x0080, 0x4ed4: 0x0080, 0x4ed6: 0x0080, 0x4ed7: 0x0080, + 0x4ed8: 0x0080, 0x4ed9: 0x0080, 0x4eda: 0x0080, 0x4edb: 0x0080, 0x4edc: 0x0080, 0x4edd: 0x0080, + 0x4ede: 0x0080, 0x4edf: 0x0080, 0x4ee0: 0x0080, 0x4ee1: 0x0080, 0x4ee2: 0x0080, 0x4ee3: 0x0080, + 0x4ee4: 0x0080, 0x4ee5: 0x0080, 0x4ee6: 0x0080, 0x4ee7: 0x0080, 0x4ee8: 0x0080, 0x4ee9: 0x0080, + 0x4eea: 0x0080, 0x4eeb: 0x0080, 0x4eec: 0x0080, 0x4eed: 0x0080, 0x4eee: 0x0080, 0x4eef: 0x0080, + 0x4ef0: 0x0080, 0x4ef1: 0x0080, 0x4ef2: 0x0080, 0x4ef3: 0x0080, 0x4ef4: 0x0080, 0x4ef5: 0x0080, + 0x4ef6: 0x0080, 0x4ef7: 0x0080, 0x4ef8: 0x0080, 0x4ef9: 0x0080, 0x4efa: 0x0080, 0x4efb: 0x0080, + 0x4efc: 0x0080, 0x4efd: 0x0080, 0x4efe: 0x0080, 0x4eff: 0x0080, + // Block 0x13c, offset 0x4f00 + 0x4f00: 0x0080, 0x4f01: 0x0080, 0x4f02: 0x0080, 0x4f03: 0x0080, 0x4f04: 0x0080, 0x4f05: 0x0080, + 0x4f06: 0x0080, 0x4f07: 0x0080, 0x4f08: 0x0080, 0x4f09: 0x0080, 0x4f0a: 0x0080, 0x4f0b: 0x0080, + 0x4f0c: 0x0080, 0x4f0d: 0x0080, 0x4f0e: 0x0080, 0x4f0f: 0x0080, 0x4f10: 0x0080, 0x4f11: 0x0080, + 0x4f12: 0x0080, 0x4f13: 0x0080, 0x4f14: 0x0080, 0x4f15: 0x0080, 0x4f16: 0x0080, 0x4f17: 0x0080, + 0x4f18: 0x0080, 0x4f19: 0x0080, 0x4f1a: 0x0080, 0x4f1b: 0x0080, 0x4f1c: 0x0080, + 0x4f1e: 0x0080, 0x4f1f: 0x0080, 0x4f22: 0x0080, + 0x4f25: 0x0080, 0x4f26: 0x0080, 0x4f29: 0x0080, + 0x4f2a: 0x0080, 0x4f2b: 0x0080, 0x4f2c: 0x0080, 0x4f2e: 0x0080, 0x4f2f: 0x0080, + 0x4f30: 0x0080, 0x4f31: 0x0080, 0x4f32: 0x0080, 0x4f33: 0x0080, 0x4f34: 0x0080, 0x4f35: 0x0080, + 0x4f36: 0x0080, 0x4f37: 0x0080, 0x4f38: 0x0080, 0x4f39: 0x0080, 0x4f3b: 0x0080, + 0x4f3d: 0x0080, 0x4f3e: 0x0080, 0x4f3f: 0x0080, + // Block 0x13d, offset 0x4f40 + 0x4f40: 0x0080, 0x4f41: 0x0080, 0x4f42: 0x0080, 0x4f43: 0x0080, 0x4f45: 0x0080, + 0x4f46: 0x0080, 0x4f47: 0x0080, 0x4f48: 0x0080, 0x4f49: 0x0080, 0x4f4a: 0x0080, 0x4f4b: 0x0080, + 0x4f4c: 0x0080, 0x4f4d: 0x0080, 0x4f4e: 0x0080, 0x4f4f: 0x0080, 0x4f50: 0x0080, 0x4f51: 0x0080, + 0x4f52: 0x0080, 0x4f53: 0x0080, 0x4f54: 0x0080, 0x4f55: 0x0080, 0x4f56: 0x0080, 0x4f57: 0x0080, + 0x4f58: 0x0080, 0x4f59: 0x0080, 0x4f5a: 0x0080, 0x4f5b: 0x0080, 0x4f5c: 0x0080, 0x4f5d: 0x0080, + 0x4f5e: 0x0080, 0x4f5f: 0x0080, 0x4f60: 0x0080, 0x4f61: 0x0080, 0x4f62: 0x0080, 0x4f63: 0x0080, + 0x4f64: 0x0080, 0x4f65: 0x0080, 0x4f66: 0x0080, 0x4f67: 0x0080, 0x4f68: 0x0080, 0x4f69: 0x0080, + 0x4f6a: 0x0080, 0x4f6b: 0x0080, 0x4f6c: 0x0080, 0x4f6d: 0x0080, 0x4f6e: 0x0080, 0x4f6f: 0x0080, + 0x4f70: 0x0080, 0x4f71: 0x0080, 0x4f72: 0x0080, 0x4f73: 0x0080, 0x4f74: 0x0080, 0x4f75: 0x0080, + 0x4f76: 0x0080, 0x4f77: 0x0080, 0x4f78: 0x0080, 0x4f79: 0x0080, 0x4f7a: 0x0080, 0x4f7b: 0x0080, + 0x4f7c: 0x0080, 0x4f7d: 0x0080, 0x4f7e: 0x0080, 0x4f7f: 0x0080, + // Block 0x13e, offset 0x4f80 + 0x4f80: 0x0080, 0x4f81: 0x0080, 0x4f82: 0x0080, 0x4f83: 0x0080, 0x4f84: 0x0080, 0x4f85: 0x0080, + 0x4f87: 0x0080, 0x4f88: 0x0080, 0x4f89: 0x0080, 0x4f8a: 0x0080, + 0x4f8d: 0x0080, 0x4f8e: 0x0080, 0x4f8f: 0x0080, 0x4f90: 0x0080, 0x4f91: 0x0080, + 0x4f92: 0x0080, 0x4f93: 0x0080, 0x4f94: 0x0080, 0x4f96: 0x0080, 0x4f97: 0x0080, + 0x4f98: 0x0080, 0x4f99: 0x0080, 0x4f9a: 0x0080, 0x4f9b: 0x0080, 0x4f9c: 0x0080, + 0x4f9e: 0x0080, 0x4f9f: 0x0080, 0x4fa0: 0x0080, 0x4fa1: 0x0080, 0x4fa2: 0x0080, 0x4fa3: 0x0080, + 0x4fa4: 0x0080, 0x4fa5: 0x0080, 0x4fa6: 0x0080, 0x4fa7: 0x0080, 0x4fa8: 0x0080, 0x4fa9: 0x0080, + 0x4faa: 0x0080, 0x4fab: 0x0080, 0x4fac: 0x0080, 0x4fad: 0x0080, 0x4fae: 0x0080, 0x4faf: 0x0080, + 0x4fb0: 0x0080, 0x4fb1: 0x0080, 0x4fb2: 0x0080, 0x4fb3: 0x0080, 0x4fb4: 0x0080, 0x4fb5: 0x0080, + 0x4fb6: 0x0080, 0x4fb7: 0x0080, 0x4fb8: 0x0080, 0x4fb9: 0x0080, 0x4fbb: 0x0080, + 0x4fbc: 0x0080, 0x4fbd: 0x0080, 0x4fbe: 0x0080, + // Block 0x13f, offset 0x4fc0 + 0x4fc0: 0x0080, 0x4fc1: 0x0080, 0x4fc2: 0x0080, 0x4fc3: 0x0080, 0x4fc4: 0x0080, + 0x4fc6: 0x0080, 0x4fca: 0x0080, 0x4fcb: 0x0080, + 0x4fcc: 0x0080, 0x4fcd: 0x0080, 0x4fce: 0x0080, 0x4fcf: 0x0080, 0x4fd0: 0x0080, + 0x4fd2: 0x0080, 0x4fd3: 0x0080, 0x4fd4: 0x0080, 0x4fd5: 0x0080, 0x4fd6: 0x0080, 0x4fd7: 0x0080, + 0x4fd8: 0x0080, 0x4fd9: 0x0080, 0x4fda: 0x0080, 0x4fdb: 0x0080, 0x4fdc: 0x0080, 0x4fdd: 0x0080, + 0x4fde: 0x0080, 0x4fdf: 0x0080, 0x4fe0: 0x0080, 0x4fe1: 0x0080, 0x4fe2: 0x0080, 0x4fe3: 0x0080, + 0x4fe4: 0x0080, 0x4fe5: 0x0080, 0x4fe6: 0x0080, 0x4fe7: 0x0080, 0x4fe8: 0x0080, 0x4fe9: 0x0080, + 0x4fea: 0x0080, 0x4feb: 0x0080, 0x4fec: 0x0080, 0x4fed: 0x0080, 0x4fee: 0x0080, 0x4fef: 0x0080, + 0x4ff0: 0x0080, 0x4ff1: 0x0080, 0x4ff2: 0x0080, 0x4ff3: 0x0080, 0x4ff4: 0x0080, 0x4ff5: 0x0080, + 0x4ff6: 0x0080, 0x4ff7: 0x0080, 0x4ff8: 0x0080, 0x4ff9: 0x0080, 0x4ffa: 0x0080, 0x4ffb: 0x0080, + 0x4ffc: 0x0080, 0x4ffd: 0x0080, 0x4ffe: 0x0080, 0x4fff: 0x0080, + // Block 0x140, offset 0x5000 + 0x5000: 0x0080, 0x5001: 0x0080, 0x5002: 0x0080, 0x5003: 0x0080, 0x5004: 0x0080, 0x5005: 0x0080, + 0x5006: 0x0080, 0x5007: 0x0080, 0x5008: 0x0080, 0x5009: 0x0080, 0x500a: 0x0080, 0x500b: 0x0080, + 0x500c: 0x0080, 0x500d: 0x0080, 0x500e: 0x0080, 0x500f: 0x0080, 0x5010: 0x0080, 0x5011: 0x0080, + 0x5012: 0x0080, 0x5013: 0x0080, 0x5014: 0x0080, 0x5015: 0x0080, 0x5016: 0x0080, 0x5017: 0x0080, + 0x5018: 0x0080, 0x5019: 0x0080, 0x501a: 0x0080, 0x501b: 0x0080, 0x501c: 0x0080, 0x501d: 0x0080, + 0x501e: 0x0080, 0x501f: 0x0080, 0x5020: 0x0080, 0x5021: 0x0080, 0x5022: 0x0080, 0x5023: 0x0080, + 0x5024: 0x0080, 0x5025: 0x0080, 0x5028: 0x0080, 0x5029: 0x0080, + 0x502a: 0x0080, 0x502b: 0x0080, 0x502c: 0x0080, 0x502d: 0x0080, 0x502e: 0x0080, 0x502f: 0x0080, + 0x5030: 0x0080, 0x5031: 0x0080, 0x5032: 0x0080, 0x5033: 0x0080, 0x5034: 0x0080, 0x5035: 0x0080, + 0x5036: 0x0080, 0x5037: 0x0080, 0x5038: 0x0080, 0x5039: 0x0080, 0x503a: 0x0080, 0x503b: 0x0080, + 0x503c: 0x0080, 0x503d: 0x0080, 0x503e: 0x0080, 0x503f: 0x0080, + // Block 0x141, offset 0x5040 + 0x5040: 0x0080, 0x5041: 0x0080, 0x5042: 0x0080, 0x5043: 0x0080, 0x5044: 0x0080, 0x5045: 0x0080, + 0x5046: 0x0080, 0x5047: 0x0080, 0x5048: 0x0080, 0x5049: 0x0080, 0x504a: 0x0080, 0x504b: 0x0080, + 0x504e: 0x0080, 0x504f: 0x0080, 0x5050: 0x0080, 0x5051: 0x0080, + 0x5052: 0x0080, 0x5053: 0x0080, 0x5054: 0x0080, 0x5055: 0x0080, 0x5056: 0x0080, 0x5057: 0x0080, + 0x5058: 0x0080, 0x5059: 0x0080, 0x505a: 0x0080, 0x505b: 0x0080, 0x505c: 0x0080, 0x505d: 0x0080, + 0x505e: 0x0080, 0x505f: 0x0080, 0x5060: 0x0080, 0x5061: 0x0080, 0x5062: 0x0080, 0x5063: 0x0080, + 0x5064: 0x0080, 0x5065: 0x0080, 0x5066: 0x0080, 0x5067: 0x0080, 0x5068: 0x0080, 0x5069: 0x0080, + 0x506a: 0x0080, 0x506b: 0x0080, 0x506c: 0x0080, 0x506d: 0x0080, 0x506e: 0x0080, 0x506f: 0x0080, + 0x5070: 0x0080, 0x5071: 0x0080, 0x5072: 0x0080, 0x5073: 0x0080, 0x5074: 0x0080, 0x5075: 0x0080, + 0x5076: 0x0080, 0x5077: 0x0080, 0x5078: 0x0080, 0x5079: 0x0080, 0x507a: 0x0080, 0x507b: 0x0080, + 0x507c: 0x0080, 0x507d: 0x0080, 0x507e: 0x0080, 0x507f: 0x0080, + // Block 0x142, offset 0x5080 + 0x5080: 0x00c3, 0x5081: 0x00c3, 0x5082: 0x00c3, 0x5083: 0x00c3, 0x5084: 0x00c3, 0x5085: 0x00c3, + 0x5086: 0x00c3, 0x5087: 0x00c3, 0x5088: 0x00c3, 0x5089: 0x00c3, 0x508a: 0x00c3, 0x508b: 0x00c3, + 0x508c: 0x00c3, 0x508d: 0x00c3, 0x508e: 0x00c3, 0x508f: 0x00c3, 0x5090: 0x00c3, 0x5091: 0x00c3, + 0x5092: 0x00c3, 0x5093: 0x00c3, 0x5094: 0x00c3, 0x5095: 0x00c3, 0x5096: 0x00c3, 0x5097: 0x00c3, + 0x5098: 0x00c3, 0x5099: 0x00c3, 0x509a: 0x00c3, 0x509b: 0x00c3, 0x509c: 0x00c3, 0x509d: 0x00c3, + 0x509e: 0x00c3, 0x509f: 0x00c3, 0x50a0: 0x00c3, 0x50a1: 0x00c3, 0x50a2: 0x00c3, 0x50a3: 0x00c3, + 0x50a4: 0x00c3, 0x50a5: 0x00c3, 0x50a6: 0x00c3, 0x50a7: 0x00c3, 0x50a8: 0x00c3, 0x50a9: 0x00c3, + 0x50aa: 0x00c3, 0x50ab: 0x00c3, 0x50ac: 0x00c3, 0x50ad: 0x00c3, 0x50ae: 0x00c3, 0x50af: 0x00c3, + 0x50b0: 0x00c3, 0x50b1: 0x00c3, 0x50b2: 0x00c3, 0x50b3: 0x00c3, 0x50b4: 0x00c3, 0x50b5: 0x00c3, + 0x50b6: 0x00c3, 0x50b7: 0x0080, 0x50b8: 0x0080, 0x50b9: 0x0080, 0x50ba: 0x0080, 0x50bb: 0x00c3, + 0x50bc: 0x00c3, 0x50bd: 0x00c3, 0x50be: 0x00c3, 0x50bf: 0x00c3, + // Block 0x143, offset 0x50c0 + 0x50c0: 0x00c3, 0x50c1: 0x00c3, 0x50c2: 0x00c3, 0x50c3: 0x00c3, 0x50c4: 0x00c3, 0x50c5: 0x00c3, + 0x50c6: 0x00c3, 0x50c7: 0x00c3, 0x50c8: 0x00c3, 0x50c9: 0x00c3, 0x50ca: 0x00c3, 0x50cb: 0x00c3, + 0x50cc: 0x00c3, 0x50cd: 0x00c3, 0x50ce: 0x00c3, 0x50cf: 0x00c3, 0x50d0: 0x00c3, 0x50d1: 0x00c3, + 0x50d2: 0x00c3, 0x50d3: 0x00c3, 0x50d4: 0x00c3, 0x50d5: 0x00c3, 0x50d6: 0x00c3, 0x50d7: 0x00c3, + 0x50d8: 0x00c3, 0x50d9: 0x00c3, 0x50da: 0x00c3, 0x50db: 0x00c3, 0x50dc: 0x00c3, 0x50dd: 0x00c3, + 0x50de: 0x00c3, 0x50df: 0x00c3, 0x50e0: 0x00c3, 0x50e1: 0x00c3, 0x50e2: 0x00c3, 0x50e3: 0x00c3, + 0x50e4: 0x00c3, 0x50e5: 0x00c3, 0x50e6: 0x00c3, 0x50e7: 0x00c3, 0x50e8: 0x00c3, 0x50e9: 0x00c3, + 0x50ea: 0x00c3, 0x50eb: 0x00c3, 0x50ec: 0x00c3, 0x50ed: 0x0080, 0x50ee: 0x0080, 0x50ef: 0x0080, + 0x50f0: 0x0080, 0x50f1: 0x0080, 0x50f2: 0x0080, 0x50f3: 0x0080, 0x50f4: 0x0080, 0x50f5: 0x00c3, + 0x50f6: 0x0080, 0x50f7: 0x0080, 0x50f8: 0x0080, 0x50f9: 0x0080, 0x50fa: 0x0080, 0x50fb: 0x0080, + 0x50fc: 0x0080, 0x50fd: 0x0080, 0x50fe: 0x0080, 0x50ff: 0x0080, + // Block 0x144, offset 0x5100 + 0x5100: 0x0080, 0x5101: 0x0080, 0x5102: 0x0080, 0x5103: 0x0080, 0x5104: 0x00c3, 0x5105: 0x0080, + 0x5106: 0x0080, 0x5107: 0x0080, 0x5108: 0x0080, 0x5109: 0x0080, 0x510a: 0x0080, 0x510b: 0x0080, + 0x511b: 0x00c3, 0x511c: 0x00c3, 0x511d: 0x00c3, + 0x511e: 0x00c3, 0x511f: 0x00c3, 0x5121: 0x00c3, 0x5122: 0x00c3, 0x5123: 0x00c3, + 0x5124: 0x00c3, 0x5125: 0x00c3, 0x5126: 0x00c3, 0x5127: 0x00c3, 0x5128: 0x00c3, 0x5129: 0x00c3, + 0x512a: 0x00c3, 0x512b: 0x00c3, 0x512c: 0x00c3, 0x512d: 0x00c3, 0x512e: 0x00c3, 0x512f: 0x00c3, + // Block 0x145, offset 0x5140 + 0x5140: 0x00c0, 0x5141: 0x00c0, 0x5142: 0x00c0, 0x5143: 0x00c0, 0x5144: 0x00c0, 0x5145: 0x00c0, + 0x5146: 0x00c0, 0x5147: 0x00c0, 0x5148: 0x00c0, 0x5149: 0x00c0, 0x514a: 0x00c0, 0x514b: 0x00c0, + 0x514c: 0x00c0, 0x514d: 0x00c0, 0x514e: 0x00c0, 0x514f: 0x00c0, 0x5150: 0x00c0, 0x5151: 0x00c0, + 0x5152: 0x00c0, 0x5153: 0x00c0, 0x5154: 0x00c0, 0x5155: 0x00c0, 0x5156: 0x00c0, 0x5157: 0x00c0, + 0x5158: 0x00c0, 0x5159: 0x00c0, 0x515a: 0x00c0, 0x515b: 0x00c0, 0x515c: 0x00c0, 0x515d: 0x00c0, + 0x515e: 0x00c0, + 0x5165: 0x00c0, 0x5166: 0x00c0, 0x5167: 0x00c0, 0x5168: 0x00c0, 0x5169: 0x00c0, + 0x516a: 0x00c0, + // Block 0x146, offset 0x5180 + 0x5180: 0x00c3, 0x5181: 0x00c3, 0x5182: 0x00c3, 0x5183: 0x00c3, 0x5184: 0x00c3, 0x5185: 0x00c3, + 0x5186: 0x00c3, 0x5188: 0x00c3, 0x5189: 0x00c3, 0x518a: 0x00c3, 0x518b: 0x00c3, + 0x518c: 0x00c3, 0x518d: 0x00c3, 0x518e: 0x00c3, 0x518f: 0x00c3, 0x5190: 0x00c3, 0x5191: 0x00c3, + 0x5192: 0x00c3, 0x5193: 0x00c3, 0x5194: 0x00c3, 0x5195: 0x00c3, 0x5196: 0x00c3, 0x5197: 0x00c3, + 0x5198: 0x00c3, 0x519b: 0x00c3, 0x519c: 0x00c3, 0x519d: 0x00c3, + 0x519e: 0x00c3, 0x519f: 0x00c3, 0x51a0: 0x00c3, 0x51a1: 0x00c3, 0x51a3: 0x00c3, + 0x51a4: 0x00c3, 0x51a6: 0x00c3, 0x51a7: 0x00c3, 0x51a8: 0x00c3, 0x51a9: 0x00c3, + 0x51aa: 0x00c3, + 0x51b0: 0x0080, 0x51b1: 0x0080, 0x51b2: 0x0080, 0x51b3: 0x0080, 0x51b4: 0x0080, 0x51b5: 0x0080, + 0x51b6: 0x0080, 0x51b7: 0x0080, 0x51b8: 0x0080, 0x51b9: 0x0080, 0x51ba: 0x0080, 0x51bb: 0x0080, + 0x51bc: 0x0080, 0x51bd: 0x0080, 0x51be: 0x0080, 0x51bf: 0x0080, + // Block 0x147, offset 0x51c0 + 0x51c0: 0x0080, 0x51c1: 0x0080, 0x51c2: 0x0080, 0x51c3: 0x0080, 0x51c4: 0x0080, 0x51c5: 0x0080, + 0x51c6: 0x0080, 0x51c7: 0x0080, 0x51c8: 0x0080, 0x51c9: 0x0080, 0x51ca: 0x0080, 0x51cb: 0x0080, + 0x51cc: 0x0080, 0x51cd: 0x0080, 0x51ce: 0x0080, 0x51cf: 0x0080, 0x51d0: 0x0080, 0x51d1: 0x0080, + 0x51d2: 0x0080, 0x51d3: 0x0080, 0x51d4: 0x0080, 0x51d5: 0x0080, 0x51d6: 0x0080, 0x51d7: 0x0080, + 0x51d8: 0x0080, 0x51d9: 0x0080, 0x51da: 0x0080, 0x51db: 0x0080, 0x51dc: 0x0080, 0x51dd: 0x0080, + 0x51de: 0x0080, 0x51df: 0x0080, 0x51e0: 0x0080, 0x51e1: 0x0080, 0x51e2: 0x0080, 0x51e3: 0x0080, + 0x51e4: 0x0080, 0x51e5: 0x0080, 0x51e6: 0x0080, 0x51e7: 0x0080, 0x51e8: 0x0080, 0x51e9: 0x0080, + 0x51ea: 0x0080, 0x51eb: 0x0080, 0x51ec: 0x0080, 0x51ed: 0x0080, + // Block 0x148, offset 0x5200 + 0x520f: 0x00c3, + // Block 0x149, offset 0x5240 + 0x5240: 0x00c0, 0x5241: 0x00c0, 0x5242: 0x00c0, 0x5243: 0x00c0, 0x5244: 0x00c0, 0x5245: 0x00c0, + 0x5246: 0x00c0, 0x5247: 0x00c0, 0x5248: 0x00c0, 0x5249: 0x00c0, 0x524a: 0x00c0, 0x524b: 0x00c0, + 0x524c: 0x00c0, 0x524d: 0x00c0, 0x524e: 0x00c0, 0x524f: 0x00c0, 0x5250: 0x00c0, 0x5251: 0x00c0, + 0x5252: 0x00c0, 0x5253: 0x00c0, 0x5254: 0x00c0, 0x5255: 0x00c0, 0x5256: 0x00c0, 0x5257: 0x00c0, + 0x5258: 0x00c0, 0x5259: 0x00c0, 0x525a: 0x00c0, 0x525b: 0x00c0, 0x525c: 0x00c0, 0x525d: 0x00c0, + 0x525e: 0x00c0, 0x525f: 0x00c0, 0x5260: 0x00c0, 0x5261: 0x00c0, 0x5262: 0x00c0, 0x5263: 0x00c0, + 0x5264: 0x00c0, 0x5265: 0x00c0, 0x5266: 0x00c0, 0x5267: 0x00c0, 0x5268: 0x00c0, 0x5269: 0x00c0, + 0x526a: 0x00c0, 0x526b: 0x00c0, 0x526c: 0x00c0, + 0x5270: 0x00c3, 0x5271: 0x00c3, 0x5272: 0x00c3, 0x5273: 0x00c3, 0x5274: 0x00c3, 0x5275: 0x00c3, + 0x5276: 0x00c3, 0x5277: 0x00c0, 0x5278: 0x00c0, 0x5279: 0x00c0, 0x527a: 0x00c0, 0x527b: 0x00c0, + 0x527c: 0x00c0, 0x527d: 0x00c0, + // Block 0x14a, offset 0x5280 + 0x5280: 0x00c0, 0x5281: 0x00c0, 0x5282: 0x00c0, 0x5283: 0x00c0, 0x5284: 0x00c0, 0x5285: 0x00c0, + 0x5286: 0x00c0, 0x5287: 0x00c0, 0x5288: 0x00c0, 0x5289: 0x00c0, + 0x528e: 0x00c0, 0x528f: 0x0080, + // Block 0x14b, offset 0x52c0 + 0x52d0: 0x00c0, 0x52d1: 0x00c0, + 0x52d2: 0x00c0, 0x52d3: 0x00c0, 0x52d4: 0x00c0, 0x52d5: 0x00c0, 0x52d6: 0x00c0, 0x52d7: 0x00c0, + 0x52d8: 0x00c0, 0x52d9: 0x00c0, 0x52da: 0x00c0, 0x52db: 0x00c0, 0x52dc: 0x00c0, 0x52dd: 0x00c0, + 0x52de: 0x00c0, 0x52df: 0x00c0, 0x52e0: 0x00c0, 0x52e1: 0x00c0, 0x52e2: 0x00c0, 0x52e3: 0x00c0, + 0x52e4: 0x00c0, 0x52e5: 0x00c0, 0x52e6: 0x00c0, 0x52e7: 0x00c0, 0x52e8: 0x00c0, 0x52e9: 0x00c0, + 0x52ea: 0x00c0, 0x52eb: 0x00c0, 0x52ec: 0x00c0, 0x52ed: 0x00c0, 0x52ee: 0x00c3, + // Block 0x14c, offset 0x5300 + 0x5300: 0x00c0, 0x5301: 0x00c0, 0x5302: 0x00c0, 0x5303: 0x00c0, 0x5304: 0x00c0, 0x5305: 0x00c0, + 0x5306: 0x00c0, 0x5307: 0x00c0, 0x5308: 0x00c0, 0x5309: 0x00c0, 0x530a: 0x00c0, 0x530b: 0x00c0, + 0x530c: 0x00c0, 0x530d: 0x00c0, 0x530e: 0x00c0, 0x530f: 0x00c0, 0x5310: 0x00c0, 0x5311: 0x00c0, + 0x5312: 0x00c0, 0x5313: 0x00c0, 0x5314: 0x00c0, 0x5315: 0x00c0, 0x5316: 0x00c0, 0x5317: 0x00c0, + 0x5318: 0x00c0, 0x5319: 0x00c0, 0x531a: 0x00c0, 0x531b: 0x00c0, 0x531c: 0x00c0, 0x531d: 0x00c0, + 0x531e: 0x00c0, 0x531f: 0x00c0, 0x5320: 0x00c0, 0x5321: 0x00c0, 0x5322: 0x00c0, 0x5323: 0x00c0, + 0x5324: 0x00c0, 0x5325: 0x00c0, 0x5326: 0x00c0, 0x5327: 0x00c0, 0x5328: 0x00c0, 0x5329: 0x00c0, + 0x532a: 0x00c0, 0x532b: 0x00c0, 0x532c: 0x00c3, 0x532d: 0x00c3, 0x532e: 0x00c3, 0x532f: 0x00c3, + 0x5330: 0x00c0, 0x5331: 0x00c0, 0x5332: 0x00c0, 0x5333: 0x00c0, 0x5334: 0x00c0, 0x5335: 0x00c0, + 0x5336: 0x00c0, 0x5337: 0x00c0, 0x5338: 0x00c0, 0x5339: 0x00c0, + 0x533f: 0x0080, + // Block 0x14d, offset 0x5340 + 0x5350: 0x00c0, 0x5351: 0x00c0, + 0x5352: 0x00c0, 0x5353: 0x00c0, 0x5354: 0x00c0, 0x5355: 0x00c0, 0x5356: 0x00c0, 0x5357: 0x00c0, + 0x5358: 0x00c0, 0x5359: 0x00c0, 0x535a: 0x00c0, 0x535b: 0x00c0, 0x535c: 0x00c0, 0x535d: 0x00c0, + 0x535e: 0x00c0, 0x535f: 0x00c0, 0x5360: 0x00c0, 0x5361: 0x00c0, 0x5362: 0x00c0, 0x5363: 0x00c0, + 0x5364: 0x00c0, 0x5365: 0x00c0, 0x5366: 0x00c0, 0x5367: 0x00c0, 0x5368: 0x00c0, 0x5369: 0x00c0, + 0x536a: 0x00c0, 0x536b: 0x00c0, 0x536c: 0x00c3, 0x536d: 0x00c3, 0x536e: 0x00c3, 0x536f: 0x00c3, + 0x5370: 0x00c0, 0x5371: 0x00c0, 0x5372: 0x00c0, 0x5373: 0x00c0, 0x5374: 0x00c0, 0x5375: 0x00c0, + 0x5376: 0x00c0, 0x5377: 0x00c0, 0x5378: 0x00c0, 0x5379: 0x00c0, + // Block 0x14e, offset 0x5380 + 0x53a0: 0x00c0, 0x53a1: 0x00c0, 0x53a2: 0x00c0, 0x53a3: 0x00c0, + 0x53a4: 0x00c0, 0x53a5: 0x00c0, 0x53a6: 0x00c0, 0x53a8: 0x00c0, 0x53a9: 0x00c0, + 0x53aa: 0x00c0, 0x53ab: 0x00c0, 0x53ad: 0x00c0, 0x53ae: 0x00c0, + 0x53b0: 0x00c0, 0x53b1: 0x00c0, 0x53b2: 0x00c0, 0x53b3: 0x00c0, 0x53b4: 0x00c0, 0x53b5: 0x00c0, + 0x53b6: 0x00c0, 0x53b7: 0x00c0, 0x53b8: 0x00c0, 0x53b9: 0x00c0, 0x53ba: 0x00c0, 0x53bb: 0x00c0, + 0x53bc: 0x00c0, 0x53bd: 0x00c0, 0x53be: 0x00c0, + // Block 0x14f, offset 0x53c0 + 0x53c0: 0x00c0, 0x53c1: 0x00c0, 0x53c2: 0x00c0, 0x53c3: 0x00c0, 0x53c4: 0x00c0, + 0x53c7: 0x0080, 0x53c8: 0x0080, 0x53c9: 0x0080, 0x53ca: 0x0080, 0x53cb: 0x0080, + 0x53cc: 0x0080, 0x53cd: 0x0080, 0x53ce: 0x0080, 0x53cf: 0x0080, 0x53d0: 0x00c3, 0x53d1: 0x00c3, + 0x53d2: 0x00c3, 0x53d3: 0x00c3, 0x53d4: 0x00c3, 0x53d5: 0x00c3, 0x53d6: 0x00c3, + // Block 0x150, offset 0x5400 + 0x5400: 0x00c2, 0x5401: 0x00c2, 0x5402: 0x00c2, 0x5403: 0x00c2, 0x5404: 0x00c2, 0x5405: 0x00c2, + 0x5406: 0x00c2, 0x5407: 0x00c2, 0x5408: 0x00c2, 0x5409: 0x00c2, 0x540a: 0x00c2, 0x540b: 0x00c2, + 0x540c: 0x00c2, 0x540d: 0x00c2, 0x540e: 0x00c2, 0x540f: 0x00c2, 0x5410: 0x00c2, 0x5411: 0x00c2, + 0x5412: 0x00c2, 0x5413: 0x00c2, 0x5414: 0x00c2, 0x5415: 0x00c2, 0x5416: 0x00c2, 0x5417: 0x00c2, + 0x5418: 0x00c2, 0x5419: 0x00c2, 0x541a: 0x00c2, 0x541b: 0x00c2, 0x541c: 0x00c2, 0x541d: 0x00c2, + 0x541e: 0x00c2, 0x541f: 0x00c2, 0x5420: 0x00c2, 0x5421: 0x00c2, 0x5422: 0x00c2, 0x5423: 0x00c2, + 0x5424: 0x00c2, 0x5425: 0x00c2, 0x5426: 0x00c2, 0x5427: 0x00c2, 0x5428: 0x00c2, 0x5429: 0x00c2, + 0x542a: 0x00c2, 0x542b: 0x00c2, 0x542c: 0x00c2, 0x542d: 0x00c2, 0x542e: 0x00c2, 0x542f: 0x00c2, + 0x5430: 0x00c2, 0x5431: 0x00c2, 0x5432: 0x00c2, 0x5433: 0x00c2, 0x5434: 0x00c2, 0x5435: 0x00c2, + 0x5436: 0x00c2, 0x5437: 0x00c2, 0x5438: 0x00c2, 0x5439: 0x00c2, 0x543a: 0x00c2, 0x543b: 0x00c2, + 0x543c: 0x00c2, 0x543d: 0x00c2, 0x543e: 0x00c2, 0x543f: 0x00c2, + // Block 0x151, offset 0x5440 + 0x5440: 0x00c2, 0x5441: 0x00c2, 0x5442: 0x00c2, 0x5443: 0x00c2, 0x5444: 0x00c3, 0x5445: 0x00c3, + 0x5446: 0x00c3, 0x5447: 0x00c3, 0x5448: 0x00c3, 0x5449: 0x00c3, 0x544a: 0x00c3, 0x544b: 0x00c3, + 0x5450: 0x00c0, 0x5451: 0x00c0, + 0x5452: 0x00c0, 0x5453: 0x00c0, 0x5454: 0x00c0, 0x5455: 0x00c0, 0x5456: 0x00c0, 0x5457: 0x00c0, + 0x5458: 0x00c0, 0x5459: 0x00c0, + 0x545e: 0x0080, 0x545f: 0x0080, + // Block 0x152, offset 0x5480 + 0x54b1: 0x0080, 0x54b2: 0x0080, 0x54b3: 0x0080, 0x54b4: 0x0080, 0x54b5: 0x0080, + 0x54b6: 0x0080, 0x54b7: 0x0080, 0x54b8: 0x0080, 0x54b9: 0x0080, 0x54ba: 0x0080, 0x54bb: 0x0080, + 0x54bc: 0x0080, 0x54bd: 0x0080, 0x54be: 0x0080, 0x54bf: 0x0080, + // Block 0x153, offset 0x54c0 + 0x54c0: 0x0080, 0x54c1: 0x0080, 0x54c2: 0x0080, 0x54c3: 0x0080, 0x54c4: 0x0080, 0x54c5: 0x0080, + 0x54c6: 0x0080, 0x54c7: 0x0080, 0x54c8: 0x0080, 0x54c9: 0x0080, 0x54ca: 0x0080, 0x54cb: 0x0080, + 0x54cc: 0x0080, 0x54cd: 0x0080, 0x54ce: 0x0080, 0x54cf: 0x0080, 0x54d0: 0x0080, 0x54d1: 0x0080, + 0x54d2: 0x0080, 0x54d3: 0x0080, 0x54d4: 0x0080, 0x54d5: 0x0080, 0x54d6: 0x0080, 0x54d7: 0x0080, + 0x54d8: 0x0080, 0x54d9: 0x0080, 0x54da: 0x0080, 0x54db: 0x0080, 0x54dc: 0x0080, 0x54dd: 0x0080, + 0x54de: 0x0080, 0x54df: 0x0080, 0x54e0: 0x0080, 0x54e1: 0x0080, 0x54e2: 0x0080, 0x54e3: 0x0080, + 0x54e4: 0x0080, 0x54e5: 0x0080, 0x54e6: 0x0080, 0x54e7: 0x0080, 0x54e8: 0x0080, 0x54e9: 0x0080, + 0x54ea: 0x0080, 0x54eb: 0x0080, 0x54ec: 0x0080, 0x54ed: 0x0080, 0x54ee: 0x0080, 0x54ef: 0x0080, + 0x54f0: 0x0080, 0x54f1: 0x0080, 0x54f2: 0x0080, 0x54f3: 0x0080, 0x54f4: 0x0080, + // Block 0x154, offset 0x5500 + 0x5501: 0x0080, 0x5502: 0x0080, 0x5503: 0x0080, 0x5504: 0x0080, 0x5505: 0x0080, + 0x5506: 0x0080, 0x5507: 0x0080, 0x5508: 0x0080, 0x5509: 0x0080, 0x550a: 0x0080, 0x550b: 0x0080, + 0x550c: 0x0080, 0x550d: 0x0080, 0x550e: 0x0080, 0x550f: 0x0080, 0x5510: 0x0080, 0x5511: 0x0080, + 0x5512: 0x0080, 0x5513: 0x0080, 0x5514: 0x0080, 0x5515: 0x0080, 0x5516: 0x0080, 0x5517: 0x0080, + 0x5518: 0x0080, 0x5519: 0x0080, 0x551a: 0x0080, 0x551b: 0x0080, 0x551c: 0x0080, 0x551d: 0x0080, + 0x551e: 0x0080, 0x551f: 0x0080, 0x5520: 0x0080, 0x5521: 0x0080, 0x5522: 0x0080, 0x5523: 0x0080, + 0x5524: 0x0080, 0x5525: 0x0080, 0x5526: 0x0080, 0x5527: 0x0080, 0x5528: 0x0080, 0x5529: 0x0080, + 0x552a: 0x0080, 0x552b: 0x0080, 0x552c: 0x0080, 0x552d: 0x0080, 0x552e: 0x0080, 0x552f: 0x0080, + 0x5530: 0x0080, 0x5531: 0x0080, 0x5532: 0x0080, 0x5533: 0x0080, 0x5534: 0x0080, 0x5535: 0x0080, + 0x5536: 0x0080, 0x5537: 0x0080, 0x5538: 0x0080, 0x5539: 0x0080, 0x553a: 0x0080, 0x553b: 0x0080, + 0x553c: 0x0080, 0x553d: 0x0080, + // Block 0x155, offset 0x5540 + 0x5540: 0x0080, 0x5541: 0x0080, 0x5542: 0x0080, 0x5543: 0x0080, 0x5545: 0x0080, + 0x5546: 0x0080, 0x5547: 0x0080, 0x5548: 0x0080, 0x5549: 0x0080, 0x554a: 0x0080, 0x554b: 0x0080, + 0x554c: 0x0080, 0x554d: 0x0080, 0x554e: 0x0080, 0x554f: 0x0080, 0x5550: 0x0080, 0x5551: 0x0080, + 0x5552: 0x0080, 0x5553: 0x0080, 0x5554: 0x0080, 0x5555: 0x0080, 0x5556: 0x0080, 0x5557: 0x0080, + 0x5558: 0x0080, 0x5559: 0x0080, 0x555a: 0x0080, 0x555b: 0x0080, 0x555c: 0x0080, 0x555d: 0x0080, + 0x555e: 0x0080, 0x555f: 0x0080, 0x5561: 0x0080, 0x5562: 0x0080, + 0x5564: 0x0080, 0x5567: 0x0080, 0x5569: 0x0080, + 0x556a: 0x0080, 0x556b: 0x0080, 0x556c: 0x0080, 0x556d: 0x0080, 0x556e: 0x0080, 0x556f: 0x0080, + 0x5570: 0x0080, 0x5571: 0x0080, 0x5572: 0x0080, 0x5574: 0x0080, 0x5575: 0x0080, + 0x5576: 0x0080, 0x5577: 0x0080, 0x5579: 0x0080, 0x557b: 0x0080, + // Block 0x156, offset 0x5580 + 0x5582: 0x0080, + 0x5587: 0x0080, 0x5589: 0x0080, 0x558b: 0x0080, + 0x558d: 0x0080, 0x558e: 0x0080, 0x558f: 0x0080, 0x5591: 0x0080, + 0x5592: 0x0080, 0x5594: 0x0080, 0x5597: 0x0080, + 0x5599: 0x0080, 0x559b: 0x0080, 0x559d: 0x0080, + 0x559f: 0x0080, 0x55a1: 0x0080, 0x55a2: 0x0080, + 0x55a4: 0x0080, 0x55a7: 0x0080, 0x55a8: 0x0080, 0x55a9: 0x0080, + 0x55aa: 0x0080, 0x55ac: 0x0080, 0x55ad: 0x0080, 0x55ae: 0x0080, 0x55af: 0x0080, + 0x55b0: 0x0080, 0x55b1: 0x0080, 0x55b2: 0x0080, 0x55b4: 0x0080, 0x55b5: 0x0080, + 0x55b6: 0x0080, 0x55b7: 0x0080, 0x55b9: 0x0080, 0x55ba: 0x0080, 0x55bb: 0x0080, + 0x55bc: 0x0080, 0x55be: 0x0080, + // Block 0x157, offset 0x55c0 + 0x55c0: 0x0080, 0x55c1: 0x0080, 0x55c2: 0x0080, 0x55c3: 0x0080, 0x55c4: 0x0080, 0x55c5: 0x0080, + 0x55c6: 0x0080, 0x55c7: 0x0080, 0x55c8: 0x0080, 0x55c9: 0x0080, 0x55cb: 0x0080, + 0x55cc: 0x0080, 0x55cd: 0x0080, 0x55ce: 0x0080, 0x55cf: 0x0080, 0x55d0: 0x0080, 0x55d1: 0x0080, + 0x55d2: 0x0080, 0x55d3: 0x0080, 0x55d4: 0x0080, 0x55d5: 0x0080, 0x55d6: 0x0080, 0x55d7: 0x0080, + 0x55d8: 0x0080, 0x55d9: 0x0080, 0x55da: 0x0080, 0x55db: 0x0080, + 0x55e1: 0x0080, 0x55e2: 0x0080, 0x55e3: 0x0080, + 0x55e5: 0x0080, 0x55e6: 0x0080, 0x55e7: 0x0080, 0x55e8: 0x0080, 0x55e9: 0x0080, + 0x55eb: 0x0080, 0x55ec: 0x0080, 0x55ed: 0x0080, 0x55ee: 0x0080, 0x55ef: 0x0080, + 0x55f0: 0x0080, 0x55f1: 0x0080, 0x55f2: 0x0080, 0x55f3: 0x0080, 0x55f4: 0x0080, 0x55f5: 0x0080, + 0x55f6: 0x0080, 0x55f7: 0x0080, 0x55f8: 0x0080, 0x55f9: 0x0080, 0x55fa: 0x0080, 0x55fb: 0x0080, + // Block 0x158, offset 0x5600 + 0x5630: 0x0080, 0x5631: 0x0080, + // Block 0x159, offset 0x5640 + 0x5640: 0x0080, 0x5641: 0x0080, 0x5642: 0x0080, 0x5643: 0x0080, 0x5644: 0x0080, 0x5645: 0x0080, + 0x5646: 0x0080, 0x5647: 0x0080, 0x5648: 0x0080, 0x5649: 0x0080, 0x564a: 0x0080, 0x564b: 0x0080, + 0x564c: 0x0080, 0x564d: 0x0080, 0x564e: 0x0080, 0x564f: 0x0080, 0x5650: 0x0080, 0x5651: 0x0080, + 0x5652: 0x0080, 0x5653: 0x0080, 0x5654: 0x0080, 0x5655: 0x0080, 0x5656: 0x0080, 0x5657: 0x0080, + 0x5658: 0x0080, 0x5659: 0x0080, 0x565a: 0x0080, 0x565b: 0x0080, 0x565c: 0x0080, 0x565d: 0x0080, + 0x565e: 0x0080, 0x565f: 0x0080, 0x5660: 0x0080, 0x5661: 0x0080, 0x5662: 0x0080, 0x5663: 0x0080, + 0x5664: 0x0080, 0x5665: 0x0080, 0x5666: 0x0080, 0x5667: 0x0080, 0x5668: 0x0080, 0x5669: 0x0080, + 0x566a: 0x0080, 0x566b: 0x0080, + 0x5670: 0x0080, 0x5671: 0x0080, 0x5672: 0x0080, 0x5673: 0x0080, 0x5674: 0x0080, 0x5675: 0x0080, + 0x5676: 0x0080, 0x5677: 0x0080, 0x5678: 0x0080, 0x5679: 0x0080, 0x567a: 0x0080, 0x567b: 0x0080, + 0x567c: 0x0080, 0x567d: 0x0080, 0x567e: 0x0080, 0x567f: 0x0080, + // Block 0x15a, offset 0x5680 + 0x5680: 0x0080, 0x5681: 0x0080, 0x5682: 0x0080, 0x5683: 0x0080, 0x5684: 0x0080, 0x5685: 0x0080, + 0x5686: 0x0080, 0x5687: 0x0080, 0x5688: 0x0080, 0x5689: 0x0080, 0x568a: 0x0080, 0x568b: 0x0080, + 0x568c: 0x0080, 0x568d: 0x0080, 0x568e: 0x0080, 0x568f: 0x0080, 0x5690: 0x0080, 0x5691: 0x0080, + 0x5692: 0x0080, 0x5693: 0x0080, + 0x56a0: 0x0080, 0x56a1: 0x0080, 0x56a2: 0x0080, 0x56a3: 0x0080, + 0x56a4: 0x0080, 0x56a5: 0x0080, 0x56a6: 0x0080, 0x56a7: 0x0080, 0x56a8: 0x0080, 0x56a9: 0x0080, + 0x56aa: 0x0080, 0x56ab: 0x0080, 0x56ac: 0x0080, 0x56ad: 0x0080, 0x56ae: 0x0080, + 0x56b1: 0x0080, 0x56b2: 0x0080, 0x56b3: 0x0080, 0x56b4: 0x0080, 0x56b5: 0x0080, + 0x56b6: 0x0080, 0x56b7: 0x0080, 0x56b8: 0x0080, 0x56b9: 0x0080, 0x56ba: 0x0080, 0x56bb: 0x0080, + 0x56bc: 0x0080, 0x56bd: 0x0080, 0x56be: 0x0080, 0x56bf: 0x0080, + // Block 0x15b, offset 0x56c0 + 0x56c1: 0x0080, 0x56c2: 0x0080, 0x56c3: 0x0080, 0x56c4: 0x0080, 0x56c5: 0x0080, + 0x56c6: 0x0080, 0x56c7: 0x0080, 0x56c8: 0x0080, 0x56c9: 0x0080, 0x56ca: 0x0080, 0x56cb: 0x0080, + 0x56cc: 0x0080, 0x56cd: 0x0080, 0x56ce: 0x0080, 0x56cf: 0x0080, 0x56d1: 0x0080, + 0x56d2: 0x0080, 0x56d3: 0x0080, 0x56d4: 0x0080, 0x56d5: 0x0080, 0x56d6: 0x0080, 0x56d7: 0x0080, + 0x56d8: 0x0080, 0x56d9: 0x0080, 0x56da: 0x0080, 0x56db: 0x0080, 0x56dc: 0x0080, 0x56dd: 0x0080, + 0x56de: 0x0080, 0x56df: 0x0080, 0x56e0: 0x0080, 0x56e1: 0x0080, 0x56e2: 0x0080, 0x56e3: 0x0080, + 0x56e4: 0x0080, 0x56e5: 0x0080, 0x56e6: 0x0080, 0x56e7: 0x0080, 0x56e8: 0x0080, 0x56e9: 0x0080, + 0x56ea: 0x0080, 0x56eb: 0x0080, 0x56ec: 0x0080, 0x56ed: 0x0080, 0x56ee: 0x0080, 0x56ef: 0x0080, + 0x56f0: 0x0080, 0x56f1: 0x0080, 0x56f2: 0x0080, 0x56f3: 0x0080, 0x56f4: 0x0080, 0x56f5: 0x0080, + // Block 0x15c, offset 0x5700 + 0x5726: 0x0080, 0x5727: 0x0080, 0x5728: 0x0080, 0x5729: 0x0080, + 0x572a: 0x0080, 0x572b: 0x0080, 0x572c: 0x0080, 0x572d: 0x0080, 0x572e: 0x0080, 0x572f: 0x0080, + 0x5730: 0x0080, 0x5731: 0x0080, 0x5732: 0x0080, 0x5733: 0x0080, 0x5734: 0x0080, 0x5735: 0x0080, + 0x5736: 0x0080, 0x5737: 0x0080, 0x5738: 0x0080, 0x5739: 0x0080, 0x573a: 0x0080, 0x573b: 0x0080, + 0x573c: 0x0080, 0x573d: 0x0080, 0x573e: 0x0080, 0x573f: 0x0080, + // Block 0x15d, offset 0x5740 + 0x5740: 0x008c, 0x5741: 0x0080, 0x5742: 0x0080, + 0x5750: 0x0080, 0x5751: 0x0080, + 0x5752: 0x0080, 0x5753: 0x0080, 0x5754: 0x0080, 0x5755: 0x0080, 0x5756: 0x0080, 0x5757: 0x0080, + 0x5758: 0x0080, 0x5759: 0x0080, 0x575a: 0x0080, 0x575b: 0x0080, 0x575c: 0x0080, 0x575d: 0x0080, + 0x575e: 0x0080, 0x575f: 0x0080, 0x5760: 0x0080, 0x5761: 0x0080, 0x5762: 0x0080, 0x5763: 0x0080, + 0x5764: 0x0080, 0x5765: 0x0080, 0x5766: 0x0080, 0x5767: 0x0080, 0x5768: 0x0080, 0x5769: 0x0080, + 0x576a: 0x0080, 0x576b: 0x0080, 0x576c: 0x0080, 0x576d: 0x0080, 0x576e: 0x0080, 0x576f: 0x0080, + 0x5770: 0x0080, 0x5771: 0x0080, 0x5772: 0x0080, 0x5773: 0x0080, 0x5774: 0x0080, 0x5775: 0x0080, + 0x5776: 0x0080, 0x5777: 0x0080, 0x5778: 0x0080, 0x5779: 0x0080, 0x577a: 0x0080, 0x577b: 0x0080, + // Block 0x15e, offset 0x5780 + 0x5780: 0x0080, 0x5781: 0x0080, 0x5782: 0x0080, 0x5783: 0x0080, 0x5784: 0x0080, 0x5785: 0x0080, + 0x5786: 0x0080, 0x5787: 0x0080, 0x5788: 0x0080, + 0x5790: 0x0080, 0x5791: 0x0080, + 0x57a0: 0x0080, 0x57a1: 0x0080, 0x57a2: 0x0080, 0x57a3: 0x0080, + 0x57a4: 0x0080, 0x57a5: 0x0080, + // Block 0x15f, offset 0x57c0 + 0x57c0: 0x0080, 0x57c1: 0x0080, 0x57c2: 0x0080, 0x57c3: 0x0080, 0x57c4: 0x0080, 0x57c5: 0x0080, + 0x57c6: 0x0080, 0x57c7: 0x0080, 0x57c8: 0x0080, 0x57c9: 0x0080, 0x57ca: 0x0080, 0x57cb: 0x0080, + 0x57cc: 0x0080, 0x57cd: 0x0080, 0x57ce: 0x0080, 0x57cf: 0x0080, 0x57d0: 0x0080, 0x57d1: 0x0080, + 0x57d2: 0x0080, 0x57d3: 0x0080, 0x57d4: 0x0080, 0x57d5: 0x0080, 0x57d6: 0x0080, 0x57d7: 0x0080, + 0x57dc: 0x0080, 0x57dd: 0x0080, + 0x57de: 0x0080, 0x57df: 0x0080, 0x57e0: 0x0080, 0x57e1: 0x0080, 0x57e2: 0x0080, 0x57e3: 0x0080, + 0x57e4: 0x0080, 0x57e5: 0x0080, 0x57e6: 0x0080, 0x57e7: 0x0080, 0x57e8: 0x0080, 0x57e9: 0x0080, + 0x57ea: 0x0080, 0x57eb: 0x0080, 0x57ec: 0x0080, + 0x57f0: 0x0080, 0x57f1: 0x0080, 0x57f2: 0x0080, 0x57f3: 0x0080, 0x57f4: 0x0080, 0x57f5: 0x0080, + 0x57f6: 0x0080, 0x57f7: 0x0080, 0x57f8: 0x0080, 0x57f9: 0x0080, 0x57fa: 0x0080, 0x57fb: 0x0080, + 0x57fc: 0x0080, + // Block 0x160, offset 0x5800 + 0x5800: 0x0080, 0x5801: 0x0080, 0x5802: 0x0080, 0x5803: 0x0080, 0x5804: 0x0080, 0x5805: 0x0080, + 0x5806: 0x0080, 0x5807: 0x0080, 0x5808: 0x0080, 0x5809: 0x0080, 0x580a: 0x0080, 0x580b: 0x0080, + 0x580c: 0x0080, 0x580d: 0x0080, 0x580e: 0x0080, 0x580f: 0x0080, 0x5810: 0x0080, 0x5811: 0x0080, + 0x5812: 0x0080, 0x5813: 0x0080, 0x5814: 0x0080, 0x5815: 0x0080, 0x5816: 0x0080, 0x5817: 0x0080, + 0x5818: 0x0080, 0x5819: 0x0080, 0x581a: 0x0080, 0x581b: 0x0080, 0x581c: 0x0080, 0x581d: 0x0080, + 0x581e: 0x0080, 0x581f: 0x0080, 0x5820: 0x0080, 0x5821: 0x0080, 0x5822: 0x0080, 0x5823: 0x0080, + 0x5824: 0x0080, 0x5825: 0x0080, 0x5826: 0x0080, 0x5827: 0x0080, 0x5828: 0x0080, 0x5829: 0x0080, + 0x582a: 0x0080, 0x582b: 0x0080, 0x582c: 0x0080, 0x582d: 0x0080, 0x582e: 0x0080, 0x582f: 0x0080, + 0x5830: 0x0080, 0x5831: 0x0080, 0x5832: 0x0080, 0x5833: 0x0080, 0x5834: 0x0080, 0x5835: 0x0080, + 0x5836: 0x0080, 0x583b: 0x0080, + 0x583c: 0x0080, 0x583d: 0x0080, 0x583e: 0x0080, 0x583f: 0x0080, + // Block 0x161, offset 0x5840 + 0x5840: 0x0080, 0x5841: 0x0080, 0x5842: 0x0080, 0x5843: 0x0080, 0x5844: 0x0080, 0x5845: 0x0080, + 0x5846: 0x0080, 0x5847: 0x0080, 0x5848: 0x0080, 0x5849: 0x0080, 0x584a: 0x0080, 0x584b: 0x0080, + 0x584c: 0x0080, 0x584d: 0x0080, 0x584e: 0x0080, 0x584f: 0x0080, 0x5850: 0x0080, 0x5851: 0x0080, + 0x5852: 0x0080, 0x5853: 0x0080, 0x5854: 0x0080, 0x5855: 0x0080, 0x5856: 0x0080, 0x5857: 0x0080, + 0x5858: 0x0080, 0x5859: 0x0080, + 0x5860: 0x0080, 0x5861: 0x0080, 0x5862: 0x0080, 0x5863: 0x0080, + 0x5864: 0x0080, 0x5865: 0x0080, 0x5866: 0x0080, 0x5867: 0x0080, 0x5868: 0x0080, 0x5869: 0x0080, + 0x586a: 0x0080, 0x586b: 0x0080, + 0x5870: 0x0080, + // Block 0x162, offset 0x5880 + 0x5880: 0x0080, 0x5881: 0x0080, 0x5882: 0x0080, 0x5883: 0x0080, 0x5884: 0x0080, 0x5885: 0x0080, + 0x5886: 0x0080, 0x5887: 0x0080, 0x5888: 0x0080, 0x5889: 0x0080, 0x588a: 0x0080, 0x588b: 0x0080, + 0x5890: 0x0080, 0x5891: 0x0080, + 0x5892: 0x0080, 0x5893: 0x0080, 0x5894: 0x0080, 0x5895: 0x0080, 0x5896: 0x0080, 0x5897: 0x0080, + 0x5898: 0x0080, 0x5899: 0x0080, 0x589a: 0x0080, 0x589b: 0x0080, 0x589c: 0x0080, 0x589d: 0x0080, + 0x589e: 0x0080, 0x589f: 0x0080, 0x58a0: 0x0080, 0x58a1: 0x0080, 0x58a2: 0x0080, 0x58a3: 0x0080, + 0x58a4: 0x0080, 0x58a5: 0x0080, 0x58a6: 0x0080, 0x58a7: 0x0080, 0x58a8: 0x0080, 0x58a9: 0x0080, + 0x58aa: 0x0080, 0x58ab: 0x0080, 0x58ac: 0x0080, 0x58ad: 0x0080, 0x58ae: 0x0080, 0x58af: 0x0080, + 0x58b0: 0x0080, 0x58b1: 0x0080, 0x58b2: 0x0080, 0x58b3: 0x0080, 0x58b4: 0x0080, 0x58b5: 0x0080, + 0x58b6: 0x0080, 0x58b7: 0x0080, 0x58b8: 0x0080, 0x58b9: 0x0080, 0x58ba: 0x0080, 0x58bb: 0x0080, + 0x58bc: 0x0080, 0x58bd: 0x0080, 0x58be: 0x0080, 0x58bf: 0x0080, + // Block 0x163, offset 0x58c0 + 0x58c0: 0x0080, 0x58c1: 0x0080, 0x58c2: 0x0080, 0x58c3: 0x0080, 0x58c4: 0x0080, 0x58c5: 0x0080, + 0x58c6: 0x0080, 0x58c7: 0x0080, + 0x58d0: 0x0080, 0x58d1: 0x0080, + 0x58d2: 0x0080, 0x58d3: 0x0080, 0x58d4: 0x0080, 0x58d5: 0x0080, 0x58d6: 0x0080, 0x58d7: 0x0080, + 0x58d8: 0x0080, 0x58d9: 0x0080, + 0x58e0: 0x0080, 0x58e1: 0x0080, 0x58e2: 0x0080, 0x58e3: 0x0080, + 0x58e4: 0x0080, 0x58e5: 0x0080, 0x58e6: 0x0080, 0x58e7: 0x0080, 0x58e8: 0x0080, 0x58e9: 0x0080, + 0x58ea: 0x0080, 0x58eb: 0x0080, 0x58ec: 0x0080, 0x58ed: 0x0080, 0x58ee: 0x0080, 0x58ef: 0x0080, + 0x58f0: 0x0080, 0x58f1: 0x0080, 0x58f2: 0x0080, 0x58f3: 0x0080, 0x58f4: 0x0080, 0x58f5: 0x0080, + 0x58f6: 0x0080, 0x58f7: 0x0080, 0x58f8: 0x0080, 0x58f9: 0x0080, 0x58fa: 0x0080, 0x58fb: 0x0080, + 0x58fc: 0x0080, 0x58fd: 0x0080, 0x58fe: 0x0080, 0x58ff: 0x0080, + // Block 0x164, offset 0x5900 + 0x5900: 0x0080, 0x5901: 0x0080, 0x5902: 0x0080, 0x5903: 0x0080, 0x5904: 0x0080, 0x5905: 0x0080, + 0x5906: 0x0080, 0x5907: 0x0080, + 0x5910: 0x0080, 0x5911: 0x0080, + 0x5912: 0x0080, 0x5913: 0x0080, 0x5914: 0x0080, 0x5915: 0x0080, 0x5916: 0x0080, 0x5917: 0x0080, + 0x5918: 0x0080, 0x5919: 0x0080, 0x591a: 0x0080, 0x591b: 0x0080, 0x591c: 0x0080, 0x591d: 0x0080, + 0x591e: 0x0080, 0x591f: 0x0080, 0x5920: 0x0080, 0x5921: 0x0080, 0x5922: 0x0080, 0x5923: 0x0080, + 0x5924: 0x0080, 0x5925: 0x0080, 0x5926: 0x0080, 0x5927: 0x0080, 0x5928: 0x0080, 0x5929: 0x0080, + 0x592a: 0x0080, 0x592b: 0x0080, 0x592c: 0x0080, 0x592d: 0x0080, + 0x5930: 0x0080, 0x5931: 0x0080, + // Block 0x165, offset 0x5940 + 0x5940: 0x0080, 0x5941: 0x0080, 0x5942: 0x0080, 0x5943: 0x0080, 0x5944: 0x0080, 0x5945: 0x0080, + 0x5946: 0x0080, 0x5947: 0x0080, 0x5948: 0x0080, 0x5949: 0x0080, 0x594a: 0x0080, 0x594b: 0x0080, + 0x594c: 0x0080, 0x594d: 0x0080, 0x594e: 0x0080, 0x594f: 0x0080, 0x5950: 0x0080, 0x5951: 0x0080, + 0x5952: 0x0080, 0x5953: 0x0080, + 0x5960: 0x0080, 0x5961: 0x0080, 0x5962: 0x0080, 0x5963: 0x0080, + 0x5964: 0x0080, 0x5965: 0x0080, 0x5966: 0x0080, 0x5967: 0x0080, 0x5968: 0x0080, 0x5969: 0x0080, + 0x596a: 0x0080, 0x596b: 0x0080, 0x596c: 0x0080, 0x596d: 0x0080, + 0x5970: 0x0080, 0x5971: 0x0080, 0x5972: 0x0080, 0x5973: 0x0080, 0x5974: 0x0080, 0x5975: 0x0080, + 0x5976: 0x0080, 0x5977: 0x0080, 0x5978: 0x0080, 0x5979: 0x0080, 0x597a: 0x0080, 0x597b: 0x0080, + 0x597c: 0x0080, + // Block 0x166, offset 0x5980 + 0x5980: 0x0080, 0x5981: 0x0080, 0x5982: 0x0080, 0x5983: 0x0080, 0x5984: 0x0080, 0x5985: 0x0080, + 0x5986: 0x0080, 0x5987: 0x0080, 0x5988: 0x0080, + 0x5990: 0x0080, 0x5991: 0x0080, + 0x5992: 0x0080, 0x5993: 0x0080, 0x5994: 0x0080, 0x5995: 0x0080, 0x5996: 0x0080, 0x5997: 0x0080, + 0x5998: 0x0080, 0x5999: 0x0080, 0x599a: 0x0080, 0x599b: 0x0080, 0x599c: 0x0080, 0x599d: 0x0080, + 0x599e: 0x0080, 0x599f: 0x0080, 0x59a0: 0x0080, 0x59a1: 0x0080, 0x59a2: 0x0080, 0x59a3: 0x0080, + 0x59a4: 0x0080, 0x59a5: 0x0080, 0x59a6: 0x0080, 0x59a7: 0x0080, 0x59a8: 0x0080, 0x59a9: 0x0080, + 0x59aa: 0x0080, 0x59ab: 0x0080, 0x59ac: 0x0080, 0x59ad: 0x0080, 0x59ae: 0x0080, 0x59af: 0x0080, + 0x59b0: 0x0080, 0x59b1: 0x0080, 0x59b2: 0x0080, 0x59b3: 0x0080, 0x59b4: 0x0080, 0x59b5: 0x0080, + 0x59b6: 0x0080, 0x59b7: 0x0080, 0x59b8: 0x0080, 0x59b9: 0x0080, 0x59ba: 0x0080, 0x59bb: 0x0080, + 0x59bc: 0x0080, 0x59bd: 0x0080, 0x59bf: 0x0080, + // Block 0x167, offset 0x59c0 + 0x59c0: 0x0080, 0x59c1: 0x0080, 0x59c2: 0x0080, 0x59c3: 0x0080, 0x59c4: 0x0080, 0x59c5: 0x0080, + 0x59ce: 0x0080, 0x59cf: 0x0080, 0x59d0: 0x0080, 0x59d1: 0x0080, + 0x59d2: 0x0080, 0x59d3: 0x0080, 0x59d4: 0x0080, 0x59d5: 0x0080, 0x59d6: 0x0080, 0x59d7: 0x0080, + 0x59d8: 0x0080, 0x59d9: 0x0080, 0x59da: 0x0080, 0x59db: 0x0080, + 0x59e0: 0x0080, 0x59e1: 0x0080, 0x59e2: 0x0080, 0x59e3: 0x0080, + 0x59e4: 0x0080, 0x59e5: 0x0080, 0x59e6: 0x0080, 0x59e7: 0x0080, 0x59e8: 0x0080, + 0x59f0: 0x0080, 0x59f1: 0x0080, 0x59f2: 0x0080, 0x59f3: 0x0080, 0x59f4: 0x0080, 0x59f5: 0x0080, + 0x59f6: 0x0080, 0x59f7: 0x0080, 0x59f8: 0x0080, + // Block 0x168, offset 0x5a00 + 0x5a00: 0x0080, 0x5a01: 0x0080, 0x5a02: 0x0080, 0x5a03: 0x0080, 0x5a04: 0x0080, 0x5a05: 0x0080, + 0x5a06: 0x0080, 0x5a07: 0x0080, 0x5a08: 0x0080, 0x5a09: 0x0080, 0x5a0a: 0x0080, 0x5a0b: 0x0080, + 0x5a0c: 0x0080, 0x5a0d: 0x0080, 0x5a0e: 0x0080, 0x5a0f: 0x0080, 0x5a10: 0x0080, 0x5a11: 0x0080, + 0x5a12: 0x0080, 0x5a14: 0x0080, 0x5a15: 0x0080, 0x5a16: 0x0080, 0x5a17: 0x0080, + 0x5a18: 0x0080, 0x5a19: 0x0080, 0x5a1a: 0x0080, 0x5a1b: 0x0080, 0x5a1c: 0x0080, 0x5a1d: 0x0080, + 0x5a1e: 0x0080, 0x5a1f: 0x0080, 0x5a20: 0x0080, 0x5a21: 0x0080, 0x5a22: 0x0080, 0x5a23: 0x0080, + 0x5a24: 0x0080, 0x5a25: 0x0080, 0x5a26: 0x0080, 0x5a27: 0x0080, 0x5a28: 0x0080, 0x5a29: 0x0080, + 0x5a2a: 0x0080, 0x5a2b: 0x0080, 0x5a2c: 0x0080, 0x5a2d: 0x0080, 0x5a2e: 0x0080, 0x5a2f: 0x0080, + 0x5a30: 0x0080, 0x5a31: 0x0080, 0x5a32: 0x0080, 0x5a33: 0x0080, 0x5a34: 0x0080, 0x5a35: 0x0080, + 0x5a36: 0x0080, 0x5a37: 0x0080, 0x5a38: 0x0080, 0x5a39: 0x0080, 0x5a3a: 0x0080, 0x5a3b: 0x0080, + 0x5a3c: 0x0080, 0x5a3d: 0x0080, 0x5a3e: 0x0080, 0x5a3f: 0x0080, + // Block 0x169, offset 0x5a40 + 0x5a40: 0x0080, 0x5a41: 0x0080, 0x5a42: 0x0080, 0x5a43: 0x0080, 0x5a44: 0x0080, 0x5a45: 0x0080, + 0x5a46: 0x0080, 0x5a47: 0x0080, 0x5a48: 0x0080, 0x5a49: 0x0080, 0x5a4a: 0x0080, + 0x5a70: 0x0080, 0x5a71: 0x0080, 0x5a72: 0x0080, 0x5a73: 0x0080, 0x5a74: 0x0080, 0x5a75: 0x0080, + 0x5a76: 0x0080, 0x5a77: 0x0080, 0x5a78: 0x0080, 0x5a79: 0x0080, + // Block 0x16a, offset 0x5a80 + 0x5a80: 0x00cc, 0x5a81: 0x00cc, 0x5a82: 0x00cc, 0x5a83: 0x00cc, 0x5a84: 0x00cc, 0x5a85: 0x00cc, + 0x5a86: 0x00cc, 0x5a87: 0x00cc, 0x5a88: 0x00cc, 0x5a89: 0x00cc, 0x5a8a: 0x00cc, 0x5a8b: 0x00cc, + 0x5a8c: 0x00cc, 0x5a8d: 0x00cc, 0x5a8e: 0x00cc, 0x5a8f: 0x00cc, 0x5a90: 0x00cc, 0x5a91: 0x00cc, + 0x5a92: 0x00cc, 0x5a93: 0x00cc, 0x5a94: 0x00cc, 0x5a95: 0x00cc, 0x5a96: 0x00cc, 0x5a97: 0x00cc, + 0x5a98: 0x00cc, 0x5a99: 0x00cc, 0x5a9a: 0x00cc, 0x5a9b: 0x00cc, 0x5a9c: 0x00cc, 0x5a9d: 0x00cc, + 0x5a9e: 0x00cc, 0x5a9f: 0x00cc, + // Block 0x16b, offset 0x5ac0 + 0x5ac0: 0x00cc, 0x5ac1: 0x00cc, 0x5ac2: 0x00cc, 0x5ac3: 0x00cc, 0x5ac4: 0x00cc, 0x5ac5: 0x00cc, + 0x5ac6: 0x00cc, 0x5ac7: 0x00cc, 0x5ac8: 0x00cc, 0x5ac9: 0x00cc, 0x5aca: 0x00cc, 0x5acb: 0x00cc, + 0x5acc: 0x00cc, 0x5acd: 0x00cc, 0x5ace: 0x00cc, 0x5acf: 0x00cc, 0x5ad0: 0x00cc, 0x5ad1: 0x00cc, + 0x5ad2: 0x00cc, 0x5ad3: 0x00cc, 0x5ad4: 0x00cc, 0x5ad5: 0x00cc, 0x5ad6: 0x00cc, 0x5ad7: 0x00cc, + 0x5ad8: 0x00cc, 0x5ad9: 0x00cc, 0x5ada: 0x00cc, 0x5adb: 0x00cc, 0x5adc: 0x00cc, 0x5add: 0x00cc, + 0x5ade: 0x00cc, 0x5adf: 0x00cc, 0x5ae0: 0x00cc, 0x5ae1: 0x00cc, 0x5ae2: 0x00cc, 0x5ae3: 0x00cc, + 0x5ae4: 0x00cc, 0x5ae5: 0x00cc, 0x5ae6: 0x00cc, 0x5ae7: 0x00cc, 0x5ae8: 0x00cc, 0x5ae9: 0x00cc, + 0x5aea: 0x00cc, 0x5aeb: 0x00cc, 0x5aec: 0x00cc, 0x5aed: 0x00cc, 0x5aee: 0x00cc, 0x5aef: 0x00cc, + 0x5af0: 0x00cc, 0x5af1: 0x00cc, 0x5af2: 0x00cc, 0x5af3: 0x00cc, 0x5af4: 0x00cc, 0x5af5: 0x00cc, + 0x5af6: 0x00cc, 0x5af7: 0x00cc, 0x5af8: 0x00cc, 0x5af9: 0x00cc, + // Block 0x16c, offset 0x5b00 + 0x5b00: 0x00cc, 0x5b01: 0x00cc, 0x5b02: 0x00cc, 0x5b03: 0x00cc, 0x5b04: 0x00cc, 0x5b05: 0x00cc, + 0x5b06: 0x00cc, 0x5b07: 0x00cc, 0x5b08: 0x00cc, 0x5b09: 0x00cc, 0x5b0a: 0x00cc, 0x5b0b: 0x00cc, + 0x5b0c: 0x00cc, 0x5b0d: 0x00cc, 0x5b0e: 0x00cc, 0x5b0f: 0x00cc, 0x5b10: 0x00cc, 0x5b11: 0x00cc, + 0x5b12: 0x00cc, 0x5b13: 0x00cc, 0x5b14: 0x00cc, 0x5b15: 0x00cc, 0x5b16: 0x00cc, 0x5b17: 0x00cc, + 0x5b18: 0x00cc, 0x5b19: 0x00cc, 0x5b1a: 0x00cc, 0x5b1b: 0x00cc, 0x5b1c: 0x00cc, 0x5b1d: 0x00cc, + 0x5b20: 0x00cc, 0x5b21: 0x00cc, 0x5b22: 0x00cc, 0x5b23: 0x00cc, + 0x5b24: 0x00cc, 0x5b25: 0x00cc, 0x5b26: 0x00cc, 0x5b27: 0x00cc, 0x5b28: 0x00cc, 0x5b29: 0x00cc, + 0x5b2a: 0x00cc, 0x5b2b: 0x00cc, 0x5b2c: 0x00cc, 0x5b2d: 0x00cc, 0x5b2e: 0x00cc, 0x5b2f: 0x00cc, + 0x5b30: 0x00cc, 0x5b31: 0x00cc, 0x5b32: 0x00cc, 0x5b33: 0x00cc, 0x5b34: 0x00cc, 0x5b35: 0x00cc, + 0x5b36: 0x00cc, 0x5b37: 0x00cc, 0x5b38: 0x00cc, 0x5b39: 0x00cc, 0x5b3a: 0x00cc, 0x5b3b: 0x00cc, + 0x5b3c: 0x00cc, 0x5b3d: 0x00cc, 0x5b3e: 0x00cc, 0x5b3f: 0x00cc, + // Block 0x16d, offset 0x5b40 + 0x5b40: 0x00cc, 0x5b41: 0x00cc, 0x5b42: 0x00cc, 0x5b43: 0x00cc, 0x5b44: 0x00cc, 0x5b45: 0x00cc, + 0x5b46: 0x00cc, 0x5b47: 0x00cc, 0x5b48: 0x00cc, 0x5b49: 0x00cc, 0x5b4a: 0x00cc, 0x5b4b: 0x00cc, + 0x5b4c: 0x00cc, 0x5b4d: 0x00cc, 0x5b4e: 0x00cc, 0x5b4f: 0x00cc, 0x5b50: 0x00cc, 0x5b51: 0x00cc, + 0x5b52: 0x00cc, 0x5b53: 0x00cc, 0x5b54: 0x00cc, 0x5b55: 0x00cc, 0x5b56: 0x00cc, 0x5b57: 0x00cc, + 0x5b58: 0x00cc, 0x5b59: 0x00cc, 0x5b5a: 0x00cc, 0x5b5b: 0x00cc, 0x5b5c: 0x00cc, 0x5b5d: 0x00cc, + 0x5b5e: 0x00cc, 0x5b5f: 0x00cc, 0x5b60: 0x00cc, 0x5b61: 0x00cc, + 0x5b70: 0x00cc, 0x5b71: 0x00cc, 0x5b72: 0x00cc, 0x5b73: 0x00cc, 0x5b74: 0x00cc, 0x5b75: 0x00cc, + 0x5b76: 0x00cc, 0x5b77: 0x00cc, 0x5b78: 0x00cc, 0x5b79: 0x00cc, 0x5b7a: 0x00cc, 0x5b7b: 0x00cc, + 0x5b7c: 0x00cc, 0x5b7d: 0x00cc, 0x5b7e: 0x00cc, 0x5b7f: 0x00cc, + // Block 0x16e, offset 0x5b80 + 0x5b80: 0x00cc, 0x5b81: 0x00cc, 0x5b82: 0x00cc, 0x5b83: 0x00cc, 0x5b84: 0x00cc, 0x5b85: 0x00cc, + 0x5b86: 0x00cc, 0x5b87: 0x00cc, 0x5b88: 0x00cc, 0x5b89: 0x00cc, 0x5b8a: 0x00cc, 0x5b8b: 0x00cc, + 0x5b8c: 0x00cc, 0x5b8d: 0x00cc, 0x5b8e: 0x00cc, 0x5b8f: 0x00cc, 0x5b90: 0x00cc, 0x5b91: 0x00cc, + 0x5b92: 0x00cc, 0x5b93: 0x00cc, 0x5b94: 0x00cc, 0x5b95: 0x00cc, 0x5b96: 0x00cc, 0x5b97: 0x00cc, + 0x5b98: 0x00cc, 0x5b99: 0x00cc, 0x5b9a: 0x00cc, 0x5b9b: 0x00cc, 0x5b9c: 0x00cc, 0x5b9d: 0x00cc, + 0x5b9e: 0x00cc, 0x5b9f: 0x00cc, 0x5ba0: 0x00cc, + // Block 0x16f, offset 0x5bc0 + 0x5bc0: 0x008c, 0x5bc1: 0x008c, 0x5bc2: 0x008c, 0x5bc3: 0x008c, 0x5bc4: 0x008c, 0x5bc5: 0x008c, + 0x5bc6: 0x008c, 0x5bc7: 0x008c, 0x5bc8: 0x008c, 0x5bc9: 0x008c, 0x5bca: 0x008c, 0x5bcb: 0x008c, + 0x5bcc: 0x008c, 0x5bcd: 0x008c, 0x5bce: 0x008c, 0x5bcf: 0x008c, 0x5bd0: 0x008c, 0x5bd1: 0x008c, + 0x5bd2: 0x008c, 0x5bd3: 0x008c, 0x5bd4: 0x008c, 0x5bd5: 0x008c, 0x5bd6: 0x008c, 0x5bd7: 0x008c, + 0x5bd8: 0x008c, 0x5bd9: 0x008c, 0x5bda: 0x008c, 0x5bdb: 0x008c, 0x5bdc: 0x008c, 0x5bdd: 0x008c, + // Block 0x170, offset 0x5c00 + 0x5c00: 0x00cc, 0x5c01: 0x00cc, 0x5c02: 0x00cc, 0x5c03: 0x00cc, 0x5c04: 0x00cc, 0x5c05: 0x00cc, + 0x5c06: 0x00cc, 0x5c07: 0x00cc, 0x5c08: 0x00cc, 0x5c09: 0x00cc, 0x5c0a: 0x00cc, + 0x5c10: 0x00cc, 0x5c11: 0x00cc, + 0x5c12: 0x00cc, 0x5c13: 0x00cc, 0x5c14: 0x00cc, 0x5c15: 0x00cc, 0x5c16: 0x00cc, 0x5c17: 0x00cc, + 0x5c18: 0x00cc, 0x5c19: 0x00cc, 0x5c1a: 0x00cc, 0x5c1b: 0x00cc, 0x5c1c: 0x00cc, 0x5c1d: 0x00cc, + 0x5c1e: 0x00cc, 0x5c1f: 0x00cc, 0x5c20: 0x00cc, 0x5c21: 0x00cc, 0x5c22: 0x00cc, 0x5c23: 0x00cc, + 0x5c24: 0x00cc, 0x5c25: 0x00cc, 0x5c26: 0x00cc, 0x5c27: 0x00cc, 0x5c28: 0x00cc, 0x5c29: 0x00cc, + 0x5c2a: 0x00cc, 0x5c2b: 0x00cc, 0x5c2c: 0x00cc, 0x5c2d: 0x00cc, 0x5c2e: 0x00cc, 0x5c2f: 0x00cc, + 0x5c30: 0x00cc, 0x5c31: 0x00cc, 0x5c32: 0x00cc, 0x5c33: 0x00cc, 0x5c34: 0x00cc, 0x5c35: 0x00cc, + 0x5c36: 0x00cc, 0x5c37: 0x00cc, 0x5c38: 0x00cc, 0x5c39: 0x00cc, 0x5c3a: 0x00cc, 0x5c3b: 0x00cc, + 0x5c3c: 0x00cc, 0x5c3d: 0x00cc, 0x5c3e: 0x00cc, 0x5c3f: 0x00cc, + // Block 0x171, offset 0x5c40 + 0x5c40: 0x00cc, 0x5c41: 0x00cc, 0x5c42: 0x00cc, 0x5c43: 0x00cc, 0x5c44: 0x00cc, 0x5c45: 0x00cc, + 0x5c46: 0x00cc, 0x5c47: 0x00cc, 0x5c48: 0x00cc, 0x5c49: 0x00cc, 0x5c4a: 0x00cc, 0x5c4b: 0x00cc, + 0x5c4c: 0x00cc, 0x5c4d: 0x00cc, 0x5c4e: 0x00cc, 0x5c4f: 0x00cc, 0x5c50: 0x00cc, 0x5c51: 0x00cc, + 0x5c52: 0x00cc, 0x5c53: 0x00cc, 0x5c54: 0x00cc, 0x5c55: 0x00cc, 0x5c56: 0x00cc, 0x5c57: 0x00cc, + 0x5c58: 0x00cc, 0x5c59: 0x00cc, 0x5c5a: 0x00cc, 0x5c5b: 0x00cc, 0x5c5c: 0x00cc, 0x5c5d: 0x00cc, + 0x5c5e: 0x00cc, 0x5c5f: 0x00cc, 0x5c60: 0x00cc, 0x5c61: 0x00cc, 0x5c62: 0x00cc, 0x5c63: 0x00cc, + 0x5c64: 0x00cc, 0x5c65: 0x00cc, 0x5c66: 0x00cc, 0x5c67: 0x00cc, 0x5c68: 0x00cc, 0x5c69: 0x00cc, + 0x5c6a: 0x00cc, 0x5c6b: 0x00cc, 0x5c6c: 0x00cc, 0x5c6d: 0x00cc, 0x5c6e: 0x00cc, 0x5c6f: 0x00cc, + // Block 0x172, offset 0x5c80 + 0x5c81: 0x0040, + 0x5ca0: 0x0040, 0x5ca1: 0x0040, 0x5ca2: 0x0040, 0x5ca3: 0x0040, + 0x5ca4: 0x0040, 0x5ca5: 0x0040, 0x5ca6: 0x0040, 0x5ca7: 0x0040, 0x5ca8: 0x0040, 0x5ca9: 0x0040, + 0x5caa: 0x0040, 0x5cab: 0x0040, 0x5cac: 0x0040, 0x5cad: 0x0040, 0x5cae: 0x0040, 0x5caf: 0x0040, + 0x5cb0: 0x0040, 0x5cb1: 0x0040, 0x5cb2: 0x0040, 0x5cb3: 0x0040, 0x5cb4: 0x0040, 0x5cb5: 0x0040, + 0x5cb6: 0x0040, 0x5cb7: 0x0040, 0x5cb8: 0x0040, 0x5cb9: 0x0040, 0x5cba: 0x0040, 0x5cbb: 0x0040, + 0x5cbc: 0x0040, 0x5cbd: 0x0040, 0x5cbe: 0x0040, 0x5cbf: 0x0040, + // Block 0x173, offset 0x5cc0 + 0x5cc0: 0x0040, 0x5cc1: 0x0040, 0x5cc2: 0x0040, 0x5cc3: 0x0040, 0x5cc4: 0x0040, 0x5cc5: 0x0040, + 0x5cc6: 0x0040, 0x5cc7: 0x0040, 0x5cc8: 0x0040, 0x5cc9: 0x0040, 0x5cca: 0x0040, 0x5ccb: 0x0040, + 0x5ccc: 0x0040, 0x5ccd: 0x0040, 0x5cce: 0x0040, 0x5ccf: 0x0040, 0x5cd0: 0x0040, 0x5cd1: 0x0040, + 0x5cd2: 0x0040, 0x5cd3: 0x0040, 0x5cd4: 0x0040, 0x5cd5: 0x0040, 0x5cd6: 0x0040, 0x5cd7: 0x0040, + 0x5cd8: 0x0040, 0x5cd9: 0x0040, 0x5cda: 0x0040, 0x5cdb: 0x0040, 0x5cdc: 0x0040, 0x5cdd: 0x0040, + 0x5cde: 0x0040, 0x5cdf: 0x0040, 0x5ce0: 0x0040, 0x5ce1: 0x0040, 0x5ce2: 0x0040, 0x5ce3: 0x0040, + 0x5ce4: 0x0040, 0x5ce5: 0x0040, 0x5ce6: 0x0040, 0x5ce7: 0x0040, 0x5ce8: 0x0040, 0x5ce9: 0x0040, + 0x5cea: 0x0040, 0x5ceb: 0x0040, 0x5cec: 0x0040, 0x5ced: 0x0040, 0x5cee: 0x0040, 0x5cef: 0x0040, + // Block 0x174, offset 0x5d00 + 0x5d00: 0x0040, 0x5d01: 0x0040, 0x5d02: 0x0040, 0x5d03: 0x0040, 0x5d04: 0x0040, 0x5d05: 0x0040, + 0x5d06: 0x0040, 0x5d07: 0x0040, 0x5d08: 0x0040, 0x5d09: 0x0040, 0x5d0a: 0x0040, 0x5d0b: 0x0040, + 0x5d0c: 0x0040, 0x5d0d: 0x0040, 0x5d0e: 0x0040, 0x5d0f: 0x0040, 0x5d10: 0x0040, 0x5d11: 0x0040, + 0x5d12: 0x0040, 0x5d13: 0x0040, 0x5d14: 0x0040, 0x5d15: 0x0040, 0x5d16: 0x0040, 0x5d17: 0x0040, + 0x5d18: 0x0040, 0x5d19: 0x0040, 0x5d1a: 0x0040, 0x5d1b: 0x0040, 0x5d1c: 0x0040, 0x5d1d: 0x0040, + 0x5d1e: 0x0040, 0x5d1f: 0x0040, 0x5d20: 0x0040, 0x5d21: 0x0040, 0x5d22: 0x0040, 0x5d23: 0x0040, + 0x5d24: 0x0040, 0x5d25: 0x0040, 0x5d26: 0x0040, 0x5d27: 0x0040, 0x5d28: 0x0040, 0x5d29: 0x0040, + 0x5d2a: 0x0040, 0x5d2b: 0x0040, 0x5d2c: 0x0040, 0x5d2d: 0x0040, 0x5d2e: 0x0040, 0x5d2f: 0x0040, + 0x5d30: 0x0040, 0x5d31: 0x0040, 0x5d32: 0x0040, 0x5d33: 0x0040, 0x5d34: 0x0040, 0x5d35: 0x0040, + 0x5d36: 0x0040, 0x5d37: 0x0040, 0x5d38: 0x0040, 0x5d39: 0x0040, 0x5d3a: 0x0040, 0x5d3b: 0x0040, + 0x5d3c: 0x0040, 0x5d3d: 0x0040, +} + +// derivedPropertiesIndex: 40 blocks, 2560 entries, 5120 bytes +// Block 0 is the zero block. +var derivedPropertiesIndex = [2560]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc6: 0x05, 0xc7: 0x06, + 0xc8: 0x05, 0xc9: 0x05, 0xca: 0x07, 0xcb: 0x08, 0xcc: 0x09, 0xcd: 0x0a, 0xce: 0x0b, 0xcf: 0x0c, + 0xd0: 0x05, 0xd1: 0x05, 0xd2: 0x0d, 0xd3: 0x05, 0xd4: 0x0e, 0xd5: 0x0f, 0xd6: 0x10, 0xd7: 0x11, + 0xd8: 0x12, 0xd9: 0x13, 0xda: 0x14, 0xdb: 0x15, 0xdc: 0x16, 0xdd: 0x17, 0xde: 0x18, 0xdf: 0x19, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x07, 0xea: 0x08, 0xeb: 0x09, 0xec: 0x09, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x21, 0xf3: 0x24, 0xf4: 0x25, + // Block 0x4, offset 0x100 + 0x120: 0x1a, 0x121: 0x1b, 0x122: 0x1c, 0x123: 0x1d, 0x124: 0x1e, 0x125: 0x1f, 0x126: 0x20, 0x127: 0x21, + 0x128: 0x22, 0x129: 0x23, 0x12a: 0x24, 0x12b: 0x25, 0x12c: 0x26, 0x12d: 0x27, 0x12e: 0x28, 0x12f: 0x29, + 0x130: 0x2a, 0x131: 0x2b, 0x132: 0x2c, 0x133: 0x2d, 0x134: 0x2e, 0x135: 0x2f, 0x136: 0x30, 0x137: 0x31, + 0x138: 0x32, 0x139: 0x33, 0x13a: 0x34, 0x13b: 0x35, 0x13c: 0x36, 0x13d: 0x37, 0x13e: 0x38, 0x13f: 0x39, + // Block 0x5, offset 0x140 + 0x140: 0x3a, 0x141: 0x3b, 0x142: 0x3c, 0x143: 0x3d, 0x144: 0x3e, 0x145: 0x3e, 0x146: 0x3e, 0x147: 0x3e, + 0x148: 0x05, 0x149: 0x3f, 0x14a: 0x40, 0x14b: 0x41, 0x14c: 0x42, 0x14d: 0x43, 0x14e: 0x44, 0x14f: 0x45, + 0x150: 0x46, 0x151: 0x05, 0x152: 0x05, 0x153: 0x05, 0x154: 0x05, 0x155: 0x05, 0x156: 0x05, 0x157: 0x05, + 0x158: 0x05, 0x159: 0x47, 0x15a: 0x48, 0x15b: 0x49, 0x15c: 0x4a, 0x15d: 0x4b, 0x15e: 0x4c, 0x15f: 0x4d, + 0x160: 0x4e, 0x161: 0x4f, 0x162: 0x50, 0x163: 0x51, 0x164: 0x52, 0x165: 0x53, 0x166: 0x54, 0x167: 0x55, + 0x168: 0x56, 0x169: 0x57, 0x16a: 0x58, 0x16b: 0x59, 0x16c: 0x5a, 0x16d: 0x5b, 0x16e: 0x5c, 0x16f: 0x5d, + 0x170: 0x5e, 0x171: 0x5f, 0x172: 0x60, 0x173: 0x61, 0x174: 0x62, 0x175: 0x63, 0x176: 0x64, 0x177: 0x09, + 0x178: 0x05, 0x179: 0x05, 0x17a: 0x65, 0x17b: 0x05, 0x17c: 0x66, 0x17d: 0x67, 0x17e: 0x68, 0x17f: 0x69, + // Block 0x6, offset 0x180 + 0x180: 0x6a, 0x181: 0x6b, 0x182: 0x6c, 0x183: 0x6d, 0x184: 0x6e, 0x185: 0x6f, 0x186: 0x70, 0x187: 0x71, + 0x188: 0x71, 0x189: 0x71, 0x18a: 0x71, 0x18b: 0x71, 0x18c: 0x71, 0x18d: 0x71, 0x18e: 0x71, 0x18f: 0x71, + 0x190: 0x72, 0x191: 0x73, 0x192: 0x71, 0x193: 0x71, 0x194: 0x71, 0x195: 0x71, 0x196: 0x71, 0x197: 0x71, + 0x198: 0x71, 0x199: 0x71, 0x19a: 0x71, 0x19b: 0x71, 0x19c: 0x71, 0x19d: 0x71, 0x19e: 0x71, 0x19f: 0x71, + 0x1a0: 0x71, 0x1a1: 0x71, 0x1a2: 0x71, 0x1a3: 0x71, 0x1a4: 0x71, 0x1a5: 0x71, 0x1a6: 0x71, 0x1a7: 0x71, + 0x1a8: 0x71, 0x1a9: 0x71, 0x1aa: 0x71, 0x1ab: 0x71, 0x1ac: 0x71, 0x1ad: 0x74, 0x1ae: 0x75, 0x1af: 0x71, + 0x1b0: 0x05, 0x1b1: 0x76, 0x1b2: 0x05, 0x1b3: 0x77, 0x1b4: 0x78, 0x1b5: 0x79, 0x1b6: 0x7a, 0x1b7: 0x7b, + 0x1b8: 0x7c, 0x1b9: 0x7d, 0x1ba: 0x7e, 0x1bb: 0x7f, 0x1bc: 0x80, 0x1bd: 0x80, 0x1be: 0x80, 0x1bf: 0x81, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x82, 0x1c1: 0x83, 0x1c2: 0x84, 0x1c3: 0x85, 0x1c4: 0x86, 0x1c5: 0x87, 0x1c6: 0x88, 0x1c7: 0x89, + 0x1c8: 0x8a, 0x1c9: 0x71, 0x1ca: 0x71, 0x1cb: 0x8b, 0x1cc: 0x80, 0x1cd: 0x8c, 0x1ce: 0x71, 0x1cf: 0x71, + 0x1d0: 0x8d, 0x1d1: 0x8d, 0x1d2: 0x8d, 0x1d3: 0x8d, 0x1d4: 0x8d, 0x1d5: 0x8d, 0x1d6: 0x8d, 0x1d7: 0x8d, + 0x1d8: 0x8d, 0x1d9: 0x8d, 0x1da: 0x8d, 0x1db: 0x8d, 0x1dc: 0x8d, 0x1dd: 0x8d, 0x1de: 0x8d, 0x1df: 0x8d, + 0x1e0: 0x8d, 0x1e1: 0x8d, 0x1e2: 0x8d, 0x1e3: 0x8d, 0x1e4: 0x8d, 0x1e5: 0x8d, 0x1e6: 0x8d, 0x1e7: 0x8d, + 0x1e8: 0x8d, 0x1e9: 0x8d, 0x1ea: 0x8d, 0x1eb: 0x8d, 0x1ec: 0x8d, 0x1ed: 0x8d, 0x1ee: 0x8d, 0x1ef: 0x8d, + 0x1f0: 0x8d, 0x1f1: 0x8d, 0x1f2: 0x8d, 0x1f3: 0x8d, 0x1f4: 0x8d, 0x1f5: 0x8d, 0x1f6: 0x8d, 0x1f7: 0x8d, + 0x1f8: 0x8d, 0x1f9: 0x8d, 0x1fa: 0x8d, 0x1fb: 0x8d, 0x1fc: 0x8d, 0x1fd: 0x8d, 0x1fe: 0x8d, 0x1ff: 0x8d, + // Block 0x8, offset 0x200 + 0x200: 0x8d, 0x201: 0x8d, 0x202: 0x8d, 0x203: 0x8d, 0x204: 0x8d, 0x205: 0x8d, 0x206: 0x8d, 0x207: 0x8d, + 0x208: 0x8d, 0x209: 0x8d, 0x20a: 0x8d, 0x20b: 0x8d, 0x20c: 0x8d, 0x20d: 0x8d, 0x20e: 0x8d, 0x20f: 0x8d, + 0x210: 0x8d, 0x211: 0x8d, 0x212: 0x8d, 0x213: 0x8d, 0x214: 0x8d, 0x215: 0x8d, 0x216: 0x8d, 0x217: 0x8d, + 0x218: 0x8d, 0x219: 0x8d, 0x21a: 0x8d, 0x21b: 0x8d, 0x21c: 0x8d, 0x21d: 0x8d, 0x21e: 0x8d, 0x21f: 0x8d, + 0x220: 0x8d, 0x221: 0x8d, 0x222: 0x8d, 0x223: 0x8d, 0x224: 0x8d, 0x225: 0x8d, 0x226: 0x8d, 0x227: 0x8d, + 0x228: 0x8d, 0x229: 0x8d, 0x22a: 0x8d, 0x22b: 0x8d, 0x22c: 0x8d, 0x22d: 0x8d, 0x22e: 0x8d, 0x22f: 0x8d, + 0x230: 0x8d, 0x231: 0x8d, 0x232: 0x8d, 0x233: 0x8d, 0x234: 0x8d, 0x235: 0x8d, 0x236: 0x8d, 0x237: 0x71, + 0x238: 0x8d, 0x239: 0x8d, 0x23a: 0x8d, 0x23b: 0x8d, 0x23c: 0x8d, 0x23d: 0x8d, 0x23e: 0x8d, 0x23f: 0x8d, + // Block 0x9, offset 0x240 + 0x240: 0x8d, 0x241: 0x8d, 0x242: 0x8d, 0x243: 0x8d, 0x244: 0x8d, 0x245: 0x8d, 0x246: 0x8d, 0x247: 0x8d, + 0x248: 0x8d, 0x249: 0x8d, 0x24a: 0x8d, 0x24b: 0x8d, 0x24c: 0x8d, 0x24d: 0x8d, 0x24e: 0x8d, 0x24f: 0x8d, + 0x250: 0x8d, 0x251: 0x8d, 0x252: 0x8d, 0x253: 0x8d, 0x254: 0x8d, 0x255: 0x8d, 0x256: 0x8d, 0x257: 0x8d, + 0x258: 0x8d, 0x259: 0x8d, 0x25a: 0x8d, 0x25b: 0x8d, 0x25c: 0x8d, 0x25d: 0x8d, 0x25e: 0x8d, 0x25f: 0x8d, + 0x260: 0x8d, 0x261: 0x8d, 0x262: 0x8d, 0x263: 0x8d, 0x264: 0x8d, 0x265: 0x8d, 0x266: 0x8d, 0x267: 0x8d, + 0x268: 0x8d, 0x269: 0x8d, 0x26a: 0x8d, 0x26b: 0x8d, 0x26c: 0x8d, 0x26d: 0x8d, 0x26e: 0x8d, 0x26f: 0x8d, + 0x270: 0x8d, 0x271: 0x8d, 0x272: 0x8d, 0x273: 0x8d, 0x274: 0x8d, 0x275: 0x8d, 0x276: 0x8d, 0x277: 0x8d, + 0x278: 0x8d, 0x279: 0x8d, 0x27a: 0x8d, 0x27b: 0x8d, 0x27c: 0x8d, 0x27d: 0x8d, 0x27e: 0x8d, 0x27f: 0x8d, + // Block 0xa, offset 0x280 + 0x280: 0x05, 0x281: 0x05, 0x282: 0x05, 0x283: 0x05, 0x284: 0x05, 0x285: 0x05, 0x286: 0x05, 0x287: 0x05, + 0x288: 0x05, 0x289: 0x05, 0x28a: 0x05, 0x28b: 0x05, 0x28c: 0x05, 0x28d: 0x05, 0x28e: 0x05, 0x28f: 0x05, + 0x290: 0x05, 0x291: 0x05, 0x292: 0x8e, 0x293: 0x8f, 0x294: 0x05, 0x295: 0x05, 0x296: 0x05, 0x297: 0x05, + 0x298: 0x90, 0x299: 0x91, 0x29a: 0x92, 0x29b: 0x93, 0x29c: 0x94, 0x29d: 0x95, 0x29e: 0x96, 0x29f: 0x97, + 0x2a0: 0x98, 0x2a1: 0x99, 0x2a2: 0x05, 0x2a3: 0x9a, 0x2a4: 0x9b, 0x2a5: 0x9c, 0x2a6: 0x9d, 0x2a7: 0x9e, + 0x2a8: 0x9f, 0x2a9: 0xa0, 0x2aa: 0xa1, 0x2ab: 0xa2, 0x2ac: 0xa3, 0x2ad: 0xa4, 0x2ae: 0x05, 0x2af: 0xa5, + 0x2b0: 0x05, 0x2b1: 0x05, 0x2b2: 0x05, 0x2b3: 0x05, 0x2b4: 0x05, 0x2b5: 0x05, 0x2b6: 0x05, 0x2b7: 0x05, + 0x2b8: 0x05, 0x2b9: 0x05, 0x2ba: 0x05, 0x2bb: 0x05, 0x2bc: 0x05, 0x2bd: 0x05, 0x2be: 0x05, 0x2bf: 0x05, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x05, 0x2c1: 0x05, 0x2c2: 0x05, 0x2c3: 0x05, 0x2c4: 0x05, 0x2c5: 0x05, 0x2c6: 0x05, 0x2c7: 0x05, + 0x2c8: 0x05, 0x2c9: 0x05, 0x2ca: 0x05, 0x2cb: 0x05, 0x2cc: 0x05, 0x2cd: 0x05, 0x2ce: 0x05, 0x2cf: 0x05, + 0x2d0: 0x05, 0x2d1: 0x05, 0x2d2: 0x05, 0x2d3: 0x05, 0x2d4: 0x05, 0x2d5: 0x05, 0x2d6: 0x05, 0x2d7: 0x05, + 0x2d8: 0x05, 0x2d9: 0x05, 0x2da: 0x05, 0x2db: 0x05, 0x2dc: 0x05, 0x2dd: 0x05, 0x2de: 0x05, 0x2df: 0x05, + 0x2e0: 0x05, 0x2e1: 0x05, 0x2e2: 0x05, 0x2e3: 0x05, 0x2e4: 0x05, 0x2e5: 0x05, 0x2e6: 0x05, 0x2e7: 0x05, + 0x2e8: 0x05, 0x2e9: 0x05, 0x2ea: 0x05, 0x2eb: 0x05, 0x2ec: 0x05, 0x2ed: 0x05, 0x2ee: 0x05, 0x2ef: 0x05, + 0x2f0: 0x05, 0x2f1: 0x05, 0x2f2: 0x05, 0x2f3: 0x05, 0x2f4: 0x05, 0x2f5: 0x05, 0x2f6: 0x05, 0x2f7: 0x05, + 0x2f8: 0x05, 0x2f9: 0x05, 0x2fa: 0x05, 0x2fb: 0x05, 0x2fc: 0x05, 0x2fd: 0x05, 0x2fe: 0x05, 0x2ff: 0x05, + // Block 0xc, offset 0x300 + 0x300: 0x05, 0x301: 0x05, 0x302: 0x05, 0x303: 0x05, 0x304: 0x05, 0x305: 0x05, 0x306: 0x05, 0x307: 0x05, + 0x308: 0x05, 0x309: 0x05, 0x30a: 0x05, 0x30b: 0x05, 0x30c: 0x05, 0x30d: 0x05, 0x30e: 0x05, 0x30f: 0x05, + 0x310: 0x05, 0x311: 0x05, 0x312: 0x05, 0x313: 0x05, 0x314: 0x05, 0x315: 0x05, 0x316: 0x05, 0x317: 0x05, + 0x318: 0x05, 0x319: 0x05, 0x31a: 0x05, 0x31b: 0x05, 0x31c: 0x05, 0x31d: 0x05, 0x31e: 0xa6, 0x31f: 0xa7, + // Block 0xd, offset 0x340 + 0x340: 0x3e, 0x341: 0x3e, 0x342: 0x3e, 0x343: 0x3e, 0x344: 0x3e, 0x345: 0x3e, 0x346: 0x3e, 0x347: 0x3e, + 0x348: 0x3e, 0x349: 0x3e, 0x34a: 0x3e, 0x34b: 0x3e, 0x34c: 0x3e, 0x34d: 0x3e, 0x34e: 0x3e, 0x34f: 0x3e, + 0x350: 0x3e, 0x351: 0x3e, 0x352: 0x3e, 0x353: 0x3e, 0x354: 0x3e, 0x355: 0x3e, 0x356: 0x3e, 0x357: 0x3e, + 0x358: 0x3e, 0x359: 0x3e, 0x35a: 0x3e, 0x35b: 0x3e, 0x35c: 0x3e, 0x35d: 0x3e, 0x35e: 0x3e, 0x35f: 0x3e, + 0x360: 0x3e, 0x361: 0x3e, 0x362: 0x3e, 0x363: 0x3e, 0x364: 0x3e, 0x365: 0x3e, 0x366: 0x3e, 0x367: 0x3e, + 0x368: 0x3e, 0x369: 0x3e, 0x36a: 0x3e, 0x36b: 0x3e, 0x36c: 0x3e, 0x36d: 0x3e, 0x36e: 0x3e, 0x36f: 0x3e, + 0x370: 0x3e, 0x371: 0x3e, 0x372: 0x3e, 0x373: 0x3e, 0x374: 0x3e, 0x375: 0x3e, 0x376: 0x3e, 0x377: 0x3e, + 0x378: 0x3e, 0x379: 0x3e, 0x37a: 0x3e, 0x37b: 0x3e, 0x37c: 0x3e, 0x37d: 0x3e, 0x37e: 0x3e, 0x37f: 0x3e, + // Block 0xe, offset 0x380 + 0x380: 0x3e, 0x381: 0x3e, 0x382: 0x3e, 0x383: 0x3e, 0x384: 0x3e, 0x385: 0x3e, 0x386: 0x3e, 0x387: 0x3e, + 0x388: 0x3e, 0x389: 0x3e, 0x38a: 0x3e, 0x38b: 0x3e, 0x38c: 0x3e, 0x38d: 0x3e, 0x38e: 0x3e, 0x38f: 0x3e, + 0x390: 0x3e, 0x391: 0x3e, 0x392: 0x3e, 0x393: 0x3e, 0x394: 0x3e, 0x395: 0x3e, 0x396: 0x3e, 0x397: 0x3e, + 0x398: 0x3e, 0x399: 0x3e, 0x39a: 0x3e, 0x39b: 0x3e, 0x39c: 0x3e, 0x39d: 0x3e, 0x39e: 0x3e, 0x39f: 0x3e, + 0x3a0: 0x3e, 0x3a1: 0x3e, 0x3a2: 0x3e, 0x3a3: 0x3e, 0x3a4: 0x80, 0x3a5: 0x80, 0x3a6: 0x80, 0x3a7: 0x80, + 0x3a8: 0xa8, 0x3a9: 0xa9, 0x3aa: 0x80, 0x3ab: 0xaa, 0x3ac: 0xab, 0x3ad: 0xac, 0x3ae: 0x71, 0x3af: 0xad, + 0x3b0: 0x71, 0x3b1: 0x71, 0x3b2: 0x71, 0x3b3: 0x71, 0x3b4: 0x71, 0x3b5: 0x71, 0x3b6: 0xae, 0x3b7: 0xaf, + 0x3b8: 0xb0, 0x3b9: 0xb1, 0x3ba: 0x71, 0x3bb: 0xb2, 0x3bc: 0xb3, 0x3bd: 0xb4, 0x3be: 0xb5, 0x3bf: 0xb6, + // Block 0xf, offset 0x3c0 + 0x3c0: 0xb7, 0x3c1: 0xb8, 0x3c2: 0x05, 0x3c3: 0xb9, 0x3c4: 0xba, 0x3c5: 0xbb, 0x3c6: 0xbc, 0x3c7: 0xbd, + 0x3ca: 0xbe, 0x3cb: 0xbf, 0x3cc: 0xc0, 0x3cd: 0xc1, 0x3ce: 0xc2, 0x3cf: 0xc3, + 0x3d0: 0x05, 0x3d1: 0x05, 0x3d2: 0xc4, 0x3d3: 0xc5, 0x3d4: 0xc6, 0x3d5: 0xc7, 0x3d6: 0xc8, + 0x3d8: 0x05, 0x3d9: 0x05, 0x3da: 0x05, 0x3db: 0x05, 0x3dc: 0xc9, 0x3dd: 0xca, 0x3de: 0xcb, + 0x3e0: 0xcc, 0x3e1: 0xcd, 0x3e2: 0xce, 0x3e3: 0xcf, 0x3e4: 0xd0, 0x3e6: 0xd1, 0x3e7: 0xae, + 0x3e8: 0xd2, 0x3e9: 0xd3, 0x3ea: 0xd4, 0x3eb: 0xd5, 0x3ec: 0xd6, 0x3ed: 0xd7, 0x3ee: 0xd8, + 0x3f0: 0x05, 0x3f1: 0xd9, 0x3f2: 0xda, 0x3f3: 0xdb, 0x3f4: 0xdc, + 0x3f9: 0xdd, 0x3fa: 0xde, 0x3fb: 0xdf, 0x3fc: 0xe0, 0x3fd: 0xe1, 0x3fe: 0xe2, 0x3ff: 0xe3, + // Block 0x10, offset 0x400 + 0x400: 0xe4, 0x401: 0xe5, 0x402: 0xe6, 0x403: 0xe7, 0x404: 0xe8, 0x405: 0xe9, 0x406: 0xea, 0x407: 0xeb, + 0x408: 0xec, 0x409: 0xed, 0x40a: 0xee, 0x40b: 0xef, 0x40c: 0xf0, 0x40d: 0xf1, + 0x410: 0xf2, 0x411: 0xf3, 0x412: 0xf4, 0x413: 0xf5, 0x416: 0xf6, 0x417: 0xf7, + 0x418: 0xf8, 0x419: 0xf9, 0x41a: 0xfa, 0x41b: 0xfb, 0x41c: 0xfc, 0x41d: 0xfd, + 0x420: 0xfe, 0x422: 0xff, 0x423: 0x100, 0x424: 0x101, 0x425: 0x102, 0x426: 0x103, 0x427: 0x104, + 0x428: 0x105, 0x429: 0x106, 0x42a: 0x107, 0x42b: 0x108, 0x42c: 0x109, + 0x430: 0x10a, 0x431: 0x10b, 0x432: 0x10c, 0x434: 0x10d, 0x435: 0x10e, 0x436: 0x10f, + 0x43b: 0x110, 0x43c: 0x111, 0x43d: 0x112, 0x43e: 0x113, 0x43f: 0x114, + // Block 0x11, offset 0x440 + 0x440: 0x05, 0x441: 0x05, 0x442: 0x05, 0x443: 0x05, 0x444: 0x05, 0x445: 0x05, 0x446: 0x05, 0x447: 0x05, + 0x448: 0x05, 0x449: 0x05, 0x44a: 0x05, 0x44b: 0x05, 0x44c: 0x05, 0x44d: 0x05, 0x44e: 0x115, + 0x450: 0x71, 0x451: 0x116, 0x452: 0x05, 0x453: 0x05, 0x454: 0x05, 0x455: 0x117, + 0x47e: 0x118, 0x47f: 0x119, + // Block 0x12, offset 0x480 + 0x480: 0x05, 0x481: 0x05, 0x482: 0x05, 0x483: 0x05, 0x484: 0x05, 0x485: 0x05, 0x486: 0x05, 0x487: 0x05, + 0x488: 0x05, 0x489: 0x05, 0x48a: 0x05, 0x48b: 0x05, 0x48c: 0x05, 0x48d: 0x05, 0x48e: 0x05, 0x48f: 0x05, + 0x490: 0x11a, 0x491: 0x11b, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x05, 0x4d1: 0x05, 0x4d2: 0x05, 0x4d3: 0x05, 0x4d4: 0x05, 0x4d5: 0x05, 0x4d6: 0x05, 0x4d7: 0x05, + 0x4d8: 0x05, 0x4d9: 0xfd, + // Block 0x14, offset 0x500 + 0x520: 0x05, 0x521: 0x05, 0x522: 0x05, 0x523: 0x05, 0x524: 0x05, 0x525: 0x05, 0x526: 0x05, 0x527: 0x05, + 0x528: 0x108, 0x529: 0x11c, 0x52a: 0x11d, 0x52b: 0x11e, 0x52c: 0x11f, 0x52d: 0x120, 0x52e: 0x121, + 0x539: 0x05, 0x53a: 0x122, 0x53c: 0x05, 0x53d: 0x123, 0x53e: 0x124, 0x53f: 0x125, + // Block 0x15, offset 0x540 + 0x540: 0x05, 0x541: 0x05, 0x542: 0x05, 0x543: 0x05, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0x05, + 0x548: 0x05, 0x549: 0x05, 0x54a: 0x05, 0x54b: 0x05, 0x54c: 0x05, 0x54d: 0x05, 0x54e: 0x05, 0x54f: 0x05, + 0x550: 0x05, 0x551: 0x05, 0x552: 0x05, 0x553: 0x05, 0x554: 0x05, 0x555: 0x05, 0x556: 0x05, 0x557: 0x05, + 0x558: 0x05, 0x559: 0x05, 0x55a: 0x05, 0x55b: 0x05, 0x55c: 0x05, 0x55d: 0x05, 0x55e: 0x05, 0x55f: 0x126, + 0x560: 0x05, 0x561: 0x05, 0x562: 0x05, 0x563: 0x05, 0x564: 0x05, 0x565: 0x05, 0x566: 0x05, 0x567: 0x05, + 0x568: 0x05, 0x569: 0x05, 0x56a: 0x05, 0x56b: 0x05, 0x56c: 0x05, 0x56d: 0x05, 0x56e: 0x05, 0x56f: 0x05, + 0x570: 0x05, 0x571: 0x05, 0x572: 0x05, 0x573: 0x127, 0x574: 0xd9, + // Block 0x16, offset 0x580 + 0x5bf: 0x128, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x8d, 0x5c1: 0x8d, 0x5c2: 0x8d, 0x5c3: 0x8d, 0x5c4: 0x129, 0x5c5: 0x12a, 0x5c6: 0x05, 0x5c7: 0x05, + 0x5c8: 0x05, 0x5c9: 0x05, 0x5ca: 0x05, 0x5cb: 0x12b, + 0x5f0: 0x05, 0x5f1: 0x12c, 0x5f2: 0x12d, + // Block 0x18, offset 0x600 + 0x63c: 0x12e, 0x63d: 0x12f, 0x63e: 0x71, 0x63f: 0x130, + // Block 0x19, offset 0x640 + 0x640: 0x71, 0x641: 0x71, 0x642: 0x71, 0x643: 0x131, 0x644: 0x132, 0x645: 0x133, 0x646: 0x134, 0x647: 0x135, + 0x648: 0xbb, 0x649: 0x136, 0x64b: 0x137, 0x64c: 0x71, 0x64d: 0x138, + 0x650: 0x71, 0x651: 0x139, 0x652: 0x13a, 0x653: 0x13b, 0x654: 0x13c, 0x655: 0x13d, 0x656: 0x71, 0x657: 0x71, + 0x658: 0x71, 0x659: 0x71, 0x65a: 0x13e, 0x65b: 0x71, 0x65c: 0x71, 0x65d: 0x71, 0x65e: 0x71, 0x65f: 0x13f, + 0x660: 0x71, 0x661: 0x71, 0x662: 0x71, 0x663: 0x71, 0x664: 0x71, 0x665: 0x71, 0x666: 0x71, 0x667: 0x71, + 0x668: 0x140, 0x669: 0x141, 0x66a: 0x142, + 0x67c: 0x143, + // Block 0x1a, offset 0x680 + 0x680: 0x144, 0x681: 0x145, 0x682: 0x146, 0x684: 0x147, 0x685: 0x148, + 0x68a: 0x149, 0x68b: 0x14a, + 0x693: 0x14b, + 0x69f: 0x14c, + 0x6a0: 0x05, 0x6a1: 0x05, 0x6a2: 0x05, 0x6a3: 0x14d, 0x6a4: 0x14e, 0x6a5: 0x14f, + 0x6b1: 0x150, 0x6b2: 0x151, 0x6b4: 0x152, + 0x6b8: 0x153, 0x6b9: 0x154, 0x6ba: 0x155, 0x6bb: 0x156, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x157, 0x6c1: 0x71, 0x6c2: 0x158, 0x6c3: 0x159, 0x6c4: 0x71, 0x6c5: 0x71, 0x6c6: 0x145, 0x6c7: 0x15a, + 0x6c8: 0x15b, 0x6c9: 0x15c, 0x6cc: 0x71, 0x6cd: 0x71, 0x6ce: 0x71, 0x6cf: 0x71, + 0x6d0: 0x71, 0x6d1: 0x71, 0x6d2: 0x71, 0x6d3: 0x71, 0x6d4: 0x71, 0x6d5: 0x71, 0x6d6: 0x71, 0x6d7: 0x71, + 0x6d8: 0x71, 0x6d9: 0x71, 0x6da: 0x71, 0x6db: 0x15d, 0x6dc: 0x71, 0x6dd: 0x15e, 0x6de: 0x71, 0x6df: 0x15f, + 0x6e0: 0x160, 0x6e1: 0x161, 0x6e2: 0x162, 0x6e4: 0x71, 0x6e5: 0x71, 0x6e6: 0x71, 0x6e7: 0x71, + 0x6e8: 0x71, 0x6e9: 0x163, 0x6ea: 0x164, 0x6eb: 0x165, 0x6ec: 0x71, 0x6ed: 0x71, 0x6ee: 0x166, 0x6ef: 0x167, + // Block 0x1c, offset 0x700 + 0x700: 0x8d, 0x701: 0x8d, 0x702: 0x8d, 0x703: 0x8d, 0x704: 0x8d, 0x705: 0x8d, 0x706: 0x8d, 0x707: 0x8d, + 0x708: 0x8d, 0x709: 0x8d, 0x70a: 0x8d, 0x70b: 0x8d, 0x70c: 0x8d, 0x70d: 0x8d, 0x70e: 0x8d, 0x70f: 0x8d, + 0x710: 0x8d, 0x711: 0x8d, 0x712: 0x8d, 0x713: 0x8d, 0x714: 0x8d, 0x715: 0x8d, 0x716: 0x8d, 0x717: 0x8d, + 0x718: 0x8d, 0x719: 0x8d, 0x71a: 0x8d, 0x71b: 0x168, 0x71c: 0x8d, 0x71d: 0x8d, 0x71e: 0x8d, 0x71f: 0x8d, + 0x720: 0x8d, 0x721: 0x8d, 0x722: 0x8d, 0x723: 0x8d, 0x724: 0x8d, 0x725: 0x8d, 0x726: 0x8d, 0x727: 0x8d, + 0x728: 0x8d, 0x729: 0x8d, 0x72a: 0x8d, 0x72b: 0x8d, 0x72c: 0x8d, 0x72d: 0x8d, 0x72e: 0x8d, 0x72f: 0x8d, + 0x730: 0x8d, 0x731: 0x8d, 0x732: 0x8d, 0x733: 0x8d, 0x734: 0x8d, 0x735: 0x8d, 0x736: 0x8d, 0x737: 0x8d, + 0x738: 0x8d, 0x739: 0x8d, 0x73a: 0x8d, 0x73b: 0x8d, 0x73c: 0x8d, 0x73d: 0x8d, 0x73e: 0x8d, 0x73f: 0x8d, + // Block 0x1d, offset 0x740 + 0x740: 0x8d, 0x741: 0x8d, 0x742: 0x8d, 0x743: 0x8d, 0x744: 0x8d, 0x745: 0x8d, 0x746: 0x8d, 0x747: 0x8d, + 0x748: 0x8d, 0x749: 0x8d, 0x74a: 0x8d, 0x74b: 0x8d, 0x74c: 0x8d, 0x74d: 0x8d, 0x74e: 0x8d, 0x74f: 0x8d, + 0x750: 0x8d, 0x751: 0x8d, 0x752: 0x8d, 0x753: 0x8d, 0x754: 0x8d, 0x755: 0x8d, 0x756: 0x8d, 0x757: 0x8d, + 0x758: 0x8d, 0x759: 0x8d, 0x75a: 0x8d, 0x75b: 0x8d, 0x75c: 0x169, 0x75d: 0x8d, 0x75e: 0x8d, 0x75f: 0x8d, + 0x760: 0x16a, 0x761: 0x8d, 0x762: 0x8d, 0x763: 0x8d, 0x764: 0x8d, 0x765: 0x8d, 0x766: 0x8d, 0x767: 0x8d, + 0x768: 0x8d, 0x769: 0x8d, 0x76a: 0x8d, 0x76b: 0x8d, 0x76c: 0x8d, 0x76d: 0x8d, 0x76e: 0x8d, 0x76f: 0x8d, + 0x770: 0x8d, 0x771: 0x8d, 0x772: 0x8d, 0x773: 0x8d, 0x774: 0x8d, 0x775: 0x8d, 0x776: 0x8d, 0x777: 0x8d, + 0x778: 0x8d, 0x779: 0x8d, 0x77a: 0x8d, 0x77b: 0x8d, 0x77c: 0x8d, 0x77d: 0x8d, 0x77e: 0x8d, 0x77f: 0x8d, + // Block 0x1e, offset 0x780 + 0x780: 0x8d, 0x781: 0x8d, 0x782: 0x8d, 0x783: 0x8d, 0x784: 0x8d, 0x785: 0x8d, 0x786: 0x8d, 0x787: 0x8d, + 0x788: 0x8d, 0x789: 0x8d, 0x78a: 0x8d, 0x78b: 0x8d, 0x78c: 0x8d, 0x78d: 0x8d, 0x78e: 0x8d, 0x78f: 0x8d, + 0x790: 0x8d, 0x791: 0x8d, 0x792: 0x8d, 0x793: 0x8d, 0x794: 0x8d, 0x795: 0x8d, 0x796: 0x8d, 0x797: 0x8d, + 0x798: 0x8d, 0x799: 0x8d, 0x79a: 0x8d, 0x79b: 0x8d, 0x79c: 0x8d, 0x79d: 0x8d, 0x79e: 0x8d, 0x79f: 0x8d, + 0x7a0: 0x8d, 0x7a1: 0x8d, 0x7a2: 0x8d, 0x7a3: 0x8d, 0x7a4: 0x8d, 0x7a5: 0x8d, 0x7a6: 0x8d, 0x7a7: 0x8d, + 0x7a8: 0x8d, 0x7a9: 0x8d, 0x7aa: 0x8d, 0x7ab: 0x8d, 0x7ac: 0x8d, 0x7ad: 0x8d, 0x7ae: 0x8d, 0x7af: 0x8d, + 0x7b0: 0x8d, 0x7b1: 0x8d, 0x7b2: 0x8d, 0x7b3: 0x8d, 0x7b4: 0x8d, 0x7b5: 0x8d, 0x7b6: 0x8d, 0x7b7: 0x8d, + 0x7b8: 0x8d, 0x7b9: 0x8d, 0x7ba: 0x16b, 0x7bb: 0x8d, 0x7bc: 0x8d, 0x7bd: 0x8d, 0x7be: 0x8d, 0x7bf: 0x8d, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x8d, 0x7c1: 0x8d, 0x7c2: 0x8d, 0x7c3: 0x8d, 0x7c4: 0x8d, 0x7c5: 0x8d, 0x7c6: 0x8d, 0x7c7: 0x8d, + 0x7c8: 0x8d, 0x7c9: 0x8d, 0x7ca: 0x8d, 0x7cb: 0x8d, 0x7cc: 0x8d, 0x7cd: 0x8d, 0x7ce: 0x8d, 0x7cf: 0x8d, + 0x7d0: 0x8d, 0x7d1: 0x8d, 0x7d2: 0x8d, 0x7d3: 0x8d, 0x7d4: 0x8d, 0x7d5: 0x8d, 0x7d6: 0x8d, 0x7d7: 0x8d, + 0x7d8: 0x8d, 0x7d9: 0x8d, 0x7da: 0x8d, 0x7db: 0x8d, 0x7dc: 0x8d, 0x7dd: 0x8d, 0x7de: 0x8d, 0x7df: 0x8d, + 0x7e0: 0x8d, 0x7e1: 0x8d, 0x7e2: 0x8d, 0x7e3: 0x8d, 0x7e4: 0x8d, 0x7e5: 0x8d, 0x7e6: 0x8d, 0x7e7: 0x8d, + 0x7e8: 0x8d, 0x7e9: 0x8d, 0x7ea: 0x8d, 0x7eb: 0x8d, 0x7ec: 0x8d, 0x7ed: 0x8d, 0x7ee: 0x8d, 0x7ef: 0x16c, + // Block 0x20, offset 0x800 + 0x820: 0x80, 0x821: 0x80, 0x822: 0x80, 0x823: 0x80, 0x824: 0x80, 0x825: 0x80, 0x826: 0x80, 0x827: 0x80, + 0x828: 0x16d, + // Block 0x21, offset 0x840 + 0x840: 0x8d, 0x841: 0x8d, 0x842: 0x8d, 0x843: 0x8d, 0x844: 0x8d, 0x845: 0x8d, 0x846: 0x8d, 0x847: 0x8d, + 0x848: 0x8d, 0x849: 0x8d, 0x84a: 0x8d, 0x84b: 0x8d, 0x84c: 0x8d, 0x84d: 0x16e, 0x84e: 0x8d, 0x84f: 0x8d, + 0x850: 0x8d, 0x851: 0x8d, 0x852: 0x8d, 0x853: 0x8d, 0x854: 0x8d, 0x855: 0x8d, 0x856: 0x8d, 0x857: 0x8d, + 0x858: 0x8d, 0x859: 0x8d, 0x85a: 0x8d, 0x85b: 0x8d, 0x85c: 0x8d, 0x85d: 0x8d, 0x85e: 0x8d, 0x85f: 0x8d, + 0x860: 0x8d, 0x861: 0x8d, 0x862: 0x8d, 0x863: 0x8d, 0x864: 0x8d, 0x865: 0x8d, 0x866: 0x8d, 0x867: 0x8d, + 0x868: 0x8d, 0x869: 0x8d, 0x86a: 0x8d, 0x86b: 0x8d, 0x86c: 0x8d, 0x86d: 0x8d, 0x86e: 0x8d, 0x86f: 0x8d, + 0x870: 0x8d, 0x871: 0x8d, 0x872: 0x8d, 0x873: 0x8d, 0x874: 0x8d, 0x875: 0x8d, 0x876: 0x8d, 0x877: 0x8d, + 0x878: 0x8d, 0x879: 0x8d, 0x87a: 0x8d, 0x87b: 0x8d, 0x87c: 0x8d, 0x87d: 0x8d, 0x87e: 0x8d, 0x87f: 0x8d, + // Block 0x22, offset 0x880 + 0x880: 0x8d, 0x881: 0x8d, 0x882: 0x8d, 0x883: 0x8d, 0x884: 0x8d, 0x885: 0x8d, 0x886: 0x8d, 0x887: 0x8d, + 0x888: 0x8d, 0x889: 0x8d, 0x88a: 0x8d, 0x88b: 0x8d, 0x88c: 0x8d, 0x88d: 0x8d, 0x88e: 0x16f, + // Block 0x23, offset 0x8c0 + 0x8d0: 0x0d, 0x8d1: 0x0e, 0x8d2: 0x0f, 0x8d3: 0x10, 0x8d4: 0x11, 0x8d6: 0x12, 0x8d7: 0x09, + 0x8d8: 0x13, 0x8da: 0x14, 0x8db: 0x15, 0x8dc: 0x16, 0x8dd: 0x17, 0x8de: 0x18, 0x8df: 0x19, + 0x8e0: 0x07, 0x8e1: 0x07, 0x8e2: 0x07, 0x8e3: 0x07, 0x8e4: 0x07, 0x8e5: 0x07, 0x8e6: 0x07, 0x8e7: 0x07, + 0x8e8: 0x07, 0x8e9: 0x07, 0x8ea: 0x1a, 0x8eb: 0x1b, 0x8ec: 0x1c, 0x8ed: 0x07, 0x8ee: 0x1d, 0x8ef: 0x1e, + 0x8f0: 0x07, 0x8f1: 0x1f, 0x8f2: 0x20, + // Block 0x24, offset 0x900 + 0x900: 0x170, 0x901: 0x3e, 0x904: 0x3e, 0x905: 0x3e, 0x906: 0x3e, 0x907: 0x171, + // Block 0x25, offset 0x940 + 0x940: 0x3e, 0x941: 0x3e, 0x942: 0x3e, 0x943: 0x3e, 0x944: 0x3e, 0x945: 0x3e, 0x946: 0x3e, 0x947: 0x3e, + 0x948: 0x3e, 0x949: 0x3e, 0x94a: 0x3e, 0x94b: 0x3e, 0x94c: 0x3e, 0x94d: 0x3e, 0x94e: 0x3e, 0x94f: 0x3e, + 0x950: 0x3e, 0x951: 0x3e, 0x952: 0x3e, 0x953: 0x3e, 0x954: 0x3e, 0x955: 0x3e, 0x956: 0x3e, 0x957: 0x3e, + 0x958: 0x3e, 0x959: 0x3e, 0x95a: 0x3e, 0x95b: 0x3e, 0x95c: 0x3e, 0x95d: 0x3e, 0x95e: 0x3e, 0x95f: 0x3e, + 0x960: 0x3e, 0x961: 0x3e, 0x962: 0x3e, 0x963: 0x3e, 0x964: 0x3e, 0x965: 0x3e, 0x966: 0x3e, 0x967: 0x3e, + 0x968: 0x3e, 0x969: 0x3e, 0x96a: 0x3e, 0x96b: 0x3e, 0x96c: 0x3e, 0x96d: 0x3e, 0x96e: 0x3e, 0x96f: 0x3e, + 0x970: 0x3e, 0x971: 0x3e, 0x972: 0x3e, 0x973: 0x3e, 0x974: 0x3e, 0x975: 0x3e, 0x976: 0x3e, 0x977: 0x3e, + 0x978: 0x3e, 0x979: 0x3e, 0x97a: 0x3e, 0x97b: 0x3e, 0x97c: 0x3e, 0x97d: 0x3e, 0x97e: 0x3e, 0x97f: 0x172, + // Block 0x26, offset 0x980 + 0x9a0: 0x22, + 0x9b0: 0x0b, 0x9b1: 0x0b, 0x9b2: 0x0b, 0x9b3: 0x0b, 0x9b4: 0x0b, 0x9b5: 0x0b, 0x9b6: 0x0b, 0x9b7: 0x0b, + 0x9b8: 0x0b, 0x9b9: 0x0b, 0x9ba: 0x0b, 0x9bb: 0x0b, 0x9bc: 0x0b, 0x9bd: 0x0b, 0x9be: 0x0b, 0x9bf: 0x23, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0b, 0x9c1: 0x0b, 0x9c2: 0x0b, 0x9c3: 0x0b, 0x9c4: 0x0b, 0x9c5: 0x0b, 0x9c6: 0x0b, 0x9c7: 0x0b, + 0x9c8: 0x0b, 0x9c9: 0x0b, 0x9ca: 0x0b, 0x9cb: 0x0b, 0x9cc: 0x0b, 0x9cd: 0x0b, 0x9ce: 0x0b, 0x9cf: 0x23, +} + +// Total table size 28992 bytes (28KiB); checksum: 811C9DC5 diff --git a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go index f248effae1..ffadb7bebd 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go new file mode 100644 index 0000000000..92cce5802c --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go @@ -0,0 +1,2043 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 19904 bytes (19.44 KiB). Checksum: b1f201ed2debb6c8. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 259 blocks, 16576 entries, 16576 bytes +// The third block is the zero block. +var bidiValues = [16576]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x000d, 0x5f1: 0x000d, 0x5f2: 0x000d, 0x5f3: 0x000d, 0x5f4: 0x000d, 0x5f5: 0x000d, + 0x5f6: 0x000d, 0x5f7: 0x000d, 0x5f8: 0x000d, 0x5f9: 0x000d, 0x5fa: 0x000d, 0x5fb: 0x000d, + 0x5fc: 0x000d, 0x5fd: 0x000d, 0x5fe: 0x000d, 0x5ff: 0x000d, + // Block 0x18, offset 0x600 + 0x600: 0x000d, 0x601: 0x000d, 0x602: 0x000d, 0x603: 0x000d, 0x604: 0x000d, 0x605: 0x000d, + 0x606: 0x000d, 0x607: 0x000d, 0x608: 0x000d, 0x609: 0x000d, 0x60a: 0x000d, 0x60b: 0x000d, + 0x60c: 0x000d, 0x60d: 0x000d, 0x60e: 0x000d, 0x60f: 0x0001, 0x610: 0x0005, 0x611: 0x0005, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x000c, 0x619: 0x000c, 0x61a: 0x000c, 0x61b: 0x000c, 0x61c: 0x000c, 0x61d: 0x000c, + 0x61e: 0x000c, 0x61f: 0x000c, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000c, 0x64b: 0x000c, + 0x64c: 0x000c, 0x64d: 0x000c, 0x64e: 0x000c, 0x64f: 0x000c, 0x650: 0x000c, 0x651: 0x000c, + 0x652: 0x000c, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + 0x77e: 0x000c, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x895: 0x000c, 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, 0x944: 0x000c, + 0x97c: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa81: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaca: 0x000c, + 0xad2: 0x000c, 0xad3: 0x000c, 0xad4: 0x000c, 0xad6: 0x000c, + // Block 0x2c, offset 0xb00 + 0xb31: 0x000c, 0xb34: 0x000c, 0xb35: 0x000c, + 0xb36: 0x000c, 0xb37: 0x000c, 0xb38: 0x000c, 0xb39: 0x000c, 0xb3a: 0x000c, + 0xb3f: 0x0004, + // Block 0x2d, offset 0xb40 + 0xb47: 0x000c, 0xb48: 0x000c, 0xb49: 0x000c, 0xb4a: 0x000c, 0xb4b: 0x000c, + 0xb4c: 0x000c, 0xb4d: 0x000c, 0xb4e: 0x000c, + // Block 0x2e, offset 0xb80 + 0xbb1: 0x000c, 0xbb4: 0x000c, 0xbb5: 0x000c, + 0xbb6: 0x000c, 0xbb7: 0x000c, 0xbb8: 0x000c, 0xbb9: 0x000c, 0xbba: 0x000c, 0xbbb: 0x000c, + 0xbbc: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbc8: 0x000c, 0xbc9: 0x000c, 0xbca: 0x000c, 0xbcb: 0x000c, + 0xbcc: 0x000c, 0xbcd: 0x000c, 0xbce: 0x000c, + // Block 0x30, offset 0xc00 + 0xc18: 0x000c, 0xc19: 0x000c, + 0xc35: 0x000c, + 0xc37: 0x000c, 0xc39: 0x000c, 0xc3a: 0x003a, 0xc3b: 0x002a, + 0xc3c: 0x003a, 0xc3d: 0x002a, + // Block 0x31, offset 0xc40 + 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, 0xc7d: 0x000c, 0xc7e: 0x000c, + // Block 0x32, offset 0xc80 + 0xc80: 0x000c, 0xc81: 0x000c, 0xc82: 0x000c, 0xc83: 0x000c, 0xc84: 0x000c, + 0xc86: 0x000c, 0xc87: 0x000c, + 0xc8d: 0x000c, 0xc8e: 0x000c, 0xc8f: 0x000c, 0xc90: 0x000c, 0xc91: 0x000c, + 0xc92: 0x000c, 0xc93: 0x000c, 0xc94: 0x000c, 0xc95: 0x000c, 0xc96: 0x000c, 0xc97: 0x000c, + 0xc99: 0x000c, 0xc9a: 0x000c, 0xc9b: 0x000c, 0xc9c: 0x000c, 0xc9d: 0x000c, + 0xc9e: 0x000c, 0xc9f: 0x000c, 0xca0: 0x000c, 0xca1: 0x000c, 0xca2: 0x000c, 0xca3: 0x000c, + 0xca4: 0x000c, 0xca5: 0x000c, 0xca6: 0x000c, 0xca7: 0x000c, 0xca8: 0x000c, 0xca9: 0x000c, + 0xcaa: 0x000c, 0xcab: 0x000c, 0xcac: 0x000c, 0xcad: 0x000c, 0xcae: 0x000c, 0xcaf: 0x000c, + 0xcb0: 0x000c, 0xcb1: 0x000c, 0xcb2: 0x000c, 0xcb3: 0x000c, 0xcb4: 0x000c, 0xcb5: 0x000c, + 0xcb6: 0x000c, 0xcb7: 0x000c, 0xcb8: 0x000c, 0xcb9: 0x000c, 0xcba: 0x000c, 0xcbb: 0x000c, + 0xcbc: 0x000c, + // Block 0x33, offset 0xcc0 + 0xcc6: 0x000c, + // Block 0x34, offset 0xd00 + 0xd2d: 0x000c, 0xd2e: 0x000c, 0xd2f: 0x000c, + 0xd30: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, 0xd35: 0x000c, + 0xd36: 0x000c, 0xd37: 0x000c, 0xd39: 0x000c, 0xd3a: 0x000c, + 0xd3d: 0x000c, 0xd3e: 0x000c, + // Block 0x35, offset 0xd40 + 0xd58: 0x000c, 0xd59: 0x000c, + 0xd5e: 0x000c, 0xd5f: 0x000c, 0xd60: 0x000c, + 0xd71: 0x000c, 0xd72: 0x000c, 0xd73: 0x000c, 0xd74: 0x000c, + // Block 0x36, offset 0xd80 + 0xd82: 0x000c, 0xd85: 0x000c, + 0xd86: 0x000c, + 0xd8d: 0x000c, + 0xd9d: 0x000c, + // Block 0x37, offset 0xdc0 + 0xddd: 0x000c, + 0xdde: 0x000c, 0xddf: 0x000c, + // Block 0x38, offset 0xe00 + 0xe10: 0x000a, 0xe11: 0x000a, + 0xe12: 0x000a, 0xe13: 0x000a, 0xe14: 0x000a, 0xe15: 0x000a, 0xe16: 0x000a, 0xe17: 0x000a, + 0xe18: 0x000a, 0xe19: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x000a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x0009, + 0xe9b: 0x007a, 0xe9c: 0x006a, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, 0xed4: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf12: 0x000c, 0xf13: 0x000c, + 0xf32: 0x000c, 0xf33: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf74: 0x000c, 0xf75: 0x000c, + 0xf77: 0x000c, 0xf78: 0x000c, 0xf79: 0x000c, 0xf7a: 0x000c, 0xf7b: 0x000c, + 0xf7c: 0x000c, 0xf7d: 0x000c, + // Block 0x3e, offset 0xf80 + 0xf86: 0x000c, 0xf89: 0x000c, 0xf8a: 0x000c, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000c, 0xf8f: 0x000c, 0xf90: 0x000c, 0xf91: 0x000c, + 0xf92: 0x000c, 0xf93: 0x000c, + 0xf9b: 0x0004, 0xf9d: 0x000c, + 0xfb0: 0x000a, 0xfb1: 0x000a, 0xfb2: 0x000a, 0xfb3: 0x000a, 0xfb4: 0x000a, 0xfb5: 0x000a, + 0xfb6: 0x000a, 0xfb7: 0x000a, 0xfb8: 0x000a, 0xfb9: 0x000a, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x000a, 0xfc1: 0x000a, 0xfc2: 0x000a, 0xfc3: 0x000a, 0xfc4: 0x000a, 0xfc5: 0x000a, + 0xfc6: 0x000a, 0xfc7: 0x000a, 0xfc8: 0x000a, 0xfc9: 0x000a, 0xfca: 0x000a, 0xfcb: 0x000c, + 0xfcc: 0x000c, 0xfcd: 0x000c, 0xfce: 0x000b, 0xfcf: 0x000c, + // Block 0x40, offset 0x1000 + 0x1005: 0x000c, + 0x1006: 0x000c, + 0x1029: 0x000c, + // Block 0x41, offset 0x1040 + 0x1060: 0x000c, 0x1061: 0x000c, 0x1062: 0x000c, + 0x1067: 0x000c, 0x1068: 0x000c, + 0x1072: 0x000c, + 0x1079: 0x000c, 0x107a: 0x000c, 0x107b: 0x000c, + // Block 0x42, offset 0x1080 + 0x1080: 0x000a, 0x1084: 0x000a, 0x1085: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10de: 0x000a, 0x10df: 0x000a, 0x10e0: 0x000a, 0x10e1: 0x000a, 0x10e2: 0x000a, 0x10e3: 0x000a, + 0x10e4: 0x000a, 0x10e5: 0x000a, 0x10e6: 0x000a, 0x10e7: 0x000a, 0x10e8: 0x000a, 0x10e9: 0x000a, + 0x10ea: 0x000a, 0x10eb: 0x000a, 0x10ec: 0x000a, 0x10ed: 0x000a, 0x10ee: 0x000a, 0x10ef: 0x000a, + 0x10f0: 0x000a, 0x10f1: 0x000a, 0x10f2: 0x000a, 0x10f3: 0x000a, 0x10f4: 0x000a, 0x10f5: 0x000a, + 0x10f6: 0x000a, 0x10f7: 0x000a, 0x10f8: 0x000a, 0x10f9: 0x000a, 0x10fa: 0x000a, 0x10fb: 0x000a, + 0x10fc: 0x000a, 0x10fd: 0x000a, 0x10fe: 0x000a, 0x10ff: 0x000a, + // Block 0x44, offset 0x1100 + 0x1117: 0x000c, + 0x1118: 0x000c, 0x111b: 0x000c, + // Block 0x45, offset 0x1140 + 0x1156: 0x000c, + 0x1158: 0x000c, 0x1159: 0x000c, 0x115a: 0x000c, 0x115b: 0x000c, 0x115c: 0x000c, 0x115d: 0x000c, + 0x115e: 0x000c, 0x1160: 0x000c, 0x1162: 0x000c, + 0x1165: 0x000c, 0x1166: 0x000c, 0x1167: 0x000c, 0x1168: 0x000c, 0x1169: 0x000c, + 0x116a: 0x000c, 0x116b: 0x000c, 0x116c: 0x000c, + 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117f: 0x000c, + // Block 0x46, offset 0x1180 + 0x11b0: 0x000c, 0x11b1: 0x000c, 0x11b2: 0x000c, 0x11b3: 0x000c, 0x11b4: 0x000c, 0x11b5: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bb: 0x000c, + 0x11bc: 0x000c, 0x11bd: 0x000c, 0x11be: 0x000c, 0x11bf: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x000c, 0x11c1: 0x000c, 0x11c2: 0x000c, 0x11c3: 0x000c, 0x11c4: 0x000c, 0x11c5: 0x000c, + 0x11c6: 0x000c, 0x11c7: 0x000c, 0x11c8: 0x000c, 0x11c9: 0x000c, 0x11ca: 0x000c, 0x11cb: 0x000c, + 0x11cc: 0x000c, 0x11cd: 0x000c, 0x11ce: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, 0x1202: 0x000c, 0x1203: 0x000c, + 0x1234: 0x000c, + 0x1236: 0x000c, 0x1237: 0x000c, 0x1238: 0x000c, 0x1239: 0x000c, 0x123a: 0x000c, + 0x123c: 0x000c, + // Block 0x49, offset 0x1240 + 0x1242: 0x000c, + 0x126b: 0x000c, 0x126c: 0x000c, 0x126d: 0x000c, 0x126e: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, 0x1272: 0x000c, 0x1273: 0x000c, + // Block 0x4a, offset 0x1280 + 0x1280: 0x000c, 0x1281: 0x000c, + 0x12a2: 0x000c, 0x12a3: 0x000c, + 0x12a4: 0x000c, 0x12a5: 0x000c, 0x12a8: 0x000c, 0x12a9: 0x000c, + 0x12ab: 0x000c, 0x12ac: 0x000c, 0x12ad: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12e6: 0x000c, 0x12e8: 0x000c, 0x12e9: 0x000c, + 0x12ed: 0x000c, 0x12ef: 0x000c, + 0x12f0: 0x000c, 0x12f1: 0x000c, + // Block 0x4c, offset 0x1300 + 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, + // Block 0x4d, offset 0x1340 + 0x1350: 0x000c, 0x1351: 0x000c, + 0x1352: 0x000c, 0x1354: 0x000c, 0x1355: 0x000c, 0x1356: 0x000c, 0x1357: 0x000c, + 0x1358: 0x000c, 0x1359: 0x000c, 0x135a: 0x000c, 0x135b: 0x000c, 0x135c: 0x000c, 0x135d: 0x000c, + 0x135e: 0x000c, 0x135f: 0x000c, 0x1360: 0x000c, 0x1362: 0x000c, 0x1363: 0x000c, + 0x1364: 0x000c, 0x1365: 0x000c, 0x1366: 0x000c, 0x1367: 0x000c, 0x1368: 0x000c, + 0x136d: 0x000c, + 0x1374: 0x000c, + 0x1378: 0x000c, 0x1379: 0x000c, + // Block 0x4e, offset 0x1380 + 0x13bd: 0x000a, 0x13bf: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x000a, 0x13c1: 0x000a, + 0x13cd: 0x000a, 0x13ce: 0x000a, 0x13cf: 0x000a, + 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, + 0x13ed: 0x000a, 0x13ee: 0x000a, 0x13ef: 0x000a, + 0x13fd: 0x000a, 0x13fe: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x0009, 0x1401: 0x0009, 0x1402: 0x0009, 0x1403: 0x0009, 0x1404: 0x0009, 0x1405: 0x0009, + 0x1406: 0x0009, 0x1407: 0x0009, 0x1408: 0x0009, 0x1409: 0x0009, 0x140a: 0x0009, 0x140b: 0x000b, + 0x140c: 0x000b, 0x140d: 0x000b, 0x140f: 0x0001, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x000a, 0x1420: 0x000a, 0x1421: 0x000a, 0x1422: 0x000a, 0x1423: 0x000a, + 0x1424: 0x000a, 0x1425: 0x000a, 0x1426: 0x000a, 0x1427: 0x000a, 0x1428: 0x0009, 0x1429: 0x0007, + 0x142a: 0x000e, 0x142b: 0x000e, 0x142c: 0x000e, 0x142d: 0x000e, 0x142e: 0x000e, 0x142f: 0x0006, + 0x1430: 0x0004, 0x1431: 0x0004, 0x1432: 0x0004, 0x1433: 0x0004, 0x1434: 0x0004, 0x1435: 0x000a, + 0x1436: 0x000a, 0x1437: 0x000a, 0x1438: 0x000a, 0x1439: 0x000a, 0x143a: 0x000a, 0x143b: 0x000a, + 0x143c: 0x000a, 0x143d: 0x000a, 0x143e: 0x000a, 0x143f: 0x000a, + // Block 0x51, offset 0x1440 + 0x1440: 0x000a, 0x1441: 0x000a, 0x1442: 0x000a, 0x1443: 0x000a, 0x1444: 0x0006, 0x1445: 0x009a, + 0x1446: 0x008a, 0x1447: 0x000a, 0x1448: 0x000a, 0x1449: 0x000a, 0x144a: 0x000a, 0x144b: 0x000a, + 0x144c: 0x000a, 0x144d: 0x000a, 0x144e: 0x000a, 0x144f: 0x000a, 0x1450: 0x000a, 0x1451: 0x000a, + 0x1452: 0x000a, 0x1453: 0x000a, 0x1454: 0x000a, 0x1455: 0x000a, 0x1456: 0x000a, 0x1457: 0x000a, + 0x1458: 0x000a, 0x1459: 0x000a, 0x145a: 0x000a, 0x145b: 0x000a, 0x145c: 0x000a, 0x145d: 0x000a, + 0x145e: 0x000a, 0x145f: 0x0009, 0x1460: 0x000b, 0x1461: 0x000b, 0x1462: 0x000b, 0x1463: 0x000b, + 0x1464: 0x000b, 0x1465: 0x000b, 0x1466: 0x000e, 0x1467: 0x000e, 0x1468: 0x000e, 0x1469: 0x000e, + 0x146a: 0x000b, 0x146b: 0x000b, 0x146c: 0x000b, 0x146d: 0x000b, 0x146e: 0x000b, 0x146f: 0x000b, + 0x1470: 0x0002, 0x1474: 0x0002, 0x1475: 0x0002, + 0x1476: 0x0002, 0x1477: 0x0002, 0x1478: 0x0002, 0x1479: 0x0002, 0x147a: 0x0003, 0x147b: 0x0003, + 0x147c: 0x000a, 0x147d: 0x009a, 0x147e: 0x008a, + // Block 0x52, offset 0x1480 + 0x1480: 0x0002, 0x1481: 0x0002, 0x1482: 0x0002, 0x1483: 0x0002, 0x1484: 0x0002, 0x1485: 0x0002, + 0x1486: 0x0002, 0x1487: 0x0002, 0x1488: 0x0002, 0x1489: 0x0002, 0x148a: 0x0003, 0x148b: 0x0003, + 0x148c: 0x000a, 0x148d: 0x009a, 0x148e: 0x008a, + 0x14a0: 0x0004, 0x14a1: 0x0004, 0x14a2: 0x0004, 0x14a3: 0x0004, + 0x14a4: 0x0004, 0x14a5: 0x0004, 0x14a6: 0x0004, 0x14a7: 0x0004, 0x14a8: 0x0004, 0x14a9: 0x0004, + 0x14aa: 0x0004, 0x14ab: 0x0004, 0x14ac: 0x0004, 0x14ad: 0x0004, 0x14ae: 0x0004, 0x14af: 0x0004, + 0x14b0: 0x0004, 0x14b1: 0x0004, 0x14b2: 0x0004, 0x14b3: 0x0004, 0x14b4: 0x0004, 0x14b5: 0x0004, + 0x14b6: 0x0004, 0x14b7: 0x0004, 0x14b8: 0x0004, 0x14b9: 0x0004, 0x14ba: 0x0004, 0x14bb: 0x0004, + 0x14bc: 0x0004, 0x14bd: 0x0004, 0x14be: 0x0004, 0x14bf: 0x0004, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0004, 0x14c1: 0x0004, 0x14c2: 0x0004, 0x14c3: 0x0004, 0x14c4: 0x0004, 0x14c5: 0x0004, + 0x14c6: 0x0004, 0x14c7: 0x0004, 0x14c8: 0x0004, 0x14c9: 0x0004, 0x14ca: 0x0004, 0x14cb: 0x0004, + 0x14cc: 0x0004, 0x14cd: 0x0004, 0x14ce: 0x0004, 0x14cf: 0x0004, 0x14d0: 0x000c, 0x14d1: 0x000c, + 0x14d2: 0x000c, 0x14d3: 0x000c, 0x14d4: 0x000c, 0x14d5: 0x000c, 0x14d6: 0x000c, 0x14d7: 0x000c, + 0x14d8: 0x000c, 0x14d9: 0x000c, 0x14da: 0x000c, 0x14db: 0x000c, 0x14dc: 0x000c, 0x14dd: 0x000c, + 0x14de: 0x000c, 0x14df: 0x000c, 0x14e0: 0x000c, 0x14e1: 0x000c, 0x14e2: 0x000c, 0x14e3: 0x000c, + 0x14e4: 0x000c, 0x14e5: 0x000c, 0x14e6: 0x000c, 0x14e7: 0x000c, 0x14e8: 0x000c, 0x14e9: 0x000c, + 0x14ea: 0x000c, 0x14eb: 0x000c, 0x14ec: 0x000c, 0x14ed: 0x000c, 0x14ee: 0x000c, 0x14ef: 0x000c, + 0x14f0: 0x000c, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x1505: 0x000a, + 0x1506: 0x000a, 0x1508: 0x000a, 0x1509: 0x000a, + 0x1514: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, 0x1520: 0x000a, 0x1521: 0x000a, 0x1522: 0x000a, 0x1523: 0x000a, + 0x1525: 0x000a, 0x1527: 0x000a, 0x1529: 0x000a, + 0x152e: 0x0004, + 0x153a: 0x000a, 0x153b: 0x000a, + // Block 0x55, offset 0x1540 + 0x1540: 0x000a, 0x1541: 0x000a, 0x1542: 0x000a, 0x1543: 0x000a, 0x1544: 0x000a, + 0x154a: 0x000a, 0x154b: 0x000a, + 0x154c: 0x000a, 0x154d: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x000a, 0x15d3: 0x000a, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x000a, 0x1609: 0x000a, 0x160a: 0x000a, 0x160b: 0x000a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x0003, 0x1613: 0x0004, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x000a, + 0x162a: 0x000a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + 0x1636: 0x000a, 0x1637: 0x000a, 0x1638: 0x000a, 0x1639: 0x000a, 0x163a: 0x000a, 0x163b: 0x000a, + 0x163c: 0x000a, 0x163d: 0x000a, 0x163e: 0x000a, 0x163f: 0x000a, + // Block 0x59, offset 0x1640 + 0x1640: 0x000a, 0x1641: 0x000a, 0x1642: 0x000a, 0x1643: 0x000a, 0x1644: 0x000a, 0x1645: 0x000a, + 0x1646: 0x000a, 0x1647: 0x000a, 0x1648: 0x003a, 0x1649: 0x002a, 0x164a: 0x003a, 0x164b: 0x002a, + 0x164c: 0x000a, 0x164d: 0x000a, 0x164e: 0x000a, 0x164f: 0x000a, 0x1650: 0x000a, 0x1651: 0x000a, + 0x1652: 0x000a, 0x1653: 0x000a, 0x1654: 0x000a, 0x1655: 0x000a, 0x1656: 0x000a, 0x1657: 0x000a, + 0x1658: 0x000a, 0x1659: 0x000a, 0x165a: 0x000a, 0x165b: 0x000a, 0x165c: 0x000a, 0x165d: 0x000a, + 0x165e: 0x000a, 0x165f: 0x000a, 0x1660: 0x000a, 0x1661: 0x000a, 0x1662: 0x000a, 0x1663: 0x000a, + 0x1664: 0x000a, 0x1665: 0x000a, 0x1666: 0x000a, 0x1667: 0x000a, 0x1668: 0x000a, 0x1669: 0x009a, + 0x166a: 0x008a, 0x166b: 0x000a, 0x166c: 0x000a, 0x166d: 0x000a, 0x166e: 0x000a, 0x166f: 0x000a, + 0x1670: 0x000a, 0x1671: 0x000a, 0x1672: 0x000a, 0x1673: 0x000a, 0x1674: 0x000a, 0x1675: 0x000a, + // Block 0x5a, offset 0x1680 + 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, + 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, + 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, + 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, + 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, 0x16ff: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, + 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, + 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, + 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, + 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, + 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, + 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, + 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, + 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, + 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, + 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, + // Block 0x5e, offset 0x1780 + 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, + 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, + 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, + 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, + 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, + 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, + 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, + 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, + 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, + 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, + 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, + 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, + 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, + 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, + 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, + 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1997: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a, + 0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, + 0x19ea: 0x000a, 0x19ef: 0x000c, + 0x19f0: 0x000c, 0x19f1: 0x000c, + 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, + 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, + 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, + 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, + 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, + 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, + 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, + 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, + 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, + 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, + 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, + 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, + 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, + 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, + 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x009a, 0x1ad6: 0x008a, 0x1ad7: 0x00ba, + 0x1ad8: 0x00aa, 0x1ad9: 0x009a, 0x1ada: 0x008a, 0x1adb: 0x007a, 0x1adc: 0x006a, 0x1add: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, + 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, + 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, + 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, + 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, + 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, + 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, + 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, + 0x1bf0: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, + 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, + 0x1c20: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c7b: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, + 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, + 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, + 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, + 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, + 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cdd: 0x000a, + 0x1cde: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d10: 0x000a, 0x1d11: 0x000a, + 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, + 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, + 0x1d1e: 0x000a, 0x1d1f: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, + 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e1e: 0x000a, 0x1e1f: 0x000a, + 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e50: 0x000a, 0x1e51: 0x000a, + 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, + 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, + 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, + 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, + 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, + 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, + 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, + 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, + 0x1e86: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f2f: 0x000c, + 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, + 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, + 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f5e: 0x000c, 0x1f5f: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1fb0: 0x000c, 0x1fb1: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, + 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, + 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, + 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, + 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, + 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, + // Block 0x80, offset 0x2000 + 0x2008: 0x000a, + // Block 0x81, offset 0x2040 + 0x2042: 0x000c, + 0x2046: 0x000c, 0x204b: 0x000c, + 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, + 0x206a: 0x000a, 0x206b: 0x000a, 0x206c: 0x000c, + 0x2078: 0x0004, 0x2079: 0x0004, + // Block 0x82, offset 0x2080 + 0x20b4: 0x000a, 0x20b5: 0x000a, + 0x20b6: 0x000a, 0x20b7: 0x000a, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x000c, 0x20c5: 0x000c, + 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, + 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, + 0x20f0: 0x000c, 0x20f1: 0x000c, + 0x20ff: 0x000c, + // Block 0x84, offset 0x2100 + 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, + // Block 0x85, offset 0x2140 + 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, + 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, + // Block 0x86, offset 0x2180 + 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, + 0x21b3: 0x000c, + 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, + 0x21bc: 0x000c, 0x21bd: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x000c, + // Block 0x88, offset 0x2200 + 0x2229: 0x000c, + 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, + 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, + 0x2236: 0x000c, + // Block 0x89, offset 0x2240 + 0x2243: 0x000c, + 0x224c: 0x000c, + 0x227c: 0x000c, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, + 0x22b7: 0x000c, 0x22b8: 0x000c, + 0x22be: 0x000c, 0x22bf: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x000c, + 0x22ec: 0x000c, 0x22ed: 0x000c, + 0x22f6: 0x000c, + // Block 0x8c, offset 0x2300 + 0x232a: 0x000a, 0x232b: 0x000a, + // Block 0x8d, offset 0x2340 + 0x2365: 0x000c, 0x2368: 0x000c, + 0x236d: 0x000c, + // Block 0x8e, offset 0x2380 + 0x239d: 0x0001, + 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, + 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, + 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, + 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, + 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, + 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000a, 0x2441: 0x000a, 0x2442: 0x000a, 0x2443: 0x000a, 0x2444: 0x000a, 0x2445: 0x000a, + 0x2446: 0x000a, 0x2447: 0x000a, 0x2448: 0x000a, 0x2449: 0x000a, 0x244a: 0x000a, 0x244b: 0x000a, + 0x244c: 0x000a, 0x244d: 0x000a, 0x244e: 0x000a, 0x244f: 0x000a, 0x2450: 0x000d, 0x2451: 0x000d, + 0x2452: 0x000d, 0x2453: 0x000d, 0x2454: 0x000d, 0x2455: 0x000d, 0x2456: 0x000d, 0x2457: 0x000d, + 0x2458: 0x000d, 0x2459: 0x000d, 0x245a: 0x000d, 0x245b: 0x000d, 0x245c: 0x000d, 0x245d: 0x000d, + 0x245e: 0x000d, 0x245f: 0x000d, 0x2460: 0x000d, 0x2461: 0x000d, 0x2462: 0x000d, 0x2463: 0x000d, + 0x2464: 0x000d, 0x2465: 0x000d, 0x2466: 0x000d, 0x2467: 0x000d, 0x2468: 0x000d, 0x2469: 0x000d, + 0x246a: 0x000d, 0x246b: 0x000d, 0x246c: 0x000d, 0x246d: 0x000d, 0x246e: 0x000d, 0x246f: 0x000d, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000d, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000d, 0x2481: 0x000d, 0x2482: 0x000d, 0x2483: 0x000d, 0x2484: 0x000d, 0x2485: 0x000d, + 0x2486: 0x000d, 0x2487: 0x000d, 0x2488: 0x000d, 0x2489: 0x000d, 0x248a: 0x000d, 0x248b: 0x000d, + 0x248c: 0x000d, 0x248d: 0x000d, 0x248e: 0x000d, 0x248f: 0x000a, 0x2490: 0x000b, 0x2491: 0x000b, + 0x2492: 0x000b, 0x2493: 0x000b, 0x2494: 0x000b, 0x2495: 0x000b, 0x2496: 0x000b, 0x2497: 0x000b, + 0x2498: 0x000b, 0x2499: 0x000b, 0x249a: 0x000b, 0x249b: 0x000b, 0x249c: 0x000b, 0x249d: 0x000b, + 0x249e: 0x000b, 0x249f: 0x000b, 0x24a0: 0x000b, 0x24a1: 0x000b, 0x24a2: 0x000b, 0x24a3: 0x000b, + 0x24a4: 0x000b, 0x24a5: 0x000b, 0x24a6: 0x000b, 0x24a7: 0x000b, 0x24a8: 0x000b, 0x24a9: 0x000b, + 0x24aa: 0x000b, 0x24ab: 0x000b, 0x24ac: 0x000b, 0x24ad: 0x000b, 0x24ae: 0x000b, 0x24af: 0x000b, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000c, 0x24c1: 0x000c, 0x24c2: 0x000c, 0x24c3: 0x000c, 0x24c4: 0x000c, 0x24c5: 0x000c, + 0x24c6: 0x000c, 0x24c7: 0x000c, 0x24c8: 0x000c, 0x24c9: 0x000c, 0x24ca: 0x000c, 0x24cb: 0x000c, + 0x24cc: 0x000c, 0x24cd: 0x000c, 0x24ce: 0x000c, 0x24cf: 0x000c, 0x24d0: 0x000a, 0x24d1: 0x000a, + 0x24d2: 0x000a, 0x24d3: 0x000a, 0x24d4: 0x000a, 0x24d5: 0x000a, 0x24d6: 0x000a, 0x24d7: 0x000a, + 0x24d8: 0x000a, 0x24d9: 0x000a, + 0x24e0: 0x000c, 0x24e1: 0x000c, 0x24e2: 0x000c, 0x24e3: 0x000c, + 0x24e4: 0x000c, 0x24e5: 0x000c, 0x24e6: 0x000c, 0x24e7: 0x000c, 0x24e8: 0x000c, 0x24e9: 0x000c, + 0x24ea: 0x000c, 0x24eb: 0x000c, 0x24ec: 0x000c, 0x24ed: 0x000c, 0x24ee: 0x000c, 0x24ef: 0x000c, + 0x24f0: 0x000a, 0x24f1: 0x000a, 0x24f2: 0x000a, 0x24f3: 0x000a, 0x24f4: 0x000a, 0x24f5: 0x000a, + 0x24f6: 0x000a, 0x24f7: 0x000a, 0x24f8: 0x000a, 0x24f9: 0x000a, 0x24fa: 0x000a, 0x24fb: 0x000a, + 0x24fc: 0x000a, 0x24fd: 0x000a, 0x24fe: 0x000a, 0x24ff: 0x000a, + // Block 0x94, offset 0x2500 + 0x2500: 0x000a, 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x000a, 0x2504: 0x000a, 0x2505: 0x000a, + 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x000a, 0x2509: 0x000a, 0x250a: 0x000a, 0x250b: 0x000a, + 0x250c: 0x000a, 0x250d: 0x000a, 0x250e: 0x000a, 0x250f: 0x000a, 0x2510: 0x0006, 0x2511: 0x000a, + 0x2512: 0x0006, 0x2514: 0x000a, 0x2515: 0x0006, 0x2516: 0x000a, 0x2517: 0x000a, + 0x2518: 0x000a, 0x2519: 0x009a, 0x251a: 0x008a, 0x251b: 0x007a, 0x251c: 0x006a, 0x251d: 0x009a, + 0x251e: 0x008a, 0x251f: 0x0004, 0x2520: 0x000a, 0x2521: 0x000a, 0x2522: 0x0003, 0x2523: 0x0003, + 0x2524: 0x000a, 0x2525: 0x000a, 0x2526: 0x000a, 0x2528: 0x000a, 0x2529: 0x0004, + 0x252a: 0x0004, 0x252b: 0x000a, + 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, + 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, + 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000d, + // Block 0x95, offset 0x2540 + 0x2540: 0x000d, 0x2541: 0x000d, 0x2542: 0x000d, 0x2543: 0x000d, 0x2544: 0x000d, 0x2545: 0x000d, + 0x2546: 0x000d, 0x2547: 0x000d, 0x2548: 0x000d, 0x2549: 0x000d, 0x254a: 0x000d, 0x254b: 0x000d, + 0x254c: 0x000d, 0x254d: 0x000d, 0x254e: 0x000d, 0x254f: 0x000d, 0x2550: 0x000d, 0x2551: 0x000d, + 0x2552: 0x000d, 0x2553: 0x000d, 0x2554: 0x000d, 0x2555: 0x000d, 0x2556: 0x000d, 0x2557: 0x000d, + 0x2558: 0x000d, 0x2559: 0x000d, 0x255a: 0x000d, 0x255b: 0x000d, 0x255c: 0x000d, 0x255d: 0x000d, + 0x255e: 0x000d, 0x255f: 0x000d, 0x2560: 0x000d, 0x2561: 0x000d, 0x2562: 0x000d, 0x2563: 0x000d, + 0x2564: 0x000d, 0x2565: 0x000d, 0x2566: 0x000d, 0x2567: 0x000d, 0x2568: 0x000d, 0x2569: 0x000d, + 0x256a: 0x000d, 0x256b: 0x000d, 0x256c: 0x000d, 0x256d: 0x000d, 0x256e: 0x000d, 0x256f: 0x000d, + 0x2570: 0x000d, 0x2571: 0x000d, 0x2572: 0x000d, 0x2573: 0x000d, 0x2574: 0x000d, 0x2575: 0x000d, + 0x2576: 0x000d, 0x2577: 0x000d, 0x2578: 0x000d, 0x2579: 0x000d, 0x257a: 0x000d, 0x257b: 0x000d, + 0x257c: 0x000d, 0x257d: 0x000d, 0x257e: 0x000d, 0x257f: 0x000b, + // Block 0x96, offset 0x2580 + 0x2581: 0x000a, 0x2582: 0x000a, 0x2583: 0x0004, 0x2584: 0x0004, 0x2585: 0x0004, + 0x2586: 0x000a, 0x2587: 0x000a, 0x2588: 0x003a, 0x2589: 0x002a, 0x258a: 0x000a, 0x258b: 0x0003, + 0x258c: 0x0006, 0x258d: 0x0003, 0x258e: 0x0006, 0x258f: 0x0006, 0x2590: 0x0002, 0x2591: 0x0002, + 0x2592: 0x0002, 0x2593: 0x0002, 0x2594: 0x0002, 0x2595: 0x0002, 0x2596: 0x0002, 0x2597: 0x0002, + 0x2598: 0x0002, 0x2599: 0x0002, 0x259a: 0x0006, 0x259b: 0x000a, 0x259c: 0x000a, 0x259d: 0x000a, + 0x259e: 0x000a, 0x259f: 0x000a, 0x25a0: 0x000a, + 0x25bb: 0x005a, + 0x25bc: 0x000a, 0x25bd: 0x004a, 0x25be: 0x000a, 0x25bf: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x000a, + 0x25db: 0x005a, 0x25dc: 0x000a, 0x25dd: 0x004a, + 0x25de: 0x000a, 0x25df: 0x00fa, 0x25e0: 0x00ea, 0x25e1: 0x000a, 0x25e2: 0x003a, 0x25e3: 0x002a, + 0x25e4: 0x000a, 0x25e5: 0x000a, + // Block 0x98, offset 0x2600 + 0x2620: 0x0004, 0x2621: 0x0004, 0x2622: 0x000a, 0x2623: 0x000a, + 0x2624: 0x000a, 0x2625: 0x0004, 0x2626: 0x0004, 0x2628: 0x000a, 0x2629: 0x000a, + 0x262a: 0x000a, 0x262b: 0x000a, 0x262c: 0x000a, 0x262d: 0x000a, 0x262e: 0x000a, + 0x2630: 0x000b, 0x2631: 0x000b, 0x2632: 0x000b, 0x2633: 0x000b, 0x2634: 0x000b, 0x2635: 0x000b, + 0x2636: 0x000b, 0x2637: 0x000b, 0x2638: 0x000b, 0x2639: 0x000a, 0x263a: 0x000a, 0x263b: 0x000a, + 0x263c: 0x000a, 0x263d: 0x000a, 0x263e: 0x000b, 0x263f: 0x000b, + // Block 0x99, offset 0x2640 + 0x2641: 0x000a, + // Block 0x9a, offset 0x2680 + 0x2680: 0x000a, 0x2681: 0x000a, 0x2682: 0x000a, 0x2683: 0x000a, 0x2684: 0x000a, 0x2685: 0x000a, + 0x2686: 0x000a, 0x2687: 0x000a, 0x2688: 0x000a, 0x2689: 0x000a, 0x268a: 0x000a, 0x268b: 0x000a, + 0x268c: 0x000a, 0x2690: 0x000a, 0x2691: 0x000a, + 0x2692: 0x000a, 0x2693: 0x000a, 0x2694: 0x000a, 0x2695: 0x000a, 0x2696: 0x000a, 0x2697: 0x000a, + 0x2698: 0x000a, 0x2699: 0x000a, 0x269a: 0x000a, 0x269b: 0x000a, 0x269c: 0x000a, + 0x26a0: 0x000a, + // Block 0x9b, offset 0x26c0 + 0x26fd: 0x000c, + // Block 0x9c, offset 0x2700 + 0x2720: 0x000c, 0x2721: 0x0002, 0x2722: 0x0002, 0x2723: 0x0002, + 0x2724: 0x0002, 0x2725: 0x0002, 0x2726: 0x0002, 0x2727: 0x0002, 0x2728: 0x0002, 0x2729: 0x0002, + 0x272a: 0x0002, 0x272b: 0x0002, 0x272c: 0x0002, 0x272d: 0x0002, 0x272e: 0x0002, 0x272f: 0x0002, + 0x2730: 0x0002, 0x2731: 0x0002, 0x2732: 0x0002, 0x2733: 0x0002, 0x2734: 0x0002, 0x2735: 0x0002, + 0x2736: 0x0002, 0x2737: 0x0002, 0x2738: 0x0002, 0x2739: 0x0002, 0x273a: 0x0002, 0x273b: 0x0002, + // Block 0x9d, offset 0x2740 + 0x2776: 0x000c, 0x2777: 0x000c, 0x2778: 0x000c, 0x2779: 0x000c, 0x277a: 0x000c, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x000a, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x000c, 0x2802: 0x000c, 0x2803: 0x000c, 0x2804: 0x0001, 0x2805: 0x000c, + 0x2806: 0x000c, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x000c, 0x280d: 0x000c, 0x280e: 0x000c, 0x280f: 0x000c, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x000c, 0x2839: 0x000c, 0x283a: 0x000c, 0x283b: 0x0001, + 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x000c, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, + 0x2864: 0x0001, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, + 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, + 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, + 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x0001, 0x287a: 0x0001, 0x287b: 0x0001, + 0x287c: 0x0001, 0x287d: 0x0001, 0x287e: 0x0001, 0x287f: 0x0001, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0001, 0x28a1: 0x0001, 0x28a2: 0x0001, 0x28a3: 0x0001, + 0x28a4: 0x0001, 0x28a5: 0x0001, 0x28a6: 0x0001, 0x28a7: 0x0001, 0x28a8: 0x0001, 0x28a9: 0x0001, + 0x28aa: 0x0001, 0x28ab: 0x0001, 0x28ac: 0x0001, 0x28ad: 0x0001, 0x28ae: 0x0001, 0x28af: 0x0001, + 0x28b0: 0x0001, 0x28b1: 0x0001, 0x28b2: 0x0001, 0x28b3: 0x0001, 0x28b4: 0x0001, 0x28b5: 0x0001, + 0x28b6: 0x0001, 0x28b7: 0x0001, 0x28b8: 0x0001, 0x28b9: 0x000a, 0x28ba: 0x000a, 0x28bb: 0x000a, + 0x28bc: 0x000a, 0x28bd: 0x000a, 0x28be: 0x000a, 0x28bf: 0x000a, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x000d, 0x28c1: 0x000d, 0x28c2: 0x000d, 0x28c3: 0x000d, 0x28c4: 0x000d, 0x28c5: 0x000d, + 0x28c6: 0x000d, 0x28c7: 0x000d, 0x28c8: 0x000d, 0x28c9: 0x000d, 0x28ca: 0x000d, 0x28cb: 0x000d, + 0x28cc: 0x000d, 0x28cd: 0x000d, 0x28ce: 0x000d, 0x28cf: 0x000d, 0x28d0: 0x000d, 0x28d1: 0x000d, + 0x28d2: 0x000d, 0x28d3: 0x000d, 0x28d4: 0x000d, 0x28d5: 0x000d, 0x28d6: 0x000d, 0x28d7: 0x000d, + 0x28d8: 0x000d, 0x28d9: 0x000d, 0x28da: 0x000d, 0x28db: 0x000d, 0x28dc: 0x000d, 0x28dd: 0x000d, + 0x28de: 0x000d, 0x28df: 0x000d, 0x28e0: 0x000d, 0x28e1: 0x000d, 0x28e2: 0x000d, 0x28e3: 0x000d, + 0x28e4: 0x000c, 0x28e5: 0x000c, 0x28e6: 0x000c, 0x28e7: 0x000c, 0x28e8: 0x0001, 0x28e9: 0x0001, + 0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001, + 0x28f0: 0x0005, 0x28f1: 0x0005, 0x28f2: 0x0005, 0x28f3: 0x0005, 0x28f4: 0x0005, 0x28f5: 0x0005, + 0x28f6: 0x0005, 0x28f7: 0x0005, 0x28f8: 0x0005, 0x28f9: 0x0005, 0x28fa: 0x0001, 0x28fb: 0x0001, + 0x28fc: 0x0001, 0x28fd: 0x0001, 0x28fe: 0x0001, 0x28ff: 0x0001, + // Block 0xa4, offset 0x2900 + 0x2900: 0x0001, 0x2901: 0x0001, 0x2902: 0x0001, 0x2903: 0x0001, 0x2904: 0x0001, 0x2905: 0x0001, + 0x2906: 0x0001, 0x2907: 0x0001, 0x2908: 0x0001, 0x2909: 0x0001, 0x290a: 0x0001, 0x290b: 0x0001, + 0x290c: 0x0001, 0x290d: 0x0001, 0x290e: 0x0001, 0x290f: 0x0001, 0x2910: 0x0001, 0x2911: 0x0001, + 0x2912: 0x0001, 0x2913: 0x0001, 0x2914: 0x0001, 0x2915: 0x0001, 0x2916: 0x0001, 0x2917: 0x0001, + 0x2918: 0x0001, 0x2919: 0x0001, 0x291a: 0x0001, 0x291b: 0x0001, 0x291c: 0x0001, 0x291d: 0x0001, + 0x291e: 0x0001, 0x291f: 0x0001, 0x2920: 0x0005, 0x2921: 0x0005, 0x2922: 0x0005, 0x2923: 0x0005, + 0x2924: 0x0005, 0x2925: 0x0005, 0x2926: 0x0005, 0x2927: 0x0005, 0x2928: 0x0005, 0x2929: 0x0005, + 0x292a: 0x0005, 0x292b: 0x0005, 0x292c: 0x0005, 0x292d: 0x0005, 0x292e: 0x0005, 0x292f: 0x0005, + 0x2930: 0x0005, 0x2931: 0x0005, 0x2932: 0x0005, 0x2933: 0x0005, 0x2934: 0x0005, 0x2935: 0x0005, + 0x2936: 0x0005, 0x2937: 0x0005, 0x2938: 0x0005, 0x2939: 0x0005, 0x293a: 0x0005, 0x293b: 0x0005, + 0x293c: 0x0005, 0x293d: 0x0005, 0x293e: 0x0005, 0x293f: 0x0001, + // Block 0xa5, offset 0x2940 + 0x2940: 0x0001, 0x2941: 0x0001, 0x2942: 0x0001, 0x2943: 0x0001, 0x2944: 0x0001, 0x2945: 0x0001, + 0x2946: 0x0001, 0x2947: 0x0001, 0x2948: 0x0001, 0x2949: 0x0001, 0x294a: 0x0001, 0x294b: 0x0001, + 0x294c: 0x0001, 0x294d: 0x0001, 0x294e: 0x0001, 0x294f: 0x0001, 0x2950: 0x0001, 0x2951: 0x0001, + 0x2952: 0x0001, 0x2953: 0x0001, 0x2954: 0x0001, 0x2955: 0x0001, 0x2956: 0x0001, 0x2957: 0x0001, + 0x2958: 0x0001, 0x2959: 0x0001, 0x295a: 0x0001, 0x295b: 0x0001, 0x295c: 0x0001, 0x295d: 0x0001, + 0x295e: 0x0001, 0x295f: 0x0001, 0x2960: 0x0001, 0x2961: 0x0001, 0x2962: 0x0001, 0x2963: 0x0001, + 0x2964: 0x0001, 0x2965: 0x0001, 0x2966: 0x0001, 0x2967: 0x0001, 0x2968: 0x0001, 0x2969: 0x0001, + 0x296a: 0x0001, 0x296b: 0x000c, 0x296c: 0x000c, 0x296d: 0x0001, 0x296e: 0x0001, 0x296f: 0x0001, + 0x2970: 0x0001, 0x2971: 0x0001, 0x2972: 0x0001, 0x2973: 0x0001, 0x2974: 0x0001, 0x2975: 0x0001, + 0x2976: 0x0001, 0x2977: 0x0001, 0x2978: 0x0001, 0x2979: 0x0001, 0x297a: 0x0001, 0x297b: 0x0001, + 0x297c: 0x0001, 0x297d: 0x0001, 0x297e: 0x0001, 0x297f: 0x0001, + // Block 0xa6, offset 0x2980 + 0x2980: 0x0001, 0x2981: 0x0001, 0x2982: 0x0001, 0x2983: 0x0001, 0x2984: 0x0001, 0x2985: 0x0001, + 0x2986: 0x0001, 0x2987: 0x0001, 0x2988: 0x0001, 0x2989: 0x0001, 0x298a: 0x0001, 0x298b: 0x0001, + 0x298c: 0x0001, 0x298d: 0x0001, 0x298e: 0x0001, 0x298f: 0x0001, 0x2990: 0x0001, 0x2991: 0x0001, + 0x2992: 0x0001, 0x2993: 0x0001, 0x2994: 0x0001, 0x2995: 0x0001, 0x2996: 0x0001, 0x2997: 0x0001, + 0x2998: 0x0001, 0x2999: 0x0001, 0x299a: 0x0001, 0x299b: 0x0001, 0x299c: 0x0001, 0x299d: 0x0001, + 0x299e: 0x0001, 0x299f: 0x0001, 0x29a0: 0x0001, 0x29a1: 0x0001, 0x29a2: 0x0001, 0x29a3: 0x0001, + 0x29a4: 0x0001, 0x29a5: 0x0001, 0x29a6: 0x0001, 0x29a7: 0x0001, 0x29a8: 0x0001, 0x29a9: 0x0001, + 0x29aa: 0x0001, 0x29ab: 0x0001, 0x29ac: 0x0001, 0x29ad: 0x0001, 0x29ae: 0x0001, 0x29af: 0x0001, + 0x29b0: 0x0001, 0x29b1: 0x0001, 0x29b2: 0x0001, 0x29b3: 0x0001, 0x29b4: 0x0001, 0x29b5: 0x0001, + 0x29b6: 0x0001, 0x29b7: 0x0001, 0x29b8: 0x0001, 0x29b9: 0x0001, 0x29ba: 0x0001, 0x29bb: 0x0001, + 0x29bc: 0x0001, 0x29bd: 0x000c, 0x29be: 0x000c, 0x29bf: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x0001, 0x29c1: 0x0001, 0x29c2: 0x0001, 0x29c3: 0x0001, 0x29c4: 0x0001, 0x29c5: 0x0001, + 0x29c6: 0x0001, 0x29c7: 0x0001, 0x29c8: 0x0001, 0x29c9: 0x0001, 0x29ca: 0x0001, 0x29cb: 0x0001, + 0x29cc: 0x0001, 0x29cd: 0x0001, 0x29ce: 0x0001, 0x29cf: 0x0001, 0x29d0: 0x0001, 0x29d1: 0x0001, + 0x29d2: 0x0001, 0x29d3: 0x0001, 0x29d4: 0x0001, 0x29d5: 0x0001, 0x29d6: 0x0001, 0x29d7: 0x0001, + 0x29d8: 0x0001, 0x29d9: 0x0001, 0x29da: 0x0001, 0x29db: 0x0001, 0x29dc: 0x0001, 0x29dd: 0x0001, + 0x29de: 0x0001, 0x29df: 0x0001, 0x29e0: 0x0001, 0x29e1: 0x0001, 0x29e2: 0x0001, 0x29e3: 0x0001, + 0x29e4: 0x0001, 0x29e5: 0x0001, 0x29e6: 0x0001, 0x29e7: 0x0001, 0x29e8: 0x0001, 0x29e9: 0x0001, + 0x29ea: 0x0001, 0x29eb: 0x0001, 0x29ec: 0x0001, 0x29ed: 0x0001, 0x29ee: 0x0001, 0x29ef: 0x0001, + 0x29f0: 0x000d, 0x29f1: 0x000d, 0x29f2: 0x000d, 0x29f3: 0x000d, 0x29f4: 0x000d, 0x29f5: 0x000d, + 0x29f6: 0x000d, 0x29f7: 0x000d, 0x29f8: 0x000d, 0x29f9: 0x000d, 0x29fa: 0x000d, 0x29fb: 0x000d, + 0x29fc: 0x000d, 0x29fd: 0x000d, 0x29fe: 0x000d, 0x29ff: 0x000d, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000d, 0x2a01: 0x000d, 0x2a02: 0x000d, 0x2a03: 0x000d, 0x2a04: 0x000d, 0x2a05: 0x000d, + 0x2a06: 0x000c, 0x2a07: 0x000c, 0x2a08: 0x000c, 0x2a09: 0x000c, 0x2a0a: 0x000c, 0x2a0b: 0x000c, + 0x2a0c: 0x000c, 0x2a0d: 0x000c, 0x2a0e: 0x000c, 0x2a0f: 0x000c, 0x2a10: 0x000c, 0x2a11: 0x000d, + 0x2a12: 0x000d, 0x2a13: 0x000d, 0x2a14: 0x000d, 0x2a15: 0x000d, 0x2a16: 0x000d, 0x2a17: 0x000d, + 0x2a18: 0x000d, 0x2a19: 0x000d, 0x2a1a: 0x0001, 0x2a1b: 0x0001, 0x2a1c: 0x0001, 0x2a1d: 0x0001, + 0x2a1e: 0x0001, 0x2a1f: 0x0001, 0x2a20: 0x0001, 0x2a21: 0x0001, 0x2a22: 0x0001, 0x2a23: 0x0001, + 0x2a24: 0x0001, 0x2a25: 0x0001, 0x2a26: 0x0001, 0x2a27: 0x0001, 0x2a28: 0x0001, 0x2a29: 0x0001, + 0x2a2a: 0x0001, 0x2a2b: 0x0001, 0x2a2c: 0x0001, 0x2a2d: 0x0001, 0x2a2e: 0x0001, 0x2a2f: 0x0001, + 0x2a30: 0x0001, 0x2a31: 0x0001, 0x2a32: 0x0001, 0x2a33: 0x0001, 0x2a34: 0x0001, 0x2a35: 0x0001, + 0x2a36: 0x0001, 0x2a37: 0x0001, 0x2a38: 0x0001, 0x2a39: 0x0001, 0x2a3a: 0x0001, 0x2a3b: 0x0001, + 0x2a3c: 0x0001, 0x2a3d: 0x0001, 0x2a3e: 0x0001, 0x2a3f: 0x0001, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0001, 0x2a41: 0x0001, 0x2a42: 0x000c, 0x2a43: 0x000c, 0x2a44: 0x000c, 0x2a45: 0x000c, + 0x2a46: 0x0001, 0x2a47: 0x0001, 0x2a48: 0x0001, 0x2a49: 0x0001, 0x2a4a: 0x0001, 0x2a4b: 0x0001, + 0x2a4c: 0x0001, 0x2a4d: 0x0001, 0x2a4e: 0x0001, 0x2a4f: 0x0001, 0x2a50: 0x0001, 0x2a51: 0x0001, + 0x2a52: 0x0001, 0x2a53: 0x0001, 0x2a54: 0x0001, 0x2a55: 0x0001, 0x2a56: 0x0001, 0x2a57: 0x0001, + 0x2a58: 0x0001, 0x2a59: 0x0001, 0x2a5a: 0x0001, 0x2a5b: 0x0001, 0x2a5c: 0x0001, 0x2a5d: 0x0001, + 0x2a5e: 0x0001, 0x2a5f: 0x0001, 0x2a60: 0x0001, 0x2a61: 0x0001, 0x2a62: 0x0001, 0x2a63: 0x0001, + 0x2a64: 0x0001, 0x2a65: 0x0001, 0x2a66: 0x0001, 0x2a67: 0x0001, 0x2a68: 0x0001, 0x2a69: 0x0001, + 0x2a6a: 0x0001, 0x2a6b: 0x0001, 0x2a6c: 0x0001, 0x2a6d: 0x0001, 0x2a6e: 0x0001, 0x2a6f: 0x0001, + 0x2a70: 0x0001, 0x2a71: 0x0001, 0x2a72: 0x0001, 0x2a73: 0x0001, 0x2a74: 0x0001, 0x2a75: 0x0001, + 0x2a76: 0x0001, 0x2a77: 0x0001, 0x2a78: 0x0001, 0x2a79: 0x0001, 0x2a7a: 0x0001, 0x2a7b: 0x0001, + 0x2a7c: 0x0001, 0x2a7d: 0x0001, 0x2a7e: 0x0001, 0x2a7f: 0x0001, + // Block 0xaa, offset 0x2a80 + 0x2a81: 0x000c, + 0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c, + 0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c, 0x2abf: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x000c, 0x2ac1: 0x000c, 0x2ac2: 0x000c, 0x2ac3: 0x000c, 0x2ac4: 0x000c, 0x2ac5: 0x000c, + 0x2ac6: 0x000c, + 0x2ad2: 0x000a, 0x2ad3: 0x000a, 0x2ad4: 0x000a, 0x2ad5: 0x000a, 0x2ad6: 0x000a, 0x2ad7: 0x000a, + 0x2ad8: 0x000a, 0x2ad9: 0x000a, 0x2ada: 0x000a, 0x2adb: 0x000a, 0x2adc: 0x000a, 0x2add: 0x000a, + 0x2ade: 0x000a, 0x2adf: 0x000a, 0x2ae0: 0x000a, 0x2ae1: 0x000a, 0x2ae2: 0x000a, 0x2ae3: 0x000a, + 0x2ae4: 0x000a, 0x2ae5: 0x000a, + 0x2af0: 0x000c, 0x2af3: 0x000c, 0x2af4: 0x000c, + 0x2aff: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, 0x2b01: 0x000c, + 0x2b33: 0x000c, 0x2b34: 0x000c, 0x2b35: 0x000c, + 0x2b36: 0x000c, 0x2b39: 0x000c, 0x2b3a: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, 0x2b41: 0x000c, 0x2b42: 0x000c, + 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6d: 0x000c, 0x2b6e: 0x000c, 0x2b6f: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb3: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x000c, 0x2bc1: 0x000c, + 0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c, + 0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c09: 0x000c, 0x2c0a: 0x000c, 0x2c0b: 0x000c, + 0x2c0c: 0x000c, 0x2c0f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c6f: 0x000c, + 0x2c70: 0x000c, 0x2c71: 0x000c, 0x2c74: 0x000c, + 0x2c76: 0x000c, 0x2c77: 0x000c, + 0x2c7e: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2c9f: 0x000c, 0x2ca3: 0x000c, + 0x2ca4: 0x000c, 0x2ca5: 0x000c, 0x2ca6: 0x000c, 0x2ca7: 0x000c, 0x2ca8: 0x000c, 0x2ca9: 0x000c, + 0x2caa: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + 0x2ce6: 0x000c, 0x2ce7: 0x000c, 0x2ce8: 0x000c, 0x2ce9: 0x000c, + 0x2cea: 0x000c, 0x2ceb: 0x000c, 0x2cec: 0x000c, + 0x2cf0: 0x000c, 0x2cf1: 0x000c, 0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, 0x2d3b: 0x000c, + 0x2d3c: 0x000c, 0x2d3d: 0x000c, 0x2d3e: 0x000c, 0x2d3f: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d42: 0x000c, 0x2d43: 0x000c, 0x2d44: 0x000c, + 0x2d46: 0x000c, + 0x2d5e: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, + 0x2db6: 0x000c, 0x2db7: 0x000c, 0x2db8: 0x000c, 0x2dba: 0x000c, + 0x2dbf: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, + 0x2e3c: 0x000c, 0x2e3d: 0x000c, 0x2e3f: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x000c, + 0x2e5c: 0x000c, 0x2e5d: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, + 0x2ebd: 0x000c, 0x2ebf: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x000c, + 0x2ee0: 0x000a, 0x2ee1: 0x000a, 0x2ee2: 0x000a, 0x2ee3: 0x000a, + 0x2ee4: 0x000a, 0x2ee5: 0x000a, 0x2ee6: 0x000a, 0x2ee7: 0x000a, 0x2ee8: 0x000a, 0x2ee9: 0x000a, + 0x2eea: 0x000a, 0x2eeb: 0x000a, 0x2eec: 0x000a, + // Block 0xbc, offset 0x2f00 + 0x2f2b: 0x000c, 0x2f2d: 0x000c, + 0x2f30: 0x000c, 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c, + 0x2f37: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f5d: 0x000c, + 0x2f5e: 0x000c, 0x2f5f: 0x000c, 0x2f62: 0x000c, 0x2f63: 0x000c, + 0x2f64: 0x000c, 0x2f65: 0x000c, 0x2f67: 0x000c, 0x2f68: 0x000c, 0x2f69: 0x000c, + 0x2f6a: 0x000c, 0x2f6b: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2faf: 0x000c, + 0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, 0x2fb5: 0x000c, + 0x2fb6: 0x000c, 0x2fb7: 0x000c, 0x2fb9: 0x000c, 0x2fba: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ffb: 0x000c, + 0x2ffc: 0x000c, 0x2ffe: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3003: 0x000c, + // Block 0xc1, offset 0x3040 + 0x3054: 0x000c, 0x3055: 0x000c, 0x3056: 0x000c, 0x3057: 0x000c, + 0x305a: 0x000c, 0x305b: 0x000c, + 0x3060: 0x000c, + // Block 0xc2, offset 0x3080 + 0x3081: 0x000c, 0x3082: 0x000c, 0x3083: 0x000c, 0x3084: 0x000c, 0x3085: 0x000c, + 0x3086: 0x000c, 0x3089: 0x000c, 0x308a: 0x000c, + 0x30b3: 0x000c, 0x30b4: 0x000c, 0x30b5: 0x000c, + 0x30b6: 0x000c, 0x30b7: 0x000c, 0x30b8: 0x000c, 0x30bb: 0x000c, + 0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30c7: 0x000c, + 0x30d1: 0x000c, + 0x30d2: 0x000c, 0x30d3: 0x000c, 0x30d4: 0x000c, 0x30d5: 0x000c, 0x30d6: 0x000c, + 0x30d9: 0x000c, 0x30da: 0x000c, 0x30db: 0x000c, + // Block 0xc4, offset 0x3100 + 0x310a: 0x000c, 0x310b: 0x000c, + 0x310c: 0x000c, 0x310d: 0x000c, 0x310e: 0x000c, 0x310f: 0x000c, 0x3110: 0x000c, 0x3111: 0x000c, + 0x3112: 0x000c, 0x3113: 0x000c, 0x3114: 0x000c, 0x3115: 0x000c, 0x3116: 0x000c, + 0x3118: 0x000c, 0x3119: 0x000c, + // Block 0xc5, offset 0x3140 + 0x3170: 0x000c, 0x3171: 0x000c, 0x3172: 0x000c, 0x3173: 0x000c, 0x3174: 0x000c, 0x3175: 0x000c, + 0x3176: 0x000c, 0x3178: 0x000c, 0x3179: 0x000c, 0x317a: 0x000c, 0x317b: 0x000c, + 0x317c: 0x000c, 0x317d: 0x000c, + // Block 0xc6, offset 0x3180 + 0x3192: 0x000c, 0x3193: 0x000c, 0x3194: 0x000c, 0x3195: 0x000c, 0x3196: 0x000c, 0x3197: 0x000c, + 0x3198: 0x000c, 0x3199: 0x000c, 0x319a: 0x000c, 0x319b: 0x000c, 0x319c: 0x000c, 0x319d: 0x000c, + 0x319e: 0x000c, 0x319f: 0x000c, 0x31a0: 0x000c, 0x31a1: 0x000c, 0x31a2: 0x000c, 0x31a3: 0x000c, + 0x31a4: 0x000c, 0x31a5: 0x000c, 0x31a6: 0x000c, 0x31a7: 0x000c, + 0x31aa: 0x000c, 0x31ab: 0x000c, 0x31ac: 0x000c, 0x31ad: 0x000c, 0x31ae: 0x000c, 0x31af: 0x000c, + 0x31b0: 0x000c, 0x31b2: 0x000c, 0x31b3: 0x000c, 0x31b5: 0x000c, + 0x31b6: 0x000c, + // Block 0xc7, offset 0x31c0 + 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, + 0x31f6: 0x000c, 0x31fa: 0x000c, + 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31ff: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, + 0x3207: 0x000c, + // Block 0xc9, offset 0x3240 + 0x3250: 0x000c, 0x3251: 0x000c, + 0x3255: 0x000c, 0x3257: 0x000c, + // Block 0xca, offset 0x3280 + 0x32b3: 0x000c, 0x32b4: 0x000c, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x000c, 0x32c1: 0x000c, + 0x32f6: 0x000c, 0x32f7: 0x000c, 0x32f8: 0x000c, 0x32f9: 0x000c, 0x32fa: 0x000c, + // Block 0xcc, offset 0x3300 + 0x3300: 0x000c, 0x3302: 0x000c, + // Block 0xcd, offset 0x3340 + 0x3355: 0x000a, 0x3356: 0x000a, 0x3357: 0x000a, + 0x3358: 0x000a, 0x3359: 0x000a, 0x335a: 0x000a, 0x335b: 0x000a, 0x335c: 0x000a, 0x335d: 0x0004, + 0x335e: 0x0004, 0x335f: 0x0004, 0x3360: 0x0004, 0x3361: 0x000a, 0x3362: 0x000a, 0x3363: 0x000a, + 0x3364: 0x000a, 0x3365: 0x000a, 0x3366: 0x000a, 0x3367: 0x000a, 0x3368: 0x000a, 0x3369: 0x000a, + 0x336a: 0x000a, 0x336b: 0x000a, 0x336c: 0x000a, 0x336d: 0x000a, 0x336e: 0x000a, 0x336f: 0x000a, + 0x3370: 0x000a, 0x3371: 0x000a, + // Block 0xce, offset 0x3380 + 0x3380: 0x000c, + 0x3387: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c, + 0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c, + 0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, + // Block 0xcf, offset 0x33c0 + 0x33f0: 0x000c, 0x33f1: 0x000c, 0x33f2: 0x000c, 0x33f3: 0x000c, 0x33f4: 0x000c, + // Block 0xd0, offset 0x3400 + 0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c, + 0x3436: 0x000c, + // Block 0xd1, offset 0x3440 + 0x344f: 0x000c, + // Block 0xd2, offset 0x3480 + 0x348f: 0x000c, 0x3490: 0x000c, 0x3491: 0x000c, + 0x3492: 0x000c, + // Block 0xd3, offset 0x34c0 + 0x34e2: 0x000a, + 0x34e4: 0x000c, + // Block 0xd4, offset 0x3500 + 0x351d: 0x000c, + 0x351e: 0x000c, 0x3520: 0x000b, 0x3521: 0x000b, 0x3522: 0x000b, 0x3523: 0x000b, + // Block 0xd5, offset 0x3540 + 0x3540: 0x000c, 0x3541: 0x000c, 0x3542: 0x000c, 0x3543: 0x000c, 0x3544: 0x000c, 0x3545: 0x000c, + 0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x000c, + 0x354c: 0x000c, 0x354d: 0x000c, 0x354e: 0x000c, 0x354f: 0x000c, 0x3550: 0x000c, 0x3551: 0x000c, + 0x3552: 0x000c, 0x3553: 0x000c, 0x3554: 0x000c, 0x3555: 0x000c, 0x3556: 0x000c, 0x3557: 0x000c, + 0x3558: 0x000c, 0x3559: 0x000c, 0x355a: 0x000c, 0x355b: 0x000c, 0x355c: 0x000c, 0x355d: 0x000c, + 0x355e: 0x000c, 0x355f: 0x000c, 0x3560: 0x000c, 0x3561: 0x000c, 0x3562: 0x000c, 0x3563: 0x000c, + 0x3564: 0x000c, 0x3565: 0x000c, 0x3566: 0x000c, 0x3567: 0x000c, 0x3568: 0x000c, 0x3569: 0x000c, + 0x356a: 0x000c, 0x356b: 0x000c, 0x356c: 0x000c, 0x356d: 0x000c, + 0x3570: 0x000c, 0x3571: 0x000c, 0x3572: 0x000c, 0x3573: 0x000c, 0x3574: 0x000c, 0x3575: 0x000c, + 0x3576: 0x000c, 0x3577: 0x000c, 0x3578: 0x000c, 0x3579: 0x000c, 0x357a: 0x000c, 0x357b: 0x000c, + 0x357c: 0x000c, 0x357d: 0x000c, 0x357e: 0x000c, 0x357f: 0x000c, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000c, 0x3581: 0x000c, 0x3582: 0x000c, 0x3583: 0x000c, 0x3584: 0x000c, 0x3585: 0x000c, + 0x3586: 0x000c, + // Block 0xd7, offset 0x35c0 + 0x35e7: 0x000c, 0x35e8: 0x000c, 0x35e9: 0x000c, + 0x35f3: 0x000b, 0x35f4: 0x000b, 0x35f5: 0x000b, + 0x35f6: 0x000b, 0x35f7: 0x000b, 0x35f8: 0x000b, 0x35f9: 0x000b, 0x35fa: 0x000b, 0x35fb: 0x000c, + 0x35fc: 0x000c, 0x35fd: 0x000c, 0x35fe: 0x000c, 0x35ff: 0x000c, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000c, 0x3601: 0x000c, 0x3602: 0x000c, 0x3605: 0x000c, + 0x3606: 0x000c, 0x3607: 0x000c, 0x3608: 0x000c, 0x3609: 0x000c, 0x360a: 0x000c, 0x360b: 0x000c, + 0x362a: 0x000c, 0x362b: 0x000c, 0x362c: 0x000c, 0x362d: 0x000c, + // Block 0xd9, offset 0x3640 + 0x3669: 0x000a, + 0x366a: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000c, 0x3683: 0x000c, 0x3684: 0x000c, 0x3685: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a, + 0x36c6: 0x000a, 0x36c7: 0x000a, 0x36c8: 0x000a, 0x36c9: 0x000a, 0x36ca: 0x000a, 0x36cb: 0x000a, + 0x36cc: 0x000a, 0x36cd: 0x000a, 0x36ce: 0x000a, 0x36cf: 0x000a, 0x36d0: 0x000a, 0x36d1: 0x000a, + 0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, + // Block 0xdc, offset 0x3700 + 0x371b: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3755: 0x000a, + // Block 0xde, offset 0x3780 + 0x378f: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c9: 0x000a, + // Block 0xe0, offset 0x3800 + 0x3803: 0x000a, + 0x380e: 0x0002, 0x380f: 0x0002, 0x3810: 0x0002, 0x3811: 0x0002, + 0x3812: 0x0002, 0x3813: 0x0002, 0x3814: 0x0002, 0x3815: 0x0002, 0x3816: 0x0002, 0x3817: 0x0002, + 0x3818: 0x0002, 0x3819: 0x0002, 0x381a: 0x0002, 0x381b: 0x0002, 0x381c: 0x0002, 0x381d: 0x0002, + 0x381e: 0x0002, 0x381f: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002, + 0x3824: 0x0002, 0x3825: 0x0002, 0x3826: 0x0002, 0x3827: 0x0002, 0x3828: 0x0002, 0x3829: 0x0002, + 0x382a: 0x0002, 0x382b: 0x0002, 0x382c: 0x0002, 0x382d: 0x0002, 0x382e: 0x0002, 0x382f: 0x0002, + 0x3830: 0x0002, 0x3831: 0x0002, 0x3832: 0x0002, 0x3833: 0x0002, 0x3834: 0x0002, 0x3835: 0x0002, + 0x3836: 0x0002, 0x3837: 0x0002, 0x3838: 0x0002, 0x3839: 0x0002, 0x383a: 0x0002, 0x383b: 0x0002, + 0x383c: 0x0002, 0x383d: 0x0002, 0x383e: 0x0002, 0x383f: 0x0002, + // Block 0xe1, offset 0x3840 + 0x3840: 0x000c, 0x3841: 0x000c, 0x3842: 0x000c, 0x3843: 0x000c, 0x3844: 0x000c, 0x3845: 0x000c, + 0x3846: 0x000c, 0x3847: 0x000c, 0x3848: 0x000c, 0x3849: 0x000c, 0x384a: 0x000c, 0x384b: 0x000c, + 0x384c: 0x000c, 0x384d: 0x000c, 0x384e: 0x000c, 0x384f: 0x000c, 0x3850: 0x000c, 0x3851: 0x000c, + 0x3852: 0x000c, 0x3853: 0x000c, 0x3854: 0x000c, 0x3855: 0x000c, 0x3856: 0x000c, 0x3857: 0x000c, + 0x3858: 0x000c, 0x3859: 0x000c, 0x385a: 0x000c, 0x385b: 0x000c, 0x385c: 0x000c, 0x385d: 0x000c, + 0x385e: 0x000c, 0x385f: 0x000c, 0x3860: 0x000c, 0x3861: 0x000c, 0x3862: 0x000c, 0x3863: 0x000c, + 0x3864: 0x000c, 0x3865: 0x000c, 0x3866: 0x000c, 0x3867: 0x000c, 0x3868: 0x000c, 0x3869: 0x000c, + 0x386a: 0x000c, 0x386b: 0x000c, 0x386c: 0x000c, 0x386d: 0x000c, 0x386e: 0x000c, 0x386f: 0x000c, + 0x3870: 0x000c, 0x3871: 0x000c, 0x3872: 0x000c, 0x3873: 0x000c, 0x3874: 0x000c, 0x3875: 0x000c, + 0x3876: 0x000c, 0x387b: 0x000c, + 0x387c: 0x000c, 0x387d: 0x000c, 0x387e: 0x000c, 0x387f: 0x000c, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000c, 0x3881: 0x000c, 0x3882: 0x000c, 0x3883: 0x000c, 0x3884: 0x000c, 0x3885: 0x000c, + 0x3886: 0x000c, 0x3887: 0x000c, 0x3888: 0x000c, 0x3889: 0x000c, 0x388a: 0x000c, 0x388b: 0x000c, + 0x388c: 0x000c, 0x388d: 0x000c, 0x388e: 0x000c, 0x388f: 0x000c, 0x3890: 0x000c, 0x3891: 0x000c, + 0x3892: 0x000c, 0x3893: 0x000c, 0x3894: 0x000c, 0x3895: 0x000c, 0x3896: 0x000c, 0x3897: 0x000c, + 0x3898: 0x000c, 0x3899: 0x000c, 0x389a: 0x000c, 0x389b: 0x000c, 0x389c: 0x000c, 0x389d: 0x000c, + 0x389e: 0x000c, 0x389f: 0x000c, 0x38a0: 0x000c, 0x38a1: 0x000c, 0x38a2: 0x000c, 0x38a3: 0x000c, + 0x38a4: 0x000c, 0x38a5: 0x000c, 0x38a6: 0x000c, 0x38a7: 0x000c, 0x38a8: 0x000c, 0x38a9: 0x000c, + 0x38aa: 0x000c, 0x38ab: 0x000c, 0x38ac: 0x000c, + 0x38b5: 0x000c, + // Block 0xe3, offset 0x38c0 + 0x38c4: 0x000c, + 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c, + 0x38de: 0x000c, 0x38df: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c, + 0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c, + 0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c, + // Block 0xe4, offset 0x3900 + 0x3900: 0x000c, 0x3901: 0x000c, 0x3902: 0x000c, 0x3903: 0x000c, 0x3904: 0x000c, 0x3905: 0x000c, + 0x3906: 0x000c, 0x3908: 0x000c, 0x3909: 0x000c, 0x390a: 0x000c, 0x390b: 0x000c, + 0x390c: 0x000c, 0x390d: 0x000c, 0x390e: 0x000c, 0x390f: 0x000c, 0x3910: 0x000c, 0x3911: 0x000c, + 0x3912: 0x000c, 0x3913: 0x000c, 0x3914: 0x000c, 0x3915: 0x000c, 0x3916: 0x000c, 0x3917: 0x000c, + 0x3918: 0x000c, 0x391b: 0x000c, 0x391c: 0x000c, 0x391d: 0x000c, + 0x391e: 0x000c, 0x391f: 0x000c, 0x3920: 0x000c, 0x3921: 0x000c, 0x3923: 0x000c, + 0x3924: 0x000c, 0x3926: 0x000c, 0x3927: 0x000c, 0x3928: 0x000c, 0x3929: 0x000c, + 0x392a: 0x000c, + // Block 0xe5, offset 0x3940 + 0x396e: 0x000c, + // Block 0xe6, offset 0x3980 + 0x39ac: 0x000c, 0x39ad: 0x000c, 0x39ae: 0x000c, 0x39af: 0x000c, + 0x39bf: 0x0004, + // Block 0xe7, offset 0x39c0 + 0x39ec: 0x000c, 0x39ed: 0x000c, 0x39ee: 0x000c, 0x39ef: 0x000c, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x0001, 0x3a01: 0x0001, 0x3a02: 0x0001, 0x3a03: 0x0001, 0x3a04: 0x0001, 0x3a05: 0x0001, + 0x3a06: 0x0001, 0x3a07: 0x0001, 0x3a08: 0x0001, 0x3a09: 0x0001, 0x3a0a: 0x0001, 0x3a0b: 0x0001, + 0x3a0c: 0x0001, 0x3a0d: 0x0001, 0x3a0e: 0x0001, 0x3a0f: 0x0001, 0x3a10: 0x000c, 0x3a11: 0x000c, + 0x3a12: 0x000c, 0x3a13: 0x000c, 0x3a14: 0x000c, 0x3a15: 0x000c, 0x3a16: 0x000c, 0x3a17: 0x0001, + 0x3a18: 0x0001, 0x3a19: 0x0001, 0x3a1a: 0x0001, 0x3a1b: 0x0001, 0x3a1c: 0x0001, 0x3a1d: 0x0001, + 0x3a1e: 0x0001, 0x3a1f: 0x0001, 0x3a20: 0x0001, 0x3a21: 0x0001, 0x3a22: 0x0001, 0x3a23: 0x0001, + 0x3a24: 0x0001, 0x3a25: 0x0001, 0x3a26: 0x0001, 0x3a27: 0x0001, 0x3a28: 0x0001, 0x3a29: 0x0001, + 0x3a2a: 0x0001, 0x3a2b: 0x0001, 0x3a2c: 0x0001, 0x3a2d: 0x0001, 0x3a2e: 0x0001, 0x3a2f: 0x0001, + 0x3a30: 0x0001, 0x3a31: 0x0001, 0x3a32: 0x0001, 0x3a33: 0x0001, 0x3a34: 0x0001, 0x3a35: 0x0001, + 0x3a36: 0x0001, 0x3a37: 0x0001, 0x3a38: 0x0001, 0x3a39: 0x0001, 0x3a3a: 0x0001, 0x3a3b: 0x0001, + 0x3a3c: 0x0001, 0x3a3d: 0x0001, 0x3a3e: 0x0001, 0x3a3f: 0x0001, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0001, 0x3a41: 0x0001, 0x3a42: 0x0001, 0x3a43: 0x0001, 0x3a44: 0x000c, 0x3a45: 0x000c, + 0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x0001, + 0x3a4c: 0x0001, 0x3a4d: 0x0001, 0x3a4e: 0x0001, 0x3a4f: 0x0001, 0x3a50: 0x0001, 0x3a51: 0x0001, + 0x3a52: 0x0001, 0x3a53: 0x0001, 0x3a54: 0x0001, 0x3a55: 0x0001, 0x3a56: 0x0001, 0x3a57: 0x0001, + 0x3a58: 0x0001, 0x3a59: 0x0001, 0x3a5a: 0x0001, 0x3a5b: 0x0001, 0x3a5c: 0x0001, 0x3a5d: 0x0001, + 0x3a5e: 0x0001, 0x3a5f: 0x0001, 0x3a60: 0x0001, 0x3a61: 0x0001, 0x3a62: 0x0001, 0x3a63: 0x0001, + 0x3a64: 0x0001, 0x3a65: 0x0001, 0x3a66: 0x0001, 0x3a67: 0x0001, 0x3a68: 0x0001, 0x3a69: 0x0001, + 0x3a6a: 0x0001, 0x3a6b: 0x0001, 0x3a6c: 0x0001, 0x3a6d: 0x0001, 0x3a6e: 0x0001, 0x3a6f: 0x0001, + 0x3a70: 0x0001, 0x3a71: 0x0001, 0x3a72: 0x0001, 0x3a73: 0x0001, 0x3a74: 0x0001, 0x3a75: 0x0001, + 0x3a76: 0x0001, 0x3a77: 0x0001, 0x3a78: 0x0001, 0x3a79: 0x0001, 0x3a7a: 0x0001, 0x3a7b: 0x0001, + 0x3a7c: 0x0001, 0x3a7d: 0x0001, 0x3a7e: 0x0001, 0x3a7f: 0x0001, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x0001, 0x3a81: 0x0001, 0x3a82: 0x0001, 0x3a83: 0x0001, 0x3a84: 0x0001, 0x3a85: 0x0001, + 0x3a86: 0x0001, 0x3a87: 0x0001, 0x3a88: 0x0001, 0x3a89: 0x0001, 0x3a8a: 0x0001, 0x3a8b: 0x0001, + 0x3a8c: 0x0001, 0x3a8d: 0x0001, 0x3a8e: 0x0001, 0x3a8f: 0x0001, 0x3a90: 0x0001, 0x3a91: 0x0001, + 0x3a92: 0x0001, 0x3a93: 0x0001, 0x3a94: 0x0001, 0x3a95: 0x0001, 0x3a96: 0x0001, 0x3a97: 0x0001, + 0x3a98: 0x0001, 0x3a99: 0x0001, 0x3a9a: 0x0001, 0x3a9b: 0x0001, 0x3a9c: 0x0001, 0x3a9d: 0x0001, + 0x3a9e: 0x0001, 0x3a9f: 0x0001, 0x3aa0: 0x0001, 0x3aa1: 0x0001, 0x3aa2: 0x0001, 0x3aa3: 0x0001, + 0x3aa4: 0x0001, 0x3aa5: 0x0001, 0x3aa6: 0x0001, 0x3aa7: 0x0001, 0x3aa8: 0x0001, 0x3aa9: 0x0001, + 0x3aaa: 0x0001, 0x3aab: 0x0001, 0x3aac: 0x0001, 0x3aad: 0x0001, 0x3aae: 0x0001, 0x3aaf: 0x0001, + 0x3ab0: 0x0001, 0x3ab1: 0x000d, 0x3ab2: 0x000d, 0x3ab3: 0x000d, 0x3ab4: 0x000d, 0x3ab5: 0x000d, + 0x3ab6: 0x000d, 0x3ab7: 0x000d, 0x3ab8: 0x000d, 0x3ab9: 0x000d, 0x3aba: 0x000d, 0x3abb: 0x000d, + 0x3abc: 0x000d, 0x3abd: 0x000d, 0x3abe: 0x000d, 0x3abf: 0x000d, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x000d, 0x3ac1: 0x000d, 0x3ac2: 0x000d, 0x3ac3: 0x000d, 0x3ac4: 0x000d, 0x3ac5: 0x000d, + 0x3ac6: 0x000d, 0x3ac7: 0x000d, 0x3ac8: 0x000d, 0x3ac9: 0x000d, 0x3aca: 0x000d, 0x3acb: 0x000d, + 0x3acc: 0x000d, 0x3acd: 0x000d, 0x3ace: 0x000d, 0x3acf: 0x000d, 0x3ad0: 0x000d, 0x3ad1: 0x000d, + 0x3ad2: 0x000d, 0x3ad3: 0x000d, 0x3ad4: 0x000d, 0x3ad5: 0x000d, 0x3ad6: 0x000d, 0x3ad7: 0x000d, + 0x3ad8: 0x000d, 0x3ad9: 0x000d, 0x3ada: 0x000d, 0x3adb: 0x000d, 0x3adc: 0x000d, 0x3add: 0x000d, + 0x3ade: 0x000d, 0x3adf: 0x000d, 0x3ae0: 0x000d, 0x3ae1: 0x000d, 0x3ae2: 0x000d, 0x3ae3: 0x000d, + 0x3ae4: 0x000d, 0x3ae5: 0x000d, 0x3ae6: 0x000d, 0x3ae7: 0x000d, 0x3ae8: 0x000d, 0x3ae9: 0x000d, + 0x3aea: 0x000d, 0x3aeb: 0x000d, 0x3aec: 0x000d, 0x3aed: 0x000d, 0x3aee: 0x000d, 0x3aef: 0x000d, + 0x3af0: 0x000d, 0x3af1: 0x000d, 0x3af2: 0x000d, 0x3af3: 0x000d, 0x3af4: 0x000d, 0x3af5: 0x0001, + 0x3af6: 0x0001, 0x3af7: 0x0001, 0x3af8: 0x0001, 0x3af9: 0x0001, 0x3afa: 0x0001, 0x3afb: 0x0001, + 0x3afc: 0x0001, 0x3afd: 0x0001, 0x3afe: 0x0001, 0x3aff: 0x0001, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x0001, 0x3b01: 0x000d, 0x3b02: 0x000d, 0x3b03: 0x000d, 0x3b04: 0x000d, 0x3b05: 0x000d, + 0x3b06: 0x000d, 0x3b07: 0x000d, 0x3b08: 0x000d, 0x3b09: 0x000d, 0x3b0a: 0x000d, 0x3b0b: 0x000d, + 0x3b0c: 0x000d, 0x3b0d: 0x000d, 0x3b0e: 0x000d, 0x3b0f: 0x000d, 0x3b10: 0x000d, 0x3b11: 0x000d, + 0x3b12: 0x000d, 0x3b13: 0x000d, 0x3b14: 0x000d, 0x3b15: 0x000d, 0x3b16: 0x000d, 0x3b17: 0x000d, + 0x3b18: 0x000d, 0x3b19: 0x000d, 0x3b1a: 0x000d, 0x3b1b: 0x000d, 0x3b1c: 0x000d, 0x3b1d: 0x000d, + 0x3b1e: 0x000d, 0x3b1f: 0x000d, 0x3b20: 0x000d, 0x3b21: 0x000d, 0x3b22: 0x000d, 0x3b23: 0x000d, + 0x3b24: 0x000d, 0x3b25: 0x000d, 0x3b26: 0x000d, 0x3b27: 0x000d, 0x3b28: 0x000d, 0x3b29: 0x000d, + 0x3b2a: 0x000d, 0x3b2b: 0x000d, 0x3b2c: 0x000d, 0x3b2d: 0x000d, 0x3b2e: 0x000d, 0x3b2f: 0x000d, + 0x3b30: 0x000d, 0x3b31: 0x000d, 0x3b32: 0x000d, 0x3b33: 0x000d, 0x3b34: 0x000d, 0x3b35: 0x000d, + 0x3b36: 0x000d, 0x3b37: 0x000d, 0x3b38: 0x000d, 0x3b39: 0x000d, 0x3b3a: 0x000d, 0x3b3b: 0x000d, + 0x3b3c: 0x000d, 0x3b3d: 0x000d, 0x3b3e: 0x0001, 0x3b3f: 0x0001, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x000d, 0x3b41: 0x000d, 0x3b42: 0x000d, 0x3b43: 0x000d, 0x3b44: 0x000d, 0x3b45: 0x000d, + 0x3b46: 0x000d, 0x3b47: 0x000d, 0x3b48: 0x000d, 0x3b49: 0x000d, 0x3b4a: 0x000d, 0x3b4b: 0x000d, + 0x3b4c: 0x000d, 0x3b4d: 0x000d, 0x3b4e: 0x000d, 0x3b4f: 0x000d, 0x3b50: 0x000d, 0x3b51: 0x000d, + 0x3b52: 0x000d, 0x3b53: 0x000d, 0x3b54: 0x000d, 0x3b55: 0x000d, 0x3b56: 0x000d, 0x3b57: 0x000d, + 0x3b58: 0x000d, 0x3b59: 0x000d, 0x3b5a: 0x000d, 0x3b5b: 0x000d, 0x3b5c: 0x000d, 0x3b5d: 0x000d, + 0x3b5e: 0x000d, 0x3b5f: 0x000d, 0x3b60: 0x000d, 0x3b61: 0x000d, 0x3b62: 0x000d, 0x3b63: 0x000d, + 0x3b64: 0x000d, 0x3b65: 0x000d, 0x3b66: 0x000d, 0x3b67: 0x000d, 0x3b68: 0x000d, 0x3b69: 0x000d, + 0x3b6a: 0x000d, 0x3b6b: 0x000d, 0x3b6c: 0x000d, 0x3b6d: 0x000d, 0x3b6e: 0x000d, 0x3b6f: 0x000d, + 0x3b70: 0x000a, 0x3b71: 0x000a, 0x3b72: 0x000d, 0x3b73: 0x000d, 0x3b74: 0x000d, 0x3b75: 0x000d, + 0x3b76: 0x000d, 0x3b77: 0x000d, 0x3b78: 0x000d, 0x3b79: 0x000d, 0x3b7a: 0x000d, 0x3b7b: 0x000d, + 0x3b7c: 0x000d, 0x3b7d: 0x000d, 0x3b7e: 0x000d, 0x3b7f: 0x000d, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x000a, 0x3b81: 0x000a, 0x3b82: 0x000a, 0x3b83: 0x000a, 0x3b84: 0x000a, 0x3b85: 0x000a, + 0x3b86: 0x000a, 0x3b87: 0x000a, 0x3b88: 0x000a, 0x3b89: 0x000a, 0x3b8a: 0x000a, 0x3b8b: 0x000a, + 0x3b8c: 0x000a, 0x3b8d: 0x000a, 0x3b8e: 0x000a, 0x3b8f: 0x000a, 0x3b90: 0x000a, 0x3b91: 0x000a, + 0x3b92: 0x000a, 0x3b93: 0x000a, 0x3b94: 0x000a, 0x3b95: 0x000a, 0x3b96: 0x000a, 0x3b97: 0x000a, + 0x3b98: 0x000a, 0x3b99: 0x000a, 0x3b9a: 0x000a, 0x3b9b: 0x000a, 0x3b9c: 0x000a, 0x3b9d: 0x000a, + 0x3b9e: 0x000a, 0x3b9f: 0x000a, 0x3ba0: 0x000a, 0x3ba1: 0x000a, 0x3ba2: 0x000a, 0x3ba3: 0x000a, + 0x3ba4: 0x000a, 0x3ba5: 0x000a, 0x3ba6: 0x000a, 0x3ba7: 0x000a, 0x3ba8: 0x000a, 0x3ba9: 0x000a, + 0x3baa: 0x000a, 0x3bab: 0x000a, + 0x3bb0: 0x000a, 0x3bb1: 0x000a, 0x3bb2: 0x000a, 0x3bb3: 0x000a, 0x3bb4: 0x000a, 0x3bb5: 0x000a, + 0x3bb6: 0x000a, 0x3bb7: 0x000a, 0x3bb8: 0x000a, 0x3bb9: 0x000a, 0x3bba: 0x000a, 0x3bbb: 0x000a, + 0x3bbc: 0x000a, 0x3bbd: 0x000a, 0x3bbe: 0x000a, 0x3bbf: 0x000a, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x000a, 0x3bc1: 0x000a, 0x3bc2: 0x000a, 0x3bc3: 0x000a, 0x3bc4: 0x000a, 0x3bc5: 0x000a, + 0x3bc6: 0x000a, 0x3bc7: 0x000a, 0x3bc8: 0x000a, 0x3bc9: 0x000a, 0x3bca: 0x000a, 0x3bcb: 0x000a, + 0x3bcc: 0x000a, 0x3bcd: 0x000a, 0x3bce: 0x000a, 0x3bcf: 0x000a, 0x3bd0: 0x000a, 0x3bd1: 0x000a, + 0x3bd2: 0x000a, 0x3bd3: 0x000a, + 0x3be0: 0x000a, 0x3be1: 0x000a, 0x3be2: 0x000a, 0x3be3: 0x000a, + 0x3be4: 0x000a, 0x3be5: 0x000a, 0x3be6: 0x000a, 0x3be7: 0x000a, 0x3be8: 0x000a, 0x3be9: 0x000a, + 0x3bea: 0x000a, 0x3beb: 0x000a, 0x3bec: 0x000a, 0x3bed: 0x000a, 0x3bee: 0x000a, + 0x3bf1: 0x000a, 0x3bf2: 0x000a, 0x3bf3: 0x000a, 0x3bf4: 0x000a, 0x3bf5: 0x000a, + 0x3bf6: 0x000a, 0x3bf7: 0x000a, 0x3bf8: 0x000a, 0x3bf9: 0x000a, 0x3bfa: 0x000a, 0x3bfb: 0x000a, + 0x3bfc: 0x000a, 0x3bfd: 0x000a, 0x3bfe: 0x000a, 0x3bff: 0x000a, + // Block 0xf0, offset 0x3c00 + 0x3c01: 0x000a, 0x3c02: 0x000a, 0x3c03: 0x000a, 0x3c04: 0x000a, 0x3c05: 0x000a, + 0x3c06: 0x000a, 0x3c07: 0x000a, 0x3c08: 0x000a, 0x3c09: 0x000a, 0x3c0a: 0x000a, 0x3c0b: 0x000a, + 0x3c0c: 0x000a, 0x3c0d: 0x000a, 0x3c0e: 0x000a, 0x3c0f: 0x000a, 0x3c11: 0x000a, + 0x3c12: 0x000a, 0x3c13: 0x000a, 0x3c14: 0x000a, 0x3c15: 0x000a, 0x3c16: 0x000a, 0x3c17: 0x000a, + 0x3c18: 0x000a, 0x3c19: 0x000a, 0x3c1a: 0x000a, 0x3c1b: 0x000a, 0x3c1c: 0x000a, 0x3c1d: 0x000a, + 0x3c1e: 0x000a, 0x3c1f: 0x000a, 0x3c20: 0x000a, 0x3c21: 0x000a, 0x3c22: 0x000a, 0x3c23: 0x000a, + 0x3c24: 0x000a, 0x3c25: 0x000a, 0x3c26: 0x000a, 0x3c27: 0x000a, 0x3c28: 0x000a, 0x3c29: 0x000a, + 0x3c2a: 0x000a, 0x3c2b: 0x000a, 0x3c2c: 0x000a, 0x3c2d: 0x000a, 0x3c2e: 0x000a, 0x3c2f: 0x000a, + 0x3c30: 0x000a, 0x3c31: 0x000a, 0x3c32: 0x000a, 0x3c33: 0x000a, 0x3c34: 0x000a, 0x3c35: 0x000a, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x0002, 0x3c41: 0x0002, 0x3c42: 0x0002, 0x3c43: 0x0002, 0x3c44: 0x0002, 0x3c45: 0x0002, + 0x3c46: 0x0002, 0x3c47: 0x0002, 0x3c48: 0x0002, 0x3c49: 0x0002, 0x3c4a: 0x0002, 0x3c4b: 0x000a, + 0x3c4c: 0x000a, 0x3c4d: 0x000a, 0x3c4e: 0x000a, 0x3c4f: 0x000a, + 0x3c6f: 0x000a, + // Block 0xf2, offset 0x3c80 + 0x3caa: 0x000a, 0x3cab: 0x000a, 0x3cac: 0x000a, 0x3cad: 0x000a, 0x3cae: 0x000a, 0x3caf: 0x000a, + // Block 0xf3, offset 0x3cc0 + 0x3ced: 0x000a, + // Block 0xf4, offset 0x3d00 + 0x3d20: 0x000a, 0x3d21: 0x000a, 0x3d22: 0x000a, 0x3d23: 0x000a, + 0x3d24: 0x000a, 0x3d25: 0x000a, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x000a, 0x3d41: 0x000a, 0x3d42: 0x000a, 0x3d43: 0x000a, 0x3d44: 0x000a, 0x3d45: 0x000a, + 0x3d46: 0x000a, 0x3d47: 0x000a, 0x3d48: 0x000a, 0x3d49: 0x000a, 0x3d4a: 0x000a, 0x3d4b: 0x000a, + 0x3d4c: 0x000a, 0x3d4d: 0x000a, 0x3d4e: 0x000a, 0x3d4f: 0x000a, 0x3d50: 0x000a, 0x3d51: 0x000a, + 0x3d52: 0x000a, 0x3d53: 0x000a, 0x3d54: 0x000a, 0x3d55: 0x000a, 0x3d56: 0x000a, 0x3d57: 0x000a, + 0x3d5c: 0x000a, 0x3d5d: 0x000a, + 0x3d5e: 0x000a, 0x3d5f: 0x000a, 0x3d60: 0x000a, 0x3d61: 0x000a, 0x3d62: 0x000a, 0x3d63: 0x000a, + 0x3d64: 0x000a, 0x3d65: 0x000a, 0x3d66: 0x000a, 0x3d67: 0x000a, 0x3d68: 0x000a, 0x3d69: 0x000a, + 0x3d6a: 0x000a, 0x3d6b: 0x000a, 0x3d6c: 0x000a, + 0x3d70: 0x000a, 0x3d71: 0x000a, 0x3d72: 0x000a, 0x3d73: 0x000a, 0x3d74: 0x000a, 0x3d75: 0x000a, + 0x3d76: 0x000a, 0x3d77: 0x000a, 0x3d78: 0x000a, 0x3d79: 0x000a, 0x3d7a: 0x000a, 0x3d7b: 0x000a, + 0x3d7c: 0x000a, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x000a, 0x3d81: 0x000a, 0x3d82: 0x000a, 0x3d83: 0x000a, 0x3d84: 0x000a, 0x3d85: 0x000a, + 0x3d86: 0x000a, 0x3d87: 0x000a, 0x3d88: 0x000a, 0x3d89: 0x000a, 0x3d8a: 0x000a, 0x3d8b: 0x000a, + 0x3d8c: 0x000a, 0x3d8d: 0x000a, 0x3d8e: 0x000a, 0x3d8f: 0x000a, 0x3d90: 0x000a, 0x3d91: 0x000a, + 0x3d92: 0x000a, 0x3d93: 0x000a, 0x3d94: 0x000a, 0x3d95: 0x000a, 0x3d96: 0x000a, 0x3d97: 0x000a, + 0x3d98: 0x000a, 0x3d99: 0x000a, 0x3d9a: 0x000a, 0x3d9b: 0x000a, 0x3d9c: 0x000a, 0x3d9d: 0x000a, + 0x3d9e: 0x000a, 0x3d9f: 0x000a, 0x3da0: 0x000a, 0x3da1: 0x000a, 0x3da2: 0x000a, 0x3da3: 0x000a, + 0x3da4: 0x000a, 0x3da5: 0x000a, 0x3da6: 0x000a, 0x3da7: 0x000a, 0x3da8: 0x000a, 0x3da9: 0x000a, + 0x3daa: 0x000a, 0x3dab: 0x000a, 0x3dac: 0x000a, 0x3dad: 0x000a, 0x3dae: 0x000a, 0x3daf: 0x000a, + 0x3db0: 0x000a, 0x3db1: 0x000a, 0x3db2: 0x000a, 0x3db3: 0x000a, 0x3db4: 0x000a, 0x3db5: 0x000a, + 0x3db6: 0x000a, 0x3dbb: 0x000a, + 0x3dbc: 0x000a, 0x3dbd: 0x000a, 0x3dbe: 0x000a, 0x3dbf: 0x000a, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x000a, 0x3dc1: 0x000a, 0x3dc2: 0x000a, 0x3dc3: 0x000a, 0x3dc4: 0x000a, 0x3dc5: 0x000a, + 0x3dc6: 0x000a, 0x3dc7: 0x000a, 0x3dc8: 0x000a, 0x3dc9: 0x000a, 0x3dca: 0x000a, 0x3dcb: 0x000a, + 0x3dcc: 0x000a, 0x3dcd: 0x000a, 0x3dce: 0x000a, 0x3dcf: 0x000a, 0x3dd0: 0x000a, 0x3dd1: 0x000a, + 0x3dd2: 0x000a, 0x3dd3: 0x000a, 0x3dd4: 0x000a, 0x3dd5: 0x000a, 0x3dd6: 0x000a, 0x3dd7: 0x000a, + 0x3dd8: 0x000a, 0x3dd9: 0x000a, + 0x3de0: 0x000a, 0x3de1: 0x000a, 0x3de2: 0x000a, 0x3de3: 0x000a, + 0x3de4: 0x000a, 0x3de5: 0x000a, 0x3de6: 0x000a, 0x3de7: 0x000a, 0x3de8: 0x000a, 0x3de9: 0x000a, + 0x3dea: 0x000a, 0x3deb: 0x000a, + 0x3df0: 0x000a, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x000a, 0x3e01: 0x000a, 0x3e02: 0x000a, 0x3e03: 0x000a, 0x3e04: 0x000a, 0x3e05: 0x000a, + 0x3e06: 0x000a, 0x3e07: 0x000a, 0x3e08: 0x000a, 0x3e09: 0x000a, 0x3e0a: 0x000a, 0x3e0b: 0x000a, + 0x3e10: 0x000a, 0x3e11: 0x000a, + 0x3e12: 0x000a, 0x3e13: 0x000a, 0x3e14: 0x000a, 0x3e15: 0x000a, 0x3e16: 0x000a, 0x3e17: 0x000a, + 0x3e18: 0x000a, 0x3e19: 0x000a, 0x3e1a: 0x000a, 0x3e1b: 0x000a, 0x3e1c: 0x000a, 0x3e1d: 0x000a, + 0x3e1e: 0x000a, 0x3e1f: 0x000a, 0x3e20: 0x000a, 0x3e21: 0x000a, 0x3e22: 0x000a, 0x3e23: 0x000a, + 0x3e24: 0x000a, 0x3e25: 0x000a, 0x3e26: 0x000a, 0x3e27: 0x000a, 0x3e28: 0x000a, 0x3e29: 0x000a, + 0x3e2a: 0x000a, 0x3e2b: 0x000a, 0x3e2c: 0x000a, 0x3e2d: 0x000a, 0x3e2e: 0x000a, 0x3e2f: 0x000a, + 0x3e30: 0x000a, 0x3e31: 0x000a, 0x3e32: 0x000a, 0x3e33: 0x000a, 0x3e34: 0x000a, 0x3e35: 0x000a, + 0x3e36: 0x000a, 0x3e37: 0x000a, 0x3e38: 0x000a, 0x3e39: 0x000a, 0x3e3a: 0x000a, 0x3e3b: 0x000a, + 0x3e3c: 0x000a, 0x3e3d: 0x000a, 0x3e3e: 0x000a, 0x3e3f: 0x000a, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x000a, 0x3e41: 0x000a, 0x3e42: 0x000a, 0x3e43: 0x000a, 0x3e44: 0x000a, 0x3e45: 0x000a, + 0x3e46: 0x000a, 0x3e47: 0x000a, + 0x3e50: 0x000a, 0x3e51: 0x000a, + 0x3e52: 0x000a, 0x3e53: 0x000a, 0x3e54: 0x000a, 0x3e55: 0x000a, 0x3e56: 0x000a, 0x3e57: 0x000a, + 0x3e58: 0x000a, 0x3e59: 0x000a, + 0x3e60: 0x000a, 0x3e61: 0x000a, 0x3e62: 0x000a, 0x3e63: 0x000a, + 0x3e64: 0x000a, 0x3e65: 0x000a, 0x3e66: 0x000a, 0x3e67: 0x000a, 0x3e68: 0x000a, 0x3e69: 0x000a, + 0x3e6a: 0x000a, 0x3e6b: 0x000a, 0x3e6c: 0x000a, 0x3e6d: 0x000a, 0x3e6e: 0x000a, 0x3e6f: 0x000a, + 0x3e70: 0x000a, 0x3e71: 0x000a, 0x3e72: 0x000a, 0x3e73: 0x000a, 0x3e74: 0x000a, 0x3e75: 0x000a, + 0x3e76: 0x000a, 0x3e77: 0x000a, 0x3e78: 0x000a, 0x3e79: 0x000a, 0x3e7a: 0x000a, 0x3e7b: 0x000a, + 0x3e7c: 0x000a, 0x3e7d: 0x000a, 0x3e7e: 0x000a, 0x3e7f: 0x000a, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x000a, 0x3e81: 0x000a, 0x3e82: 0x000a, 0x3e83: 0x000a, 0x3e84: 0x000a, 0x3e85: 0x000a, + 0x3e86: 0x000a, 0x3e87: 0x000a, + 0x3e90: 0x000a, 0x3e91: 0x000a, + 0x3e92: 0x000a, 0x3e93: 0x000a, 0x3e94: 0x000a, 0x3e95: 0x000a, 0x3e96: 0x000a, 0x3e97: 0x000a, + 0x3e98: 0x000a, 0x3e99: 0x000a, 0x3e9a: 0x000a, 0x3e9b: 0x000a, 0x3e9c: 0x000a, 0x3e9d: 0x000a, + 0x3e9e: 0x000a, 0x3e9f: 0x000a, 0x3ea0: 0x000a, 0x3ea1: 0x000a, 0x3ea2: 0x000a, 0x3ea3: 0x000a, + 0x3ea4: 0x000a, 0x3ea5: 0x000a, 0x3ea6: 0x000a, 0x3ea7: 0x000a, 0x3ea8: 0x000a, 0x3ea9: 0x000a, + 0x3eaa: 0x000a, 0x3eab: 0x000a, 0x3eac: 0x000a, 0x3ead: 0x000a, + 0x3eb0: 0x000a, 0x3eb1: 0x000a, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x000a, 0x3ec1: 0x000a, 0x3ec2: 0x000a, 0x3ec3: 0x000a, 0x3ec4: 0x000a, 0x3ec5: 0x000a, + 0x3ec6: 0x000a, 0x3ec7: 0x000a, 0x3ec8: 0x000a, 0x3ec9: 0x000a, 0x3eca: 0x000a, 0x3ecb: 0x000a, + 0x3ecc: 0x000a, 0x3ecd: 0x000a, 0x3ece: 0x000a, 0x3ecf: 0x000a, 0x3ed0: 0x000a, 0x3ed1: 0x000a, + 0x3ed2: 0x000a, 0x3ed3: 0x000a, + 0x3ee0: 0x000a, 0x3ee1: 0x000a, 0x3ee2: 0x000a, 0x3ee3: 0x000a, + 0x3ee4: 0x000a, 0x3ee5: 0x000a, 0x3ee6: 0x000a, 0x3ee7: 0x000a, 0x3ee8: 0x000a, 0x3ee9: 0x000a, + 0x3eea: 0x000a, 0x3eeb: 0x000a, 0x3eec: 0x000a, 0x3eed: 0x000a, + 0x3ef0: 0x000a, 0x3ef1: 0x000a, 0x3ef2: 0x000a, 0x3ef3: 0x000a, 0x3ef4: 0x000a, 0x3ef5: 0x000a, + 0x3ef6: 0x000a, 0x3ef7: 0x000a, 0x3ef8: 0x000a, 0x3ef9: 0x000a, 0x3efa: 0x000a, 0x3efb: 0x000a, + 0x3efc: 0x000a, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x000a, 0x3f01: 0x000a, 0x3f02: 0x000a, 0x3f03: 0x000a, 0x3f04: 0x000a, 0x3f05: 0x000a, + 0x3f06: 0x000a, 0x3f07: 0x000a, 0x3f08: 0x000a, + 0x3f10: 0x000a, 0x3f11: 0x000a, + 0x3f12: 0x000a, 0x3f13: 0x000a, 0x3f14: 0x000a, 0x3f15: 0x000a, 0x3f16: 0x000a, 0x3f17: 0x000a, + 0x3f18: 0x000a, 0x3f19: 0x000a, 0x3f1a: 0x000a, 0x3f1b: 0x000a, 0x3f1c: 0x000a, 0x3f1d: 0x000a, + 0x3f1e: 0x000a, 0x3f1f: 0x000a, 0x3f20: 0x000a, 0x3f21: 0x000a, 0x3f22: 0x000a, 0x3f23: 0x000a, + 0x3f24: 0x000a, 0x3f25: 0x000a, 0x3f26: 0x000a, 0x3f27: 0x000a, 0x3f28: 0x000a, 0x3f29: 0x000a, + 0x3f2a: 0x000a, 0x3f2b: 0x000a, 0x3f2c: 0x000a, 0x3f2d: 0x000a, 0x3f2e: 0x000a, 0x3f2f: 0x000a, + 0x3f30: 0x000a, 0x3f31: 0x000a, 0x3f32: 0x000a, 0x3f33: 0x000a, 0x3f34: 0x000a, 0x3f35: 0x000a, + 0x3f36: 0x000a, 0x3f37: 0x000a, 0x3f38: 0x000a, 0x3f39: 0x000a, 0x3f3a: 0x000a, 0x3f3b: 0x000a, + 0x3f3c: 0x000a, 0x3f3d: 0x000a, 0x3f3f: 0x000a, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x000a, 0x3f41: 0x000a, 0x3f42: 0x000a, 0x3f43: 0x000a, 0x3f44: 0x000a, 0x3f45: 0x000a, + 0x3f4e: 0x000a, 0x3f4f: 0x000a, 0x3f50: 0x000a, 0x3f51: 0x000a, + 0x3f52: 0x000a, 0x3f53: 0x000a, 0x3f54: 0x000a, 0x3f55: 0x000a, 0x3f56: 0x000a, 0x3f57: 0x000a, + 0x3f58: 0x000a, 0x3f59: 0x000a, 0x3f5a: 0x000a, 0x3f5b: 0x000a, + 0x3f60: 0x000a, 0x3f61: 0x000a, 0x3f62: 0x000a, 0x3f63: 0x000a, + 0x3f64: 0x000a, 0x3f65: 0x000a, 0x3f66: 0x000a, 0x3f67: 0x000a, 0x3f68: 0x000a, + 0x3f70: 0x000a, 0x3f71: 0x000a, 0x3f72: 0x000a, 0x3f73: 0x000a, 0x3f74: 0x000a, 0x3f75: 0x000a, + 0x3f76: 0x000a, 0x3f77: 0x000a, 0x3f78: 0x000a, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x000a, 0x3f81: 0x000a, 0x3f82: 0x000a, 0x3f83: 0x000a, 0x3f84: 0x000a, 0x3f85: 0x000a, + 0x3f86: 0x000a, 0x3f87: 0x000a, 0x3f88: 0x000a, 0x3f89: 0x000a, 0x3f8a: 0x000a, 0x3f8b: 0x000a, + 0x3f8c: 0x000a, 0x3f8d: 0x000a, 0x3f8e: 0x000a, 0x3f8f: 0x000a, 0x3f90: 0x000a, 0x3f91: 0x000a, + 0x3f92: 0x000a, 0x3f94: 0x000a, 0x3f95: 0x000a, 0x3f96: 0x000a, 0x3f97: 0x000a, + 0x3f98: 0x000a, 0x3f99: 0x000a, 0x3f9a: 0x000a, 0x3f9b: 0x000a, 0x3f9c: 0x000a, 0x3f9d: 0x000a, + 0x3f9e: 0x000a, 0x3f9f: 0x000a, 0x3fa0: 0x000a, 0x3fa1: 0x000a, 0x3fa2: 0x000a, 0x3fa3: 0x000a, + 0x3fa4: 0x000a, 0x3fa5: 0x000a, 0x3fa6: 0x000a, 0x3fa7: 0x000a, 0x3fa8: 0x000a, 0x3fa9: 0x000a, + 0x3faa: 0x000a, 0x3fab: 0x000a, 0x3fac: 0x000a, 0x3fad: 0x000a, 0x3fae: 0x000a, 0x3faf: 0x000a, + 0x3fb0: 0x000a, 0x3fb1: 0x000a, 0x3fb2: 0x000a, 0x3fb3: 0x000a, 0x3fb4: 0x000a, 0x3fb5: 0x000a, + 0x3fb6: 0x000a, 0x3fb7: 0x000a, 0x3fb8: 0x000a, 0x3fb9: 0x000a, 0x3fba: 0x000a, 0x3fbb: 0x000a, + 0x3fbc: 0x000a, 0x3fbd: 0x000a, 0x3fbe: 0x000a, 0x3fbf: 0x000a, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x000a, 0x3fc1: 0x000a, 0x3fc2: 0x000a, 0x3fc3: 0x000a, 0x3fc4: 0x000a, 0x3fc5: 0x000a, + 0x3fc6: 0x000a, 0x3fc7: 0x000a, 0x3fc8: 0x000a, 0x3fc9: 0x000a, 0x3fca: 0x000a, + 0x3ff0: 0x0002, 0x3ff1: 0x0002, 0x3ff2: 0x0002, 0x3ff3: 0x0002, 0x3ff4: 0x0002, 0x3ff5: 0x0002, + 0x3ff6: 0x0002, 0x3ff7: 0x0002, 0x3ff8: 0x0002, 0x3ff9: 0x0002, + // Block 0x100, offset 0x4000 + 0x403e: 0x000b, 0x403f: 0x000b, + // Block 0x101, offset 0x4040 + 0x4040: 0x000b, 0x4041: 0x000b, 0x4042: 0x000b, 0x4043: 0x000b, 0x4044: 0x000b, 0x4045: 0x000b, + 0x4046: 0x000b, 0x4047: 0x000b, 0x4048: 0x000b, 0x4049: 0x000b, 0x404a: 0x000b, 0x404b: 0x000b, + 0x404c: 0x000b, 0x404d: 0x000b, 0x404e: 0x000b, 0x404f: 0x000b, 0x4050: 0x000b, 0x4051: 0x000b, + 0x4052: 0x000b, 0x4053: 0x000b, 0x4054: 0x000b, 0x4055: 0x000b, 0x4056: 0x000b, 0x4057: 0x000b, + 0x4058: 0x000b, 0x4059: 0x000b, 0x405a: 0x000b, 0x405b: 0x000b, 0x405c: 0x000b, 0x405d: 0x000b, + 0x405e: 0x000b, 0x405f: 0x000b, 0x4060: 0x000b, 0x4061: 0x000b, 0x4062: 0x000b, 0x4063: 0x000b, + 0x4064: 0x000b, 0x4065: 0x000b, 0x4066: 0x000b, 0x4067: 0x000b, 0x4068: 0x000b, 0x4069: 0x000b, + 0x406a: 0x000b, 0x406b: 0x000b, 0x406c: 0x000b, 0x406d: 0x000b, 0x406e: 0x000b, 0x406f: 0x000b, + 0x4070: 0x000b, 0x4071: 0x000b, 0x4072: 0x000b, 0x4073: 0x000b, 0x4074: 0x000b, 0x4075: 0x000b, + 0x4076: 0x000b, 0x4077: 0x000b, 0x4078: 0x000b, 0x4079: 0x000b, 0x407a: 0x000b, 0x407b: 0x000b, + 0x407c: 0x000b, 0x407d: 0x000b, 0x407e: 0x000b, 0x407f: 0x000b, + // Block 0x102, offset 0x4080 + 0x4080: 0x000c, 0x4081: 0x000c, 0x4082: 0x000c, 0x4083: 0x000c, 0x4084: 0x000c, 0x4085: 0x000c, + 0x4086: 0x000c, 0x4087: 0x000c, 0x4088: 0x000c, 0x4089: 0x000c, 0x408a: 0x000c, 0x408b: 0x000c, + 0x408c: 0x000c, 0x408d: 0x000c, 0x408e: 0x000c, 0x408f: 0x000c, 0x4090: 0x000c, 0x4091: 0x000c, + 0x4092: 0x000c, 0x4093: 0x000c, 0x4094: 0x000c, 0x4095: 0x000c, 0x4096: 0x000c, 0x4097: 0x000c, + 0x4098: 0x000c, 0x4099: 0x000c, 0x409a: 0x000c, 0x409b: 0x000c, 0x409c: 0x000c, 0x409d: 0x000c, + 0x409e: 0x000c, 0x409f: 0x000c, 0x40a0: 0x000c, 0x40a1: 0x000c, 0x40a2: 0x000c, 0x40a3: 0x000c, + 0x40a4: 0x000c, 0x40a5: 0x000c, 0x40a6: 0x000c, 0x40a7: 0x000c, 0x40a8: 0x000c, 0x40a9: 0x000c, + 0x40aa: 0x000c, 0x40ab: 0x000c, 0x40ac: 0x000c, 0x40ad: 0x000c, 0x40ae: 0x000c, 0x40af: 0x000c, + 0x40b0: 0x000b, 0x40b1: 0x000b, 0x40b2: 0x000b, 0x40b3: 0x000b, 0x40b4: 0x000b, 0x40b5: 0x000b, + 0x40b6: 0x000b, 0x40b7: 0x000b, 0x40b8: 0x000b, 0x40b9: 0x000b, 0x40ba: 0x000b, 0x40bb: 0x000b, + 0x40bc: 0x000b, 0x40bd: 0x000b, 0x40be: 0x000b, 0x40bf: 0x000b, +} + +// bidiIndex: 26 blocks, 1664 entries, 3328 bytes +// Block 0 is the zero block. +var bidiIndex = [1664]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x13, 0xf1: 0x14, 0xf2: 0x14, 0xf3: 0x16, 0xf4: 0x17, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x136: 0x28, 0x137: 0x29, + 0x138: 0x2a, 0x139: 0x2b, 0x13a: 0x2c, 0x13b: 0x2d, 0x13c: 0x2e, 0x13d: 0x2f, 0x13e: 0x30, 0x13f: 0x31, + // Block 0x5, offset 0x140 + 0x140: 0x32, 0x141: 0x33, 0x142: 0x34, + 0x14d: 0x35, 0x14e: 0x36, + 0x150: 0x37, + 0x15a: 0x38, 0x15c: 0x39, 0x15d: 0x3a, 0x15e: 0x3b, 0x15f: 0x3c, + 0x160: 0x3d, 0x162: 0x3e, 0x164: 0x3f, 0x165: 0x40, 0x167: 0x41, + 0x168: 0x42, 0x169: 0x43, 0x16a: 0x44, 0x16b: 0x45, 0x16c: 0x46, 0x16d: 0x47, 0x16e: 0x48, 0x16f: 0x49, + 0x170: 0x4a, 0x173: 0x4b, 0x177: 0x05, + 0x17e: 0x4c, 0x17f: 0x4d, + // Block 0x6, offset 0x180 + 0x180: 0x4e, 0x181: 0x4f, 0x182: 0x50, 0x183: 0x51, 0x184: 0x52, 0x185: 0x53, 0x186: 0x54, 0x187: 0x55, + 0x188: 0x56, 0x189: 0x55, 0x18a: 0x55, 0x18b: 0x55, 0x18c: 0x57, 0x18d: 0x58, 0x18e: 0x59, 0x18f: 0x55, + 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x55, 0x195: 0x55, 0x196: 0x55, 0x197: 0x55, + 0x198: 0x55, 0x199: 0x55, 0x19a: 0x5e, 0x19b: 0x55, 0x19c: 0x55, 0x19d: 0x5f, 0x19e: 0x55, 0x19f: 0x60, + 0x1a4: 0x55, 0x1a5: 0x55, 0x1a6: 0x61, 0x1a7: 0x62, + 0x1a8: 0x55, 0x1a9: 0x55, 0x1aa: 0x55, 0x1ab: 0x55, 0x1ac: 0x55, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x55, + 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, + 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x55, 0x1bd: 0x55, 0x1be: 0x55, 0x1bf: 0x6c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, + 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, + // Block 0x8, offset 0x200 + 0x237: 0x55, + // Block 0x9, offset 0x240 + 0x252: 0x77, 0x253: 0x78, + 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, + 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, + 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26d: 0x8a, 0x26f: 0x8b, + // Block 0xa, offset 0x280 + 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x8f, 0x2b6: 0x0e, 0x2b7: 0x90, + 0x2b8: 0x91, 0x2b9: 0x92, 0x2ba: 0x0e, 0x2bb: 0x93, 0x2bc: 0x94, 0x2bd: 0x95, 0x2bf: 0x96, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x97, 0x2c5: 0x55, 0x2c6: 0x98, 0x2c7: 0x99, + 0x2cb: 0x9a, 0x2cd: 0x9b, + 0x2e0: 0x9c, 0x2e1: 0x9c, 0x2e2: 0x9c, 0x2e3: 0x9c, 0x2e4: 0x9d, 0x2e5: 0x9c, 0x2e6: 0x9c, 0x2e7: 0x9c, + 0x2e8: 0x9e, 0x2e9: 0x9c, 0x2ea: 0x9c, 0x2eb: 0x9f, 0x2ec: 0xa0, 0x2ed: 0x9c, 0x2ee: 0x9c, 0x2ef: 0x9c, + 0x2f0: 0x9c, 0x2f1: 0x9c, 0x2f2: 0x9c, 0x2f3: 0x9c, 0x2f4: 0xa1, 0x2f5: 0x9c, 0x2f6: 0x9c, 0x2f7: 0x9c, + 0x2f8: 0x9c, 0x2f9: 0xa2, 0x2fa: 0xa3, 0x2fb: 0xa4, 0x2fc: 0xa5, 0x2fd: 0xa6, 0x2fe: 0xa7, 0x2ff: 0x9c, + // Block 0xc, offset 0x300 + 0x300: 0xa8, 0x301: 0xa9, 0x302: 0xaa, 0x303: 0x21, 0x304: 0xab, 0x305: 0xac, 0x306: 0xad, 0x307: 0xae, + 0x308: 0xaf, 0x309: 0x28, 0x30b: 0xb0, 0x30c: 0x26, 0x30d: 0xb1, + 0x310: 0xb2, 0x311: 0xb3, 0x312: 0xb4, 0x313: 0xb5, 0x316: 0xb6, 0x317: 0xb7, + 0x318: 0xb8, 0x319: 0xb9, 0x31a: 0xba, 0x31c: 0xbb, + 0x320: 0xbc, 0x324: 0xbd, 0x325: 0xbe, 0x327: 0xbf, + 0x328: 0xc0, 0x329: 0xc1, 0x32a: 0xc2, + 0x330: 0xc3, 0x332: 0xc4, 0x334: 0xc5, 0x335: 0xc6, 0x336: 0xc7, + 0x33b: 0xc8, 0x33c: 0xc9, 0x33d: 0xca, 0x33f: 0xcb, + // Block 0xd, offset 0x340 + 0x351: 0xcc, + // Block 0xe, offset 0x380 + 0x3ab: 0xcd, 0x3ac: 0xce, + 0x3bd: 0xcf, 0x3be: 0xd0, 0x3bf: 0xd1, + // Block 0xf, offset 0x3c0 + 0x3f2: 0xd2, + // Block 0x10, offset 0x400 + 0x43c: 0xd3, 0x43d: 0xd4, + // Block 0x11, offset 0x440 + 0x445: 0xd5, 0x446: 0xd6, 0x447: 0xd7, + 0x448: 0x55, 0x449: 0xd8, 0x44c: 0x55, 0x44d: 0xd9, + 0x45b: 0xda, 0x45c: 0xdb, 0x45d: 0xdc, 0x45e: 0xdd, 0x45f: 0xde, + 0x468: 0xdf, 0x469: 0xe0, 0x46a: 0xe1, + // Block 0x12, offset 0x480 + 0x480: 0xe2, 0x482: 0xcf, 0x484: 0xce, + 0x48a: 0xe3, 0x48b: 0xe4, + 0x493: 0xe5, + 0x4a0: 0x9c, 0x4a1: 0x9c, 0x4a2: 0x9c, 0x4a3: 0xe6, 0x4a4: 0x9c, 0x4a5: 0xe7, 0x4a6: 0x9c, 0x4a7: 0x9c, + 0x4a8: 0x9c, 0x4a9: 0x9c, 0x4aa: 0x9c, 0x4ab: 0x9c, 0x4ac: 0x9c, 0x4ad: 0x9c, 0x4ae: 0x9c, 0x4af: 0x9c, + 0x4b0: 0x9c, 0x4b1: 0xe8, 0x4b2: 0xe9, 0x4b3: 0x9c, 0x4b4: 0xea, 0x4b5: 0x9c, 0x4b6: 0x9c, 0x4b7: 0x9c, + 0x4b8: 0x0e, 0x4b9: 0x0e, 0x4ba: 0x0e, 0x4bb: 0xeb, 0x4bc: 0x9c, 0x4bd: 0x9c, 0x4be: 0x9c, 0x4bf: 0x9c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xec, 0x4c1: 0x55, 0x4c2: 0xed, 0x4c3: 0xee, 0x4c4: 0xef, 0x4c5: 0xf0, 0x4c6: 0xf1, + 0x4c9: 0xf2, 0x4cc: 0x55, 0x4cd: 0x55, 0x4ce: 0x55, 0x4cf: 0x55, + 0x4d0: 0x55, 0x4d1: 0x55, 0x4d2: 0x55, 0x4d3: 0x55, 0x4d4: 0x55, 0x4d5: 0x55, 0x4d6: 0x55, 0x4d7: 0x55, + 0x4d8: 0x55, 0x4d9: 0x55, 0x4da: 0x55, 0x4db: 0xf3, 0x4dc: 0x55, 0x4dd: 0xf4, 0x4de: 0x55, 0x4df: 0xf5, + 0x4e0: 0xf6, 0x4e1: 0xf7, 0x4e2: 0xf8, 0x4e4: 0x55, 0x4e5: 0x55, 0x4e6: 0x55, 0x4e7: 0x55, + 0x4e8: 0x55, 0x4e9: 0xf9, 0x4ea: 0xfa, 0x4eb: 0xfb, 0x4ec: 0x55, 0x4ed: 0x55, 0x4ee: 0xfc, 0x4ef: 0xfd, + 0x4ff: 0xfe, + // Block 0x14, offset 0x500 + 0x53f: 0xfe, + // Block 0x15, offset 0x540 + 0x550: 0x09, 0x551: 0x0a, 0x553: 0x0b, 0x556: 0x0c, + 0x55b: 0x0d, 0x55c: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, + 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x58f: 0x12, + 0x59f: 0x12, + 0x5af: 0x12, + 0x5bf: 0x12, + // Block 0x17, offset 0x5c0 + 0x5c0: 0xff, 0x5c1: 0xff, 0x5c2: 0xff, 0x5c3: 0xff, 0x5c4: 0x05, 0x5c5: 0x05, 0x5c6: 0x05, 0x5c7: 0x100, + 0x5c8: 0xff, 0x5c9: 0xff, 0x5ca: 0xff, 0x5cb: 0xff, 0x5cc: 0xff, 0x5cd: 0xff, 0x5ce: 0xff, 0x5cf: 0xff, + 0x5d0: 0xff, 0x5d1: 0xff, 0x5d2: 0xff, 0x5d3: 0xff, 0x5d4: 0xff, 0x5d5: 0xff, 0x5d6: 0xff, 0x5d7: 0xff, + 0x5d8: 0xff, 0x5d9: 0xff, 0x5da: 0xff, 0x5db: 0xff, 0x5dc: 0xff, 0x5dd: 0xff, 0x5de: 0xff, 0x5df: 0xff, + 0x5e0: 0xff, 0x5e1: 0xff, 0x5e2: 0xff, 0x5e3: 0xff, 0x5e4: 0xff, 0x5e5: 0xff, 0x5e6: 0xff, 0x5e7: 0xff, + 0x5e8: 0xff, 0x5e9: 0xff, 0x5ea: 0xff, 0x5eb: 0xff, 0x5ec: 0xff, 0x5ed: 0xff, 0x5ee: 0xff, 0x5ef: 0xff, + 0x5f0: 0xff, 0x5f1: 0xff, 0x5f2: 0xff, 0x5f3: 0xff, 0x5f4: 0xff, 0x5f5: 0xff, 0x5f6: 0xff, 0x5f7: 0xff, + 0x5f8: 0xff, 0x5f9: 0xff, 0x5fa: 0xff, 0x5fb: 0xff, 0x5fc: 0xff, 0x5fd: 0xff, 0x5fe: 0xff, 0x5ff: 0xff, + // Block 0x18, offset 0x600 + 0x60f: 0x12, + 0x61f: 0x12, + 0x620: 0x15, + 0x62f: 0x12, + 0x63f: 0x12, + // Block 0x19, offset 0x640 + 0x64f: 0x12, +} + +// Total table size 19960 bytes (19KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go index 9115ef257e..f65785e8ac 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go new file mode 100644 index 0000000000..e1858b879d --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go @@ -0,0 +1,7908 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package norm + +import "sync" + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "15.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [56]uint8{ + 0, 1, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 84, 91, 103, 107, 118, 122, 129, + 130, 132, 202, 214, 216, 218, 220, 222, + 224, 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x199A + firstCCC = 0x2DD5 + endMulti = 0x30A1 + firstLeadingCCC = 0x4AEF + firstCCCZeroExcept = 0x4BB9 + firstStarterWithNLead = 0x4BE0 + lastDecomp = 0x4BE2 + maxDecomp = 0x8000 +) + +// decomps: 19426 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xA6, 0x42, + 0xC3, 0xB0, 0x42, 0xC3, 0xB8, 0x42, 0xC4, 0xA6, + 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5, + 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42, + 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC7, 0x80, + 0x42, 0xC7, 0x81, 0x42, 0xC7, 0x82, 0x42, 0xC8, + // Bytes 100 - 13f + 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42, + 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, 0x93, + 0x42, 0xC9, 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, + 0x96, 0x42, 0xC9, 0x97, 0x42, 0xC9, 0x98, 0x42, + 0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C, + 0x42, 0xC9, 0x9E, 0x42, 0xC9, 0x9F, 0x42, 0xC9, + 0xA0, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA2, 0x42, + 0xC9, 0xA3, 0x42, 0xC9, 0xA4, 0x42, 0xC9, 0xA5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA7, 0x42, 0xC9, + 0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, + 0xC9, 0xAB, 0x42, 0xC9, 0xAC, 0x42, 0xC9, 0xAD, + 0x42, 0xC9, 0xAE, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + 0x42, 0xC9, 0xB6, 0x42, 0xC9, 0xB7, 0x42, 0xC9, + 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBA, 0x42, + // Bytes 180 - 1bf + 0xC9, 0xBB, 0x42, 0xC9, 0xBD, 0x42, 0xC9, 0xBE, + 0x42, 0xCA, 0x80, 0x42, 0xCA, 0x81, 0x42, 0xCA, + 0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x84, 0x42, + 0xCA, 0x88, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x8D, 0x42, 0xCA, 0x8E, 0x42, 0xCA, 0x8F, 0x42, + 0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, + 0x42, 0xCA, 0x95, 0x42, 0xCA, 0x98, 0x42, 0xCA, + // Bytes 1c0 - 1ff + 0x99, 0x42, 0xCA, 0x9B, 0x42, 0xCA, 0x9C, 0x42, + 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xA1, + 0x42, 0xCA, 0xA2, 0x42, 0xCA, 0xA3, 0x42, 0xCA, + 0xA4, 0x42, 0xCA, 0xA5, 0x42, 0xCA, 0xA6, 0x42, + 0xCA, 0xA7, 0x42, 0xCA, 0xA8, 0x42, 0xCA, 0xA9, + 0x42, 0xCA, 0xAA, 0x42, 0xCA, 0xAB, 0x42, 0xCA, + 0xB9, 0x42, 0xCB, 0x90, 0x42, 0xCB, 0x91, 0x42, + 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93, + // Bytes 200 - 23f + 0x42, 0xCE, 0x94, 0x42, 0xCE, 0x95, 0x42, 0xCE, + 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42, + 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B, + 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE, + 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42, + 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4, + 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE, + 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42, + // Bytes 240 - 27f + 0xCE, 0xB1, 0x42, 0xCE, 0xB2, 0x42, 0xCE, 0xB3, + 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE, + 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42, + 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB, + 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE, + 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42, + 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83, + 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF, + // Bytes 280 - 2bf + 0x86, 0x42, 0xCF, 0x87, 0x42, 0xCF, 0x88, 0x42, + 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D, + 0x42, 0xD0, 0xB0, 0x42, 0xD0, 0xB1, 0x42, 0xD0, + 0xB2, 0x42, 0xD0, 0xB3, 0x42, 0xD0, 0xB4, 0x42, + 0xD0, 0xB5, 0x42, 0xD0, 0xB6, 0x42, 0xD0, 0xB7, + 0x42, 0xD0, 0xB8, 0x42, 0xD0, 0xBA, 0x42, 0xD0, + 0xBB, 0x42, 0xD0, 0xBC, 0x42, 0xD0, 0xBD, 0x42, + 0xD0, 0xBE, 0x42, 0xD0, 0xBF, 0x42, 0xD1, 0x80, + // Bytes 2c0 - 2ff + 0x42, 0xD1, 0x81, 0x42, 0xD1, 0x82, 0x42, 0xD1, + 0x83, 0x42, 0xD1, 0x84, 0x42, 0xD1, 0x85, 0x42, + 0xD1, 0x86, 0x42, 0xD1, 0x87, 0x42, 0xD1, 0x88, + 0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8B, 0x42, 0xD1, + 0x8C, 0x42, 0xD1, 0x8D, 0x42, 0xD1, 0x8E, 0x42, + 0xD1, 0x95, 0x42, 0xD1, 0x96, 0x42, 0xD1, 0x98, + 0x42, 0xD1, 0x9F, 0x42, 0xD2, 0x91, 0x42, 0xD2, + 0xAB, 0x42, 0xD2, 0xAF, 0x42, 0xD2, 0xB1, 0x42, + // Bytes 300 - 33f + 0xD3, 0x8F, 0x42, 0xD3, 0x99, 0x42, 0xD3, 0xA9, + 0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7, + 0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42, + 0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D, + 0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7, + 0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42, + 0xD8, 0xA8, 0x42, 0xD8, 0xA9, 0x42, 0xD8, 0xAA, + 0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8, + // Bytes 340 - 37f + 0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42, + 0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2, + 0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8, + 0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42, + 0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA, + 0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9, + 0x83, 0x42, 0xD9, 0x84, 0x42, 0xD9, 0x85, 0x42, + 0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88, + // Bytes 380 - 3bf + 0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9, + 0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42, + 0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, + 0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, + 0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, + 0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, + 0x42, 0xDA, 0x8C, 0x42, 0xDA, 0x8D, 0x42, 0xDA, + 0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, + // Bytes 3c0 - 3ff + 0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6, + 0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA, + 0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42, + 0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE, + 0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB, + 0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42, + 0xDB, 0x89, 0x42, 0xDB, 0x8B, 0x42, 0xDB, 0x8C, + 0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0, + // Bytes 400 - 43f + 0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1, + 0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1, + 0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1, + 0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1, + 0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1, + 0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1, + 0x84, 0x8A, 0x43, 0xE1, 0x84, 0x8B, 0x43, 0xE1, + 0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1, + // Bytes 440 - 47f + 0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1, + 0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1, + 0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1, + 0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1, + 0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1, + 0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1, + 0x84, 0xA1, 0x43, 0xE1, 0x84, 0xA2, 0x43, 0xE1, + 0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1, + // Bytes 480 - 4bf + 0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1, + 0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1, + 0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1, + 0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1, + 0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1, + 0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1, + 0x85, 0x98, 0x43, 0xE1, 0x85, 0x99, 0x43, 0xE1, + 0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, + // Bytes 4c0 - 4ff + 0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, + 0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, + 0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, + 0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1, + 0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1, + 0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1, + 0x87, 0x97, 0x43, 0xE1, 0x87, 0x99, 0x43, 0xE1, + 0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1, + // Bytes 500 - 53f + 0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1, + 0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1, + 0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1, + 0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1, + 0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE1, + 0xB6, 0x91, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, + 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, 0xE2, + 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, + // Bytes 540 - 57f + 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, + 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, + 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, + 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, + 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, + 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, + 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, 0xE2, + 0xB1, 0xB1, 0x43, 0xE2, 0xB5, 0xA1, 0x43, 0xE3, + // Bytes 580 - 5bf + 0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3, + 0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3, + 0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3, + 0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3, + 0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3, + 0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3, + 0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3, + 0x80, 0x95, 0x43, 0xE3, 0x80, 0x96, 0x43, 0xE3, + // Bytes 5c0 - 5ff + 0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3, + 0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3, + 0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3, + 0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3, + 0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3, + 0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3, + 0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3, + 0x82, 0xB1, 0x43, 0xE3, 0x82, 0xB3, 0x43, 0xE3, + // Bytes 600 - 63f + 0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3, + 0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3, + 0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3, + 0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3, + 0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3, + 0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3, + 0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3, + 0x83, 0x8D, 0x43, 0xE3, 0x83, 0x8E, 0x43, 0xE3, + // Bytes 640 - 67f + 0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3, + 0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3, + 0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3, + 0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3, + 0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3, + 0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3, + 0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3, + 0x83, 0xA7, 0x43, 0xE3, 0x83, 0xA8, 0x43, 0xE3, + // Bytes 680 - 6bf + 0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3, + 0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3, + 0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3, + 0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3, + 0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3, + 0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3, + 0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3, + 0x92, 0xBB, 0x43, 0xE3, 0x93, 0x9F, 0x43, 0xE3, + // Bytes 6c0 - 6ff + 0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3, + 0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3, + 0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3, + 0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3, + 0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3, + 0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3, + 0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3, + 0xAC, 0x88, 0x43, 0xE3, 0xAC, 0x99, 0x43, 0xE3, + // Bytes 700 - 73f + 0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3, + 0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3, + 0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3, + 0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3, + 0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4, + 0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4, + 0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4, + 0x82, 0x96, 0x43, 0xE4, 0x83, 0xA3, 0x43, 0xE4, + // Bytes 740 - 77f + 0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4, + 0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4, + 0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4, + 0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4, + 0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4, + 0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4, + 0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4, + 0x95, 0xAB, 0x43, 0xE4, 0x97, 0x97, 0x43, 0xE4, + // Bytes 780 - 7bf + 0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4, + 0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4, + 0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4, + 0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4, + 0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4, + 0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4, + 0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4, + 0xB5, 0x96, 0x43, 0xE4, 0xB8, 0x80, 0x43, 0xE4, + // Bytes 7c0 - 7ff + 0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4, + 0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4, + 0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4, + 0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4, + 0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4, + 0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4, + 0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4, + 0xB8, 0xBD, 0x43, 0xE4, 0xB8, 0xBF, 0x43, 0xE4, + // Bytes 800 - 83f + 0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4, + 0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4, + 0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4, + 0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4, + 0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4, + 0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4, + 0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4, + 0xBB, 0xA4, 0x43, 0xE4, 0xBC, 0x81, 0x43, 0xE4, + // Bytes 840 - 87f + 0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4, + 0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4, + 0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4, + 0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5, + 0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5, + 0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5, + 0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5, + 0x83, 0xA7, 0x43, 0xE5, 0x84, 0xAA, 0x43, 0xE5, + // Bytes 880 - 8bf + 0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5, + 0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5, + 0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5, + 0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5, + 0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5, + 0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5, + 0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5, + 0x86, 0x82, 0x43, 0xE5, 0x86, 0x8D, 0x43, 0xE5, + // Bytes 8c0 - 8ff + 0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5, + 0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5, + 0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5, + 0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5, + 0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5, + 0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5, + 0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5, + 0x87, 0xA0, 0x43, 0xE5, 0x87, 0xB5, 0x43, 0xE5, + // Bytes 900 - 93f + 0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5, + 0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5, + 0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5, + 0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5, + 0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5, + 0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5, + 0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5, + 0x8A, 0xA3, 0x43, 0xE5, 0x8A, 0xB3, 0x43, 0xE5, + // Bytes 940 - 97f + 0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5, + 0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5, + 0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5, + 0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5, + 0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5, + 0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5, + 0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5, + 0x8C, 0xB8, 0x43, 0xE5, 0x8C, 0xBB, 0x43, 0xE5, + // Bytes 980 - 9bf + 0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5, + 0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5, + 0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5, + 0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5, + 0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5, + 0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5, + 0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5, + 0x8D, 0xBF, 0x43, 0xE5, 0x8E, 0x82, 0x43, 0xE5, + // Bytes 9c0 - 9ff + 0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5, + 0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5, + 0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5, + 0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5, + 0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5, + 0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5, + 0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5, + 0x90, 0x8D, 0x43, 0xE5, 0x90, 0x8F, 0x43, 0xE5, + // Bytes a00 - a3f + 0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5, + 0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5, + 0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5, + 0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5, + 0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5, + 0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5, + 0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5, + 0x95, 0xA3, 0x43, 0xE5, 0x96, 0x84, 0x43, 0xE5, + // Bytes a40 - a7f + 0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5, + 0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5, + 0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5, + 0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5, + 0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5, + 0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5, + 0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5, + 0x9B, 0x9B, 0x43, 0xE5, 0x9B, 0xB9, 0x43, 0xE5, + // Bytes a80 - abf + 0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5, + 0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5, + 0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5, + 0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5, + 0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5, + 0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5, + 0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5, + 0xA2, 0xAC, 0x43, 0xE5, 0xA2, 0xB3, 0x43, 0xE5, + // Bytes ac0 - aff + 0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5, + 0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5, + 0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5, + 0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5, + 0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5, + 0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5, + 0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5, + 0xA4, 0xA7, 0x43, 0xE5, 0xA4, 0xA9, 0x43, 0xE5, + // Bytes b00 - b3f + 0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5, + 0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5, + 0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5, + 0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5, + 0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5, + 0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5, + 0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5, + 0xAC, 0xA8, 0x43, 0xE5, 0xAC, 0xBE, 0x43, 0xE5, + // Bytes b40 - b7f + 0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5, + 0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5, + 0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5, + 0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5, + 0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5, + 0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5, + 0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5, + 0xB0, 0x8F, 0x43, 0xE5, 0xB0, 0xA2, 0x43, 0xE5, + // Bytes b80 - bbf + 0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5, + 0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5, + 0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5, + 0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5, + 0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5, + 0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5, + 0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5, + 0xB5, 0xAE, 0x43, 0xE5, 0xB5, 0xBC, 0x43, 0xE5, + // Bytes bc0 - bff + 0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5, + 0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5, + 0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5, + 0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5, + 0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5, + 0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5, + 0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5, + 0xB9, 0xB4, 0x43, 0xE5, 0xB9, 0xBA, 0x43, 0xE5, + // Bytes c00 - c3f + 0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5, + 0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5, + 0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5, + 0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5, + 0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5, + 0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5, + 0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5, + 0xBC, 0x84, 0x43, 0xE5, 0xBC, 0x8B, 0x43, 0xE5, + // Bytes c40 - c7f + 0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5, + 0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5, + 0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5, + 0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5, + 0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5, + 0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5, + 0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5, + 0xBE, 0xAD, 0x43, 0xE5, 0xBF, 0x83, 0x43, 0xE5, + // Bytes c80 - cbf + 0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5, + 0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6, + 0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6, + 0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6, + 0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6, + 0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6, + 0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6, + 0x85, 0x88, 0x43, 0xE6, 0x85, 0x8C, 0x43, 0xE6, + // Bytes cc0 - cff + 0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6, + 0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6, + 0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6, + 0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6, + 0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6, + 0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6, + 0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6, + 0x88, 0x90, 0x43, 0xE6, 0x88, 0x9B, 0x43, 0xE6, + // Bytes d00 - d3f + 0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6, + 0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6, + 0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6, + 0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6, + 0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6, + 0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6, + 0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6, + 0x8C, 0x87, 0x43, 0xE6, 0x8C, 0xBD, 0x43, 0xE6, + // Bytes d40 - d7f + 0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6, + 0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6, + 0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6, + 0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6, + 0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6, + 0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6, + 0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6, + 0x91, 0xB7, 0x43, 0xE6, 0x91, 0xBE, 0x43, 0xE6, + // Bytes d80 - dbf + 0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6, + 0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6, + 0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6, + 0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6, + 0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6, + 0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6, + 0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6, + 0x96, 0xB9, 0x43, 0xE6, 0x97, 0x85, 0x43, 0xE6, + // Bytes dc0 - dff + 0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6, + 0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6, + 0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6, + 0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6, + 0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6, + 0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6, + 0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6, + 0x9B, 0xB4, 0x43, 0xE6, 0x9B, 0xB8, 0x43, 0xE6, + // Bytes e00 - e3f + 0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6, + 0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6, + 0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6, + 0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6, + 0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6, + 0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6, + 0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6, + 0x9F, 0xB3, 0x43, 0xE6, 0x9F, 0xBA, 0x43, 0xE6, + // Bytes e40 - e7f + 0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6, + 0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6, + 0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6, + 0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6, + 0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6, + 0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6, + 0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6, + 0xAA, 0xA8, 0x43, 0xE6, 0xAB, 0x93, 0x43, 0xE6, + // Bytes e80 - ebf + 0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6, + 0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6, + 0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6, + 0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6, + 0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6, + 0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6, + 0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6, + 0xAE, 0xBB, 0x43, 0xE6, 0xAF, 0x8B, 0x43, 0xE6, + // Bytes ec0 - eff + 0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6, + 0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6, + 0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6, + 0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6, + 0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6, + 0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6, + 0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6, + 0xB4, 0x96, 0x43, 0xE6, 0xB4, 0x9B, 0x43, 0xE6, + // Bytes f00 - f3f + 0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6, + 0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6, + 0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6, + 0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6, + 0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6, + 0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6, + 0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6, + 0xB8, 0xAF, 0x43, 0xE6, 0xB9, 0xAE, 0x43, 0xE6, + // Bytes f40 - f7f + 0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6, + 0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6, + 0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6, + 0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6, + 0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6, + 0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6, + 0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6, + 0xBF, 0xBE, 0x43, 0xE7, 0x80, 0x9B, 0x43, 0xE7, + // Bytes f80 - fbf + 0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7, + 0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7, + 0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7, + 0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7, + 0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7, + 0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7, + 0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7, + 0x85, 0xAE, 0x43, 0xE7, 0x86, 0x9C, 0x43, 0xE7, + // Bytes fc0 - fff + 0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7, + 0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7, + 0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7, + 0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7, + 0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7, + 0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7, + 0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7, + 0x89, 0x9B, 0x43, 0xE7, 0x89, 0xA2, 0x43, 0xE7, + // Bytes 1000 - 103f + 0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7, + 0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7, + 0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7, + 0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7, + 0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7, + 0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7, + 0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7, + 0x8E, 0xA5, 0x43, 0xE7, 0x8E, 0xB2, 0x43, 0xE7, + // Bytes 1040 - 107f + 0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7, + 0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7, + 0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7, + 0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7, + 0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7, + 0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7, + 0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7, + 0x94, 0x86, 0x43, 0xE7, 0x94, 0x98, 0x43, 0xE7, + // Bytes 1080 - 10bf + 0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7, + 0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7, + 0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7, + 0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7, + 0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7, + 0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7, + 0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7, + 0x97, 0xA2, 0x43, 0xE7, 0x98, 0x90, 0x43, 0xE7, + // Bytes 10c0 - 10ff + 0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7, + 0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7, + 0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7, + 0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7, + 0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7, + 0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7, + 0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7, + 0x9C, 0x81, 0x43, 0xE7, 0x9C, 0x9E, 0x43, 0xE7, + // Bytes 1100 - 113f + 0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7, + 0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7, + 0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7, + 0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7, + 0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7, + 0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7, + 0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7, + 0xA3, 0xBB, 0x43, 0xE7, 0xA4, 0xAA, 0x43, 0xE7, + // Bytes 1140 - 117f + 0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7, + 0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7, + 0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7, + 0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7, + 0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7, + 0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7, + 0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7, + 0xA6, 0x8F, 0x43, 0xE7, 0xA6, 0xAE, 0x43, 0xE7, + // Bytes 1180 - 11bf + 0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7, + 0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7, + 0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7, + 0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7, + 0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7, + 0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7, + 0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7, + 0xAB, 0xAE, 0x43, 0xE7, 0xAB, 0xB9, 0x43, 0xE7, + // Bytes 11c0 - 11ff + 0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7, + 0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7, + 0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7, + 0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7, + 0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7, + 0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7, + 0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7, + 0xB3, 0xA7, 0x43, 0xE7, 0xB3, 0xA8, 0x43, 0xE7, + // Bytes 1200 - 123f + 0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7, + 0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7, + 0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7, + 0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7, + 0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7, + 0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7, + 0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7, + 0xB8, 0xB7, 0x43, 0xE7, 0xB9, 0x81, 0x43, 0xE7, + // Bytes 1240 - 127f + 0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7, + 0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7, + 0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7, + 0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7, + 0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7, + 0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7, + 0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8, + 0x80, 0x85, 0x43, 0xE8, 0x80, 0x8C, 0x43, 0xE8, + // Bytes 1280 - 12bf + 0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8, + 0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8, + 0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8, + 0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8, + 0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8, + 0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8, + 0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8, + 0x87, 0x98, 0x43, 0xE8, 0x87, 0xA3, 0x43, 0xE8, + // Bytes 12c0 - 12ff + 0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8, + 0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8, + 0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8, + 0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8, + 0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8, + 0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8, + 0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8, + 0x89, 0xB8, 0x43, 0xE8, 0x89, 0xB9, 0x43, 0xE8, + // Bytes 1300 - 133f + 0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8, + 0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8, + 0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8, + 0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8, + 0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8, + 0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8, + 0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8, + 0x8E, 0xAD, 0x43, 0xE8, 0x8E, 0xBD, 0x43, 0xE8, + // Bytes 1340 - 137f + 0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8, + 0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8, + 0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8, + 0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8, + 0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8, + 0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8, + 0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8, + 0x94, 0x96, 0x43, 0xE8, 0x95, 0xA4, 0x43, 0xE8, + // Bytes 1380 - 13bf + 0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8, + 0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8, + 0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8, + 0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8, + 0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8, + 0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8, + 0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8, + 0x9B, 0xA2, 0x43, 0xE8, 0x9C, 0x8E, 0x43, 0xE8, + // Bytes 13c0 - 13ff + 0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8, + 0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8, + 0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8, + 0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8, + 0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8, + 0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8, + 0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8, + 0xA3, 0x97, 0x43, 0xE8, 0xA3, 0x9E, 0x43, 0xE8, + // Bytes 1400 - 143f + 0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8, + 0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8, + 0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8, + 0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8, + 0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8, + 0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8, + 0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8, + 0xAA, 0xAA, 0x43, 0xE8, 0xAA, 0xBF, 0x43, 0xE8, + // Bytes 1440 - 147f + 0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8, + 0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8, + 0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8, + 0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8, + 0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8, + 0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8, + 0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8, + 0xB1, 0x95, 0x43, 0xE8, 0xB1, 0xB8, 0x43, 0xE8, + // Bytes 1480 - 14bf + 0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8, + 0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8, + 0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8, + 0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8, + 0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8, + 0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8, + 0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8, + 0xB6, 0xB3, 0x43, 0xE8, 0xB6, 0xBC, 0x43, 0xE8, + // Bytes 14c0 - 14ff + 0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8, + 0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8, + 0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8, + 0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8, + 0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8, + 0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8, + 0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8, + 0xBE, 0xB5, 0x43, 0xE8, 0xBE, 0xB6, 0x43, 0xE9, + // Bytes 1500 - 153f + 0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9, + 0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9, + 0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9, + 0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9, + 0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9, + 0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, + 0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, + 0x84, 0x9B, 0x43, 0xE9, 0x85, 0x89, 0x43, 0xE9, + // Bytes 1540 - 157f + 0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9, + 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9, + 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9, + 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9, + 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9, + 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9, + 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9, + 0x8C, 0x84, 0x43, 0xE9, 0x8D, 0x8A, 0x43, 0xE9, + // Bytes 1580 - 15bf + 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9, + 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9, + 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9, + 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9, + 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9, + 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9, + 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9, + 0x9A, 0x86, 0x43, 0xE9, 0x9A, 0xA3, 0x43, 0xE9, + // Bytes 15c0 - 15ff + 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9, + 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, + 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, + 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, + 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, + 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, + 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, + 0x9D, 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, 0xE9, + // Bytes 1600 - 163f + 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, + 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, + 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, + 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, + 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, + 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, + 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, + 0xA1, 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, 0xE9, + // Bytes 1640 - 167f + 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, + 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, + 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, + 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, + 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, + 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, + 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, + 0xA9, 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, 0xE9, + // Bytes 1680 - 16bf + 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, + 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, + 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, + 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, + 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, + 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, + 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, + 0xB6, 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, 0xE9, + // Bytes 16c0 - 16ff + 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, + 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, + 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, + 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, + 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, + 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, + 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, + 0xBC, 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, 0xE9, + // Bytes 1700 - 173f + 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, + 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, + 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, + 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, + 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, + 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, + 0xBE, 0xA0, 0x43, 0xEA, 0x99, 0x91, 0x43, 0xEA, + 0x9A, 0x89, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA, + // Bytes 1740 - 177f + 0x9D, 0xAF, 0x43, 0xEA, 0x9E, 0x8E, 0x43, 0xEA, + 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x43, 0xEA, + 0xAD, 0xA6, 0x43, 0xEA, 0xAD, 0xA7, 0x44, 0xF0, + 0x9D, 0xBC, 0x84, 0x44, 0xF0, 0x9D, 0xBC, 0x85, + 0x44, 0xF0, 0x9D, 0xBC, 0x86, 0x44, 0xF0, 0x9D, + 0xBC, 0x88, 0x44, 0xF0, 0x9D, 0xBC, 0x8A, 0x44, + 0xF0, 0x9D, 0xBC, 0x9E, 0x44, 0xF0, 0xA0, 0x84, + 0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, + // Bytes 1780 - 17bf + 0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, + 0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, + 0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, + 0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, + 0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, + 0xA1, 0x9A, 0xA8, 0x44, 0xF0, 0xA1, 0x9B, 0xAA, + 0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, + 0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, + // Bytes 17c0 - 17ff + 0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, + 0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, + 0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, + 0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, + 0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, + 0xF0, 0xA2, 0xAC, 0x8C, 0x44, 0xF0, 0xA2, 0xAF, + 0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, + 0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, + // Bytes 1800 - 183f + 0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, + 0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, + 0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, + 0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, + 0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, + 0x44, 0xF0, 0xA3, 0xAB, 0xBA, 0x44, 0xF0, 0xA3, + 0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, + 0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, + // Bytes 1840 - 187f + 0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, + 0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, + 0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, + 0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, + 0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, + 0xB6, 0x44, 0xF0, 0xA4, 0xB2, 0x92, 0x44, 0xF0, + 0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, + 0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, + // Bytes 1880 - 18bf + 0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, + 0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, + 0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, + 0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, + 0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, + 0x9B, 0x85, 0x44, 0xF0, 0xA5, 0xA5, 0xBC, 0x44, + 0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, + 0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, + // Bytes 18c0 - 18ff + 0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, + 0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, + 0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, + 0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, + 0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, + 0xA6, 0x94, 0xA3, 0x44, 0xF0, 0xA6, 0x96, 0xA8, + 0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, + 0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, + // Bytes 1900 - 193f + 0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, + 0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, + 0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, + 0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, + 0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, + 0xF0, 0xA7, 0xA2, 0xAE, 0x44, 0xF0, 0xA7, 0xA5, + 0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, + 0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, + // Bytes 1940 - 197f + 0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, + 0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, + 0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, + 0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, + 0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, + 0x44, 0xF0, 0xA9, 0x90, 0x8A, 0x44, 0xF0, 0xA9, + 0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, + 0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, + // Bytes 1980 - 19bf + 0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, + 0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, + 0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, + 0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, + 0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, + 0x2E, 0x42, 0x31, 0x2C, 0x42, 0x31, 0x2E, 0x42, + 0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, + 0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, + // Bytes 19c0 - 19ff + 0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, + 0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, + 0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, + 0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, + 0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, + 0x42, 0x32, 0x37, 0x42, 0x32, 0x38, 0x42, 0x32, + 0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, + 0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, + // Bytes 1a00 - 1a3f + 0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, + 0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, + 0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, + 0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, + 0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, + 0x34, 0x34, 0x42, 0x34, 0x35, 0x42, 0x34, 0x36, + 0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, + 0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, + // Bytes 1a40 - 1a7f + 0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, + 0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, + 0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, + 0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, + 0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, + 0x71, 0x42, 0x43, 0x44, 0x42, 0x44, 0x4A, 0x42, + 0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, + 0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, + // Bytes 1a80 - 1abf + 0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, + 0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, + 0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, + 0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, + 0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, + 0x42, 0x4D, 0x43, 0x42, 0x4D, 0x44, 0x42, 0x4D, + 0x52, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, + 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, + // Bytes 1ac0 - 1aff + 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, + 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, + 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, + 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, + 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, + 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, + 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, + 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, + // Bytes 1b00 - 1b3f + 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, + 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, + 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, + 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, + 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, + 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, + 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, + 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, + // Bytes 1b40 - 1b7f + 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, + 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, + 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, + 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, + 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, + 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, + 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, + 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, + // Bytes 1b80 - 1bbf + 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, + 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, + 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, + 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, + 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, + 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, + 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, + 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, + // Bytes 1bc0 - 1bff + 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, + 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, + 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, + 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, + 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, + 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, + 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, + 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, + // Bytes 1c00 - 1c3f + 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, + 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, + 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, + 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, + 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, + 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, + 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, + 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, + // Bytes 1c40 - 1c7f + 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, + 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, + 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, + 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, + 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, + 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, + 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, + 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, + // Bytes 1c80 - 1cbf + 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, + 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, + 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, + 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, + 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, + 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, + 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, + 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, + // Bytes 1cc0 - 1cff + 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, + 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, + 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, + 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, + 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, + 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, + 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, + // Bytes 1d00 - 1d3f + 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, + 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, + 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, + 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, + 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, + 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, + 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, + 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, + // Bytes 1d40 - 1d7f + 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, + 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, + 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, + 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, + 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, + 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, + 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, + 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, + // Bytes 1d80 - 1dbf + 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, + 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, + 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, + 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, + 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, + 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, + 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, + 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, + // Bytes 1dc0 - 1dff + 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, + 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, + 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, + 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, + 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, + 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, + 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, + 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, + // Bytes 1e00 - 1e3f + 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, + 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, + 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, + 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, + 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, + 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, + 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, + 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, + // Bytes 1e40 - 1e7f + 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, + 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, + 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, + 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, + 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, + 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, + 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, + 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, + // Bytes 1e80 - 1ebf + 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, + 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, + 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, + 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, + 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, + 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, + 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, + 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, + // Bytes 1ec0 - 1eff + 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, + 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, + 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, + 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, + 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, + 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, + 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, + 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, + // Bytes 1f00 - 1f3f + 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, + 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, + 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, + 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, + 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, + 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, + 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, + 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, + // Bytes 1f40 - 1f7f + 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, + 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, + 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, + 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, + 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, + 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, + 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, + 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, + // Bytes 1f80 - 1fbf + 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, + 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, + 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, + 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, + 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, + 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, + 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, + 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, + // Bytes 1fc0 - 1fff + 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, + 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, + 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, + 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, + 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, + 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, + 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, + 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, + // Bytes 2000 - 203f + 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, + 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, + 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, + 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, + 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, + 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, + 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, + 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, + // Bytes 2040 - 207f + 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, + 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, + 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, + 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, + 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, + 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, + 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, + 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, + // Bytes 2080 - 20bf + 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, + 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, + 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, + 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, + 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, + 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, + 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, + 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, + // Bytes 20c0 - 20ff + 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, + 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, + 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, + 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, + 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, + 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, + 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, + 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, + // Bytes 2100 - 213f + 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, + 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, + 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, + 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, + 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, + 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, + 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, + 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, + // Bytes 2140 - 217f + 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, + 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, + 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, + 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, + 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, + 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, + 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, + 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, + // Bytes 2180 - 21bf + 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, + 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, + // Bytes 21c0 - 21ff + 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, + 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, + 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, + 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, + 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, + // Bytes 2200 - 223f + 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, + 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, + 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, + 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, + 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, + 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, + 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, + 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, + // Bytes 2240 - 227f + 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, + 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, + 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, + 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, + 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, + 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, + 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, + 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, + // Bytes 2280 - 22bf + 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, + 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, + 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, + 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, + 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, + // Bytes 22c0 - 22ff + 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, + 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, + 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, + // Bytes 2300 - 233f + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, + // Bytes 2340 - 237f + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, + 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, + // Bytes 2380 - 23bf + 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, + 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, + // Bytes 23c0 - 23ff + 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, + 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, + 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, + // Bytes 2400 - 243f + 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, + 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, + 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, + 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, + 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, + // Bytes 2440 - 247f + 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, + 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, + 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, + 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, + // Bytes 2480 - 24bf + 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, + 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, + 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + // Bytes 24c0 - 24ff + 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, + 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, + 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, + 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, + // Bytes 2500 - 253f + 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, + 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, + 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, + // Bytes 2540 - 257f + 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, + 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, + 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, + 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, + // Bytes 2580 - 25bf + 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, + 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, + 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, + // Bytes 25c0 - 25ff + 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, + // Bytes 2600 - 263f + 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, + 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, + 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, + 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, + 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, + 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, + // Bytes 2640 - 267f + 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, + 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, + 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, + 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, + 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, + 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + // Bytes 2680 - 26bf + 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, + 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, + 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + // Bytes 26c0 - 26ff + 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, + // Bytes 2700 - 273f + 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, + // Bytes 2740 - 277f + 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, + 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, + 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, + 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, + 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, + 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, + // Bytes 2780 - 27bf + 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, + 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, + 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, + 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, + 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, + // Bytes 27c0 - 27ff + 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, + 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, + 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, + 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, + 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, + // Bytes 2800 - 283f + 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, + 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, + 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, + 0x83, 0xA0, 0x46, 0xE4, 0xBB, 0xA4, 0xE5, 0x92, + 0x8C, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, + 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46, + // Bytes 2840 - 287f + 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6, + 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61, + 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80, + 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1, + 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + // Bytes 2880 - 28bf + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, + // Bytes 28c0 - 28ff + 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64, + 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7, + 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48, + // Bytes 2900 - 293f + 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, + 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, + 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, + 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, + 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49, + // Bytes 2940 - 297f + 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80, + 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80, + 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, 0x9D, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, + // Bytes 2980 - 29bf + 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, + 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + // Bytes 29c0 - 29ff + 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3, + 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82, + 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49, + 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, 0xE3, + 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, + // Bytes 2a00 - 2a3f + 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49, + 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, + 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, + // Bytes 2a40 - 2a7f + 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49, + 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3, + 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, + 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, + // Bytes 2a80 - 2abf + 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83, + 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49, + 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3, + // Bytes 2ac0 - 2aff + 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, + 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, 0x83, + 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + // Bytes 2b00 - 2b3f + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, 0xE3, + 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83, + // Bytes 2b40 - 2b7f + 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3, + // Bytes 2b80 - 2bbf + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, + 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98, + // Bytes 2bc0 - 2bff + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, + 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + // Bytes 2c00 - 2c3f + 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C, + 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, + 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, + 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, 0x84, + 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, + // Bytes 2c40 - 2c7f + 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, + // Bytes 2c80 - 2cbf + 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7, + // Bytes 2cc0 - 2cff + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, + 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, + // Bytes 2d00 - 2d3f + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, + // Bytes 2d40 - 2d7f + 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, + 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, + 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52, + 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, + // Bytes 2d80 - 2dbf + 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, + 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, + 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, + 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, 0x84, + 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, + // Bytes 2dc0 - 2dff + 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, + 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE, + // Bytes 2e00 - 2e3f + 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2, + 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, 0xB5, + 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5, + // Bytes 2e40 - 2e7f + 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5, + 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7, + 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80, + 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC, + 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + // Bytes 2e80 - 2ebf + 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD, + 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, 0x91, + 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, + // Bytes 2ec0 - 2eff + 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7, + 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, + 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, + 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91, + 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08, + 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA, + 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, + 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8, + // Bytes 2f00 - 2f3f + 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91, + 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, + 0xF0, 0x91, 0xA4, 0xB5, 0xF0, 0x91, 0xA4, 0xB0, + 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, + 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x16, 0x44, + 0x44, 0x5A, 0xCC, 0x8C, 0xCD, 0x44, 0x44, 0x7A, + 0xCC, 0x8C, 0xCD, 0x44, 0x64, 0x7A, 0xCC, 0x8C, + // Bytes 2f40 - 2f7f + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, + // Bytes 2f80 - 2fbf + 0x01, 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, + 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, + // Bytes 2fc0 - 2fff + 0x01, 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, + 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0x11, 0x4C, 0xE1, 0x84, 0x8C, + 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, + 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x11, + 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, + // Bytes 3000 - 303f + 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x11, 0x4C, 0xE3, + 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE1, 0x84, 0x8E, + 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, + 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE3, + 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, + // Bytes 3040 - 307f + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x11, + 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0x11, 0x52, 0xE3, 0x83, + // Bytes 3080 - 30bf + 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, + 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, + 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, + 0x03, 0x41, 0xCC, 0x80, 0xCD, 0x03, 0x41, 0xCC, + 0x81, 0xCD, 0x03, 0x41, 0xCC, 0x83, 0xCD, 0x03, + // Bytes 30c0 - 30ff + 0x41, 0xCC, 0x84, 0xCD, 0x03, 0x41, 0xCC, 0x89, + 0xCD, 0x03, 0x41, 0xCC, 0x8C, 0xCD, 0x03, 0x41, + 0xCC, 0x8F, 0xCD, 0x03, 0x41, 0xCC, 0x91, 0xCD, + 0x03, 0x41, 0xCC, 0xA5, 0xB9, 0x03, 0x41, 0xCC, + 0xA8, 0xA9, 0x03, 0x42, 0xCC, 0x87, 0xCD, 0x03, + 0x42, 0xCC, 0xA3, 0xB9, 0x03, 0x42, 0xCC, 0xB1, + 0xB9, 0x03, 0x43, 0xCC, 0x81, 0xCD, 0x03, 0x43, + 0xCC, 0x82, 0xCD, 0x03, 0x43, 0xCC, 0x87, 0xCD, + // Bytes 3100 - 313f + 0x03, 0x43, 0xCC, 0x8C, 0xCD, 0x03, 0x44, 0xCC, + 0x87, 0xCD, 0x03, 0x44, 0xCC, 0x8C, 0xCD, 0x03, + 0x44, 0xCC, 0xA3, 0xB9, 0x03, 0x44, 0xCC, 0xA7, + 0xA9, 0x03, 0x44, 0xCC, 0xAD, 0xB9, 0x03, 0x44, + 0xCC, 0xB1, 0xB9, 0x03, 0x45, 0xCC, 0x80, 0xCD, + 0x03, 0x45, 0xCC, 0x81, 0xCD, 0x03, 0x45, 0xCC, + 0x83, 0xCD, 0x03, 0x45, 0xCC, 0x86, 0xCD, 0x03, + 0x45, 0xCC, 0x87, 0xCD, 0x03, 0x45, 0xCC, 0x88, + // Bytes 3140 - 317f + 0xCD, 0x03, 0x45, 0xCC, 0x89, 0xCD, 0x03, 0x45, + 0xCC, 0x8C, 0xCD, 0x03, 0x45, 0xCC, 0x8F, 0xCD, + 0x03, 0x45, 0xCC, 0x91, 0xCD, 0x03, 0x45, 0xCC, + 0xA8, 0xA9, 0x03, 0x45, 0xCC, 0xAD, 0xB9, 0x03, + 0x45, 0xCC, 0xB0, 0xB9, 0x03, 0x46, 0xCC, 0x87, + 0xCD, 0x03, 0x47, 0xCC, 0x81, 0xCD, 0x03, 0x47, + 0xCC, 0x82, 0xCD, 0x03, 0x47, 0xCC, 0x84, 0xCD, + 0x03, 0x47, 0xCC, 0x86, 0xCD, 0x03, 0x47, 0xCC, + // Bytes 3180 - 31bf + 0x87, 0xCD, 0x03, 0x47, 0xCC, 0x8C, 0xCD, 0x03, + 0x47, 0xCC, 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0x82, + 0xCD, 0x03, 0x48, 0xCC, 0x87, 0xCD, 0x03, 0x48, + 0xCC, 0x88, 0xCD, 0x03, 0x48, 0xCC, 0x8C, 0xCD, + 0x03, 0x48, 0xCC, 0xA3, 0xB9, 0x03, 0x48, 0xCC, + 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0xAE, 0xB9, 0x03, + 0x49, 0xCC, 0x80, 0xCD, 0x03, 0x49, 0xCC, 0x81, + 0xCD, 0x03, 0x49, 0xCC, 0x82, 0xCD, 0x03, 0x49, + // Bytes 31c0 - 31ff + 0xCC, 0x83, 0xCD, 0x03, 0x49, 0xCC, 0x84, 0xCD, + 0x03, 0x49, 0xCC, 0x86, 0xCD, 0x03, 0x49, 0xCC, + 0x87, 0xCD, 0x03, 0x49, 0xCC, 0x89, 0xCD, 0x03, + 0x49, 0xCC, 0x8C, 0xCD, 0x03, 0x49, 0xCC, 0x8F, + 0xCD, 0x03, 0x49, 0xCC, 0x91, 0xCD, 0x03, 0x49, + 0xCC, 0xA3, 0xB9, 0x03, 0x49, 0xCC, 0xA8, 0xA9, + 0x03, 0x49, 0xCC, 0xB0, 0xB9, 0x03, 0x4A, 0xCC, + 0x82, 0xCD, 0x03, 0x4B, 0xCC, 0x81, 0xCD, 0x03, + // Bytes 3200 - 323f + 0x4B, 0xCC, 0x8C, 0xCD, 0x03, 0x4B, 0xCC, 0xA3, + 0xB9, 0x03, 0x4B, 0xCC, 0xA7, 0xA9, 0x03, 0x4B, + 0xCC, 0xB1, 0xB9, 0x03, 0x4C, 0xCC, 0x81, 0xCD, + 0x03, 0x4C, 0xCC, 0x8C, 0xCD, 0x03, 0x4C, 0xCC, + 0xA7, 0xA9, 0x03, 0x4C, 0xCC, 0xAD, 0xB9, 0x03, + 0x4C, 0xCC, 0xB1, 0xB9, 0x03, 0x4D, 0xCC, 0x81, + 0xCD, 0x03, 0x4D, 0xCC, 0x87, 0xCD, 0x03, 0x4D, + 0xCC, 0xA3, 0xB9, 0x03, 0x4E, 0xCC, 0x80, 0xCD, + // Bytes 3240 - 327f + 0x03, 0x4E, 0xCC, 0x81, 0xCD, 0x03, 0x4E, 0xCC, + 0x83, 0xCD, 0x03, 0x4E, 0xCC, 0x87, 0xCD, 0x03, + 0x4E, 0xCC, 0x8C, 0xCD, 0x03, 0x4E, 0xCC, 0xA3, + 0xB9, 0x03, 0x4E, 0xCC, 0xA7, 0xA9, 0x03, 0x4E, + 0xCC, 0xAD, 0xB9, 0x03, 0x4E, 0xCC, 0xB1, 0xB9, + 0x03, 0x4F, 0xCC, 0x80, 0xCD, 0x03, 0x4F, 0xCC, + 0x81, 0xCD, 0x03, 0x4F, 0xCC, 0x86, 0xCD, 0x03, + 0x4F, 0xCC, 0x89, 0xCD, 0x03, 0x4F, 0xCC, 0x8B, + // Bytes 3280 - 32bf + 0xCD, 0x03, 0x4F, 0xCC, 0x8C, 0xCD, 0x03, 0x4F, + 0xCC, 0x8F, 0xCD, 0x03, 0x4F, 0xCC, 0x91, 0xCD, + 0x03, 0x50, 0xCC, 0x81, 0xCD, 0x03, 0x50, 0xCC, + 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x81, 0xCD, 0x03, + 0x52, 0xCC, 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x8C, + 0xCD, 0x03, 0x52, 0xCC, 0x8F, 0xCD, 0x03, 0x52, + 0xCC, 0x91, 0xCD, 0x03, 0x52, 0xCC, 0xA7, 0xA9, + 0x03, 0x52, 0xCC, 0xB1, 0xB9, 0x03, 0x53, 0xCC, + // Bytes 32c0 - 32ff + 0x82, 0xCD, 0x03, 0x53, 0xCC, 0x87, 0xCD, 0x03, + 0x53, 0xCC, 0xA6, 0xB9, 0x03, 0x53, 0xCC, 0xA7, + 0xA9, 0x03, 0x54, 0xCC, 0x87, 0xCD, 0x03, 0x54, + 0xCC, 0x8C, 0xCD, 0x03, 0x54, 0xCC, 0xA3, 0xB9, + 0x03, 0x54, 0xCC, 0xA6, 0xB9, 0x03, 0x54, 0xCC, + 0xA7, 0xA9, 0x03, 0x54, 0xCC, 0xAD, 0xB9, 0x03, + 0x54, 0xCC, 0xB1, 0xB9, 0x03, 0x55, 0xCC, 0x80, + 0xCD, 0x03, 0x55, 0xCC, 0x81, 0xCD, 0x03, 0x55, + // Bytes 3300 - 333f + 0xCC, 0x82, 0xCD, 0x03, 0x55, 0xCC, 0x86, 0xCD, + 0x03, 0x55, 0xCC, 0x89, 0xCD, 0x03, 0x55, 0xCC, + 0x8A, 0xCD, 0x03, 0x55, 0xCC, 0x8B, 0xCD, 0x03, + 0x55, 0xCC, 0x8C, 0xCD, 0x03, 0x55, 0xCC, 0x8F, + 0xCD, 0x03, 0x55, 0xCC, 0x91, 0xCD, 0x03, 0x55, + 0xCC, 0xA3, 0xB9, 0x03, 0x55, 0xCC, 0xA4, 0xB9, + 0x03, 0x55, 0xCC, 0xA8, 0xA9, 0x03, 0x55, 0xCC, + 0xAD, 0xB9, 0x03, 0x55, 0xCC, 0xB0, 0xB9, 0x03, + // Bytes 3340 - 337f + 0x56, 0xCC, 0x83, 0xCD, 0x03, 0x56, 0xCC, 0xA3, + 0xB9, 0x03, 0x57, 0xCC, 0x80, 0xCD, 0x03, 0x57, + 0xCC, 0x81, 0xCD, 0x03, 0x57, 0xCC, 0x82, 0xCD, + 0x03, 0x57, 0xCC, 0x87, 0xCD, 0x03, 0x57, 0xCC, + 0x88, 0xCD, 0x03, 0x57, 0xCC, 0xA3, 0xB9, 0x03, + 0x58, 0xCC, 0x87, 0xCD, 0x03, 0x58, 0xCC, 0x88, + 0xCD, 0x03, 0x59, 0xCC, 0x80, 0xCD, 0x03, 0x59, + 0xCC, 0x81, 0xCD, 0x03, 0x59, 0xCC, 0x82, 0xCD, + // Bytes 3380 - 33bf + 0x03, 0x59, 0xCC, 0x83, 0xCD, 0x03, 0x59, 0xCC, + 0x84, 0xCD, 0x03, 0x59, 0xCC, 0x87, 0xCD, 0x03, + 0x59, 0xCC, 0x88, 0xCD, 0x03, 0x59, 0xCC, 0x89, + 0xCD, 0x03, 0x59, 0xCC, 0xA3, 0xB9, 0x03, 0x5A, + 0xCC, 0x81, 0xCD, 0x03, 0x5A, 0xCC, 0x82, 0xCD, + 0x03, 0x5A, 0xCC, 0x87, 0xCD, 0x03, 0x5A, 0xCC, + 0x8C, 0xCD, 0x03, 0x5A, 0xCC, 0xA3, 0xB9, 0x03, + 0x5A, 0xCC, 0xB1, 0xB9, 0x03, 0x61, 0xCC, 0x80, + // Bytes 33c0 - 33ff + 0xCD, 0x03, 0x61, 0xCC, 0x81, 0xCD, 0x03, 0x61, + 0xCC, 0x83, 0xCD, 0x03, 0x61, 0xCC, 0x84, 0xCD, + 0x03, 0x61, 0xCC, 0x89, 0xCD, 0x03, 0x61, 0xCC, + 0x8C, 0xCD, 0x03, 0x61, 0xCC, 0x8F, 0xCD, 0x03, + 0x61, 0xCC, 0x91, 0xCD, 0x03, 0x61, 0xCC, 0xA5, + 0xB9, 0x03, 0x61, 0xCC, 0xA8, 0xA9, 0x03, 0x62, + 0xCC, 0x87, 0xCD, 0x03, 0x62, 0xCC, 0xA3, 0xB9, + 0x03, 0x62, 0xCC, 0xB1, 0xB9, 0x03, 0x63, 0xCC, + // Bytes 3400 - 343f + 0x81, 0xCD, 0x03, 0x63, 0xCC, 0x82, 0xCD, 0x03, + 0x63, 0xCC, 0x87, 0xCD, 0x03, 0x63, 0xCC, 0x8C, + 0xCD, 0x03, 0x64, 0xCC, 0x87, 0xCD, 0x03, 0x64, + 0xCC, 0x8C, 0xCD, 0x03, 0x64, 0xCC, 0xA3, 0xB9, + 0x03, 0x64, 0xCC, 0xA7, 0xA9, 0x03, 0x64, 0xCC, + 0xAD, 0xB9, 0x03, 0x64, 0xCC, 0xB1, 0xB9, 0x03, + 0x65, 0xCC, 0x80, 0xCD, 0x03, 0x65, 0xCC, 0x81, + 0xCD, 0x03, 0x65, 0xCC, 0x83, 0xCD, 0x03, 0x65, + // Bytes 3440 - 347f + 0xCC, 0x86, 0xCD, 0x03, 0x65, 0xCC, 0x87, 0xCD, + 0x03, 0x65, 0xCC, 0x88, 0xCD, 0x03, 0x65, 0xCC, + 0x89, 0xCD, 0x03, 0x65, 0xCC, 0x8C, 0xCD, 0x03, + 0x65, 0xCC, 0x8F, 0xCD, 0x03, 0x65, 0xCC, 0x91, + 0xCD, 0x03, 0x65, 0xCC, 0xA8, 0xA9, 0x03, 0x65, + 0xCC, 0xAD, 0xB9, 0x03, 0x65, 0xCC, 0xB0, 0xB9, + 0x03, 0x66, 0xCC, 0x87, 0xCD, 0x03, 0x67, 0xCC, + 0x81, 0xCD, 0x03, 0x67, 0xCC, 0x82, 0xCD, 0x03, + // Bytes 3480 - 34bf + 0x67, 0xCC, 0x84, 0xCD, 0x03, 0x67, 0xCC, 0x86, + 0xCD, 0x03, 0x67, 0xCC, 0x87, 0xCD, 0x03, 0x67, + 0xCC, 0x8C, 0xCD, 0x03, 0x67, 0xCC, 0xA7, 0xA9, + 0x03, 0x68, 0xCC, 0x82, 0xCD, 0x03, 0x68, 0xCC, + 0x87, 0xCD, 0x03, 0x68, 0xCC, 0x88, 0xCD, 0x03, + 0x68, 0xCC, 0x8C, 0xCD, 0x03, 0x68, 0xCC, 0xA3, + 0xB9, 0x03, 0x68, 0xCC, 0xA7, 0xA9, 0x03, 0x68, + 0xCC, 0xAE, 0xB9, 0x03, 0x68, 0xCC, 0xB1, 0xB9, + // Bytes 34c0 - 34ff + 0x03, 0x69, 0xCC, 0x80, 0xCD, 0x03, 0x69, 0xCC, + 0x81, 0xCD, 0x03, 0x69, 0xCC, 0x82, 0xCD, 0x03, + 0x69, 0xCC, 0x83, 0xCD, 0x03, 0x69, 0xCC, 0x84, + 0xCD, 0x03, 0x69, 0xCC, 0x86, 0xCD, 0x03, 0x69, + 0xCC, 0x89, 0xCD, 0x03, 0x69, 0xCC, 0x8C, 0xCD, + 0x03, 0x69, 0xCC, 0x8F, 0xCD, 0x03, 0x69, 0xCC, + 0x91, 0xCD, 0x03, 0x69, 0xCC, 0xA3, 0xB9, 0x03, + 0x69, 0xCC, 0xA8, 0xA9, 0x03, 0x69, 0xCC, 0xB0, + // Bytes 3500 - 353f + 0xB9, 0x03, 0x6A, 0xCC, 0x82, 0xCD, 0x03, 0x6A, + 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, 0x81, 0xCD, + 0x03, 0x6B, 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, + 0xA3, 0xB9, 0x03, 0x6B, 0xCC, 0xA7, 0xA9, 0x03, + 0x6B, 0xCC, 0xB1, 0xB9, 0x03, 0x6C, 0xCC, 0x81, + 0xCD, 0x03, 0x6C, 0xCC, 0x8C, 0xCD, 0x03, 0x6C, + 0xCC, 0xA7, 0xA9, 0x03, 0x6C, 0xCC, 0xAD, 0xB9, + 0x03, 0x6C, 0xCC, 0xB1, 0xB9, 0x03, 0x6D, 0xCC, + // Bytes 3540 - 357f + 0x81, 0xCD, 0x03, 0x6D, 0xCC, 0x87, 0xCD, 0x03, + 0x6D, 0xCC, 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0x80, + 0xCD, 0x03, 0x6E, 0xCC, 0x81, 0xCD, 0x03, 0x6E, + 0xCC, 0x83, 0xCD, 0x03, 0x6E, 0xCC, 0x87, 0xCD, + 0x03, 0x6E, 0xCC, 0x8C, 0xCD, 0x03, 0x6E, 0xCC, + 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0xA7, 0xA9, 0x03, + 0x6E, 0xCC, 0xAD, 0xB9, 0x03, 0x6E, 0xCC, 0xB1, + 0xB9, 0x03, 0x6F, 0xCC, 0x80, 0xCD, 0x03, 0x6F, + // Bytes 3580 - 35bf + 0xCC, 0x81, 0xCD, 0x03, 0x6F, 0xCC, 0x86, 0xCD, + 0x03, 0x6F, 0xCC, 0x89, 0xCD, 0x03, 0x6F, 0xCC, + 0x8B, 0xCD, 0x03, 0x6F, 0xCC, 0x8C, 0xCD, 0x03, + 0x6F, 0xCC, 0x8F, 0xCD, 0x03, 0x6F, 0xCC, 0x91, + 0xCD, 0x03, 0x70, 0xCC, 0x81, 0xCD, 0x03, 0x70, + 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, 0x81, 0xCD, + 0x03, 0x72, 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, + 0x8C, 0xCD, 0x03, 0x72, 0xCC, 0x8F, 0xCD, 0x03, + // Bytes 35c0 - 35ff + 0x72, 0xCC, 0x91, 0xCD, 0x03, 0x72, 0xCC, 0xA7, + 0xA9, 0x03, 0x72, 0xCC, 0xB1, 0xB9, 0x03, 0x73, + 0xCC, 0x82, 0xCD, 0x03, 0x73, 0xCC, 0x87, 0xCD, + 0x03, 0x73, 0xCC, 0xA6, 0xB9, 0x03, 0x73, 0xCC, + 0xA7, 0xA9, 0x03, 0x74, 0xCC, 0x87, 0xCD, 0x03, + 0x74, 0xCC, 0x88, 0xCD, 0x03, 0x74, 0xCC, 0x8C, + 0xCD, 0x03, 0x74, 0xCC, 0xA3, 0xB9, 0x03, 0x74, + 0xCC, 0xA6, 0xB9, 0x03, 0x74, 0xCC, 0xA7, 0xA9, + // Bytes 3600 - 363f + 0x03, 0x74, 0xCC, 0xAD, 0xB9, 0x03, 0x74, 0xCC, + 0xB1, 0xB9, 0x03, 0x75, 0xCC, 0x80, 0xCD, 0x03, + 0x75, 0xCC, 0x81, 0xCD, 0x03, 0x75, 0xCC, 0x82, + 0xCD, 0x03, 0x75, 0xCC, 0x86, 0xCD, 0x03, 0x75, + 0xCC, 0x89, 0xCD, 0x03, 0x75, 0xCC, 0x8A, 0xCD, + 0x03, 0x75, 0xCC, 0x8B, 0xCD, 0x03, 0x75, 0xCC, + 0x8C, 0xCD, 0x03, 0x75, 0xCC, 0x8F, 0xCD, 0x03, + 0x75, 0xCC, 0x91, 0xCD, 0x03, 0x75, 0xCC, 0xA3, + // Bytes 3640 - 367f + 0xB9, 0x03, 0x75, 0xCC, 0xA4, 0xB9, 0x03, 0x75, + 0xCC, 0xA8, 0xA9, 0x03, 0x75, 0xCC, 0xAD, 0xB9, + 0x03, 0x75, 0xCC, 0xB0, 0xB9, 0x03, 0x76, 0xCC, + 0x83, 0xCD, 0x03, 0x76, 0xCC, 0xA3, 0xB9, 0x03, + 0x77, 0xCC, 0x80, 0xCD, 0x03, 0x77, 0xCC, 0x81, + 0xCD, 0x03, 0x77, 0xCC, 0x82, 0xCD, 0x03, 0x77, + 0xCC, 0x87, 0xCD, 0x03, 0x77, 0xCC, 0x88, 0xCD, + 0x03, 0x77, 0xCC, 0x8A, 0xCD, 0x03, 0x77, 0xCC, + // Bytes 3680 - 36bf + 0xA3, 0xB9, 0x03, 0x78, 0xCC, 0x87, 0xCD, 0x03, + 0x78, 0xCC, 0x88, 0xCD, 0x03, 0x79, 0xCC, 0x80, + 0xCD, 0x03, 0x79, 0xCC, 0x81, 0xCD, 0x03, 0x79, + 0xCC, 0x82, 0xCD, 0x03, 0x79, 0xCC, 0x83, 0xCD, + 0x03, 0x79, 0xCC, 0x84, 0xCD, 0x03, 0x79, 0xCC, + 0x87, 0xCD, 0x03, 0x79, 0xCC, 0x88, 0xCD, 0x03, + 0x79, 0xCC, 0x89, 0xCD, 0x03, 0x79, 0xCC, 0x8A, + 0xCD, 0x03, 0x79, 0xCC, 0xA3, 0xB9, 0x03, 0x7A, + // Bytes 36c0 - 36ff + 0xCC, 0x81, 0xCD, 0x03, 0x7A, 0xCC, 0x82, 0xCD, + 0x03, 0x7A, 0xCC, 0x87, 0xCD, 0x03, 0x7A, 0xCC, + 0x8C, 0xCD, 0x03, 0x7A, 0xCC, 0xA3, 0xB9, 0x03, + 0x7A, 0xCC, 0xB1, 0xB9, 0x04, 0xC2, 0xA8, 0xCC, + 0x80, 0xCE, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, + 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCE, 0x04, 0xC3, + 0x86, 0xCC, 0x81, 0xCD, 0x04, 0xC3, 0x86, 0xCC, + 0x84, 0xCD, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xCD, + // Bytes 3700 - 373f + 0x04, 0xC3, 0xA6, 0xCC, 0x81, 0xCD, 0x04, 0xC3, + 0xA6, 0xCC, 0x84, 0xCD, 0x04, 0xC3, 0xB8, 0xCC, + 0x81, 0xCD, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xCD, + 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xCD, 0x04, 0xCA, + 0x92, 0xCC, 0x8C, 0xCD, 0x04, 0xCE, 0x91, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0x91, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0x91, 0xCD, + // Bytes 3740 - 377f + 0x85, 0xDD, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0x97, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x97, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xDD, + 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0x99, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0x99, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + // Bytes 3780 - 37bf + 0x9F, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x9F, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0xA5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + 0xA9, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0xA9, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xDD, + // Bytes 37c0 - 37ff + 0x04, 0xCE, 0xB1, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB1, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB1, 0xCD, + 0x85, 0xDD, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0xB7, 0xCD, 0x85, 0xDD, 0x04, 0xCE, 0xB9, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB9, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB9, 0xCD, + // Bytes 3800 - 383f + 0x82, 0xCD, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x81, 0xCC, 0x93, 0xCD, 0x04, 0xCF, 0x81, 0xCC, + 0x94, 0xCD, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xCD, + 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x85, 0xCC, 0x84, 0xCD, 0x04, 0xCF, 0x85, 0xCC, + 0x86, 0xCD, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xCD, + 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xDD, 0x04, 0xCF, + // Bytes 3840 - 387f + 0x92, 0xCC, 0x81, 0xCD, 0x04, 0xCF, 0x92, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x90, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x93, 0xCC, + 0x81, 0xCD, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x95, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x96, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xCD, + // Bytes 3880 - 38bf + 0x04, 0xD0, 0x97, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x98, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0x98, 0xCC, + 0x84, 0xCD, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xCD, + 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x9A, 0xCC, 0x81, 0xCD, 0x04, 0xD0, 0x9E, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xCD, + 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0xA3, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, + // Bytes 38c0 - 38ff + 0x8B, 0xCD, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0xAD, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xCD, 0x04, 0xD0, + 0xB5, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + // Bytes 3900 - 393f + 0xB6, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB7, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xCD, 0x04, 0xD0, + 0xB8, 0xCC, 0x86, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xCD, + 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0x83, 0xCC, 0x84, 0xCD, 0x04, 0xD1, 0x83, 0xCC, + 0x86, 0xCD, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xCD, + // Bytes 3940 - 397f + 0x04, 0xD1, 0x83, 0xCC, 0x8B, 0xCD, 0x04, 0xD1, + 0x87, 0xCC, 0x88, 0xCD, 0x04, 0xD1, 0x8B, 0xCC, + 0x88, 0xCD, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xCD, + 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0xB4, 0xCC, 0x8F, 0xCD, 0x04, 0xD1, 0xB5, 0xCC, + 0x8F, 0xCD, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xCD, + 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xD3, + 0xA8, 0xCC, 0x88, 0xCD, 0x04, 0xD3, 0xA9, 0xCC, + // Bytes 3980 - 39bf + 0x88, 0xCD, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xCD, + 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xCD, 0x04, 0xD8, + 0xA7, 0xD9, 0x95, 0xB9, 0x04, 0xD9, 0x88, 0xD9, + 0x94, 0xCD, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xCD, + 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xCD, 0x04, 0xDB, + 0x92, 0xD9, 0x94, 0xCD, 0x04, 0xDB, 0x95, 0xD9, + 0x94, 0xCD, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + // Bytes 39c0 - 39ff + 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x41, + 0xCC, 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x41, 0xCC, + 0x86, 0xCC, 0x81, 0xCE, 0x05, 0x41, 0xCC, 0x86, + 0xCC, 0x83, 0xCE, 0x05, 0x41, 0xCC, 0x86, 0xCC, + 0x89, 0xCE, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, + 0xCE, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCE, + 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, + // Bytes 3a00 - 3a3f + 0x41, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x41, + 0xCC, 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x43, 0xCC, + 0xA7, 0xCC, 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, + 0xCC, 0x80, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, + 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, + 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCE, + 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, + 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x45, + // Bytes 3a40 - 3a7f + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x45, 0xCC, + 0xA7, 0xCC, 0x86, 0xCE, 0x05, 0x49, 0xCC, 0x88, + 0xCC, 0x81, 0xCE, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, + 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x4F, + 0xCC, 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + // Bytes 3a80 - 3abf + 0x83, 0xCC, 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x83, + 0xCC, 0x88, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, + 0x80, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, + 0xCE, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x4F, + 0xCC, 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + 0x9B, 0xCC, 0x83, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, + // Bytes 3ac0 - 3aff + 0xCC, 0x89, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, + 0xA3, 0xBA, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, + 0xCE, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, + 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, + 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x53, + 0xCC, 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x53, 0xCC, + 0xA3, 0xCC, 0x87, 0xCE, 0x05, 0x55, 0xCC, 0x83, + 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x84, 0xCC, + // Bytes 3b00 - 3b3f + 0x88, 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x55, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, + // Bytes 3b40 - 3b7f + 0xBA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x61, + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x61, 0xCC, + 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x61, 0xCC, 0x86, + 0xCC, 0x81, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, + 0x83, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, + 0xCE, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + // Bytes 3b80 - 3bbf + 0x05, 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, 0x61, + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x61, 0xCC, + 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x63, 0xCC, 0xA7, + 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, + 0x80, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, + 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCE, + 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, + // Bytes 3bc0 - 3bff + 0x65, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, 0x65, + 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, + 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x65, 0xCC, 0xA7, + 0xCC, 0x86, 0xCE, 0x05, 0x69, 0xCC, 0x88, 0xCC, + 0x81, 0xCE, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, + 0xCE, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x6F, + // Bytes 3c00 - 3c3f + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x6F, 0xCC, + 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x83, + 0xCC, 0x84, 0xCE, 0x05, 0x6F, 0xCC, 0x83, 0xCC, + 0x88, 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, + 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCE, + 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, 0x05, + 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x6F, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x6F, 0xCC, + // Bytes 3c40 - 3c7f + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, + 0xBA, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, + 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, 0x05, + 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, 0x73, + 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, + 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, 0xA3, + // Bytes 3c80 - 3cbf + 0xCC, 0x87, 0xCE, 0x05, 0x75, 0xCC, 0x83, 0xCC, + 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, + 0xCE, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCE, + 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x05, + 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x75, + 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x75, 0xCC, + 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, + // Bytes 3cc0 - 3cff + 0x83, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, + 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xBA, + 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCE, 0x05, + 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCE, 0x05, 0xE1, + 0xBE, 0xBF, 0xCD, 0x82, 0xCE, 0x05, 0xE1, 0xBF, + 0xBE, 0xCC, 0x80, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, + 0xCC, 0x81, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, + 0x82, 0xCE, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, + // Bytes 3d00 - 3d3f + 0x05, 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, + 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, + // Bytes 3d40 - 3d7f + 0x05, 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3d80 - 3dbf + 0xE2, 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + // Bytes 3dc0 - 3dff + 0x8A, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + // Bytes 3e00 - 3e3f + 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, + 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, + // Bytes 3e40 - 3e7f + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3e80 - 3ebf + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 3ec0 - 3eff + 0xCE, 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, + // Bytes 3f00 - 3f3f + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 3f40 - 3f7f + 0xDE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3f80 - 3fbf + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, + // Bytes 3fc0 - 3fff + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, + // Bytes 4000 - 403f + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, + 0x89, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, + // Bytes 4040 - 407f + 0x15, 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, + // Bytes 4080 - 40bf + 0x11, 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, + // Bytes 40c0 - 40ff + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, + // Bytes 4100 - 413f + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4140 - 417f + 0x11, 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, + // Bytes 4180 - 41bf + 0x11, 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + // Bytes 41c0 - 41ff + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4200 - 423f + 0x11, 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 4240 - 427f + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + // Bytes 4280 - 42bf + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, + // Bytes 42c0 - 42ff + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 4300 - 433f + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + // Bytes 4340 - 437f + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, + // Bytes 4380 - 43bf + 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, 0x82, 0x9B, + 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, + 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x42, + 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xCD, + 0x43, 0x20, 0xCC, 0x83, 0xCD, 0x43, 0x20, 0xCC, + 0x84, 0xCD, 0x43, 0x20, 0xCC, 0x85, 0xCD, 0x43, + 0x20, 0xCC, 0x86, 0xCD, 0x43, 0x20, 0xCC, 0x87, + 0xCD, 0x43, 0x20, 0xCC, 0x88, 0xCD, 0x43, 0x20, + // Bytes 43c0 - 43ff + 0xCC, 0x8A, 0xCD, 0x43, 0x20, 0xCC, 0x8B, 0xCD, + 0x43, 0x20, 0xCC, 0x93, 0xCD, 0x43, 0x20, 0xCC, + 0x94, 0xCD, 0x43, 0x20, 0xCC, 0xA7, 0xA9, 0x43, + 0x20, 0xCC, 0xA8, 0xA9, 0x43, 0x20, 0xCC, 0xB3, + 0xB9, 0x43, 0x20, 0xCD, 0x82, 0xCD, 0x43, 0x20, + 0xCD, 0x85, 0xDD, 0x43, 0x20, 0xD9, 0x8B, 0x5D, + 0x43, 0x20, 0xD9, 0x8C, 0x61, 0x43, 0x20, 0xD9, + 0x8D, 0x65, 0x43, 0x20, 0xD9, 0x8E, 0x69, 0x43, + // Bytes 4400 - 443f + 0x20, 0xD9, 0x8F, 0x6D, 0x43, 0x20, 0xD9, 0x90, + 0x71, 0x43, 0x20, 0xD9, 0x91, 0x75, 0x43, 0x20, + 0xD9, 0x92, 0x79, 0x43, 0x41, 0xCC, 0x8A, 0xCD, + 0x43, 0x73, 0xCC, 0x87, 0xCD, 0x44, 0x20, 0xE3, + 0x82, 0x99, 0x11, 0x44, 0x20, 0xE3, 0x82, 0x9A, + 0x11, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, 0x44, + 0xCE, 0x91, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x95, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x97, 0xCC, 0x81, + // Bytes 4440 - 447f + 0xCD, 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0x9F, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, 0xCC, 0x88, + 0xCD, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB7, 0xCC, 0x81, + 0xCD, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x85, + // Bytes 4480 - 44bf + 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x89, 0xCC, 0x81, + 0xCD, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x35, 0x44, + 0xD7, 0x90, 0xD6, 0xB8, 0x39, 0x44, 0xD7, 0x90, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x92, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x93, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x94, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x3D, 0x44, + // Bytes 44c0 - 44ff + 0xD7, 0x95, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x96, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x98, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x29, 0x44, + 0xD7, 0x99, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9A, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x9C, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9E, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, + // Bytes 4500 - 453f + 0x45, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA3, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, + 0x4D, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA7, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA8, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x51, 0x44, + 0xD7, 0xA9, 0xD7, 0x82, 0x55, 0x44, 0xD7, 0xAA, + // Bytes 4540 - 457f + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, + 0x35, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x5D, 0x44, + 0xD8, 0xA7, 0xD9, 0x93, 0xCD, 0x44, 0xD8, 0xA7, + 0xD9, 0x94, 0xCD, 0x44, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x7D, 0x44, + 0xD8, 0xB1, 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x80, + 0xD9, 0x8B, 0x5D, 0x44, 0xD9, 0x80, 0xD9, 0x8E, + 0x69, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x6D, 0x44, + // Bytes 4580 - 45bf + 0xD9, 0x80, 0xD9, 0x90, 0x71, 0x44, 0xD9, 0x80, + 0xD9, 0x91, 0x75, 0x44, 0xD9, 0x80, 0xD9, 0x92, + 0x79, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x7D, 0x44, + 0xD9, 0x88, 0xD9, 0x94, 0xCD, 0x44, 0xD9, 0x89, + 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x8A, 0xD9, 0x94, + 0xCD, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xCD, 0x44, + 0xDB, 0x95, 0xD9, 0x94, 0xCD, 0x45, 0x20, 0xCC, + 0x88, 0xCC, 0x80, 0xCE, 0x45, 0x20, 0xCC, 0x88, + // Bytes 45c0 - 45ff + 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, 0x88, 0xCD, + 0x82, 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCE, + 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x45, + 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x45, 0x20, + 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, + 0x94, 0xCD, 0x82, 0xCE, 0x45, 0x20, 0xD9, 0x8C, + 0xD9, 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8D, 0xD9, + // Bytes 4600 - 463f + 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, + 0x76, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x76, + 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x45, + 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7E, 0x45, 0xE2, + 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xCF, 0x85, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xD7, 0xA9, + 0xD6, 0xBC, 0xD7, 0x81, 0x52, 0x46, 0xD7, 0xA9, + // Bytes 4640 - 467f + 0xD6, 0xBC, 0xD7, 0x82, 0x56, 0x46, 0xD9, 0x80, + 0xD9, 0x8E, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x8F, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x46, 0xE0, 0xA4, + 0x95, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x96, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x97, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x9C, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + // Bytes 4680 - 46bf + 0xA1, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xA2, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAB, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAF, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA1, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA2, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xAF, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x96, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + // Bytes 46c0 - 46ff + 0x97, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x9C, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xAB, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB2, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB8, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA1, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA2, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE0, 0xBE, + // Bytes 4700 - 473f + 0xB3, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE3, 0x83, + 0x86, 0xE3, 0x82, 0x99, 0x11, 0x48, 0xF0, 0x9D, + 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x48, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xBA, + 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x49, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, + // Bytes 4740 - 477f + 0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, + 0xBE, 0x80, 0xA2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, + 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xB0, 0xB2, 0x4C, 0xF0, 0x9D, + 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + // Bytes 4780 - 47bf + 0x85, 0xB1, 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, + 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xB2, 0x4C, + 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, 0xF0, 0x9D, + 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xAE, 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, + // Bytes 47c0 - 47ff + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, + 0xB2, 0x83, 0x41, 0xCC, 0x82, 0xCD, 0x83, 0x41, + 0xCC, 0x86, 0xCD, 0x83, 0x41, 0xCC, 0x87, 0xCD, + 0x83, 0x41, 0xCC, 0x88, 0xCD, 0x83, 0x41, 0xCC, + 0x8A, 0xCD, 0x83, 0x41, 0xCC, 0xA3, 0xB9, 0x83, + 0x43, 0xCC, 0xA7, 0xA9, 0x83, 0x45, 0xCC, 0x82, + 0xCD, 0x83, 0x45, 0xCC, 0x84, 0xCD, 0x83, 0x45, + 0xCC, 0xA3, 0xB9, 0x83, 0x45, 0xCC, 0xA7, 0xA9, + // Bytes 4800 - 483f + 0x83, 0x49, 0xCC, 0x88, 0xCD, 0x83, 0x4C, 0xCC, + 0xA3, 0xB9, 0x83, 0x4F, 0xCC, 0x82, 0xCD, 0x83, + 0x4F, 0xCC, 0x83, 0xCD, 0x83, 0x4F, 0xCC, 0x84, + 0xCD, 0x83, 0x4F, 0xCC, 0x87, 0xCD, 0x83, 0x4F, + 0xCC, 0x88, 0xCD, 0x83, 0x4F, 0xCC, 0x9B, 0xB1, + 0x83, 0x4F, 0xCC, 0xA3, 0xB9, 0x83, 0x4F, 0xCC, + 0xA8, 0xA9, 0x83, 0x52, 0xCC, 0xA3, 0xB9, 0x83, + 0x53, 0xCC, 0x81, 0xCD, 0x83, 0x53, 0xCC, 0x8C, + // Bytes 4840 - 487f + 0xCD, 0x83, 0x53, 0xCC, 0xA3, 0xB9, 0x83, 0x55, + 0xCC, 0x83, 0xCD, 0x83, 0x55, 0xCC, 0x84, 0xCD, + 0x83, 0x55, 0xCC, 0x88, 0xCD, 0x83, 0x55, 0xCC, + 0x9B, 0xB1, 0x83, 0x61, 0xCC, 0x82, 0xCD, 0x83, + 0x61, 0xCC, 0x86, 0xCD, 0x83, 0x61, 0xCC, 0x87, + 0xCD, 0x83, 0x61, 0xCC, 0x88, 0xCD, 0x83, 0x61, + 0xCC, 0x8A, 0xCD, 0x83, 0x61, 0xCC, 0xA3, 0xB9, + 0x83, 0x63, 0xCC, 0xA7, 0xA9, 0x83, 0x65, 0xCC, + // Bytes 4880 - 48bf + 0x82, 0xCD, 0x83, 0x65, 0xCC, 0x84, 0xCD, 0x83, + 0x65, 0xCC, 0xA3, 0xB9, 0x83, 0x65, 0xCC, 0xA7, + 0xA9, 0x83, 0x69, 0xCC, 0x88, 0xCD, 0x83, 0x6C, + 0xCC, 0xA3, 0xB9, 0x83, 0x6F, 0xCC, 0x82, 0xCD, + 0x83, 0x6F, 0xCC, 0x83, 0xCD, 0x83, 0x6F, 0xCC, + 0x84, 0xCD, 0x83, 0x6F, 0xCC, 0x87, 0xCD, 0x83, + 0x6F, 0xCC, 0x88, 0xCD, 0x83, 0x6F, 0xCC, 0x9B, + 0xB1, 0x83, 0x6F, 0xCC, 0xA3, 0xB9, 0x83, 0x6F, + // Bytes 48c0 - 48ff + 0xCC, 0xA8, 0xA9, 0x83, 0x72, 0xCC, 0xA3, 0xB9, + 0x83, 0x73, 0xCC, 0x81, 0xCD, 0x83, 0x73, 0xCC, + 0x8C, 0xCD, 0x83, 0x73, 0xCC, 0xA3, 0xB9, 0x83, + 0x75, 0xCC, 0x83, 0xCD, 0x83, 0x75, 0xCC, 0x84, + 0xCD, 0x83, 0x75, 0xCC, 0x88, 0xCD, 0x83, 0x75, + 0xCC, 0x9B, 0xB1, 0x84, 0xCE, 0x91, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x95, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x95, + // Bytes 4900 - 493f + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x99, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xA9, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x84, + // Bytes 4940 - 497f + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x84, 0xCE, 0xB1, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x84, + 0xCE, 0xB5, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB5, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x80, + 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x84, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB7, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCD, 0x82, + // Bytes 4980 - 49bf + 0xCD, 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x84, + 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB9, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xCD, 0x84, + 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x84, 0xCF, 0x85, + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x85, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x84, + 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x84, 0xCF, 0x89, + // Bytes 49c0 - 49ff + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4a00 - 4a3f + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + // Bytes 4a40 - 4a7f + 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + // Bytes 4a80 - 4abf + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4ac0 - 4aff + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x42, + 0xCC, 0x80, 0xCD, 0x33, 0x42, 0xCC, 0x81, 0xCD, + 0x33, 0x42, 0xCC, 0x93, 0xCD, 0x33, 0x43, 0xE1, + // Bytes 4b00 - 4b3f + 0x85, 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, + // Bytes 4b40 - 4b7f + 0x43, 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, + // Bytes 4b80 - 4bbf + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, + 0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x33, 0x43, 0xE3, 0x82, 0x99, 0x11, 0x04, 0x43, + // Bytes 4bc0 - 4bff + 0xE3, 0x82, 0x9A, 0x11, 0x04, 0x46, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBD, 0xB2, 0xA2, 0x27, 0x46, 0xE0, + 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA6, 0x27, 0x46, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, 0x27, + 0x00, 0x01, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10798 bytes (10.54 KiB). Checksum: b5981cc85e3bd14. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 46: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 46 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 48 blocks, 3072 entries, 6144 bytes +// The third block is the zero block. +var nfcValues = [3072]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, + // Block 0x5, offset 0x140 + 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x36e2, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x3862, 0x2c1: 0x386e, 0x2c3: 0x385c, + 0x2c6: 0xa000, 0x2c7: 0x384a, + 0x2cc: 0x389e, 0x2cd: 0x3886, 0x2ce: 0x38b0, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x3892, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x3916, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x3874, 0x302: 0x38f8, + 0x310: 0x3850, 0x311: 0x38d4, + 0x312: 0x3856, 0x313: 0x38da, 0x316: 0x3868, 0x317: 0x38ec, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x396a, 0x31b: 0x3970, 0x31c: 0x387a, 0x31d: 0x38fe, + 0x31e: 0x3880, 0x31f: 0x3904, 0x322: 0x388c, 0x323: 0x3910, + 0x324: 0x3898, 0x325: 0x391c, 0x326: 0x38a4, 0x327: 0x3928, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3976, 0x32b: 0x397c, 0x32c: 0x38ce, 0x32d: 0x3952, 0x32e: 0x38aa, 0x32f: 0x392e, + 0x330: 0x38b6, 0x331: 0x393a, 0x332: 0x38bc, 0x333: 0x3940, 0x334: 0x38c2, 0x335: 0x3946, + 0x338: 0x38c8, 0x339: 0x394c, + // Block 0xd, offset 0x340 + 0x351: 0x812e, + 0x352: 0x8133, 0x353: 0x8133, 0x354: 0x8133, 0x355: 0x8133, 0x356: 0x812e, 0x357: 0x8133, + 0x358: 0x8133, 0x359: 0x8133, 0x35a: 0x812f, 0x35b: 0x812e, 0x35c: 0x8133, 0x35d: 0x8133, + 0x35e: 0x8133, 0x35f: 0x8133, 0x360: 0x8133, 0x361: 0x8133, 0x362: 0x812e, 0x363: 0x812e, + 0x364: 0x812e, 0x365: 0x812e, 0x366: 0x812e, 0x367: 0x812e, 0x368: 0x8133, 0x369: 0x8133, + 0x36a: 0x812e, 0x36b: 0x8133, 0x36c: 0x8133, 0x36d: 0x812f, 0x36e: 0x8132, 0x36f: 0x8133, + 0x370: 0x8106, 0x371: 0x8107, 0x372: 0x8108, 0x373: 0x8109, 0x374: 0x810a, 0x375: 0x810b, + 0x376: 0x810c, 0x377: 0x810d, 0x378: 0x810e, 0x379: 0x810f, 0x37a: 0x810f, 0x37b: 0x8110, + 0x37c: 0x8111, 0x37d: 0x8112, 0x37f: 0x8113, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8117, + 0x38c: 0x8118, 0x38d: 0x8119, 0x38e: 0x811a, 0x38f: 0x811b, 0x390: 0x811c, 0x391: 0x811d, + 0x392: 0x811e, 0x393: 0x9933, 0x394: 0x9933, 0x395: 0x992e, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x8133, 0x39b: 0x8133, 0x39c: 0x812e, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x812e, + 0x3b0: 0x811f, + // Block 0xf, offset 0x3c0 + 0x3ca: 0x8133, 0x3cb: 0x8133, + 0x3cc: 0x8133, 0x3cd: 0x8133, 0x3ce: 0x8133, 0x3cf: 0x812e, 0x3d0: 0x812e, 0x3d1: 0x812e, + 0x3d2: 0x812e, 0x3d3: 0x812e, 0x3d4: 0x8133, 0x3d5: 0x8133, 0x3d6: 0x8133, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x8133, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x8133, 0x3e0: 0x8133, 0x3e1: 0x8133, 0x3e3: 0x812e, + 0x3e4: 0x8133, 0x3e5: 0x8133, 0x3e6: 0x812e, 0x3e7: 0x8133, 0x3e8: 0x8133, 0x3e9: 0x812e, + 0x3ea: 0x8133, 0x3eb: 0x8133, 0x3ec: 0x8133, 0x3ed: 0x812e, 0x3ee: 0x812e, 0x3ef: 0x812e, + 0x3f0: 0x8117, 0x3f1: 0x8118, 0x3f2: 0x8119, 0x3f3: 0x8133, 0x3f4: 0x8133, 0x3f5: 0x8133, + 0x3f6: 0x812e, 0x3f7: 0x8133, 0x3f8: 0x8133, 0x3f9: 0x812e, 0x3fa: 0x812e, 0x3fb: 0x8133, + 0x3fc: 0x8133, 0x3fd: 0x8133, 0x3fe: 0x8133, 0x3ff: 0x8133, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2e5d, 0x407: 0xa000, 0x408: 0x2e65, 0x409: 0xa000, 0x40a: 0x2e6d, 0x40b: 0xa000, + 0x40c: 0x2e75, 0x40d: 0xa000, 0x40e: 0x2e7d, 0x411: 0xa000, + 0x412: 0x2e85, + 0x434: 0x8103, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2e8d, + 0x43c: 0xa000, 0x43d: 0x2e95, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x8133, 0x441: 0x8133, 0x442: 0x812e, 0x443: 0x8133, 0x444: 0x8133, 0x445: 0x8133, + 0x446: 0x8133, 0x447: 0x8133, 0x448: 0x8133, 0x449: 0x8133, 0x44a: 0x812e, 0x44b: 0x8133, + 0x44c: 0x8133, 0x44d: 0x8136, 0x44e: 0x812b, 0x44f: 0x812e, 0x450: 0x812a, 0x451: 0x8133, + 0x452: 0x8133, 0x453: 0x8133, 0x454: 0x8133, 0x455: 0x8133, 0x456: 0x8133, 0x457: 0x8133, + 0x458: 0x8133, 0x459: 0x8133, 0x45a: 0x8133, 0x45b: 0x8133, 0x45c: 0x8133, 0x45d: 0x8133, + 0x45e: 0x8133, 0x45f: 0x8133, 0x460: 0x8133, 0x461: 0x8133, 0x462: 0x8133, 0x463: 0x8133, + 0x464: 0x8133, 0x465: 0x8133, 0x466: 0x8133, 0x467: 0x8133, 0x468: 0x8133, 0x469: 0x8133, + 0x46a: 0x8133, 0x46b: 0x8133, 0x46c: 0x8133, 0x46d: 0x8133, 0x46e: 0x8133, 0x46f: 0x8133, + 0x470: 0x8133, 0x471: 0x8133, 0x472: 0x8133, 0x473: 0x8133, 0x474: 0x8133, 0x475: 0x8133, + 0x476: 0x8134, 0x477: 0x8132, 0x478: 0x8132, 0x479: 0x812e, 0x47a: 0x812d, 0x47b: 0x8133, + 0x47c: 0x8135, 0x47d: 0x812e, 0x47e: 0x8133, 0x47f: 0x812e, + // Block 0x12, offset 0x480 + 0x480: 0x30d8, 0x481: 0x33e4, 0x482: 0x30e2, 0x483: 0x33ee, 0x484: 0x30e7, 0x485: 0x33f3, + 0x486: 0x30ec, 0x487: 0x33f8, 0x488: 0x3a0d, 0x489: 0x3b9c, 0x48a: 0x3105, 0x48b: 0x3411, + 0x48c: 0x310f, 0x48d: 0x341b, 0x48e: 0x311e, 0x48f: 0x342a, 0x490: 0x3114, 0x491: 0x3420, + 0x492: 0x3119, 0x493: 0x3425, 0x494: 0x3a30, 0x495: 0x3bbf, 0x496: 0x3a37, 0x497: 0x3bc6, + 0x498: 0x315a, 0x499: 0x3466, 0x49a: 0x315f, 0x49b: 0x346b, 0x49c: 0x3a45, 0x49d: 0x3bd4, + 0x49e: 0x3164, 0x49f: 0x3470, 0x4a0: 0x3173, 0x4a1: 0x347f, 0x4a2: 0x3191, 0x4a3: 0x349d, + 0x4a4: 0x31a0, 0x4a5: 0x34ac, 0x4a6: 0x3196, 0x4a7: 0x34a2, 0x4a8: 0x31a5, 0x4a9: 0x34b1, + 0x4aa: 0x31aa, 0x4ab: 0x34b6, 0x4ac: 0x31f0, 0x4ad: 0x34fc, 0x4ae: 0x3a4c, 0x4af: 0x3bdb, + 0x4b0: 0x31fa, 0x4b1: 0x350b, 0x4b2: 0x3204, 0x4b3: 0x3515, 0x4b4: 0x320e, 0x4b5: 0x351f, + 0x4b6: 0x4805, 0x4b7: 0x4896, 0x4b8: 0x3a53, 0x4b9: 0x3be2, 0x4ba: 0x3227, 0x4bb: 0x3538, + 0x4bc: 0x3222, 0x4bd: 0x3533, 0x4be: 0x322c, 0x4bf: 0x353d, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x3231, 0x4c1: 0x3542, 0x4c2: 0x3236, 0x4c3: 0x3547, 0x4c4: 0x324a, 0x4c5: 0x355b, + 0x4c6: 0x3254, 0x4c7: 0x3565, 0x4c8: 0x3263, 0x4c9: 0x3574, 0x4ca: 0x325e, 0x4cb: 0x356f, + 0x4cc: 0x3a76, 0x4cd: 0x3c05, 0x4ce: 0x3a84, 0x4cf: 0x3c13, 0x4d0: 0x3a8b, 0x4d1: 0x3c1a, + 0x4d2: 0x3a92, 0x4d3: 0x3c21, 0x4d4: 0x3290, 0x4d5: 0x35a1, 0x4d6: 0x3295, 0x4d7: 0x35a6, + 0x4d8: 0x329f, 0x4d9: 0x35b0, 0x4da: 0x4832, 0x4db: 0x48c3, 0x4dc: 0x3ad8, 0x4dd: 0x3c67, + 0x4de: 0x32b8, 0x4df: 0x35c9, 0x4e0: 0x32c2, 0x4e1: 0x35d3, 0x4e2: 0x4841, 0x4e3: 0x48d2, + 0x4e4: 0x3adf, 0x4e5: 0x3c6e, 0x4e6: 0x3ae6, 0x4e7: 0x3c75, 0x4e8: 0x3aed, 0x4e9: 0x3c7c, + 0x4ea: 0x32d1, 0x4eb: 0x35e2, 0x4ec: 0x32db, 0x4ed: 0x35f1, 0x4ee: 0x32ef, 0x4ef: 0x3605, + 0x4f0: 0x32ea, 0x4f1: 0x3600, 0x4f2: 0x332b, 0x4f3: 0x3641, 0x4f4: 0x333a, 0x4f5: 0x3650, + 0x4f6: 0x3335, 0x4f7: 0x364b, 0x4f8: 0x3af4, 0x4f9: 0x3c83, 0x4fa: 0x3afb, 0x4fb: 0x3c8a, + 0x4fc: 0x333f, 0x4fd: 0x3655, 0x4fe: 0x3344, 0x4ff: 0x365a, + // Block 0x14, offset 0x500 + 0x500: 0x3349, 0x501: 0x365f, 0x502: 0x334e, 0x503: 0x3664, 0x504: 0x335d, 0x505: 0x3673, + 0x506: 0x3358, 0x507: 0x366e, 0x508: 0x3362, 0x509: 0x367d, 0x50a: 0x3367, 0x50b: 0x3682, + 0x50c: 0x336c, 0x50d: 0x3687, 0x50e: 0x338a, 0x50f: 0x36a5, 0x510: 0x33a3, 0x511: 0x36c3, + 0x512: 0x33b2, 0x513: 0x36d2, 0x514: 0x33b7, 0x515: 0x36d7, 0x516: 0x34bb, 0x517: 0x35e7, + 0x518: 0x3678, 0x519: 0x36b4, 0x51b: 0x3712, + 0x520: 0x47e2, 0x521: 0x4873, 0x522: 0x30c4, 0x523: 0x33d0, + 0x524: 0x39b9, 0x525: 0x3b48, 0x526: 0x39b2, 0x527: 0x3b41, 0x528: 0x39c7, 0x529: 0x3b56, + 0x52a: 0x39c0, 0x52b: 0x3b4f, 0x52c: 0x39ff, 0x52d: 0x3b8e, 0x52e: 0x39d5, 0x52f: 0x3b64, + 0x530: 0x39ce, 0x531: 0x3b5d, 0x532: 0x39e3, 0x533: 0x3b72, 0x534: 0x39dc, 0x535: 0x3b6b, + 0x536: 0x3a06, 0x537: 0x3b95, 0x538: 0x47f6, 0x539: 0x4887, 0x53a: 0x3141, 0x53b: 0x344d, + 0x53c: 0x312d, 0x53d: 0x3439, 0x53e: 0x3a1b, 0x53f: 0x3baa, + // Block 0x15, offset 0x540 + 0x540: 0x3a14, 0x541: 0x3ba3, 0x542: 0x3a29, 0x543: 0x3bb8, 0x544: 0x3a22, 0x545: 0x3bb1, + 0x546: 0x3a3e, 0x547: 0x3bcd, 0x548: 0x31d2, 0x549: 0x34de, 0x54a: 0x31e6, 0x54b: 0x34f2, + 0x54c: 0x4828, 0x54d: 0x48b9, 0x54e: 0x3277, 0x54f: 0x3588, 0x550: 0x3a61, 0x551: 0x3bf0, + 0x552: 0x3a5a, 0x553: 0x3be9, 0x554: 0x3a6f, 0x555: 0x3bfe, 0x556: 0x3a68, 0x557: 0x3bf7, + 0x558: 0x3aca, 0x559: 0x3c59, 0x55a: 0x3aae, 0x55b: 0x3c3d, 0x55c: 0x3aa7, 0x55d: 0x3c36, + 0x55e: 0x3abc, 0x55f: 0x3c4b, 0x560: 0x3ab5, 0x561: 0x3c44, 0x562: 0x3ac3, 0x563: 0x3c52, + 0x564: 0x3326, 0x565: 0x363c, 0x566: 0x3308, 0x567: 0x361e, 0x568: 0x3b25, 0x569: 0x3cb4, + 0x56a: 0x3b1e, 0x56b: 0x3cad, 0x56c: 0x3b33, 0x56d: 0x3cc2, 0x56e: 0x3b2c, 0x56f: 0x3cbb, + 0x570: 0x3b3a, 0x571: 0x3cc9, 0x572: 0x3371, 0x573: 0x368c, 0x574: 0x3399, 0x575: 0x36b9, + 0x576: 0x3394, 0x577: 0x36af, 0x578: 0x3380, 0x579: 0x369b, + // Block 0x16, offset 0x580 + 0x580: 0x4945, 0x581: 0x494b, 0x582: 0x4a5f, 0x583: 0x4a77, 0x584: 0x4a67, 0x585: 0x4a7f, + 0x586: 0x4a6f, 0x587: 0x4a87, 0x588: 0x48eb, 0x589: 0x48f1, 0x58a: 0x49cf, 0x58b: 0x49e7, + 0x58c: 0x49d7, 0x58d: 0x49ef, 0x58e: 0x49df, 0x58f: 0x49f7, 0x590: 0x4957, 0x591: 0x495d, + 0x592: 0x3ef9, 0x593: 0x3f09, 0x594: 0x3f01, 0x595: 0x3f11, + 0x598: 0x48f7, 0x599: 0x48fd, 0x59a: 0x3e29, 0x59b: 0x3e39, 0x59c: 0x3e31, 0x59d: 0x3e41, + 0x5a0: 0x496f, 0x5a1: 0x4975, 0x5a2: 0x4a8f, 0x5a3: 0x4aa7, + 0x5a4: 0x4a97, 0x5a5: 0x4aaf, 0x5a6: 0x4a9f, 0x5a7: 0x4ab7, 0x5a8: 0x4903, 0x5a9: 0x4909, + 0x5aa: 0x49ff, 0x5ab: 0x4a17, 0x5ac: 0x4a07, 0x5ad: 0x4a1f, 0x5ae: 0x4a0f, 0x5af: 0x4a27, + 0x5b0: 0x4987, 0x5b1: 0x498d, 0x5b2: 0x3f59, 0x5b3: 0x3f71, 0x5b4: 0x3f61, 0x5b5: 0x3f79, + 0x5b6: 0x3f69, 0x5b7: 0x3f81, 0x5b8: 0x490f, 0x5b9: 0x4915, 0x5ba: 0x3e59, 0x5bb: 0x3e71, + 0x5bc: 0x3e61, 0x5bd: 0x3e79, 0x5be: 0x3e69, 0x5bf: 0x3e81, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4993, 0x5c1: 0x4999, 0x5c2: 0x3f89, 0x5c3: 0x3f99, 0x5c4: 0x3f91, 0x5c5: 0x3fa1, + 0x5c8: 0x491b, 0x5c9: 0x4921, 0x5ca: 0x3e89, 0x5cb: 0x3e99, + 0x5cc: 0x3e91, 0x5cd: 0x3ea1, 0x5d0: 0x49a5, 0x5d1: 0x49ab, + 0x5d2: 0x3fc1, 0x5d3: 0x3fd9, 0x5d4: 0x3fc9, 0x5d5: 0x3fe1, 0x5d6: 0x3fd1, 0x5d7: 0x3fe9, + 0x5d9: 0x4927, 0x5db: 0x3ea9, 0x5dd: 0x3eb1, + 0x5df: 0x3eb9, 0x5e0: 0x49bd, 0x5e1: 0x49c3, 0x5e2: 0x4abf, 0x5e3: 0x4ad7, + 0x5e4: 0x4ac7, 0x5e5: 0x4adf, 0x5e6: 0x4acf, 0x5e7: 0x4ae7, 0x5e8: 0x492d, 0x5e9: 0x4933, + 0x5ea: 0x4a2f, 0x5eb: 0x4a47, 0x5ec: 0x4a37, 0x5ed: 0x4a4f, 0x5ee: 0x4a3f, 0x5ef: 0x4a57, + 0x5f0: 0x4939, 0x5f1: 0x445f, 0x5f2: 0x37d2, 0x5f3: 0x4465, 0x5f4: 0x4963, 0x5f5: 0x446b, + 0x5f6: 0x37e4, 0x5f7: 0x4471, 0x5f8: 0x3802, 0x5f9: 0x4477, 0x5fa: 0x381a, 0x5fb: 0x447d, + 0x5fc: 0x49b1, 0x5fd: 0x4483, + // Block 0x18, offset 0x600 + 0x600: 0x3ee1, 0x601: 0x3ee9, 0x602: 0x42c5, 0x603: 0x42e3, 0x604: 0x42cf, 0x605: 0x42ed, + 0x606: 0x42d9, 0x607: 0x42f7, 0x608: 0x3e19, 0x609: 0x3e21, 0x60a: 0x4211, 0x60b: 0x422f, + 0x60c: 0x421b, 0x60d: 0x4239, 0x60e: 0x4225, 0x60f: 0x4243, 0x610: 0x3f29, 0x611: 0x3f31, + 0x612: 0x4301, 0x613: 0x431f, 0x614: 0x430b, 0x615: 0x4329, 0x616: 0x4315, 0x617: 0x4333, + 0x618: 0x3e49, 0x619: 0x3e51, 0x61a: 0x424d, 0x61b: 0x426b, 0x61c: 0x4257, 0x61d: 0x4275, + 0x61e: 0x4261, 0x61f: 0x427f, 0x620: 0x4001, 0x621: 0x4009, 0x622: 0x433d, 0x623: 0x435b, + 0x624: 0x4347, 0x625: 0x4365, 0x626: 0x4351, 0x627: 0x436f, 0x628: 0x3ec1, 0x629: 0x3ec9, + 0x62a: 0x4289, 0x62b: 0x42a7, 0x62c: 0x4293, 0x62d: 0x42b1, 0x62e: 0x429d, 0x62f: 0x42bb, + 0x630: 0x37c6, 0x631: 0x37c0, 0x632: 0x3ed1, 0x633: 0x37cc, 0x634: 0x3ed9, + 0x636: 0x4951, 0x637: 0x3ef1, 0x638: 0x3736, 0x639: 0x3730, 0x63a: 0x3724, 0x63b: 0x442f, + 0x63c: 0x373c, 0x63d: 0x8100, 0x63e: 0x0257, 0x63f: 0xa100, + // Block 0x19, offset 0x640 + 0x640: 0x8100, 0x641: 0x36e8, 0x642: 0x3f19, 0x643: 0x37de, 0x644: 0x3f21, + 0x646: 0x497b, 0x647: 0x3f39, 0x648: 0x3742, 0x649: 0x4435, 0x64a: 0x374e, 0x64b: 0x443b, + 0x64c: 0x375a, 0x64d: 0x3cd0, 0x64e: 0x3cd7, 0x64f: 0x3cde, 0x650: 0x37f6, 0x651: 0x37f0, + 0x652: 0x3f41, 0x653: 0x4625, 0x656: 0x37fc, 0x657: 0x3f51, + 0x658: 0x3772, 0x659: 0x376c, 0x65a: 0x3760, 0x65b: 0x4441, 0x65d: 0x3ce5, + 0x65e: 0x3cec, 0x65f: 0x3cf3, 0x660: 0x382c, 0x661: 0x3826, 0x662: 0x3fa9, 0x663: 0x462d, + 0x664: 0x380e, 0x665: 0x3814, 0x666: 0x3832, 0x667: 0x3fb9, 0x668: 0x37a2, 0x669: 0x379c, + 0x66a: 0x3790, 0x66b: 0x444d, 0x66c: 0x378a, 0x66d: 0x36dc, 0x66e: 0x4429, 0x66f: 0x0081, + 0x672: 0x3ff1, 0x673: 0x3838, 0x674: 0x3ff9, + 0x676: 0x49c9, 0x677: 0x4011, 0x678: 0x377e, 0x679: 0x4447, 0x67a: 0x37ae, 0x67b: 0x4459, + 0x67c: 0x37ba, 0x67d: 0x4397, 0x67e: 0xa100, + // Block 0x1a, offset 0x680 + 0x681: 0x3d47, 0x683: 0xa000, 0x684: 0x3d4e, 0x685: 0xa000, + 0x687: 0x3d55, 0x688: 0xa000, 0x689: 0x3d5c, + 0x68d: 0xa000, + 0x6a0: 0x30a6, 0x6a1: 0xa000, 0x6a2: 0x3d6a, + 0x6a4: 0xa000, 0x6a5: 0xa000, + 0x6ad: 0x3d63, 0x6ae: 0x30a1, 0x6af: 0x30ab, + 0x6b0: 0x3d71, 0x6b1: 0x3d78, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3d7f, 0x6b5: 0x3d86, + 0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3d8d, 0x6b9: 0x3d94, 0x6ba: 0xa000, 0x6bb: 0xa000, + 0x6bc: 0xa000, 0x6bd: 0xa000, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3d9b, 0x6c1: 0x3da2, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3db7, 0x6c5: 0x3dbe, + 0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3dc5, 0x6c9: 0x3dcc, + 0x6d1: 0xa000, + 0x6d2: 0xa000, + 0x6e2: 0xa000, + 0x6e8: 0xa000, 0x6e9: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3de1, 0x6ed: 0x3de8, 0x6ee: 0x3def, 0x6ef: 0x3df6, + 0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000, + // Block 0x1c, offset 0x700 + 0x706: 0xa000, 0x70b: 0xa000, + 0x70c: 0x4049, 0x70d: 0xa000, 0x70e: 0x4051, 0x70f: 0xa000, 0x710: 0x4059, 0x711: 0xa000, + 0x712: 0x4061, 0x713: 0xa000, 0x714: 0x4069, 0x715: 0xa000, 0x716: 0x4071, 0x717: 0xa000, + 0x718: 0x4079, 0x719: 0xa000, 0x71a: 0x4081, 0x71b: 0xa000, 0x71c: 0x4089, 0x71d: 0xa000, + 0x71e: 0x4091, 0x71f: 0xa000, 0x720: 0x4099, 0x721: 0xa000, 0x722: 0x40a1, + 0x724: 0xa000, 0x725: 0x40a9, 0x726: 0xa000, 0x727: 0x40b1, 0x728: 0xa000, 0x729: 0x40b9, + 0x72f: 0xa000, + 0x730: 0x40c1, 0x731: 0x40c9, 0x732: 0xa000, 0x733: 0x40d1, 0x734: 0x40d9, 0x735: 0xa000, + 0x736: 0x40e1, 0x737: 0x40e9, 0x738: 0xa000, 0x739: 0x40f1, 0x73a: 0x40f9, 0x73b: 0xa000, + 0x73c: 0x4101, 0x73d: 0x4109, + // Block 0x1d, offset 0x740 + 0x754: 0x4041, + 0x759: 0x9904, 0x75a: 0x9904, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000, + 0x75e: 0x4111, + 0x766: 0xa000, + 0x76b: 0xa000, 0x76c: 0x4121, 0x76d: 0xa000, 0x76e: 0x4129, 0x76f: 0xa000, + 0x770: 0x4131, 0x771: 0xa000, 0x772: 0x4139, 0x773: 0xa000, 0x774: 0x4141, 0x775: 0xa000, + 0x776: 0x4149, 0x777: 0xa000, 0x778: 0x4151, 0x779: 0xa000, 0x77a: 0x4159, 0x77b: 0xa000, + 0x77c: 0x4161, 0x77d: 0xa000, 0x77e: 0x4169, 0x77f: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x4171, 0x781: 0xa000, 0x782: 0x4179, 0x784: 0xa000, 0x785: 0x4181, + 0x786: 0xa000, 0x787: 0x4189, 0x788: 0xa000, 0x789: 0x4191, + 0x78f: 0xa000, 0x790: 0x4199, 0x791: 0x41a1, + 0x792: 0xa000, 0x793: 0x41a9, 0x794: 0x41b1, 0x795: 0xa000, 0x796: 0x41b9, 0x797: 0x41c1, + 0x798: 0xa000, 0x799: 0x41c9, 0x79a: 0x41d1, 0x79b: 0xa000, 0x79c: 0x41d9, 0x79d: 0x41e1, + 0x7af: 0xa000, + 0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x4119, + 0x7b7: 0x41e9, 0x7b8: 0x41f1, 0x7b9: 0x41f9, 0x7ba: 0x4201, + 0x7bd: 0xa000, 0x7be: 0x4209, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x1472, 0x7c1: 0x0df6, 0x7c2: 0x14ce, 0x7c3: 0x149a, 0x7c4: 0x0f52, 0x7c5: 0x07e6, + 0x7c6: 0x09da, 0x7c7: 0x1726, 0x7c8: 0x1726, 0x7c9: 0x0b06, 0x7ca: 0x155a, 0x7cb: 0x0a3e, + 0x7cc: 0x0b02, 0x7cd: 0x0cea, 0x7ce: 0x10ca, 0x7cf: 0x125a, 0x7d0: 0x1392, 0x7d1: 0x13ce, + 0x7d2: 0x1402, 0x7d3: 0x1516, 0x7d4: 0x0e6e, 0x7d5: 0x0efa, 0x7d6: 0x0fa6, 0x7d7: 0x103e, + 0x7d8: 0x135a, 0x7d9: 0x1542, 0x7da: 0x166e, 0x7db: 0x080a, 0x7dc: 0x09ae, 0x7dd: 0x0e82, + 0x7de: 0x0fca, 0x7df: 0x138e, 0x7e0: 0x16be, 0x7e1: 0x0bae, 0x7e2: 0x0f72, 0x7e3: 0x137e, + 0x7e4: 0x1412, 0x7e5: 0x0d1e, 0x7e6: 0x12b6, 0x7e7: 0x13da, 0x7e8: 0x0c1a, 0x7e9: 0x0e0a, + 0x7ea: 0x0f12, 0x7eb: 0x1016, 0x7ec: 0x1522, 0x7ed: 0x084a, 0x7ee: 0x08e2, 0x7ef: 0x094e, + 0x7f0: 0x0d86, 0x7f1: 0x0e7a, 0x7f2: 0x0fc6, 0x7f3: 0x10ea, 0x7f4: 0x1272, 0x7f5: 0x1386, + 0x7f6: 0x139e, 0x7f7: 0x14c2, 0x7f8: 0x15ea, 0x7f9: 0x169e, 0x7fa: 0x16ba, 0x7fb: 0x1126, + 0x7fc: 0x1166, 0x7fd: 0x121e, 0x7fe: 0x133e, 0x7ff: 0x1576, + // Block 0x20, offset 0x800 + 0x800: 0x16c6, 0x801: 0x1446, 0x802: 0x0ac2, 0x803: 0x0c36, 0x804: 0x11d6, 0x805: 0x1296, + 0x806: 0x0ffa, 0x807: 0x112e, 0x808: 0x1492, 0x809: 0x15e2, 0x80a: 0x0abe, 0x80b: 0x0b8a, + 0x80c: 0x0e72, 0x80d: 0x0f26, 0x80e: 0x0f5a, 0x80f: 0x120e, 0x810: 0x1236, 0x811: 0x15a2, + 0x812: 0x094a, 0x813: 0x12a2, 0x814: 0x08ee, 0x815: 0x08ea, 0x816: 0x1192, 0x817: 0x1222, + 0x818: 0x1356, 0x819: 0x15aa, 0x81a: 0x1462, 0x81b: 0x0d22, 0x81c: 0x0e6e, 0x81d: 0x1452, + 0x81e: 0x07f2, 0x81f: 0x0b5e, 0x820: 0x0c8e, 0x821: 0x102a, 0x822: 0x10aa, 0x823: 0x096e, + 0x824: 0x1136, 0x825: 0x085a, 0x826: 0x0c72, 0x827: 0x07d2, 0x828: 0x0ee6, 0x829: 0x0d9e, + 0x82a: 0x120a, 0x82b: 0x09c2, 0x82c: 0x0aae, 0x82d: 0x10f6, 0x82e: 0x135e, 0x82f: 0x1436, + 0x830: 0x0eb2, 0x831: 0x14f2, 0x832: 0x0ede, 0x833: 0x0d32, 0x834: 0x1316, 0x835: 0x0d52, + 0x836: 0x10a6, 0x837: 0x0826, 0x838: 0x08a2, 0x839: 0x08e6, 0x83a: 0x0e4e, 0x83b: 0x11f6, + 0x83c: 0x12ee, 0x83d: 0x1442, 0x83e: 0x1556, 0x83f: 0x0956, + // Block 0x21, offset 0x840 + 0x840: 0x0a0a, 0x841: 0x0b12, 0x842: 0x0c2a, 0x843: 0x0dba, 0x844: 0x0f76, 0x845: 0x113a, + 0x846: 0x1592, 0x847: 0x1676, 0x848: 0x16ca, 0x849: 0x16e2, 0x84a: 0x0932, 0x84b: 0x0dee, + 0x84c: 0x0e9e, 0x84d: 0x14e6, 0x84e: 0x0bf6, 0x84f: 0x0cd2, 0x850: 0x0cee, 0x851: 0x0d7e, + 0x852: 0x0f66, 0x853: 0x0fb2, 0x854: 0x1062, 0x855: 0x1186, 0x856: 0x122a, 0x857: 0x128e, + 0x858: 0x14d6, 0x859: 0x1366, 0x85a: 0x14fe, 0x85b: 0x157a, 0x85c: 0x090a, 0x85d: 0x0936, + 0x85e: 0x0a1e, 0x85f: 0x0fa2, 0x860: 0x13ee, 0x861: 0x1436, 0x862: 0x0c16, 0x863: 0x0c86, + 0x864: 0x0d4a, 0x865: 0x0eaa, 0x866: 0x11d2, 0x867: 0x101e, 0x868: 0x0836, 0x869: 0x0a7a, + 0x86a: 0x0b5e, 0x86b: 0x0bc2, 0x86c: 0x0c92, 0x86d: 0x103a, 0x86e: 0x1056, 0x86f: 0x1266, + 0x870: 0x1286, 0x871: 0x155e, 0x872: 0x15de, 0x873: 0x15ee, 0x874: 0x162a, 0x875: 0x084e, + 0x876: 0x117a, 0x877: 0x154a, 0x878: 0x15c6, 0x879: 0x0caa, 0x87a: 0x0812, 0x87b: 0x0872, + 0x87c: 0x0b62, 0x87d: 0x0b82, 0x87e: 0x0daa, 0x87f: 0x0e6e, + // Block 0x22, offset 0x880 + 0x880: 0x0fbe, 0x881: 0x10c6, 0x882: 0x1372, 0x883: 0x1512, 0x884: 0x171e, 0x885: 0x0dde, + 0x886: 0x159e, 0x887: 0x092e, 0x888: 0x0e2a, 0x889: 0x0e36, 0x88a: 0x0f0a, 0x88b: 0x0f42, + 0x88c: 0x1046, 0x88d: 0x10a2, 0x88e: 0x1122, 0x88f: 0x1206, 0x890: 0x1636, 0x891: 0x08aa, + 0x892: 0x0cfe, 0x893: 0x15ae, 0x894: 0x0862, 0x895: 0x0ba6, 0x896: 0x0f2a, 0x897: 0x14da, + 0x898: 0x0c62, 0x899: 0x0cb2, 0x89a: 0x0e3e, 0x89b: 0x102a, 0x89c: 0x15b6, 0x89d: 0x0912, + 0x89e: 0x09fa, 0x89f: 0x0b92, 0x8a0: 0x0dce, 0x8a1: 0x0e1a, 0x8a2: 0x0e5a, 0x8a3: 0x0eee, + 0x8a4: 0x1042, 0x8a5: 0x10b6, 0x8a6: 0x1252, 0x8a7: 0x13f2, 0x8a8: 0x13fe, 0x8a9: 0x1552, + 0x8aa: 0x15d2, 0x8ab: 0x097e, 0x8ac: 0x0f46, 0x8ad: 0x09fe, 0x8ae: 0x0fc2, 0x8af: 0x1066, + 0x8b0: 0x1382, 0x8b1: 0x15ba, 0x8b2: 0x16a6, 0x8b3: 0x16ce, 0x8b4: 0x0e32, 0x8b5: 0x0f22, + 0x8b6: 0x12be, 0x8b7: 0x11b2, 0x8b8: 0x11be, 0x8b9: 0x11e2, 0x8ba: 0x1012, 0x8bb: 0x0f9a, + 0x8bc: 0x145e, 0x8bd: 0x082e, 0x8be: 0x1326, 0x8bf: 0x0916, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0906, 0x8c1: 0x0c06, 0x8c2: 0x0d26, 0x8c3: 0x11ee, 0x8c4: 0x0b4e, 0x8c5: 0x0efe, + 0x8c6: 0x0dea, 0x8c7: 0x14e2, 0x8c8: 0x13e2, 0x8c9: 0x15a6, 0x8ca: 0x141e, 0x8cb: 0x0c22, + 0x8cc: 0x0882, 0x8cd: 0x0a56, 0x8d0: 0x0aaa, + 0x8d2: 0x0dda, 0x8d5: 0x08f2, 0x8d6: 0x101a, 0x8d7: 0x10de, + 0x8d8: 0x1142, 0x8d9: 0x115e, 0x8da: 0x1162, 0x8db: 0x1176, 0x8dc: 0x15f6, 0x8dd: 0x11e6, + 0x8de: 0x126a, 0x8e0: 0x138a, 0x8e2: 0x144e, + 0x8e5: 0x1502, 0x8e6: 0x152e, + 0x8ea: 0x164a, 0x8eb: 0x164e, 0x8ec: 0x1652, 0x8ed: 0x16b6, 0x8ee: 0x1526, 0x8ef: 0x15c2, + 0x8f0: 0x0852, 0x8f1: 0x0876, 0x8f2: 0x088a, 0x8f3: 0x0946, 0x8f4: 0x0952, 0x8f5: 0x0992, + 0x8f6: 0x0a46, 0x8f7: 0x0a62, 0x8f8: 0x0a6a, 0x8f9: 0x0aa6, 0x8fa: 0x0ab2, 0x8fb: 0x0b8e, + 0x8fc: 0x0b96, 0x8fd: 0x0c9e, 0x8fe: 0x0cc6, 0x8ff: 0x0cce, + // Block 0x24, offset 0x900 + 0x900: 0x0ce6, 0x901: 0x0d92, 0x902: 0x0dc2, 0x903: 0x0de2, 0x904: 0x0e52, 0x905: 0x0f16, + 0x906: 0x0f32, 0x907: 0x0f62, 0x908: 0x0fb6, 0x909: 0x0fd6, 0x90a: 0x104a, 0x90b: 0x112a, + 0x90c: 0x1146, 0x90d: 0x114e, 0x90e: 0x114a, 0x90f: 0x1152, 0x910: 0x1156, 0x911: 0x115a, + 0x912: 0x116e, 0x913: 0x1172, 0x914: 0x1196, 0x915: 0x11aa, 0x916: 0x11c6, 0x917: 0x122a, + 0x918: 0x1232, 0x919: 0x123a, 0x91a: 0x124e, 0x91b: 0x1276, 0x91c: 0x12c6, 0x91d: 0x12fa, + 0x91e: 0x12fa, 0x91f: 0x1362, 0x920: 0x140a, 0x921: 0x1422, 0x922: 0x1456, 0x923: 0x145a, + 0x924: 0x149e, 0x925: 0x14a2, 0x926: 0x14fa, 0x927: 0x1502, 0x928: 0x15d6, 0x929: 0x161a, + 0x92a: 0x1632, 0x92b: 0x0c96, 0x92c: 0x184b, 0x92d: 0x12de, + 0x930: 0x07da, 0x931: 0x08de, 0x932: 0x089e, 0x933: 0x0846, 0x934: 0x0886, 0x935: 0x08b2, + 0x936: 0x0942, 0x937: 0x095e, 0x938: 0x0a46, 0x939: 0x0a32, 0x93a: 0x0a42, 0x93b: 0x0a5e, + 0x93c: 0x0aaa, 0x93d: 0x0aba, 0x93e: 0x0afe, 0x93f: 0x0b0a, + // Block 0x25, offset 0x940 + 0x940: 0x0b26, 0x941: 0x0b36, 0x942: 0x0c1e, 0x943: 0x0c26, 0x944: 0x0c56, 0x945: 0x0c76, + 0x946: 0x0ca6, 0x947: 0x0cbe, 0x948: 0x0cae, 0x949: 0x0cce, 0x94a: 0x0cc2, 0x94b: 0x0ce6, + 0x94c: 0x0d02, 0x94d: 0x0d5a, 0x94e: 0x0d66, 0x94f: 0x0d6e, 0x950: 0x0d96, 0x951: 0x0dda, + 0x952: 0x0e0a, 0x953: 0x0e0e, 0x954: 0x0e22, 0x955: 0x0ea2, 0x956: 0x0eb2, 0x957: 0x0f0a, + 0x958: 0x0f56, 0x959: 0x0f4e, 0x95a: 0x0f62, 0x95b: 0x0f7e, 0x95c: 0x0fb6, 0x95d: 0x110e, + 0x95e: 0x0fda, 0x95f: 0x100e, 0x960: 0x101a, 0x961: 0x105a, 0x962: 0x1076, 0x963: 0x109a, + 0x964: 0x10be, 0x965: 0x10c2, 0x966: 0x10de, 0x967: 0x10e2, 0x968: 0x10f2, 0x969: 0x1106, + 0x96a: 0x1102, 0x96b: 0x1132, 0x96c: 0x11ae, 0x96d: 0x11c6, 0x96e: 0x11de, 0x96f: 0x1216, + 0x970: 0x122a, 0x971: 0x1246, 0x972: 0x1276, 0x973: 0x132a, 0x974: 0x1352, 0x975: 0x13c6, + 0x976: 0x140e, 0x977: 0x141a, 0x978: 0x1422, 0x979: 0x143a, 0x97a: 0x144e, 0x97b: 0x143e, + 0x97c: 0x1456, 0x97d: 0x1452, 0x97e: 0x144a, 0x97f: 0x145a, + // Block 0x26, offset 0x980 + 0x980: 0x1466, 0x981: 0x14a2, 0x982: 0x14de, 0x983: 0x150e, 0x984: 0x1546, 0x985: 0x1566, + 0x986: 0x15b2, 0x987: 0x15d6, 0x988: 0x15f6, 0x989: 0x160a, 0x98a: 0x161a, 0x98b: 0x1626, + 0x98c: 0x1632, 0x98d: 0x1686, 0x98e: 0x1726, 0x98f: 0x17e2, 0x990: 0x17dd, 0x991: 0x180f, + 0x992: 0x0702, 0x993: 0x072a, 0x994: 0x072e, 0x995: 0x1891, 0x996: 0x18be, 0x997: 0x1936, + 0x998: 0x1712, 0x999: 0x1722, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x07f6, 0x9c1: 0x07ee, 0x9c2: 0x07fe, 0x9c3: 0x1774, 0x9c4: 0x0842, 0x9c5: 0x0852, + 0x9c6: 0x0856, 0x9c7: 0x085e, 0x9c8: 0x0866, 0x9c9: 0x086a, 0x9ca: 0x0876, 0x9cb: 0x086e, + 0x9cc: 0x06ae, 0x9cd: 0x1788, 0x9ce: 0x088a, 0x9cf: 0x088e, 0x9d0: 0x0892, 0x9d1: 0x08ae, + 0x9d2: 0x1779, 0x9d3: 0x06b2, 0x9d4: 0x089a, 0x9d5: 0x08ba, 0x9d6: 0x1783, 0x9d7: 0x08ca, + 0x9d8: 0x08d2, 0x9d9: 0x0832, 0x9da: 0x08da, 0x9db: 0x08de, 0x9dc: 0x195e, 0x9dd: 0x08fa, + 0x9de: 0x0902, 0x9df: 0x06ba, 0x9e0: 0x091a, 0x9e1: 0x091e, 0x9e2: 0x0926, 0x9e3: 0x092a, + 0x9e4: 0x06be, 0x9e5: 0x0942, 0x9e6: 0x0946, 0x9e7: 0x0952, 0x9e8: 0x095e, 0x9e9: 0x0962, + 0x9ea: 0x0966, 0x9eb: 0x096e, 0x9ec: 0x098e, 0x9ed: 0x0992, 0x9ee: 0x099a, 0x9ef: 0x09aa, + 0x9f0: 0x09b2, 0x9f1: 0x09b6, 0x9f2: 0x09b6, 0x9f3: 0x09b6, 0x9f4: 0x1797, 0x9f5: 0x0f8e, + 0x9f6: 0x09ca, 0x9f7: 0x09d2, 0x9f8: 0x179c, 0x9f9: 0x09de, 0x9fa: 0x09e6, 0x9fb: 0x09ee, + 0x9fc: 0x0a16, 0x9fd: 0x0a02, 0x9fe: 0x0a0e, 0x9ff: 0x0a12, + // Block 0x28, offset 0xa00 + 0xa00: 0x0a1a, 0xa01: 0x0a22, 0xa02: 0x0a26, 0xa03: 0x0a2e, 0xa04: 0x0a36, 0xa05: 0x0a3a, + 0xa06: 0x0a3a, 0xa07: 0x0a42, 0xa08: 0x0a4a, 0xa09: 0x0a4e, 0xa0a: 0x0a5a, 0xa0b: 0x0a7e, + 0xa0c: 0x0a62, 0xa0d: 0x0a82, 0xa0e: 0x0a66, 0xa0f: 0x0a6e, 0xa10: 0x0906, 0xa11: 0x0aca, + 0xa12: 0x0a92, 0xa13: 0x0a96, 0xa14: 0x0a9a, 0xa15: 0x0a8e, 0xa16: 0x0aa2, 0xa17: 0x0a9e, + 0xa18: 0x0ab6, 0xa19: 0x17a1, 0xa1a: 0x0ad2, 0xa1b: 0x0ad6, 0xa1c: 0x0ade, 0xa1d: 0x0aea, + 0xa1e: 0x0af2, 0xa1f: 0x0b0e, 0xa20: 0x17a6, 0xa21: 0x17ab, 0xa22: 0x0b1a, 0xa23: 0x0b1e, + 0xa24: 0x0b22, 0xa25: 0x0b16, 0xa26: 0x0b2a, 0xa27: 0x06c2, 0xa28: 0x06c6, 0xa29: 0x0b32, + 0xa2a: 0x0b3a, 0xa2b: 0x0b3a, 0xa2c: 0x17b0, 0xa2d: 0x0b56, 0xa2e: 0x0b5a, 0xa2f: 0x0b5e, + 0xa30: 0x0b66, 0xa31: 0x17b5, 0xa32: 0x0b6e, 0xa33: 0x0b72, 0xa34: 0x0c4a, 0xa35: 0x0b7a, + 0xa36: 0x06ca, 0xa37: 0x0b86, 0xa38: 0x0b96, 0xa39: 0x0ba2, 0xa3a: 0x0b9e, 0xa3b: 0x17bf, + 0xa3c: 0x0baa, 0xa3d: 0x17c4, 0xa3e: 0x0bb6, 0xa3f: 0x0bb2, + // Block 0x29, offset 0xa40 + 0xa40: 0x0bba, 0xa41: 0x0bca, 0xa42: 0x0bce, 0xa43: 0x06ce, 0xa44: 0x0bde, 0xa45: 0x0be6, + 0xa46: 0x0bea, 0xa47: 0x0bee, 0xa48: 0x06d2, 0xa49: 0x17c9, 0xa4a: 0x06d6, 0xa4b: 0x0c0a, + 0xa4c: 0x0c0e, 0xa4d: 0x0c12, 0xa4e: 0x0c1a, 0xa4f: 0x1990, 0xa50: 0x0c32, 0xa51: 0x17d3, + 0xa52: 0x17d3, 0xa53: 0x12d2, 0xa54: 0x0c42, 0xa55: 0x0c42, 0xa56: 0x06da, 0xa57: 0x17f6, + 0xa58: 0x18c8, 0xa59: 0x0c52, 0xa5a: 0x0c5a, 0xa5b: 0x06de, 0xa5c: 0x0c6e, 0xa5d: 0x0c7e, + 0xa5e: 0x0c82, 0xa5f: 0x0c8a, 0xa60: 0x0c9a, 0xa61: 0x06e6, 0xa62: 0x06e2, 0xa63: 0x0c9e, + 0xa64: 0x17d8, 0xa65: 0x0ca2, 0xa66: 0x0cb6, 0xa67: 0x0cba, 0xa68: 0x0cbe, 0xa69: 0x0cba, + 0xa6a: 0x0cca, 0xa6b: 0x0cce, 0xa6c: 0x0cde, 0xa6d: 0x0cd6, 0xa6e: 0x0cda, 0xa6f: 0x0ce2, + 0xa70: 0x0ce6, 0xa71: 0x0cea, 0xa72: 0x0cf6, 0xa73: 0x0cfa, 0xa74: 0x0d12, 0xa75: 0x0d1a, + 0xa76: 0x0d2a, 0xa77: 0x0d3e, 0xa78: 0x17e7, 0xa79: 0x0d3a, 0xa7a: 0x0d2e, 0xa7b: 0x0d46, + 0xa7c: 0x0d4e, 0xa7d: 0x0d62, 0xa7e: 0x17ec, 0xa7f: 0x0d6a, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0d5e, 0xa81: 0x0d56, 0xa82: 0x06ea, 0xa83: 0x0d72, 0xa84: 0x0d7a, 0xa85: 0x0d82, + 0xa86: 0x0d76, 0xa87: 0x06ee, 0xa88: 0x0d92, 0xa89: 0x0d9a, 0xa8a: 0x17f1, 0xa8b: 0x0dc6, + 0xa8c: 0x0dfa, 0xa8d: 0x0dd6, 0xa8e: 0x06fa, 0xa8f: 0x0de2, 0xa90: 0x06f6, 0xa91: 0x06f2, + 0xa92: 0x08be, 0xa93: 0x08c2, 0xa94: 0x0dfe, 0xa95: 0x0de6, 0xa96: 0x12a6, 0xa97: 0x075e, + 0xa98: 0x0e0a, 0xa99: 0x0e0e, 0xa9a: 0x0e12, 0xa9b: 0x0e26, 0xa9c: 0x0e1e, 0xa9d: 0x180a, + 0xa9e: 0x06fe, 0xa9f: 0x0e3a, 0xaa0: 0x0e2e, 0xaa1: 0x0e4a, 0xaa2: 0x0e52, 0xaa3: 0x1814, + 0xaa4: 0x0e56, 0xaa5: 0x0e42, 0xaa6: 0x0e5e, 0xaa7: 0x0702, 0xaa8: 0x0e62, 0xaa9: 0x0e66, + 0xaaa: 0x0e6a, 0xaab: 0x0e76, 0xaac: 0x1819, 0xaad: 0x0e7e, 0xaae: 0x0706, 0xaaf: 0x0e8a, + 0xab0: 0x181e, 0xab1: 0x0e8e, 0xab2: 0x070a, 0xab3: 0x0e9a, 0xab4: 0x0ea6, 0xab5: 0x0eb2, + 0xab6: 0x0eb6, 0xab7: 0x1823, 0xab8: 0x17ba, 0xab9: 0x1828, 0xaba: 0x0ed6, 0xabb: 0x182d, + 0xabc: 0x0ee2, 0xabd: 0x0eea, 0xabe: 0x0eda, 0xabf: 0x0ef6, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0f06, 0xac1: 0x0f16, 0xac2: 0x0f0a, 0xac3: 0x0f0e, 0xac4: 0x0f1a, 0xac5: 0x0f1e, + 0xac6: 0x1832, 0xac7: 0x0f02, 0xac8: 0x0f36, 0xac9: 0x0f3a, 0xaca: 0x070e, 0xacb: 0x0f4e, + 0xacc: 0x0f4a, 0xacd: 0x1837, 0xace: 0x0f2e, 0xacf: 0x0f6a, 0xad0: 0x183c, 0xad1: 0x1841, + 0xad2: 0x0f6e, 0xad3: 0x0f82, 0xad4: 0x0f7e, 0xad5: 0x0f7a, 0xad6: 0x0712, 0xad7: 0x0f86, + 0xad8: 0x0f96, 0xad9: 0x0f92, 0xada: 0x0f9e, 0xadb: 0x177e, 0xadc: 0x0fae, 0xadd: 0x1846, + 0xade: 0x0fba, 0xadf: 0x1850, 0xae0: 0x0fce, 0xae1: 0x0fda, 0xae2: 0x0fee, 0xae3: 0x1855, + 0xae4: 0x1002, 0xae5: 0x1006, 0xae6: 0x185a, 0xae7: 0x185f, 0xae8: 0x1022, 0xae9: 0x1032, + 0xaea: 0x0716, 0xaeb: 0x1036, 0xaec: 0x071a, 0xaed: 0x071a, 0xaee: 0x104e, 0xaef: 0x1052, + 0xaf0: 0x105a, 0xaf1: 0x105e, 0xaf2: 0x106a, 0xaf3: 0x071e, 0xaf4: 0x1082, 0xaf5: 0x1864, + 0xaf6: 0x109e, 0xaf7: 0x1869, 0xaf8: 0x10aa, 0xaf9: 0x17ce, 0xafa: 0x10ba, 0xafb: 0x186e, + 0xafc: 0x1873, 0xafd: 0x1878, 0xafe: 0x0722, 0xaff: 0x0726, + // Block 0x2c, offset 0xb00 + 0xb00: 0x10f2, 0xb01: 0x1882, 0xb02: 0x187d, 0xb03: 0x1887, 0xb04: 0x188c, 0xb05: 0x10fa, + 0xb06: 0x10fe, 0xb07: 0x10fe, 0xb08: 0x1106, 0xb09: 0x072e, 0xb0a: 0x110a, 0xb0b: 0x0732, + 0xb0c: 0x0736, 0xb0d: 0x1896, 0xb0e: 0x111e, 0xb0f: 0x1126, 0xb10: 0x1132, 0xb11: 0x073a, + 0xb12: 0x189b, 0xb13: 0x1156, 0xb14: 0x18a0, 0xb15: 0x18a5, 0xb16: 0x1176, 0xb17: 0x118e, + 0xb18: 0x073e, 0xb19: 0x1196, 0xb1a: 0x119a, 0xb1b: 0x119e, 0xb1c: 0x18aa, 0xb1d: 0x18af, + 0xb1e: 0x18af, 0xb1f: 0x11b6, 0xb20: 0x0742, 0xb21: 0x18b4, 0xb22: 0x11ca, 0xb23: 0x11ce, + 0xb24: 0x0746, 0xb25: 0x18b9, 0xb26: 0x11ea, 0xb27: 0x074a, 0xb28: 0x11fa, 0xb29: 0x11f2, + 0xb2a: 0x1202, 0xb2b: 0x18c3, 0xb2c: 0x121a, 0xb2d: 0x074e, 0xb2e: 0x1226, 0xb2f: 0x122e, + 0xb30: 0x123e, 0xb31: 0x0752, 0xb32: 0x18cd, 0xb33: 0x18d2, 0xb34: 0x0756, 0xb35: 0x18d7, + 0xb36: 0x1256, 0xb37: 0x18dc, 0xb38: 0x1262, 0xb39: 0x126e, 0xb3a: 0x1276, 0xb3b: 0x18e1, + 0xb3c: 0x18e6, 0xb3d: 0x128a, 0xb3e: 0x18eb, 0xb3f: 0x1292, + // Block 0x2d, offset 0xb40 + 0xb40: 0x17fb, 0xb41: 0x075a, 0xb42: 0x12aa, 0xb43: 0x12ae, 0xb44: 0x0762, 0xb45: 0x12b2, + 0xb46: 0x0b2e, 0xb47: 0x18f0, 0xb48: 0x18f5, 0xb49: 0x1800, 0xb4a: 0x1805, 0xb4b: 0x12d2, + 0xb4c: 0x12d6, 0xb4d: 0x14ee, 0xb4e: 0x0766, 0xb4f: 0x1302, 0xb50: 0x12fe, 0xb51: 0x1306, + 0xb52: 0x093a, 0xb53: 0x130a, 0xb54: 0x130e, 0xb55: 0x1312, 0xb56: 0x131a, 0xb57: 0x18fa, + 0xb58: 0x1316, 0xb59: 0x131e, 0xb5a: 0x1332, 0xb5b: 0x1336, 0xb5c: 0x1322, 0xb5d: 0x133a, + 0xb5e: 0x134e, 0xb5f: 0x1362, 0xb60: 0x132e, 0xb61: 0x1342, 0xb62: 0x1346, 0xb63: 0x134a, + 0xb64: 0x18ff, 0xb65: 0x1909, 0xb66: 0x1904, 0xb67: 0x076a, 0xb68: 0x136a, 0xb69: 0x136e, + 0xb6a: 0x1376, 0xb6b: 0x191d, 0xb6c: 0x137a, 0xb6d: 0x190e, 0xb6e: 0x076e, 0xb6f: 0x0772, + 0xb70: 0x1913, 0xb71: 0x1918, 0xb72: 0x0776, 0xb73: 0x139a, 0xb74: 0x139e, 0xb75: 0x13a2, + 0xb76: 0x13a6, 0xb77: 0x13b2, 0xb78: 0x13ae, 0xb79: 0x13ba, 0xb7a: 0x13b6, 0xb7b: 0x13c6, + 0xb7c: 0x13be, 0xb7d: 0x13c2, 0xb7e: 0x13ca, 0xb7f: 0x077a, + // Block 0x2e, offset 0xb80 + 0xb80: 0x13d2, 0xb81: 0x13d6, 0xb82: 0x077e, 0xb83: 0x13e6, 0xb84: 0x13ea, 0xb85: 0x1922, + 0xb86: 0x13f6, 0xb87: 0x13fa, 0xb88: 0x0782, 0xb89: 0x1406, 0xb8a: 0x06b6, 0xb8b: 0x1927, + 0xb8c: 0x192c, 0xb8d: 0x0786, 0xb8e: 0x078a, 0xb8f: 0x1432, 0xb90: 0x144a, 0xb91: 0x1466, + 0xb92: 0x1476, 0xb93: 0x1931, 0xb94: 0x148a, 0xb95: 0x148e, 0xb96: 0x14a6, 0xb97: 0x14b2, + 0xb98: 0x193b, 0xb99: 0x178d, 0xb9a: 0x14be, 0xb9b: 0x14ba, 0xb9c: 0x14c6, 0xb9d: 0x1792, + 0xb9e: 0x14d2, 0xb9f: 0x14de, 0xba0: 0x1940, 0xba1: 0x1945, 0xba2: 0x151e, 0xba3: 0x152a, + 0xba4: 0x1532, 0xba5: 0x194a, 0xba6: 0x1536, 0xba7: 0x1562, 0xba8: 0x156e, 0xba9: 0x1572, + 0xbaa: 0x156a, 0xbab: 0x157e, 0xbac: 0x1582, 0xbad: 0x194f, 0xbae: 0x158e, 0xbaf: 0x078e, + 0xbb0: 0x1596, 0xbb1: 0x1954, 0xbb2: 0x0792, 0xbb3: 0x15ce, 0xbb4: 0x0bbe, 0xbb5: 0x15e6, + 0xbb6: 0x1959, 0xbb7: 0x1963, 0xbb8: 0x0796, 0xbb9: 0x079a, 0xbba: 0x160e, 0xbbb: 0x1968, + 0xbbc: 0x079e, 0xbbd: 0x196d, 0xbbe: 0x1626, 0xbbf: 0x1626, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x162e, 0xbc1: 0x1972, 0xbc2: 0x1646, 0xbc3: 0x07a2, 0xbc4: 0x1656, 0xbc5: 0x1662, + 0xbc6: 0x166a, 0xbc7: 0x1672, 0xbc8: 0x07a6, 0xbc9: 0x1977, 0xbca: 0x1686, 0xbcb: 0x16a2, + 0xbcc: 0x16ae, 0xbcd: 0x07aa, 0xbce: 0x07ae, 0xbcf: 0x16b2, 0xbd0: 0x197c, 0xbd1: 0x07b2, + 0xbd2: 0x1981, 0xbd3: 0x1986, 0xbd4: 0x198b, 0xbd5: 0x16d6, 0xbd6: 0x07b6, 0xbd7: 0x16ea, + 0xbd8: 0x16f2, 0xbd9: 0x16f6, 0xbda: 0x16fe, 0xbdb: 0x1706, 0xbdc: 0x170e, 0xbdd: 0x1995, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32, + 0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35, + 0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x3b, 0x121: 0x3c, 0x122: 0x3d, 0x123: 0x0d, 0x124: 0x3e, 0x125: 0x3f, 0x126: 0x40, 0x127: 0x41, + 0x128: 0x42, 0x129: 0x43, 0x12a: 0x44, 0x12b: 0x45, 0x12c: 0x40, 0x12d: 0x46, 0x12e: 0x47, 0x12f: 0x48, + 0x130: 0x44, 0x131: 0x49, 0x132: 0x4a, 0x133: 0x4b, 0x134: 0x4c, 0x135: 0x4d, 0x137: 0x4e, + 0x138: 0x4f, 0x139: 0x50, 0x13a: 0x51, 0x13b: 0x52, 0x13c: 0x53, 0x13d: 0x54, 0x13e: 0x55, 0x13f: 0x56, + // Block 0x5, offset 0x140 + 0x140: 0x57, 0x142: 0x58, 0x144: 0x59, 0x145: 0x5a, 0x146: 0x5b, 0x147: 0x5c, + 0x14d: 0x5d, + 0x15c: 0x5e, 0x15f: 0x5f, + 0x162: 0x60, 0x164: 0x61, + 0x168: 0x62, 0x169: 0x63, 0x16a: 0x64, 0x16b: 0x65, 0x16c: 0x0e, 0x16d: 0x66, 0x16e: 0x67, 0x16f: 0x68, + 0x170: 0x69, 0x173: 0x6a, 0x177: 0x0f, + 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, + // Block 0x6, offset 0x180 + 0x180: 0x6b, 0x183: 0x6c, 0x184: 0x6d, 0x186: 0x6e, 0x187: 0x6f, + 0x188: 0x70, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x71, 0x18c: 0x72, + 0x1ab: 0x73, + 0x1b3: 0x74, 0x1b5: 0x75, 0x1b7: 0x76, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x77, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x78, 0x1c5: 0x79, + 0x1c9: 0x7a, 0x1cc: 0x7b, 0x1cd: 0x7c, + // Block 0x8, offset 0x200 + 0x219: 0x7d, 0x21a: 0x7e, 0x21b: 0x7f, + 0x220: 0x80, 0x223: 0x81, 0x224: 0x82, 0x225: 0x83, 0x226: 0x84, 0x227: 0x85, + 0x22a: 0x86, 0x22b: 0x87, 0x22f: 0x88, + 0x230: 0x89, 0x231: 0x8a, 0x232: 0x8b, 0x233: 0x8c, 0x234: 0x8d, 0x235: 0x8e, 0x236: 0x8f, 0x237: 0x89, + 0x238: 0x8a, 0x239: 0x8b, 0x23a: 0x8c, 0x23b: 0x8d, 0x23c: 0x8e, 0x23d: 0x8f, 0x23e: 0x89, 0x23f: 0x8a, + // Block 0x9, offset 0x240 + 0x240: 0x8b, 0x241: 0x8c, 0x242: 0x8d, 0x243: 0x8e, 0x244: 0x8f, 0x245: 0x89, 0x246: 0x8a, 0x247: 0x8b, + 0x248: 0x8c, 0x249: 0x8d, 0x24a: 0x8e, 0x24b: 0x8f, 0x24c: 0x89, 0x24d: 0x8a, 0x24e: 0x8b, 0x24f: 0x8c, + 0x250: 0x8d, 0x251: 0x8e, 0x252: 0x8f, 0x253: 0x89, 0x254: 0x8a, 0x255: 0x8b, 0x256: 0x8c, 0x257: 0x8d, + 0x258: 0x8e, 0x259: 0x8f, 0x25a: 0x89, 0x25b: 0x8a, 0x25c: 0x8b, 0x25d: 0x8c, 0x25e: 0x8d, 0x25f: 0x8e, + 0x260: 0x8f, 0x261: 0x89, 0x262: 0x8a, 0x263: 0x8b, 0x264: 0x8c, 0x265: 0x8d, 0x266: 0x8e, 0x267: 0x8f, + 0x268: 0x89, 0x269: 0x8a, 0x26a: 0x8b, 0x26b: 0x8c, 0x26c: 0x8d, 0x26d: 0x8e, 0x26e: 0x8f, 0x26f: 0x89, + 0x270: 0x8a, 0x271: 0x8b, 0x272: 0x8c, 0x273: 0x8d, 0x274: 0x8e, 0x275: 0x8f, 0x276: 0x89, 0x277: 0x8a, + 0x278: 0x8b, 0x279: 0x8c, 0x27a: 0x8d, 0x27b: 0x8e, 0x27c: 0x8f, 0x27d: 0x89, 0x27e: 0x8a, 0x27f: 0x8b, + // Block 0xa, offset 0x280 + 0x280: 0x8c, 0x281: 0x8d, 0x282: 0x8e, 0x283: 0x8f, 0x284: 0x89, 0x285: 0x8a, 0x286: 0x8b, 0x287: 0x8c, + 0x288: 0x8d, 0x289: 0x8e, 0x28a: 0x8f, 0x28b: 0x89, 0x28c: 0x8a, 0x28d: 0x8b, 0x28e: 0x8c, 0x28f: 0x8d, + 0x290: 0x8e, 0x291: 0x8f, 0x292: 0x89, 0x293: 0x8a, 0x294: 0x8b, 0x295: 0x8c, 0x296: 0x8d, 0x297: 0x8e, + 0x298: 0x8f, 0x299: 0x89, 0x29a: 0x8a, 0x29b: 0x8b, 0x29c: 0x8c, 0x29d: 0x8d, 0x29e: 0x8e, 0x29f: 0x8f, + 0x2a0: 0x89, 0x2a1: 0x8a, 0x2a2: 0x8b, 0x2a3: 0x8c, 0x2a4: 0x8d, 0x2a5: 0x8e, 0x2a6: 0x8f, 0x2a7: 0x89, + 0x2a8: 0x8a, 0x2a9: 0x8b, 0x2aa: 0x8c, 0x2ab: 0x8d, 0x2ac: 0x8e, 0x2ad: 0x8f, 0x2ae: 0x89, 0x2af: 0x8a, + 0x2b0: 0x8b, 0x2b1: 0x8c, 0x2b2: 0x8d, 0x2b3: 0x8e, 0x2b4: 0x8f, 0x2b5: 0x89, 0x2b6: 0x8a, 0x2b7: 0x8b, + 0x2b8: 0x8c, 0x2b9: 0x8d, 0x2ba: 0x8e, 0x2bb: 0x8f, 0x2bc: 0x89, 0x2bd: 0x8a, 0x2be: 0x8b, 0x2bf: 0x8c, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8d, 0x2c1: 0x8e, 0x2c2: 0x8f, 0x2c3: 0x89, 0x2c4: 0x8a, 0x2c5: 0x8b, 0x2c6: 0x8c, 0x2c7: 0x8d, + 0x2c8: 0x8e, 0x2c9: 0x8f, 0x2ca: 0x89, 0x2cb: 0x8a, 0x2cc: 0x8b, 0x2cd: 0x8c, 0x2ce: 0x8d, 0x2cf: 0x8e, + 0x2d0: 0x8f, 0x2d1: 0x89, 0x2d2: 0x8a, 0x2d3: 0x8b, 0x2d4: 0x8c, 0x2d5: 0x8d, 0x2d6: 0x8e, 0x2d7: 0x8f, + 0x2d8: 0x89, 0x2d9: 0x8a, 0x2da: 0x8b, 0x2db: 0x8c, 0x2dc: 0x8d, 0x2dd: 0x8e, 0x2de: 0x90, + // Block 0xc, offset 0x300 + 0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20, + 0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x91, 0x32d: 0x92, 0x32e: 0x93, + 0x331: 0x94, 0x332: 0x95, 0x333: 0x96, 0x334: 0x97, + 0x338: 0x98, 0x339: 0x99, 0x33a: 0x9a, 0x33b: 0x9b, 0x33e: 0x9c, 0x33f: 0x9d, + // Block 0xd, offset 0x340 + 0x347: 0x9e, + 0x34b: 0x9f, 0x34d: 0xa0, + 0x368: 0xa1, 0x36b: 0xa2, + 0x374: 0xa3, + 0x37a: 0xa4, 0x37b: 0xa5, 0x37d: 0xa6, 0x37e: 0xa7, + // Block 0xe, offset 0x380 + 0x381: 0xa8, 0x382: 0xa9, 0x384: 0xaa, 0x385: 0x84, 0x387: 0xab, + 0x388: 0xac, 0x38b: 0xad, 0x38c: 0xae, 0x38d: 0xaf, + 0x391: 0xb0, 0x392: 0xb1, 0x393: 0xb2, 0x396: 0xb3, 0x397: 0xb4, + 0x398: 0x75, 0x39a: 0xb5, 0x39c: 0xb6, + 0x3a0: 0xb7, 0x3a4: 0xb8, 0x3a5: 0xb9, 0x3a7: 0xba, + 0x3a8: 0xbb, 0x3a9: 0xbc, 0x3aa: 0xbd, + 0x3b0: 0x75, 0x3b5: 0xbe, 0x3b6: 0xbf, + 0x3bd: 0xc0, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xc1, 0x3ec: 0xc2, + 0x3ff: 0xc3, + // Block 0x10, offset 0x400 + 0x432: 0xc4, + // Block 0x11, offset 0x440 + 0x445: 0xc5, 0x446: 0xc6, 0x447: 0xc7, + 0x449: 0xc8, + // Block 0x12, offset 0x480 + 0x480: 0xc9, 0x482: 0xca, 0x484: 0xc2, + 0x48a: 0xcb, 0x48b: 0xcc, + 0x493: 0xcd, + 0x4a3: 0xce, 0x4a5: 0xcf, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xd0, + // Block 0x14, offset 0x500 + 0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c, + 0x528: 0x2d, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 163 entries, 326 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x6e, 0x76, 0x7d, 0x80, 0x88, 0x8c, 0x90, 0x92, 0x94, 0x9d, 0xa1, 0xa8, 0xad, 0xb0, 0xba, 0xbd, 0xc4, 0xcc, 0xcf, 0xd1, 0xd4, 0xd6, 0xdb, 0xec, 0xf8, 0xfa, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10f, 0x112, 0x114, 0x117, 0x11a, 0x11e, 0x124, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x146, 0x14a, 0x158, 0x15b, 0x161, 0x167, 0x172, 0x176, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x186, 0x18a, 0x18c, 0x18e, 0x196, 0x19a, 0x19d, 0x19f, 0x1a1, 0x1a4, 0x1a7, 0x1a9, 0x1ab, 0x1ad, 0x1af, 0x1b5, 0x1b8, 0x1ba, 0x1c1, 0x1c7, 0x1cd, 0x1d5, 0x1db, 0x1e1, 0x1e7, 0x1eb, 0x1f9, 0x202, 0x205, 0x208, 0x20a, 0x20d, 0x20f, 0x213, 0x218, 0x21a, 0x21c, 0x221, 0x227, 0x229, 0x22b, 0x22d, 0x233, 0x236, 0x238, 0x23a, 0x23c, 0x242, 0x246, 0x24a, 0x252, 0x259, 0x25c, 0x25f, 0x261, 0x264, 0x26c, 0x270, 0x277, 0x27a, 0x280, 0x282, 0x285, 0x287, 0x28a, 0x28f, 0x291, 0x293, 0x295, 0x297, 0x299, 0x29c, 0x29e, 0x2a0, 0x2a2, 0x2a4, 0x2a6, 0x2a8, 0x2b5, 0x2bf, 0x2c1, 0x2c3, 0x2c9, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d5, 0x2d8} + +// nfcSparseValues: 730 entries, 2920 bytes +var nfcSparseValues = [730]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x4981, lo: 0x8a, hi: 0x8a}, + {value: 0x499f, lo: 0x8b, hi: 0x8b}, + {value: 0x3808, lo: 0x8c, hi: 0x8c}, + {value: 0x3820, lo: 0x8d, hi: 0x8d}, + {value: 0x49b7, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x383e, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xd, offset 0x63 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x68 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x6a + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0x10, offset 0x6e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x11, offset 0x76 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x12, offset 0x7d + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x80 + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x14, offset 0x88 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x8c + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x16, offset 0x90 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x17, offset 0x92 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x18, offset 0x94 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x19, offset 0x9d + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1a, offset 0xa1 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1b, offset 0xa8 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xad + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0xb0 + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1e, offset 0xba + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1f, offset 0xbd + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x20, offset 0xc4 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x21, offset 0xcc + {value: 0x0000, lo: 0x02}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x22, offset 0xcf + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x23, offset 0xd1 + {value: 0x0000, lo: 0x02}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x24, offset 0xd4 + {value: 0x0000, lo: 0x01}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + // Block 0x25, offset 0xd6 + {value: 0x0000, lo: 0x04}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0xdb + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x27, offset 0xec + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x28, offset 0xf8 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x29, offset 0xfa + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x2a, offset 0x100 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2b, offset 0x102 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x104 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x106 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x108 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x10a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x10c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x10f + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x114 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x117 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x11a + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x11e + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x124 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x12b + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x134 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x136 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x139 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x13b + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x146 + {value: 0x0004, lo: 0x03}, + {value: 0x052a, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3e, offset 0x14a + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x3f, offset 0x158 + {value: 0x43bc, lo: 0x02}, + {value: 0x023c, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x40, offset 0x15b + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x161 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x167 + {value: 0x62c7, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x172 + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x176 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x178 + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x46, offset 0x17a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x47, offset 0x17c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x48, offset 0x17e + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x49, offset 0x180 + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xaf}, + // Block 0x4a, offset 0x186 + {value: 0x0000, lo: 0x03}, + {value: 0x4be0, lo: 0xb3, hi: 0xb3}, + {value: 0x4be0, lo: 0xb5, hi: 0xb6}, + {value: 0x4be0, lo: 0xba, hi: 0xbf}, + // Block 0x4b, offset 0x18a + {value: 0x0000, lo: 0x01}, + {value: 0x4be0, lo: 0x8f, hi: 0xa3}, + // Block 0x4c, offset 0x18c + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4d, offset 0x18e + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4e, offset 0x196 + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4f, offset 0x19a + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x50, offset 0x19d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x51, offset 0x19f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x52, offset 0x1a1 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x53, offset 0x1a4 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x54, offset 0x1a7 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x55, offset 0x1a9 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x56, offset 0x1ab + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x57, offset 0x1ad + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x58, offset 0x1af + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x59, offset 0x1b5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x5a, offset 0x1b8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x5b, offset 0x1ba + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5c, offset 0x1c1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5d, offset 0x1c7 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5e, offset 0x1cd + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5f, offset 0x1d5 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x60, offset 0x1db + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x61, offset 0x1e1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x62, offset 0x1e7 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x63, offset 0x1eb + {value: 0x0006, lo: 0x0d}, + {value: 0x44d1, lo: 0x9d, hi: 0x9d}, + {value: 0x8116, lo: 0x9e, hi: 0x9e}, + {value: 0x4543, lo: 0x9f, hi: 0x9f}, + {value: 0x4531, lo: 0xaa, hi: 0xab}, + {value: 0x4635, lo: 0xac, hi: 0xac}, + {value: 0x463d, lo: 0xad, hi: 0xad}, + {value: 0x4489, lo: 0xae, hi: 0xb1}, + {value: 0x44a7, lo: 0xb2, hi: 0xb4}, + {value: 0x44bf, lo: 0xb5, hi: 0xb6}, + {value: 0x44cb, lo: 0xb8, hi: 0xb8}, + {value: 0x44d7, lo: 0xb9, hi: 0xbb}, + {value: 0x44ef, lo: 0xbc, hi: 0xbc}, + {value: 0x44f5, lo: 0xbe, hi: 0xbe}, + // Block 0x64, offset 0x1f9 + {value: 0x0006, lo: 0x08}, + {value: 0x44fb, lo: 0x80, hi: 0x81}, + {value: 0x4507, lo: 0x83, hi: 0x84}, + {value: 0x4519, lo: 0x86, hi: 0x89}, + {value: 0x453d, lo: 0x8a, hi: 0x8a}, + {value: 0x44b9, lo: 0x8b, hi: 0x8b}, + {value: 0x44a1, lo: 0x8c, hi: 0x8c}, + {value: 0x44e9, lo: 0x8d, hi: 0x8d}, + {value: 0x4513, lo: 0x8e, hi: 0x8e}, + // Block 0x65, offset 0x202 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x66, offset 0x205 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x67, offset 0x208 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x68, offset 0x20a + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x69, offset 0x20d + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x6a, offset 0x20f + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0xa0, hi: 0xa6}, + {value: 0x812e, lo: 0xa7, hi: 0xad}, + {value: 0x8133, lo: 0xae, hi: 0xaf}, + // Block 0x6b, offset 0x213 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6c, offset 0x218 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6d, offset 0x21a + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6e, offset 0x21c + {value: 0x0000, lo: 0x04}, + {value: 0x4be0, lo: 0x9e, hi: 0x9f}, + {value: 0x4be0, lo: 0xa3, hi: 0xa3}, + {value: 0x4be0, lo: 0xa5, hi: 0xa6}, + {value: 0x4be0, lo: 0xaa, hi: 0xaf}, + // Block 0x6f, offset 0x221 + {value: 0x0000, lo: 0x05}, + {value: 0x4be0, lo: 0x82, hi: 0x87}, + {value: 0x4be0, lo: 0x8a, hi: 0x8f}, + {value: 0x4be0, lo: 0x92, hi: 0x97}, + {value: 0x4be0, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x70, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x71, offset 0x229 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x72, offset 0x22b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x73, offset 0x22d + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x233 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x75, offset 0x236 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x76, offset 0x238 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x77, offset 0x23a + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x78, offset 0x23c + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x79, offset 0x242 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x7a, offset 0x246 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x7b, offset 0x24a + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x7c, offset 0x252 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x7d, offset 0x259 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7e, offset 0x25c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7f, offset 0x25f + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x80, offset 0x261 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x81, offset 0x264 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x82, offset 0x26c + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x83, offset 0x270 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x84, offset 0x277 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x85, offset 0x27a + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x86, offset 0x280 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x87, offset 0x282 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x88, offset 0x285 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x89, offset 0x287 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x8a, offset 0x28a + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x8b, offset 0x28f + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x8c, offset 0x291 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8d, offset 0x293 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8e, offset 0x295 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8f, offset 0x297 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x90, offset 0x299 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x91, offset 0x29c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x92, offset 0x29e + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x93, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x94, offset 0x2a2 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x95, offset 0x2a4 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x96, offset 0x2a6 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x97, offset 0x2a8 + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x98, offset 0x2b5 + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x2bf + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x9a, offset 0x2c1 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x9b, offset 0x2c3 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0x80, hi: 0x86}, + {value: 0x8133, lo: 0x88, hi: 0x98}, + {value: 0x8133, lo: 0x9b, hi: 0xa1}, + {value: 0x8133, lo: 0xa3, hi: 0xa4}, + {value: 0x8133, lo: 0xa6, hi: 0xaa}, + // Block 0x9c, offset 0x2c9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0x9d, offset 0x2cb + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0x9e, offset 0x2cd + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0x9f, offset 0x2cf + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xa0, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xa1, offset 0x2d5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xa2, offset 0x2d8 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 19260 bytes (18.81 KiB). Checksum: 1a0bbc4c8c24da49. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 95: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 95 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 97 blocks, 6208 entries, 12416 bytes +// The third block is the zero block. +var nfkcValues = [6208]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x132: 0x1a8a, 0x133: 0x1b17, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, 0x13f: 0x1cdc, + // Block 0x5, offset 0x140 + 0x140: 0x1d64, 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, 0x149: 0x1d8c, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2f2f, 0x185: 0x2f35, + 0x186: 0x2f3b, 0x187: 0x1a9f, 0x188: 0x1aa2, 0x189: 0x1b38, 0x18a: 0x1ab7, 0x18b: 0x1aba, + 0x18c: 0x1b6e, 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b1: 0x1a6f, 0x1b2: 0x1a72, 0x1b3: 0x1aff, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x43e6, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x439b, 0x285: 0x45bc, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x4981, 0x2cb: 0x499f, + 0x2cc: 0x3808, 0x2cd: 0x3820, 0x2ce: 0x49b7, 0x2d0: 0x0242, 0x2d1: 0x0254, + 0x2d2: 0x0230, 0x2d3: 0x444d, 0x2d4: 0x4453, 0x2d5: 0x027e, 0x2d6: 0x026c, + 0x2f0: 0x025a, 0x2f1: 0x026f, 0x2f2: 0x0272, 0x2f4: 0x020c, 0x2f5: 0x024b, + 0x2f9: 0x022a, + // Block 0xc, offset 0x300 + 0x300: 0x3862, 0x301: 0x386e, 0x303: 0x385c, + 0x306: 0xa000, 0x307: 0x384a, + 0x30c: 0x389e, 0x30d: 0x3886, 0x30e: 0x38b0, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x3892, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x3916, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x3874, 0x342: 0x38f8, + 0x350: 0x3850, 0x351: 0x38d4, + 0x352: 0x3856, 0x353: 0x38da, 0x356: 0x3868, 0x357: 0x38ec, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x396a, 0x35b: 0x3970, 0x35c: 0x387a, 0x35d: 0x38fe, + 0x35e: 0x3880, 0x35f: 0x3904, 0x362: 0x388c, 0x363: 0x3910, + 0x364: 0x3898, 0x365: 0x391c, 0x366: 0x38a4, 0x367: 0x3928, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3976, 0x36b: 0x397c, 0x36c: 0x38ce, 0x36d: 0x3952, 0x36e: 0x38aa, 0x36f: 0x392e, + 0x370: 0x38b6, 0x371: 0x393a, 0x372: 0x38bc, 0x373: 0x3940, 0x374: 0x38c2, 0x375: 0x3946, + 0x378: 0x38c8, 0x379: 0x394c, + // Block 0xe, offset 0x380 + 0x387: 0x1e91, + 0x391: 0x812e, + 0x392: 0x8133, 0x393: 0x8133, 0x394: 0x8133, 0x395: 0x8133, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x812f, 0x39b: 0x812e, 0x39c: 0x8133, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x8133, 0x3a0: 0x8133, 0x3a1: 0x8133, 0x3a2: 0x812e, 0x3a3: 0x812e, + 0x3a4: 0x812e, 0x3a5: 0x812e, 0x3a6: 0x812e, 0x3a7: 0x812e, 0x3a8: 0x8133, 0x3a9: 0x8133, + 0x3aa: 0x812e, 0x3ab: 0x8133, 0x3ac: 0x8133, 0x3ad: 0x812f, 0x3ae: 0x8132, 0x3af: 0x8133, + 0x3b0: 0x8106, 0x3b1: 0x8107, 0x3b2: 0x8108, 0x3b3: 0x8109, 0x3b4: 0x810a, 0x3b5: 0x810b, + 0x3b6: 0x810c, 0x3b7: 0x810d, 0x3b8: 0x810e, 0x3b9: 0x810f, 0x3ba: 0x810f, 0x3bb: 0x8110, + 0x3bc: 0x8111, 0x3bd: 0x8112, 0x3bf: 0x8113, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8117, + 0x3cc: 0x8118, 0x3cd: 0x8119, 0x3ce: 0x811a, 0x3cf: 0x811b, 0x3d0: 0x811c, 0x3d1: 0x811d, + 0x3d2: 0x811e, 0x3d3: 0x9933, 0x3d4: 0x9933, 0x3d5: 0x992e, 0x3d6: 0x812e, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x812e, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x812e, + 0x3f0: 0x811f, 0x3f5: 0x1eb4, + 0x3f6: 0x2143, 0x3f7: 0x217f, 0x3f8: 0x217a, + // Block 0x10, offset 0x400 + 0x40a: 0x8133, 0x40b: 0x8133, + 0x40c: 0x8133, 0x40d: 0x8133, 0x40e: 0x8133, 0x40f: 0x812e, 0x410: 0x812e, 0x411: 0x812e, + 0x412: 0x812e, 0x413: 0x812e, 0x414: 0x8133, 0x415: 0x8133, 0x416: 0x8133, 0x417: 0x8133, + 0x418: 0x8133, 0x419: 0x8133, 0x41a: 0x8133, 0x41b: 0x8133, 0x41c: 0x8133, 0x41d: 0x8133, + 0x41e: 0x8133, 0x41f: 0x8133, 0x420: 0x8133, 0x421: 0x8133, 0x423: 0x812e, + 0x424: 0x8133, 0x425: 0x8133, 0x426: 0x812e, 0x427: 0x8133, 0x428: 0x8133, 0x429: 0x812e, + 0x42a: 0x8133, 0x42b: 0x8133, 0x42c: 0x8133, 0x42d: 0x812e, 0x42e: 0x812e, 0x42f: 0x812e, + 0x430: 0x8117, 0x431: 0x8118, 0x432: 0x8119, 0x433: 0x8133, 0x434: 0x8133, 0x435: 0x8133, + 0x436: 0x812e, 0x437: 0x8133, 0x438: 0x8133, 0x439: 0x812e, 0x43a: 0x812e, 0x43b: 0x8133, + 0x43c: 0x8133, 0x43d: 0x8133, 0x43e: 0x8133, 0x43f: 0x8133, + // Block 0x11, offset 0x440 + 0x445: 0xa000, + 0x446: 0x2e5d, 0x447: 0xa000, 0x448: 0x2e65, 0x449: 0xa000, 0x44a: 0x2e6d, 0x44b: 0xa000, + 0x44c: 0x2e75, 0x44d: 0xa000, 0x44e: 0x2e7d, 0x451: 0xa000, + 0x452: 0x2e85, + 0x474: 0x8103, 0x475: 0x9900, + 0x47a: 0xa000, 0x47b: 0x2e8d, + 0x47c: 0xa000, 0x47d: 0x2e95, 0x47e: 0xa000, 0x47f: 0xa000, + // Block 0x12, offset 0x480 + 0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x0104, 0x485: 0x0107, + 0x486: 0x0506, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x011f, 0x48b: 0x0122, + 0x48c: 0x0125, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e6, + 0x492: 0x009f, 0x493: 0x0110, 0x494: 0x050a, 0x495: 0x050e, 0x496: 0x00a1, 0x497: 0x00a9, + 0x498: 0x00ab, 0x499: 0x0516, 0x49a: 0x015b, 0x49b: 0x00ad, 0x49c: 0x051a, 0x49d: 0x0242, + 0x49e: 0x0245, 0x49f: 0x0248, 0x4a0: 0x027e, 0x4a1: 0x0281, 0x4a2: 0x0093, 0x4a3: 0x00a5, + 0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x0242, 0x4a7: 0x0245, 0x4a8: 0x026f, 0x4a9: 0x027e, + 0x4aa: 0x0281, + 0x4b8: 0x02b4, + // Block 0x13, offset 0x4c0 + 0x4db: 0x010a, 0x4dc: 0x0087, 0x4dd: 0x0113, + 0x4de: 0x00d7, 0x4df: 0x0125, 0x4e0: 0x008d, 0x4e1: 0x012b, 0x4e2: 0x0131, 0x4e3: 0x013d, + 0x4e4: 0x0146, 0x4e5: 0x0149, 0x4e6: 0x014c, 0x4e7: 0x051e, 0x4e8: 0x01c7, 0x4e9: 0x0155, + 0x4ea: 0x0522, 0x4eb: 0x01ca, 0x4ec: 0x0161, 0x4ed: 0x015e, 0x4ee: 0x0164, 0x4ef: 0x0167, + 0x4f0: 0x016a, 0x4f1: 0x016d, 0x4f2: 0x0176, 0x4f3: 0x018e, 0x4f4: 0x0191, 0x4f5: 0x00f2, + 0x4f6: 0x019a, 0x4f7: 0x019d, 0x4f8: 0x0512, 0x4f9: 0x01a0, 0x4fa: 0x01a3, 0x4fb: 0x00b5, + 0x4fc: 0x01af, 0x4fd: 0x01b2, 0x4fe: 0x01b5, 0x4ff: 0x0254, + // Block 0x14, offset 0x500 + 0x500: 0x8133, 0x501: 0x8133, 0x502: 0x812e, 0x503: 0x8133, 0x504: 0x8133, 0x505: 0x8133, + 0x506: 0x8133, 0x507: 0x8133, 0x508: 0x8133, 0x509: 0x8133, 0x50a: 0x812e, 0x50b: 0x8133, + 0x50c: 0x8133, 0x50d: 0x8136, 0x50e: 0x812b, 0x50f: 0x812e, 0x510: 0x812a, 0x511: 0x8133, + 0x512: 0x8133, 0x513: 0x8133, 0x514: 0x8133, 0x515: 0x8133, 0x516: 0x8133, 0x517: 0x8133, + 0x518: 0x8133, 0x519: 0x8133, 0x51a: 0x8133, 0x51b: 0x8133, 0x51c: 0x8133, 0x51d: 0x8133, + 0x51e: 0x8133, 0x51f: 0x8133, 0x520: 0x8133, 0x521: 0x8133, 0x522: 0x8133, 0x523: 0x8133, + 0x524: 0x8133, 0x525: 0x8133, 0x526: 0x8133, 0x527: 0x8133, 0x528: 0x8133, 0x529: 0x8133, + 0x52a: 0x8133, 0x52b: 0x8133, 0x52c: 0x8133, 0x52d: 0x8133, 0x52e: 0x8133, 0x52f: 0x8133, + 0x530: 0x8133, 0x531: 0x8133, 0x532: 0x8133, 0x533: 0x8133, 0x534: 0x8133, 0x535: 0x8133, + 0x536: 0x8134, 0x537: 0x8132, 0x538: 0x8132, 0x539: 0x812e, 0x53a: 0x812d, 0x53b: 0x8133, + 0x53c: 0x8135, 0x53d: 0x812e, 0x53e: 0x8133, 0x53f: 0x812e, + // Block 0x15, offset 0x540 + 0x540: 0x30d8, 0x541: 0x33e4, 0x542: 0x30e2, 0x543: 0x33ee, 0x544: 0x30e7, 0x545: 0x33f3, + 0x546: 0x30ec, 0x547: 0x33f8, 0x548: 0x3a0d, 0x549: 0x3b9c, 0x54a: 0x3105, 0x54b: 0x3411, + 0x54c: 0x310f, 0x54d: 0x341b, 0x54e: 0x311e, 0x54f: 0x342a, 0x550: 0x3114, 0x551: 0x3420, + 0x552: 0x3119, 0x553: 0x3425, 0x554: 0x3a30, 0x555: 0x3bbf, 0x556: 0x3a37, 0x557: 0x3bc6, + 0x558: 0x315a, 0x559: 0x3466, 0x55a: 0x315f, 0x55b: 0x346b, 0x55c: 0x3a45, 0x55d: 0x3bd4, + 0x55e: 0x3164, 0x55f: 0x3470, 0x560: 0x3173, 0x561: 0x347f, 0x562: 0x3191, 0x563: 0x349d, + 0x564: 0x31a0, 0x565: 0x34ac, 0x566: 0x3196, 0x567: 0x34a2, 0x568: 0x31a5, 0x569: 0x34b1, + 0x56a: 0x31aa, 0x56b: 0x34b6, 0x56c: 0x31f0, 0x56d: 0x34fc, 0x56e: 0x3a4c, 0x56f: 0x3bdb, + 0x570: 0x31fa, 0x571: 0x350b, 0x572: 0x3204, 0x573: 0x3515, 0x574: 0x320e, 0x575: 0x351f, + 0x576: 0x4805, 0x577: 0x4896, 0x578: 0x3a53, 0x579: 0x3be2, 0x57a: 0x3227, 0x57b: 0x3538, + 0x57c: 0x3222, 0x57d: 0x3533, 0x57e: 0x322c, 0x57f: 0x353d, + // Block 0x16, offset 0x580 + 0x580: 0x3231, 0x581: 0x3542, 0x582: 0x3236, 0x583: 0x3547, 0x584: 0x324a, 0x585: 0x355b, + 0x586: 0x3254, 0x587: 0x3565, 0x588: 0x3263, 0x589: 0x3574, 0x58a: 0x325e, 0x58b: 0x356f, + 0x58c: 0x3a76, 0x58d: 0x3c05, 0x58e: 0x3a84, 0x58f: 0x3c13, 0x590: 0x3a8b, 0x591: 0x3c1a, + 0x592: 0x3a92, 0x593: 0x3c21, 0x594: 0x3290, 0x595: 0x35a1, 0x596: 0x3295, 0x597: 0x35a6, + 0x598: 0x329f, 0x599: 0x35b0, 0x59a: 0x4832, 0x59b: 0x48c3, 0x59c: 0x3ad8, 0x59d: 0x3c67, + 0x59e: 0x32b8, 0x59f: 0x35c9, 0x5a0: 0x32c2, 0x5a1: 0x35d3, 0x5a2: 0x4841, 0x5a3: 0x48d2, + 0x5a4: 0x3adf, 0x5a5: 0x3c6e, 0x5a6: 0x3ae6, 0x5a7: 0x3c75, 0x5a8: 0x3aed, 0x5a9: 0x3c7c, + 0x5aa: 0x32d1, 0x5ab: 0x35e2, 0x5ac: 0x32db, 0x5ad: 0x35f1, 0x5ae: 0x32ef, 0x5af: 0x3605, + 0x5b0: 0x32ea, 0x5b1: 0x3600, 0x5b2: 0x332b, 0x5b3: 0x3641, 0x5b4: 0x333a, 0x5b5: 0x3650, + 0x5b6: 0x3335, 0x5b7: 0x364b, 0x5b8: 0x3af4, 0x5b9: 0x3c83, 0x5ba: 0x3afb, 0x5bb: 0x3c8a, + 0x5bc: 0x333f, 0x5bd: 0x3655, 0x5be: 0x3344, 0x5bf: 0x365a, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3349, 0x5c1: 0x365f, 0x5c2: 0x334e, 0x5c3: 0x3664, 0x5c4: 0x335d, 0x5c5: 0x3673, + 0x5c6: 0x3358, 0x5c7: 0x366e, 0x5c8: 0x3362, 0x5c9: 0x367d, 0x5ca: 0x3367, 0x5cb: 0x3682, + 0x5cc: 0x336c, 0x5cd: 0x3687, 0x5ce: 0x338a, 0x5cf: 0x36a5, 0x5d0: 0x33a3, 0x5d1: 0x36c3, + 0x5d2: 0x33b2, 0x5d3: 0x36d2, 0x5d4: 0x33b7, 0x5d5: 0x36d7, 0x5d6: 0x34bb, 0x5d7: 0x35e7, + 0x5d8: 0x3678, 0x5d9: 0x36b4, 0x5da: 0x1d10, 0x5db: 0x4418, + 0x5e0: 0x47e2, 0x5e1: 0x4873, 0x5e2: 0x30c4, 0x5e3: 0x33d0, + 0x5e4: 0x39b9, 0x5e5: 0x3b48, 0x5e6: 0x39b2, 0x5e7: 0x3b41, 0x5e8: 0x39c7, 0x5e9: 0x3b56, + 0x5ea: 0x39c0, 0x5eb: 0x3b4f, 0x5ec: 0x39ff, 0x5ed: 0x3b8e, 0x5ee: 0x39d5, 0x5ef: 0x3b64, + 0x5f0: 0x39ce, 0x5f1: 0x3b5d, 0x5f2: 0x39e3, 0x5f3: 0x3b72, 0x5f4: 0x39dc, 0x5f5: 0x3b6b, + 0x5f6: 0x3a06, 0x5f7: 0x3b95, 0x5f8: 0x47f6, 0x5f9: 0x4887, 0x5fa: 0x3141, 0x5fb: 0x344d, + 0x5fc: 0x312d, 0x5fd: 0x3439, 0x5fe: 0x3a1b, 0x5ff: 0x3baa, + // Block 0x18, offset 0x600 + 0x600: 0x3a14, 0x601: 0x3ba3, 0x602: 0x3a29, 0x603: 0x3bb8, 0x604: 0x3a22, 0x605: 0x3bb1, + 0x606: 0x3a3e, 0x607: 0x3bcd, 0x608: 0x31d2, 0x609: 0x34de, 0x60a: 0x31e6, 0x60b: 0x34f2, + 0x60c: 0x4828, 0x60d: 0x48b9, 0x60e: 0x3277, 0x60f: 0x3588, 0x610: 0x3a61, 0x611: 0x3bf0, + 0x612: 0x3a5a, 0x613: 0x3be9, 0x614: 0x3a6f, 0x615: 0x3bfe, 0x616: 0x3a68, 0x617: 0x3bf7, + 0x618: 0x3aca, 0x619: 0x3c59, 0x61a: 0x3aae, 0x61b: 0x3c3d, 0x61c: 0x3aa7, 0x61d: 0x3c36, + 0x61e: 0x3abc, 0x61f: 0x3c4b, 0x620: 0x3ab5, 0x621: 0x3c44, 0x622: 0x3ac3, 0x623: 0x3c52, + 0x624: 0x3326, 0x625: 0x363c, 0x626: 0x3308, 0x627: 0x361e, 0x628: 0x3b25, 0x629: 0x3cb4, + 0x62a: 0x3b1e, 0x62b: 0x3cad, 0x62c: 0x3b33, 0x62d: 0x3cc2, 0x62e: 0x3b2c, 0x62f: 0x3cbb, + 0x630: 0x3b3a, 0x631: 0x3cc9, 0x632: 0x3371, 0x633: 0x368c, 0x634: 0x3399, 0x635: 0x36b9, + 0x636: 0x3394, 0x637: 0x36af, 0x638: 0x3380, 0x639: 0x369b, + // Block 0x19, offset 0x640 + 0x640: 0x4945, 0x641: 0x494b, 0x642: 0x4a5f, 0x643: 0x4a77, 0x644: 0x4a67, 0x645: 0x4a7f, + 0x646: 0x4a6f, 0x647: 0x4a87, 0x648: 0x48eb, 0x649: 0x48f1, 0x64a: 0x49cf, 0x64b: 0x49e7, + 0x64c: 0x49d7, 0x64d: 0x49ef, 0x64e: 0x49df, 0x64f: 0x49f7, 0x650: 0x4957, 0x651: 0x495d, + 0x652: 0x3ef9, 0x653: 0x3f09, 0x654: 0x3f01, 0x655: 0x3f11, + 0x658: 0x48f7, 0x659: 0x48fd, 0x65a: 0x3e29, 0x65b: 0x3e39, 0x65c: 0x3e31, 0x65d: 0x3e41, + 0x660: 0x496f, 0x661: 0x4975, 0x662: 0x4a8f, 0x663: 0x4aa7, + 0x664: 0x4a97, 0x665: 0x4aaf, 0x666: 0x4a9f, 0x667: 0x4ab7, 0x668: 0x4903, 0x669: 0x4909, + 0x66a: 0x49ff, 0x66b: 0x4a17, 0x66c: 0x4a07, 0x66d: 0x4a1f, 0x66e: 0x4a0f, 0x66f: 0x4a27, + 0x670: 0x4987, 0x671: 0x498d, 0x672: 0x3f59, 0x673: 0x3f71, 0x674: 0x3f61, 0x675: 0x3f79, + 0x676: 0x3f69, 0x677: 0x3f81, 0x678: 0x490f, 0x679: 0x4915, 0x67a: 0x3e59, 0x67b: 0x3e71, + 0x67c: 0x3e61, 0x67d: 0x3e79, 0x67e: 0x3e69, 0x67f: 0x3e81, + // Block 0x1a, offset 0x680 + 0x680: 0x4993, 0x681: 0x4999, 0x682: 0x3f89, 0x683: 0x3f99, 0x684: 0x3f91, 0x685: 0x3fa1, + 0x688: 0x491b, 0x689: 0x4921, 0x68a: 0x3e89, 0x68b: 0x3e99, + 0x68c: 0x3e91, 0x68d: 0x3ea1, 0x690: 0x49a5, 0x691: 0x49ab, + 0x692: 0x3fc1, 0x693: 0x3fd9, 0x694: 0x3fc9, 0x695: 0x3fe1, 0x696: 0x3fd1, 0x697: 0x3fe9, + 0x699: 0x4927, 0x69b: 0x3ea9, 0x69d: 0x3eb1, + 0x69f: 0x3eb9, 0x6a0: 0x49bd, 0x6a1: 0x49c3, 0x6a2: 0x4abf, 0x6a3: 0x4ad7, + 0x6a4: 0x4ac7, 0x6a5: 0x4adf, 0x6a6: 0x4acf, 0x6a7: 0x4ae7, 0x6a8: 0x492d, 0x6a9: 0x4933, + 0x6aa: 0x4a2f, 0x6ab: 0x4a47, 0x6ac: 0x4a37, 0x6ad: 0x4a4f, 0x6ae: 0x4a3f, 0x6af: 0x4a57, + 0x6b0: 0x4939, 0x6b1: 0x445f, 0x6b2: 0x37d2, 0x6b3: 0x4465, 0x6b4: 0x4963, 0x6b5: 0x446b, + 0x6b6: 0x37e4, 0x6b7: 0x4471, 0x6b8: 0x3802, 0x6b9: 0x4477, 0x6ba: 0x381a, 0x6bb: 0x447d, + 0x6bc: 0x49b1, 0x6bd: 0x4483, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3ee1, 0x6c1: 0x3ee9, 0x6c2: 0x42c5, 0x6c3: 0x42e3, 0x6c4: 0x42cf, 0x6c5: 0x42ed, + 0x6c6: 0x42d9, 0x6c7: 0x42f7, 0x6c8: 0x3e19, 0x6c9: 0x3e21, 0x6ca: 0x4211, 0x6cb: 0x422f, + 0x6cc: 0x421b, 0x6cd: 0x4239, 0x6ce: 0x4225, 0x6cf: 0x4243, 0x6d0: 0x3f29, 0x6d1: 0x3f31, + 0x6d2: 0x4301, 0x6d3: 0x431f, 0x6d4: 0x430b, 0x6d5: 0x4329, 0x6d6: 0x4315, 0x6d7: 0x4333, + 0x6d8: 0x3e49, 0x6d9: 0x3e51, 0x6da: 0x424d, 0x6db: 0x426b, 0x6dc: 0x4257, 0x6dd: 0x4275, + 0x6de: 0x4261, 0x6df: 0x427f, 0x6e0: 0x4001, 0x6e1: 0x4009, 0x6e2: 0x433d, 0x6e3: 0x435b, + 0x6e4: 0x4347, 0x6e5: 0x4365, 0x6e6: 0x4351, 0x6e7: 0x436f, 0x6e8: 0x3ec1, 0x6e9: 0x3ec9, + 0x6ea: 0x4289, 0x6eb: 0x42a7, 0x6ec: 0x4293, 0x6ed: 0x42b1, 0x6ee: 0x429d, 0x6ef: 0x42bb, + 0x6f0: 0x37c6, 0x6f1: 0x37c0, 0x6f2: 0x3ed1, 0x6f3: 0x37cc, 0x6f4: 0x3ed9, + 0x6f6: 0x4951, 0x6f7: 0x3ef1, 0x6f8: 0x3736, 0x6f9: 0x3730, 0x6fa: 0x3724, 0x6fb: 0x442f, + 0x6fc: 0x373c, 0x6fd: 0x43c8, 0x6fe: 0x0257, 0x6ff: 0x43c8, + // Block 0x1c, offset 0x700 + 0x700: 0x43e1, 0x701: 0x45c3, 0x702: 0x3f19, 0x703: 0x37de, 0x704: 0x3f21, + 0x706: 0x497b, 0x707: 0x3f39, 0x708: 0x3742, 0x709: 0x4435, 0x70a: 0x374e, 0x70b: 0x443b, + 0x70c: 0x375a, 0x70d: 0x45ca, 0x70e: 0x45d1, 0x70f: 0x45d8, 0x710: 0x37f6, 0x711: 0x37f0, + 0x712: 0x3f41, 0x713: 0x4625, 0x716: 0x37fc, 0x717: 0x3f51, + 0x718: 0x3772, 0x719: 0x376c, 0x71a: 0x3760, 0x71b: 0x4441, 0x71d: 0x45df, + 0x71e: 0x45e6, 0x71f: 0x45ed, 0x720: 0x382c, 0x721: 0x3826, 0x722: 0x3fa9, 0x723: 0x462d, + 0x724: 0x380e, 0x725: 0x3814, 0x726: 0x3832, 0x727: 0x3fb9, 0x728: 0x37a2, 0x729: 0x379c, + 0x72a: 0x3790, 0x72b: 0x444d, 0x72c: 0x378a, 0x72d: 0x45b5, 0x72e: 0x45bc, 0x72f: 0x0081, + 0x732: 0x3ff1, 0x733: 0x3838, 0x734: 0x3ff9, + 0x736: 0x49c9, 0x737: 0x4011, 0x738: 0x377e, 0x739: 0x4447, 0x73a: 0x37ae, 0x73b: 0x4459, + 0x73c: 0x37ba, 0x73d: 0x439b, 0x73e: 0x43cd, + // Block 0x1d, offset 0x740 + 0x740: 0x1d08, 0x741: 0x1d0c, 0x742: 0x0047, 0x743: 0x1d84, 0x745: 0x1d18, + 0x746: 0x1d1c, 0x747: 0x00ef, 0x749: 0x1d88, 0x74a: 0x008f, 0x74b: 0x0051, + 0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00e0, 0x750: 0x0053, 0x751: 0x0053, + 0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x1abd, + 0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065, + 0x760: 0x1acf, 0x761: 0x1cf8, 0x762: 0x1ad8, + 0x764: 0x0075, 0x766: 0x023c, 0x768: 0x0075, + 0x76a: 0x0057, 0x76b: 0x4413, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b, + 0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0308, + 0x776: 0x030b, 0x777: 0x030e, 0x778: 0x0311, 0x779: 0x0093, 0x77b: 0x1cc8, + 0x77c: 0x026c, 0x77d: 0x0245, 0x77e: 0x01fd, 0x77f: 0x0224, + // Block 0x1e, offset 0x780 + 0x780: 0x055a, 0x785: 0x0049, + 0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095, + 0x790: 0x235e, 0x791: 0x236a, + 0x792: 0x241e, 0x793: 0x2346, 0x794: 0x23ca, 0x795: 0x2352, 0x796: 0x23d0, 0x797: 0x23e8, + 0x798: 0x23f4, 0x799: 0x2358, 0x79a: 0x23fa, 0x79b: 0x2364, 0x79c: 0x23ee, 0x79d: 0x2400, + 0x79e: 0x2406, 0x79f: 0x1dec, 0x7a0: 0x0053, 0x7a1: 0x1a87, 0x7a2: 0x1cd4, 0x7a3: 0x1a90, + 0x7a4: 0x006d, 0x7a5: 0x1adb, 0x7a6: 0x1d00, 0x7a7: 0x1e78, 0x7a8: 0x1a93, 0x7a9: 0x0071, + 0x7aa: 0x1ae7, 0x7ab: 0x1d04, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b, + 0x7b0: 0x0093, 0x7b1: 0x1b14, 0x7b2: 0x1d48, 0x7b3: 0x1b1d, 0x7b4: 0x00ad, 0x7b5: 0x1b92, + 0x7b6: 0x1d7c, 0x7b7: 0x1e8c, 0x7b8: 0x1b20, 0x7b9: 0x00b1, 0x7ba: 0x1b95, 0x7bb: 0x1d80, + 0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x3d47, 0x7c3: 0xa000, 0x7c4: 0x3d4e, 0x7c5: 0xa000, + 0x7c7: 0x3d55, 0x7c8: 0xa000, 0x7c9: 0x3d5c, + 0x7cd: 0xa000, + 0x7e0: 0x30a6, 0x7e1: 0xa000, 0x7e2: 0x3d6a, + 0x7e4: 0xa000, 0x7e5: 0xa000, + 0x7ed: 0x3d63, 0x7ee: 0x30a1, 0x7ef: 0x30ab, + 0x7f0: 0x3d71, 0x7f1: 0x3d78, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3d7f, 0x7f5: 0x3d86, + 0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3d8d, 0x7f9: 0x3d94, 0x7fa: 0xa000, 0x7fb: 0xa000, + 0x7fc: 0xa000, 0x7fd: 0xa000, + // Block 0x20, offset 0x800 + 0x800: 0x3d9b, 0x801: 0x3da2, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3db7, 0x805: 0x3dbe, + 0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3dc5, 0x809: 0x3dcc, + 0x811: 0xa000, + 0x812: 0xa000, + 0x822: 0xa000, + 0x828: 0xa000, 0x829: 0xa000, + 0x82b: 0xa000, 0x82c: 0x3de1, 0x82d: 0x3de8, 0x82e: 0x3def, 0x82f: 0x3df6, + 0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000, + // Block 0x21, offset 0x840 + 0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029, + 0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x19af, + 0x86a: 0x19b2, 0x86b: 0x19b5, 0x86c: 0x19b8, 0x86d: 0x19bb, 0x86e: 0x19be, 0x86f: 0x19c1, + 0x870: 0x19c4, 0x871: 0x19c7, 0x872: 0x19ca, 0x873: 0x19d3, 0x874: 0x1b98, 0x875: 0x1b9c, + 0x876: 0x1ba0, 0x877: 0x1ba4, 0x878: 0x1ba8, 0x879: 0x1bac, 0x87a: 0x1bb0, 0x87b: 0x1bb4, + 0x87c: 0x1bb8, 0x87d: 0x1db0, 0x87e: 0x1db5, 0x87f: 0x1dba, + // Block 0x22, offset 0x880 + 0x880: 0x1dbf, 0x881: 0x1dc4, 0x882: 0x1dc9, 0x883: 0x1dce, 0x884: 0x1dd3, 0x885: 0x1dd8, + 0x886: 0x1ddd, 0x887: 0x1de2, 0x888: 0x19ac, 0x889: 0x19d0, 0x88a: 0x19f4, 0x88b: 0x1a18, + 0x88c: 0x1a3c, 0x88d: 0x1a45, 0x88e: 0x1a4b, 0x88f: 0x1a51, 0x890: 0x1a57, 0x891: 0x1c90, + 0x892: 0x1c94, 0x893: 0x1c98, 0x894: 0x1c9c, 0x895: 0x1ca0, 0x896: 0x1ca4, 0x897: 0x1ca8, + 0x898: 0x1cac, 0x899: 0x1cb0, 0x89a: 0x1cb4, 0x89b: 0x1cb8, 0x89c: 0x1c24, 0x89d: 0x1c28, + 0x89e: 0x1c2c, 0x89f: 0x1c30, 0x8a0: 0x1c34, 0x8a1: 0x1c38, 0x8a2: 0x1c3c, 0x8a3: 0x1c40, + 0x8a4: 0x1c44, 0x8a5: 0x1c48, 0x8a6: 0x1c4c, 0x8a7: 0x1c50, 0x8a8: 0x1c54, 0x8a9: 0x1c58, + 0x8aa: 0x1c5c, 0x8ab: 0x1c60, 0x8ac: 0x1c64, 0x8ad: 0x1c68, 0x8ae: 0x1c6c, 0x8af: 0x1c70, + 0x8b0: 0x1c74, 0x8b1: 0x1c78, 0x8b2: 0x1c7c, 0x8b3: 0x1c80, 0x8b4: 0x1c84, 0x8b5: 0x1c88, + 0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d, + 0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x07ba, 0x8c1: 0x07de, 0x8c2: 0x07ea, 0x8c3: 0x07fa, 0x8c4: 0x0802, 0x8c5: 0x080e, + 0x8c6: 0x0816, 0x8c7: 0x081e, 0x8c8: 0x082a, 0x8c9: 0x087e, 0x8ca: 0x0896, 0x8cb: 0x08a6, + 0x8cc: 0x08b6, 0x8cd: 0x08c6, 0x8ce: 0x08d6, 0x8cf: 0x08f6, 0x8d0: 0x08fa, 0x8d1: 0x08fe, + 0x8d2: 0x0932, 0x8d3: 0x095a, 0x8d4: 0x096a, 0x8d5: 0x0972, 0x8d6: 0x0976, 0x8d7: 0x0982, + 0x8d8: 0x099e, 0x8d9: 0x09a2, 0x8da: 0x09ba, 0x8db: 0x09be, 0x8dc: 0x09c6, 0x8dd: 0x09d6, + 0x8de: 0x0a72, 0x8df: 0x0a86, 0x8e0: 0x0ac6, 0x8e1: 0x0ada, 0x8e2: 0x0ae2, 0x8e3: 0x0ae6, + 0x8e4: 0x0af6, 0x8e5: 0x0b12, 0x8e6: 0x0b3e, 0x8e7: 0x0b4a, 0x8e8: 0x0b6a, 0x8e9: 0x0b76, + 0x8ea: 0x0b7a, 0x8eb: 0x0b7e, 0x8ec: 0x0b96, 0x8ed: 0x0b9a, 0x8ee: 0x0bc6, 0x8ef: 0x0bd2, + 0x8f0: 0x0bda, 0x8f1: 0x0be2, 0x8f2: 0x0bf2, 0x8f3: 0x0bfa, 0x8f4: 0x0c02, 0x8f5: 0x0c2e, + 0x8f6: 0x0c32, 0x8f7: 0x0c3a, 0x8f8: 0x0c3e, 0x8f9: 0x0c46, 0x8fa: 0x0c4e, 0x8fb: 0x0c5e, + 0x8fc: 0x0c7a, 0x8fd: 0x0cf2, 0x8fe: 0x0d06, 0x8ff: 0x0d0a, + // Block 0x24, offset 0x900 + 0x900: 0x0d8a, 0x901: 0x0d8e, 0x902: 0x0da2, 0x903: 0x0da6, 0x904: 0x0dae, 0x905: 0x0db6, + 0x906: 0x0dbe, 0x907: 0x0dca, 0x908: 0x0df2, 0x909: 0x0e02, 0x90a: 0x0e16, 0x90b: 0x0e86, + 0x90c: 0x0e92, 0x90d: 0x0ea2, 0x90e: 0x0eae, 0x90f: 0x0eba, 0x910: 0x0ec2, 0x911: 0x0ec6, + 0x912: 0x0eca, 0x913: 0x0ece, 0x914: 0x0ed2, 0x915: 0x0f8a, 0x916: 0x0fd2, 0x917: 0x0fde, + 0x918: 0x0fe2, 0x919: 0x0fe6, 0x91a: 0x0fea, 0x91b: 0x0ff2, 0x91c: 0x0ff6, 0x91d: 0x100a, + 0x91e: 0x1026, 0x91f: 0x102e, 0x920: 0x106e, 0x921: 0x1072, 0x922: 0x107a, 0x923: 0x107e, + 0x924: 0x1086, 0x925: 0x108a, 0x926: 0x10ae, 0x927: 0x10b2, 0x928: 0x10ce, 0x929: 0x10d2, + 0x92a: 0x10d6, 0x92b: 0x10da, 0x92c: 0x10ee, 0x92d: 0x1112, 0x92e: 0x1116, 0x92f: 0x111a, + 0x930: 0x113e, 0x931: 0x117e, 0x932: 0x1182, 0x933: 0x11a2, 0x934: 0x11b2, 0x935: 0x11ba, + 0x936: 0x11da, 0x937: 0x11fe, 0x938: 0x1242, 0x939: 0x124a, 0x93a: 0x125e, 0x93b: 0x126a, + 0x93c: 0x1272, 0x93d: 0x127a, 0x93e: 0x127e, 0x93f: 0x1282, + // Block 0x25, offset 0x940 + 0x940: 0x129a, 0x941: 0x129e, 0x942: 0x12ba, 0x943: 0x12c2, 0x944: 0x12ca, 0x945: 0x12ce, + 0x946: 0x12da, 0x947: 0x12e2, 0x948: 0x12e6, 0x949: 0x12ea, 0x94a: 0x12f2, 0x94b: 0x12f6, + 0x94c: 0x1396, 0x94d: 0x13aa, 0x94e: 0x13de, 0x94f: 0x13e2, 0x950: 0x13ea, 0x951: 0x1416, + 0x952: 0x141e, 0x953: 0x1426, 0x954: 0x142e, 0x955: 0x146a, 0x956: 0x146e, 0x957: 0x1476, + 0x958: 0x147a, 0x959: 0x147e, 0x95a: 0x14aa, 0x95b: 0x14ae, 0x95c: 0x14b6, 0x95d: 0x14ca, + 0x95e: 0x14ce, 0x95f: 0x14ea, 0x960: 0x14f2, 0x961: 0x14f6, 0x962: 0x151a, 0x963: 0x153a, + 0x964: 0x154e, 0x965: 0x1552, 0x966: 0x155a, 0x967: 0x1586, 0x968: 0x158a, 0x969: 0x159a, + 0x96a: 0x15be, 0x96b: 0x15ca, 0x96c: 0x15da, 0x96d: 0x15f2, 0x96e: 0x15fa, 0x96f: 0x15fe, + 0x970: 0x1602, 0x971: 0x1606, 0x972: 0x1612, 0x973: 0x1616, 0x974: 0x161e, 0x975: 0x163a, + 0x976: 0x163e, 0x977: 0x1642, 0x978: 0x165a, 0x979: 0x165e, 0x97a: 0x1666, 0x97b: 0x167a, + 0x97c: 0x167e, 0x97d: 0x1682, 0x97e: 0x168a, 0x97f: 0x168e, + // Block 0x26, offset 0x980 + 0x986: 0xa000, 0x98b: 0xa000, + 0x98c: 0x4049, 0x98d: 0xa000, 0x98e: 0x4051, 0x98f: 0xa000, 0x990: 0x4059, 0x991: 0xa000, + 0x992: 0x4061, 0x993: 0xa000, 0x994: 0x4069, 0x995: 0xa000, 0x996: 0x4071, 0x997: 0xa000, + 0x998: 0x4079, 0x999: 0xa000, 0x99a: 0x4081, 0x99b: 0xa000, 0x99c: 0x4089, 0x99d: 0xa000, + 0x99e: 0x4091, 0x99f: 0xa000, 0x9a0: 0x4099, 0x9a1: 0xa000, 0x9a2: 0x40a1, + 0x9a4: 0xa000, 0x9a5: 0x40a9, 0x9a6: 0xa000, 0x9a7: 0x40b1, 0x9a8: 0xa000, 0x9a9: 0x40b9, + 0x9af: 0xa000, + 0x9b0: 0x40c1, 0x9b1: 0x40c9, 0x9b2: 0xa000, 0x9b3: 0x40d1, 0x9b4: 0x40d9, 0x9b5: 0xa000, + 0x9b6: 0x40e1, 0x9b7: 0x40e9, 0x9b8: 0xa000, 0x9b9: 0x40f1, 0x9ba: 0x40f9, 0x9bb: 0xa000, + 0x9bc: 0x4101, 0x9bd: 0x4109, + // Block 0x27, offset 0x9c0 + 0x9d4: 0x4041, + 0x9d9: 0x9904, 0x9da: 0x9904, 0x9db: 0x441d, 0x9dc: 0x4423, 0x9dd: 0xa000, + 0x9de: 0x4111, 0x9df: 0x27e4, + 0x9e6: 0xa000, + 0x9eb: 0xa000, 0x9ec: 0x4121, 0x9ed: 0xa000, 0x9ee: 0x4129, 0x9ef: 0xa000, + 0x9f0: 0x4131, 0x9f1: 0xa000, 0x9f2: 0x4139, 0x9f3: 0xa000, 0x9f4: 0x4141, 0x9f5: 0xa000, + 0x9f6: 0x4149, 0x9f7: 0xa000, 0x9f8: 0x4151, 0x9f9: 0xa000, 0x9fa: 0x4159, 0x9fb: 0xa000, + 0x9fc: 0x4161, 0x9fd: 0xa000, 0x9fe: 0x4169, 0x9ff: 0xa000, + // Block 0x28, offset 0xa00 + 0xa00: 0x4171, 0xa01: 0xa000, 0xa02: 0x4179, 0xa04: 0xa000, 0xa05: 0x4181, + 0xa06: 0xa000, 0xa07: 0x4189, 0xa08: 0xa000, 0xa09: 0x4191, + 0xa0f: 0xa000, 0xa10: 0x4199, 0xa11: 0x41a1, + 0xa12: 0xa000, 0xa13: 0x41a9, 0xa14: 0x41b1, 0xa15: 0xa000, 0xa16: 0x41b9, 0xa17: 0x41c1, + 0xa18: 0xa000, 0xa19: 0x41c9, 0xa1a: 0x41d1, 0xa1b: 0xa000, 0xa1c: 0x41d9, 0xa1d: 0x41e1, + 0xa2f: 0xa000, + 0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x4119, + 0xa37: 0x41e9, 0xa38: 0x41f1, 0xa39: 0x41f9, 0xa3a: 0x4201, + 0xa3d: 0xa000, 0xa3e: 0x4209, 0xa3f: 0x27f9, + // Block 0x29, offset 0xa40 + 0xa40: 0x045a, 0xa41: 0x041e, 0xa42: 0x0422, 0xa43: 0x0426, 0xa44: 0x046e, 0xa45: 0x042a, + 0xa46: 0x042e, 0xa47: 0x0432, 0xa48: 0x0436, 0xa49: 0x043a, 0xa4a: 0x043e, 0xa4b: 0x0442, + 0xa4c: 0x0446, 0xa4d: 0x044a, 0xa4e: 0x044e, 0xa4f: 0x4afe, 0xa50: 0x4b04, 0xa51: 0x4b0a, + 0xa52: 0x4b10, 0xa53: 0x4b16, 0xa54: 0x4b1c, 0xa55: 0x4b22, 0xa56: 0x4b28, 0xa57: 0x4b2e, + 0xa58: 0x4b34, 0xa59: 0x4b3a, 0xa5a: 0x4b40, 0xa5b: 0x4b46, 0xa5c: 0x4b4c, 0xa5d: 0x4b52, + 0xa5e: 0x4b58, 0xa5f: 0x4b5e, 0xa60: 0x4b64, 0xa61: 0x4b6a, 0xa62: 0x4b70, 0xa63: 0x4b76, + 0xa64: 0x04b6, 0xa65: 0x0452, 0xa66: 0x0456, 0xa67: 0x04da, 0xa68: 0x04de, 0xa69: 0x04e2, + 0xa6a: 0x04e6, 0xa6b: 0x04ea, 0xa6c: 0x04ee, 0xa6d: 0x04f2, 0xa6e: 0x045e, 0xa6f: 0x04f6, + 0xa70: 0x04fa, 0xa71: 0x0462, 0xa72: 0x0466, 0xa73: 0x046a, 0xa74: 0x0472, 0xa75: 0x0476, + 0xa76: 0x047a, 0xa77: 0x047e, 0xa78: 0x0482, 0xa79: 0x0486, 0xa7a: 0x048a, 0xa7b: 0x048e, + 0xa7c: 0x0492, 0xa7d: 0x0496, 0xa7e: 0x049a, 0xa7f: 0x049e, + // Block 0x2a, offset 0xa80 + 0xa80: 0x04a2, 0xa81: 0x04a6, 0xa82: 0x04fe, 0xa83: 0x0502, 0xa84: 0x04aa, 0xa85: 0x04ae, + 0xa86: 0x04b2, 0xa87: 0x04ba, 0xa88: 0x04be, 0xa89: 0x04c2, 0xa8a: 0x04c6, 0xa8b: 0x04ca, + 0xa8c: 0x04ce, 0xa8d: 0x04d2, 0xa8e: 0x04d6, + 0xa92: 0x07ba, 0xa93: 0x0816, 0xa94: 0x07c6, 0xa95: 0x0a76, 0xa96: 0x07ca, 0xa97: 0x07e2, + 0xa98: 0x07ce, 0xa99: 0x108e, 0xa9a: 0x0802, 0xa9b: 0x07d6, 0xa9c: 0x07be, 0xa9d: 0x0afa, + 0xa9e: 0x0a8a, 0xa9f: 0x082a, + // Block 0x2b, offset 0xac0 + 0xac0: 0x2184, 0xac1: 0x218a, 0xac2: 0x2190, 0xac3: 0x2196, 0xac4: 0x219c, 0xac5: 0x21a2, + 0xac6: 0x21a8, 0xac7: 0x21ae, 0xac8: 0x21b4, 0xac9: 0x21ba, 0xaca: 0x21c0, 0xacb: 0x21c6, + 0xacc: 0x21cc, 0xacd: 0x21d2, 0xace: 0x285d, 0xacf: 0x2866, 0xad0: 0x286f, 0xad1: 0x2878, + 0xad2: 0x2881, 0xad3: 0x288a, 0xad4: 0x2893, 0xad5: 0x289c, 0xad6: 0x28a5, 0xad7: 0x28b7, + 0xad8: 0x28c0, 0xad9: 0x28c9, 0xada: 0x28d2, 0xadb: 0x28db, 0xadc: 0x28ae, 0xadd: 0x2ce3, + 0xade: 0x2c24, 0xae0: 0x21d8, 0xae1: 0x21f0, 0xae2: 0x21e4, 0xae3: 0x2238, + 0xae4: 0x21f6, 0xae5: 0x2214, 0xae6: 0x21de, 0xae7: 0x220e, 0xae8: 0x21ea, 0xae9: 0x2220, + 0xaea: 0x2250, 0xaeb: 0x226e, 0xaec: 0x2268, 0xaed: 0x225c, 0xaee: 0x22aa, 0xaef: 0x223e, + 0xaf0: 0x224a, 0xaf1: 0x2262, 0xaf2: 0x2256, 0xaf3: 0x2280, 0xaf4: 0x222c, 0xaf5: 0x2274, + 0xaf6: 0x229e, 0xaf7: 0x2286, 0xaf8: 0x221a, 0xaf9: 0x21fc, 0xafa: 0x2232, 0xafb: 0x2244, + 0xafc: 0x227a, 0xafd: 0x2202, 0xafe: 0x22a4, 0xaff: 0x2226, + // Block 0x2c, offset 0xb00 + 0xb00: 0x228c, 0xb01: 0x2208, 0xb02: 0x2292, 0xb03: 0x2298, 0xb04: 0x0a2a, 0xb05: 0x0bfe, + 0xb06: 0x0da2, 0xb07: 0x11c2, + 0xb10: 0x1cf4, 0xb11: 0x19d6, + 0xb12: 0x19d9, 0xb13: 0x19dc, 0xb14: 0x19df, 0xb15: 0x19e2, 0xb16: 0x19e5, 0xb17: 0x19e8, + 0xb18: 0x19eb, 0xb19: 0x19ee, 0xb1a: 0x19f7, 0xb1b: 0x19fa, 0xb1c: 0x19fd, 0xb1d: 0x1a00, + 0xb1e: 0x1a03, 0xb1f: 0x1a06, 0xb20: 0x0406, 0xb21: 0x040e, 0xb22: 0x0412, 0xb23: 0x041a, + 0xb24: 0x041e, 0xb25: 0x0422, 0xb26: 0x042a, 0xb27: 0x0432, 0xb28: 0x0436, 0xb29: 0x043e, + 0xb2a: 0x0442, 0xb2b: 0x0446, 0xb2c: 0x044a, 0xb2d: 0x044e, 0xb2e: 0x2f59, 0xb2f: 0x2f61, + 0xb30: 0x2f69, 0xb31: 0x2f71, 0xb32: 0x2f79, 0xb33: 0x2f81, 0xb34: 0x2f89, 0xb35: 0x2f91, + 0xb36: 0x2fa1, 0xb37: 0x2fa9, 0xb38: 0x2fb1, 0xb39: 0x2fb9, 0xb3a: 0x2fc1, 0xb3b: 0x2fc9, + 0xb3c: 0x3014, 0xb3d: 0x2fdc, 0xb3e: 0x2f99, + // Block 0x2d, offset 0xb40 + 0xb40: 0x07ba, 0xb41: 0x0816, 0xb42: 0x07c6, 0xb43: 0x0a76, 0xb44: 0x081a, 0xb45: 0x08aa, + 0xb46: 0x07c2, 0xb47: 0x08a6, 0xb48: 0x0806, 0xb49: 0x0982, 0xb4a: 0x0e02, 0xb4b: 0x0f8a, + 0xb4c: 0x0ed2, 0xb4d: 0x0e16, 0xb4e: 0x155a, 0xb4f: 0x0a86, 0xb50: 0x0dca, 0xb51: 0x0e46, + 0xb52: 0x0e06, 0xb53: 0x1146, 0xb54: 0x09f6, 0xb55: 0x0ffe, 0xb56: 0x1482, 0xb57: 0x115a, + 0xb58: 0x093e, 0xb59: 0x118a, 0xb5a: 0x1096, 0xb5b: 0x0b12, 0xb5c: 0x150a, 0xb5d: 0x087a, + 0xb5e: 0x09a6, 0xb5f: 0x0ef2, 0xb60: 0x1622, 0xb61: 0x083e, 0xb62: 0x08ce, 0xb63: 0x0e96, + 0xb64: 0x07ca, 0xb65: 0x07e2, 0xb66: 0x07ce, 0xb67: 0x0bd6, 0xb68: 0x09ea, 0xb69: 0x097a, + 0xb6a: 0x0b52, 0xb6b: 0x0b46, 0xb6c: 0x10e6, 0xb6d: 0x083a, 0xb6e: 0x1496, 0xb6f: 0x0996, + 0xb70: 0x0aee, 0xb71: 0x1a09, 0xb72: 0x1a0c, 0xb73: 0x1a0f, 0xb74: 0x1a12, 0xb75: 0x1a1b, + 0xb76: 0x1a1e, 0xb77: 0x1a21, 0xb78: 0x1a24, 0xb79: 0x1a27, 0xb7a: 0x1a2a, 0xb7b: 0x1a2d, + 0xb7c: 0x1a30, 0xb7d: 0x1a33, 0xb7e: 0x1a36, 0xb7f: 0x1a3f, + // Block 0x2e, offset 0xb80 + 0xb80: 0x1df6, 0xb81: 0x1e05, 0xb82: 0x1e14, 0xb83: 0x1e23, 0xb84: 0x1e32, 0xb85: 0x1e41, + 0xb86: 0x1e50, 0xb87: 0x1e5f, 0xb88: 0x1e6e, 0xb89: 0x22bc, 0xb8a: 0x22ce, 0xb8b: 0x22e0, + 0xb8c: 0x1a81, 0xb8d: 0x1d34, 0xb8e: 0x1b02, 0xb8f: 0x1cd8, 0xb90: 0x05c6, 0xb91: 0x05ce, + 0xb92: 0x05d6, 0xb93: 0x05de, 0xb94: 0x05e6, 0xb95: 0x05ea, 0xb96: 0x05ee, 0xb97: 0x05f2, + 0xb98: 0x05f6, 0xb99: 0x05fa, 0xb9a: 0x05fe, 0xb9b: 0x0602, 0xb9c: 0x0606, 0xb9d: 0x060a, + 0xb9e: 0x060e, 0xb9f: 0x0612, 0xba0: 0x0616, 0xba1: 0x061e, 0xba2: 0x0622, 0xba3: 0x0626, + 0xba4: 0x062a, 0xba5: 0x062e, 0xba6: 0x0632, 0xba7: 0x0636, 0xba8: 0x063a, 0xba9: 0x063e, + 0xbaa: 0x0642, 0xbab: 0x0646, 0xbac: 0x064a, 0xbad: 0x064e, 0xbae: 0x0652, 0xbaf: 0x0656, + 0xbb0: 0x065a, 0xbb1: 0x065e, 0xbb2: 0x0662, 0xbb3: 0x066a, 0xbb4: 0x0672, 0xbb5: 0x067a, + 0xbb6: 0x067e, 0xbb7: 0x0682, 0xbb8: 0x0686, 0xbb9: 0x068a, 0xbba: 0x068e, 0xbbb: 0x0692, + 0xbbc: 0x0696, 0xbbd: 0x069a, 0xbbe: 0x069e, 0xbbf: 0x282a, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x2c43, 0xbc1: 0x2adf, 0xbc2: 0x2c53, 0xbc3: 0x29b7, 0xbc4: 0x3025, 0xbc5: 0x29c1, + 0xbc6: 0x29cb, 0xbc7: 0x3069, 0xbc8: 0x2aec, 0xbc9: 0x29d5, 0xbca: 0x29df, 0xbcb: 0x29e9, + 0xbcc: 0x2b13, 0xbcd: 0x2b20, 0xbce: 0x2af9, 0xbcf: 0x2b06, 0xbd0: 0x2fea, 0xbd1: 0x2b2d, + 0xbd2: 0x2b3a, 0xbd3: 0x2cf5, 0xbd4: 0x27eb, 0xbd5: 0x2d08, 0xbd6: 0x2d1b, 0xbd7: 0x2c63, + 0xbd8: 0x2b47, 0xbd9: 0x2d2e, 0xbda: 0x2d41, 0xbdb: 0x2b54, 0xbdc: 0x29f3, 0xbdd: 0x29fd, + 0xbde: 0x2ff8, 0xbdf: 0x2b61, 0xbe0: 0x2c73, 0xbe1: 0x3036, 0xbe2: 0x2a07, 0xbe3: 0x2a11, + 0xbe4: 0x2b6e, 0xbe5: 0x2a1b, 0xbe6: 0x2a25, 0xbe7: 0x2800, 0xbe8: 0x2807, 0xbe9: 0x2a2f, + 0xbea: 0x2a39, 0xbeb: 0x2d54, 0xbec: 0x2b7b, 0xbed: 0x2c83, 0xbee: 0x2d67, 0xbef: 0x2b88, + 0xbf0: 0x2a4d, 0xbf1: 0x2a43, 0xbf2: 0x307d, 0xbf3: 0x2b95, 0xbf4: 0x2d7a, 0xbf5: 0x2a57, + 0xbf6: 0x2c93, 0xbf7: 0x2a61, 0xbf8: 0x2baf, 0xbf9: 0x2a6b, 0xbfa: 0x2bbc, 0xbfb: 0x3047, + 0xbfc: 0x2ba2, 0xbfd: 0x2ca3, 0xbfe: 0x2bc9, 0xbff: 0x280e, + // Block 0x30, offset 0xc00 + 0xc00: 0x3058, 0xc01: 0x2a75, 0xc02: 0x2a7f, 0xc03: 0x2bd6, 0xc04: 0x2a89, 0xc05: 0x2a93, + 0xc06: 0x2a9d, 0xc07: 0x2cb3, 0xc08: 0x2be3, 0xc09: 0x2815, 0xc0a: 0x2d8d, 0xc0b: 0x2fd1, + 0xc0c: 0x2cc3, 0xc0d: 0x2bf0, 0xc0e: 0x3006, 0xc0f: 0x2aa7, 0xc10: 0x2ab1, 0xc11: 0x2bfd, + 0xc12: 0x281c, 0xc13: 0x2c0a, 0xc14: 0x2cd3, 0xc15: 0x2823, 0xc16: 0x2da0, 0xc17: 0x2abb, + 0xc18: 0x1de7, 0xc19: 0x1dfb, 0xc1a: 0x1e0a, 0xc1b: 0x1e19, 0xc1c: 0x1e28, 0xc1d: 0x1e37, + 0xc1e: 0x1e46, 0xc1f: 0x1e55, 0xc20: 0x1e64, 0xc21: 0x1e73, 0xc22: 0x22c2, 0xc23: 0x22d4, + 0xc24: 0x22e6, 0xc25: 0x22f2, 0xc26: 0x22fe, 0xc27: 0x230a, 0xc28: 0x2316, 0xc29: 0x2322, + 0xc2a: 0x232e, 0xc2b: 0x233a, 0xc2c: 0x2376, 0xc2d: 0x2382, 0xc2e: 0x238e, 0xc2f: 0x239a, + 0xc30: 0x23a6, 0xc31: 0x1d44, 0xc32: 0x1af6, 0xc33: 0x1a63, 0xc34: 0x1d14, 0xc35: 0x1b77, + 0xc36: 0x1b86, 0xc37: 0x1afc, 0xc38: 0x1d2c, 0xc39: 0x1d30, 0xc3a: 0x1a8d, 0xc3b: 0x2838, + 0xc3c: 0x2846, 0xc3d: 0x2831, 0xc3e: 0x283f, 0xc3f: 0x2c17, + // Block 0x31, offset 0xc40 + 0xc40: 0x1b7a, 0xc41: 0x1b62, 0xc42: 0x1d90, 0xc43: 0x1b4a, 0xc44: 0x1b23, 0xc45: 0x1a96, + 0xc46: 0x1aa5, 0xc47: 0x1a75, 0xc48: 0x1d20, 0xc49: 0x1e82, 0xc4a: 0x1b7d, 0xc4b: 0x1b65, + 0xc4c: 0x1d94, 0xc4d: 0x1da0, 0xc4e: 0x1b56, 0xc4f: 0x1b2c, 0xc50: 0x1a84, 0xc51: 0x1d4c, + 0xc52: 0x1ce0, 0xc53: 0x1ccc, 0xc54: 0x1cfc, 0xc55: 0x1da4, 0xc56: 0x1b59, 0xc57: 0x1af9, + 0xc58: 0x1b2f, 0xc59: 0x1b0e, 0xc5a: 0x1b71, 0xc5b: 0x1da8, 0xc5c: 0x1b5c, 0xc5d: 0x1af0, + 0xc5e: 0x1b32, 0xc5f: 0x1d6c, 0xc60: 0x1d24, 0xc61: 0x1b44, 0xc62: 0x1d54, 0xc63: 0x1d70, + 0xc64: 0x1d28, 0xc65: 0x1b47, 0xc66: 0x1d58, 0xc67: 0x2418, 0xc68: 0x242c, 0xc69: 0x1ac6, + 0xc6a: 0x1d50, 0xc6b: 0x1ce4, 0xc6c: 0x1cd0, 0xc6d: 0x1d78, 0xc6e: 0x284d, 0xc6f: 0x28e4, + 0xc70: 0x1b89, 0xc71: 0x1b74, 0xc72: 0x1dac, 0xc73: 0x1b5f, 0xc74: 0x1b80, 0xc75: 0x1b68, + 0xc76: 0x1d98, 0xc77: 0x1b4d, 0xc78: 0x1b26, 0xc79: 0x1ab1, 0xc7a: 0x1b83, 0xc7b: 0x1b6b, + 0xc7c: 0x1d9c, 0xc7d: 0x1b50, 0xc7e: 0x1b29, 0xc7f: 0x1ab4, + // Block 0x32, offset 0xc80 + 0xc80: 0x1d5c, 0xc81: 0x1ce8, 0xc82: 0x1e7d, 0xc83: 0x1a66, 0xc84: 0x1aea, 0xc85: 0x1aed, + 0xc86: 0x2425, 0xc87: 0x1cc4, 0xc88: 0x1af3, 0xc89: 0x1a78, 0xc8a: 0x1b11, 0xc8b: 0x1a7b, + 0xc8c: 0x1b1a, 0xc8d: 0x1a99, 0xc8e: 0x1a9c, 0xc8f: 0x1b35, 0xc90: 0x1b3b, 0xc91: 0x1b3e, + 0xc92: 0x1d60, 0xc93: 0x1b41, 0xc94: 0x1b53, 0xc95: 0x1d68, 0xc96: 0x1d74, 0xc97: 0x1ac0, + 0xc98: 0x1e87, 0xc99: 0x1cec, 0xc9a: 0x1ac3, 0xc9b: 0x1b8c, 0xc9c: 0x1ad5, 0xc9d: 0x1ae4, + 0xc9e: 0x2412, 0xc9f: 0x240c, 0xca0: 0x1df1, 0xca1: 0x1e00, 0xca2: 0x1e0f, 0xca3: 0x1e1e, + 0xca4: 0x1e2d, 0xca5: 0x1e3c, 0xca6: 0x1e4b, 0xca7: 0x1e5a, 0xca8: 0x1e69, 0xca9: 0x22b6, + 0xcaa: 0x22c8, 0xcab: 0x22da, 0xcac: 0x22ec, 0xcad: 0x22f8, 0xcae: 0x2304, 0xcaf: 0x2310, + 0xcb0: 0x231c, 0xcb1: 0x2328, 0xcb2: 0x2334, 0xcb3: 0x2370, 0xcb4: 0x237c, 0xcb5: 0x2388, + 0xcb6: 0x2394, 0xcb7: 0x23a0, 0xcb8: 0x23ac, 0xcb9: 0x23b2, 0xcba: 0x23b8, 0xcbb: 0x23be, + 0xcbc: 0x23c4, 0xcbd: 0x23d6, 0xcbe: 0x23dc, 0xcbf: 0x1d40, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x1472, 0xcc1: 0x0df6, 0xcc2: 0x14ce, 0xcc3: 0x149a, 0xcc4: 0x0f52, 0xcc5: 0x07e6, + 0xcc6: 0x09da, 0xcc7: 0x1726, 0xcc8: 0x1726, 0xcc9: 0x0b06, 0xcca: 0x155a, 0xccb: 0x0a3e, + 0xccc: 0x0b02, 0xccd: 0x0cea, 0xcce: 0x10ca, 0xccf: 0x125a, 0xcd0: 0x1392, 0xcd1: 0x13ce, + 0xcd2: 0x1402, 0xcd3: 0x1516, 0xcd4: 0x0e6e, 0xcd5: 0x0efa, 0xcd6: 0x0fa6, 0xcd7: 0x103e, + 0xcd8: 0x135a, 0xcd9: 0x1542, 0xcda: 0x166e, 0xcdb: 0x080a, 0xcdc: 0x09ae, 0xcdd: 0x0e82, + 0xcde: 0x0fca, 0xcdf: 0x138e, 0xce0: 0x16be, 0xce1: 0x0bae, 0xce2: 0x0f72, 0xce3: 0x137e, + 0xce4: 0x1412, 0xce5: 0x0d1e, 0xce6: 0x12b6, 0xce7: 0x13da, 0xce8: 0x0c1a, 0xce9: 0x0e0a, + 0xcea: 0x0f12, 0xceb: 0x1016, 0xcec: 0x1522, 0xced: 0x084a, 0xcee: 0x08e2, 0xcef: 0x094e, + 0xcf0: 0x0d86, 0xcf1: 0x0e7a, 0xcf2: 0x0fc6, 0xcf3: 0x10ea, 0xcf4: 0x1272, 0xcf5: 0x1386, + 0xcf6: 0x139e, 0xcf7: 0x14c2, 0xcf8: 0x15ea, 0xcf9: 0x169e, 0xcfa: 0x16ba, 0xcfb: 0x1126, + 0xcfc: 0x1166, 0xcfd: 0x121e, 0xcfe: 0x133e, 0xcff: 0x1576, + // Block 0x34, offset 0xd00 + 0xd00: 0x16c6, 0xd01: 0x1446, 0xd02: 0x0ac2, 0xd03: 0x0c36, 0xd04: 0x11d6, 0xd05: 0x1296, + 0xd06: 0x0ffa, 0xd07: 0x112e, 0xd08: 0x1492, 0xd09: 0x15e2, 0xd0a: 0x0abe, 0xd0b: 0x0b8a, + 0xd0c: 0x0e72, 0xd0d: 0x0f26, 0xd0e: 0x0f5a, 0xd0f: 0x120e, 0xd10: 0x1236, 0xd11: 0x15a2, + 0xd12: 0x094a, 0xd13: 0x12a2, 0xd14: 0x08ee, 0xd15: 0x08ea, 0xd16: 0x1192, 0xd17: 0x1222, + 0xd18: 0x1356, 0xd19: 0x15aa, 0xd1a: 0x1462, 0xd1b: 0x0d22, 0xd1c: 0x0e6e, 0xd1d: 0x1452, + 0xd1e: 0x07f2, 0xd1f: 0x0b5e, 0xd20: 0x0c8e, 0xd21: 0x102a, 0xd22: 0x10aa, 0xd23: 0x096e, + 0xd24: 0x1136, 0xd25: 0x085a, 0xd26: 0x0c72, 0xd27: 0x07d2, 0xd28: 0x0ee6, 0xd29: 0x0d9e, + 0xd2a: 0x120a, 0xd2b: 0x09c2, 0xd2c: 0x0aae, 0xd2d: 0x10f6, 0xd2e: 0x135e, 0xd2f: 0x1436, + 0xd30: 0x0eb2, 0xd31: 0x14f2, 0xd32: 0x0ede, 0xd33: 0x0d32, 0xd34: 0x1316, 0xd35: 0x0d52, + 0xd36: 0x10a6, 0xd37: 0x0826, 0xd38: 0x08a2, 0xd39: 0x08e6, 0xd3a: 0x0e4e, 0xd3b: 0x11f6, + 0xd3c: 0x12ee, 0xd3d: 0x1442, 0xd3e: 0x1556, 0xd3f: 0x0956, + // Block 0x35, offset 0xd40 + 0xd40: 0x0a0a, 0xd41: 0x0b12, 0xd42: 0x0c2a, 0xd43: 0x0dba, 0xd44: 0x0f76, 0xd45: 0x113a, + 0xd46: 0x1592, 0xd47: 0x1676, 0xd48: 0x16ca, 0xd49: 0x16e2, 0xd4a: 0x0932, 0xd4b: 0x0dee, + 0xd4c: 0x0e9e, 0xd4d: 0x14e6, 0xd4e: 0x0bf6, 0xd4f: 0x0cd2, 0xd50: 0x0cee, 0xd51: 0x0d7e, + 0xd52: 0x0f66, 0xd53: 0x0fb2, 0xd54: 0x1062, 0xd55: 0x1186, 0xd56: 0x122a, 0xd57: 0x128e, + 0xd58: 0x14d6, 0xd59: 0x1366, 0xd5a: 0x14fe, 0xd5b: 0x157a, 0xd5c: 0x090a, 0xd5d: 0x0936, + 0xd5e: 0x0a1e, 0xd5f: 0x0fa2, 0xd60: 0x13ee, 0xd61: 0x1436, 0xd62: 0x0c16, 0xd63: 0x0c86, + 0xd64: 0x0d4a, 0xd65: 0x0eaa, 0xd66: 0x11d2, 0xd67: 0x101e, 0xd68: 0x0836, 0xd69: 0x0a7a, + 0xd6a: 0x0b5e, 0xd6b: 0x0bc2, 0xd6c: 0x0c92, 0xd6d: 0x103a, 0xd6e: 0x1056, 0xd6f: 0x1266, + 0xd70: 0x1286, 0xd71: 0x155e, 0xd72: 0x15de, 0xd73: 0x15ee, 0xd74: 0x162a, 0xd75: 0x084e, + 0xd76: 0x117a, 0xd77: 0x154a, 0xd78: 0x15c6, 0xd79: 0x0caa, 0xd7a: 0x0812, 0xd7b: 0x0872, + 0xd7c: 0x0b62, 0xd7d: 0x0b82, 0xd7e: 0x0daa, 0xd7f: 0x0e6e, + // Block 0x36, offset 0xd80 + 0xd80: 0x0fbe, 0xd81: 0x10c6, 0xd82: 0x1372, 0xd83: 0x1512, 0xd84: 0x171e, 0xd85: 0x0dde, + 0xd86: 0x159e, 0xd87: 0x092e, 0xd88: 0x0e2a, 0xd89: 0x0e36, 0xd8a: 0x0f0a, 0xd8b: 0x0f42, + 0xd8c: 0x1046, 0xd8d: 0x10a2, 0xd8e: 0x1122, 0xd8f: 0x1206, 0xd90: 0x1636, 0xd91: 0x08aa, + 0xd92: 0x0cfe, 0xd93: 0x15ae, 0xd94: 0x0862, 0xd95: 0x0ba6, 0xd96: 0x0f2a, 0xd97: 0x14da, + 0xd98: 0x0c62, 0xd99: 0x0cb2, 0xd9a: 0x0e3e, 0xd9b: 0x102a, 0xd9c: 0x15b6, 0xd9d: 0x0912, + 0xd9e: 0x09fa, 0xd9f: 0x0b92, 0xda0: 0x0dce, 0xda1: 0x0e1a, 0xda2: 0x0e5a, 0xda3: 0x0eee, + 0xda4: 0x1042, 0xda5: 0x10b6, 0xda6: 0x1252, 0xda7: 0x13f2, 0xda8: 0x13fe, 0xda9: 0x1552, + 0xdaa: 0x15d2, 0xdab: 0x097e, 0xdac: 0x0f46, 0xdad: 0x09fe, 0xdae: 0x0fc2, 0xdaf: 0x1066, + 0xdb0: 0x1382, 0xdb1: 0x15ba, 0xdb2: 0x16a6, 0xdb3: 0x16ce, 0xdb4: 0x0e32, 0xdb5: 0x0f22, + 0xdb6: 0x12be, 0xdb7: 0x11b2, 0xdb8: 0x11be, 0xdb9: 0x11e2, 0xdba: 0x1012, 0xdbb: 0x0f9a, + 0xdbc: 0x145e, 0xdbd: 0x082e, 0xdbe: 0x1326, 0xdbf: 0x0916, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0906, 0xdc1: 0x0c06, 0xdc2: 0x0d26, 0xdc3: 0x11ee, 0xdc4: 0x0b4e, 0xdc5: 0x0efe, + 0xdc6: 0x0dea, 0xdc7: 0x14e2, 0xdc8: 0x13e2, 0xdc9: 0x15a6, 0xdca: 0x141e, 0xdcb: 0x0c22, + 0xdcc: 0x0882, 0xdcd: 0x0a56, 0xdd0: 0x0aaa, + 0xdd2: 0x0dda, 0xdd5: 0x08f2, 0xdd6: 0x101a, 0xdd7: 0x10de, + 0xdd8: 0x1142, 0xdd9: 0x115e, 0xdda: 0x1162, 0xddb: 0x1176, 0xddc: 0x15f6, 0xddd: 0x11e6, + 0xdde: 0x126a, 0xde0: 0x138a, 0xde2: 0x144e, + 0xde5: 0x1502, 0xde6: 0x152e, + 0xdea: 0x164a, 0xdeb: 0x164e, 0xdec: 0x1652, 0xded: 0x16b6, 0xdee: 0x1526, 0xdef: 0x15c2, + 0xdf0: 0x0852, 0xdf1: 0x0876, 0xdf2: 0x088a, 0xdf3: 0x0946, 0xdf4: 0x0952, 0xdf5: 0x0992, + 0xdf6: 0x0a46, 0xdf7: 0x0a62, 0xdf8: 0x0a6a, 0xdf9: 0x0aa6, 0xdfa: 0x0ab2, 0xdfb: 0x0b8e, + 0xdfc: 0x0b96, 0xdfd: 0x0c9e, 0xdfe: 0x0cc6, 0xdff: 0x0cce, + // Block 0x38, offset 0xe00 + 0xe00: 0x0ce6, 0xe01: 0x0d92, 0xe02: 0x0dc2, 0xe03: 0x0de2, 0xe04: 0x0e52, 0xe05: 0x0f16, + 0xe06: 0x0f32, 0xe07: 0x0f62, 0xe08: 0x0fb6, 0xe09: 0x0fd6, 0xe0a: 0x104a, 0xe0b: 0x112a, + 0xe0c: 0x1146, 0xe0d: 0x114e, 0xe0e: 0x114a, 0xe0f: 0x1152, 0xe10: 0x1156, 0xe11: 0x115a, + 0xe12: 0x116e, 0xe13: 0x1172, 0xe14: 0x1196, 0xe15: 0x11aa, 0xe16: 0x11c6, 0xe17: 0x122a, + 0xe18: 0x1232, 0xe19: 0x123a, 0xe1a: 0x124e, 0xe1b: 0x1276, 0xe1c: 0x12c6, 0xe1d: 0x12fa, + 0xe1e: 0x12fa, 0xe1f: 0x1362, 0xe20: 0x140a, 0xe21: 0x1422, 0xe22: 0x1456, 0xe23: 0x145a, + 0xe24: 0x149e, 0xe25: 0x14a2, 0xe26: 0x14fa, 0xe27: 0x1502, 0xe28: 0x15d6, 0xe29: 0x161a, + 0xe2a: 0x1632, 0xe2b: 0x0c96, 0xe2c: 0x184b, 0xe2d: 0x12de, + 0xe30: 0x07da, 0xe31: 0x08de, 0xe32: 0x089e, 0xe33: 0x0846, 0xe34: 0x0886, 0xe35: 0x08b2, + 0xe36: 0x0942, 0xe37: 0x095e, 0xe38: 0x0a46, 0xe39: 0x0a32, 0xe3a: 0x0a42, 0xe3b: 0x0a5e, + 0xe3c: 0x0aaa, 0xe3d: 0x0aba, 0xe3e: 0x0afe, 0xe3f: 0x0b0a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0b26, 0xe41: 0x0b36, 0xe42: 0x0c1e, 0xe43: 0x0c26, 0xe44: 0x0c56, 0xe45: 0x0c76, + 0xe46: 0x0ca6, 0xe47: 0x0cbe, 0xe48: 0x0cae, 0xe49: 0x0cce, 0xe4a: 0x0cc2, 0xe4b: 0x0ce6, + 0xe4c: 0x0d02, 0xe4d: 0x0d5a, 0xe4e: 0x0d66, 0xe4f: 0x0d6e, 0xe50: 0x0d96, 0xe51: 0x0dda, + 0xe52: 0x0e0a, 0xe53: 0x0e0e, 0xe54: 0x0e22, 0xe55: 0x0ea2, 0xe56: 0x0eb2, 0xe57: 0x0f0a, + 0xe58: 0x0f56, 0xe59: 0x0f4e, 0xe5a: 0x0f62, 0xe5b: 0x0f7e, 0xe5c: 0x0fb6, 0xe5d: 0x110e, + 0xe5e: 0x0fda, 0xe5f: 0x100e, 0xe60: 0x101a, 0xe61: 0x105a, 0xe62: 0x1076, 0xe63: 0x109a, + 0xe64: 0x10be, 0xe65: 0x10c2, 0xe66: 0x10de, 0xe67: 0x10e2, 0xe68: 0x10f2, 0xe69: 0x1106, + 0xe6a: 0x1102, 0xe6b: 0x1132, 0xe6c: 0x11ae, 0xe6d: 0x11c6, 0xe6e: 0x11de, 0xe6f: 0x1216, + 0xe70: 0x122a, 0xe71: 0x1246, 0xe72: 0x1276, 0xe73: 0x132a, 0xe74: 0x1352, 0xe75: 0x13c6, + 0xe76: 0x140e, 0xe77: 0x141a, 0xe78: 0x1422, 0xe79: 0x143a, 0xe7a: 0x144e, 0xe7b: 0x143e, + 0xe7c: 0x1456, 0xe7d: 0x1452, 0xe7e: 0x144a, 0xe7f: 0x145a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x1466, 0xe81: 0x14a2, 0xe82: 0x14de, 0xe83: 0x150e, 0xe84: 0x1546, 0xe85: 0x1566, + 0xe86: 0x15b2, 0xe87: 0x15d6, 0xe88: 0x15f6, 0xe89: 0x160a, 0xe8a: 0x161a, 0xe8b: 0x1626, + 0xe8c: 0x1632, 0xe8d: 0x1686, 0xe8e: 0x1726, 0xe8f: 0x17e2, 0xe90: 0x17dd, 0xe91: 0x180f, + 0xe92: 0x0702, 0xe93: 0x072a, 0xe94: 0x072e, 0xe95: 0x1891, 0xe96: 0x18be, 0xe97: 0x1936, + 0xe98: 0x1712, 0xe99: 0x1722, + // Block 0x3b, offset 0xec0 + 0xec0: 0x1b05, 0xec1: 0x1b08, 0xec2: 0x1b0b, 0xec3: 0x1d38, 0xec4: 0x1d3c, 0xec5: 0x1b8f, + 0xec6: 0x1b8f, + 0xed3: 0x1ea5, 0xed4: 0x1e96, 0xed5: 0x1e9b, 0xed6: 0x1eaa, 0xed7: 0x1ea0, + 0xedd: 0x44d1, + 0xede: 0x8116, 0xedf: 0x4543, 0xee0: 0x0320, 0xee1: 0x0308, 0xee2: 0x0311, 0xee3: 0x0314, + 0xee4: 0x0317, 0xee5: 0x031a, 0xee6: 0x031d, 0xee7: 0x0323, 0xee8: 0x0326, 0xee9: 0x0017, + 0xeea: 0x4531, 0xeeb: 0x4537, 0xeec: 0x4635, 0xeed: 0x463d, 0xeee: 0x4489, 0xeef: 0x448f, + 0xef0: 0x4495, 0xef1: 0x449b, 0xef2: 0x44a7, 0xef3: 0x44ad, 0xef4: 0x44b3, 0xef5: 0x44bf, + 0xef6: 0x44c5, 0xef8: 0x44cb, 0xef9: 0x44d7, 0xefa: 0x44dd, 0xefb: 0x44e3, + 0xefc: 0x44ef, 0xefe: 0x44f5, + // Block 0x3c, offset 0xf00 + 0xf00: 0x44fb, 0xf01: 0x4501, 0xf03: 0x4507, 0xf04: 0x450d, + 0xf06: 0x4519, 0xf07: 0x451f, 0xf08: 0x4525, 0xf09: 0x452b, 0xf0a: 0x453d, 0xf0b: 0x44b9, + 0xf0c: 0x44a1, 0xf0d: 0x44e9, 0xf0e: 0x4513, 0xf0f: 0x1eaf, 0xf10: 0x038c, 0xf11: 0x038c, + 0xf12: 0x0395, 0xf13: 0x0395, 0xf14: 0x0395, 0xf15: 0x0395, 0xf16: 0x0398, 0xf17: 0x0398, + 0xf18: 0x0398, 0xf19: 0x0398, 0xf1a: 0x039e, 0xf1b: 0x039e, 0xf1c: 0x039e, 0xf1d: 0x039e, + 0xf1e: 0x0392, 0xf1f: 0x0392, 0xf20: 0x0392, 0xf21: 0x0392, 0xf22: 0x039b, 0xf23: 0x039b, + 0xf24: 0x039b, 0xf25: 0x039b, 0xf26: 0x038f, 0xf27: 0x038f, 0xf28: 0x038f, 0xf29: 0x038f, + 0xf2a: 0x03c2, 0xf2b: 0x03c2, 0xf2c: 0x03c2, 0xf2d: 0x03c2, 0xf2e: 0x03c5, 0xf2f: 0x03c5, + 0xf30: 0x03c5, 0xf31: 0x03c5, 0xf32: 0x03a4, 0xf33: 0x03a4, 0xf34: 0x03a4, 0xf35: 0x03a4, + 0xf36: 0x03a1, 0xf37: 0x03a1, 0xf38: 0x03a1, 0xf39: 0x03a1, 0xf3a: 0x03a7, 0xf3b: 0x03a7, + 0xf3c: 0x03a7, 0xf3d: 0x03a7, 0xf3e: 0x03aa, 0xf3f: 0x03aa, + // Block 0x3d, offset 0xf40 + 0xf40: 0x03aa, 0xf41: 0x03aa, 0xf42: 0x03b3, 0xf43: 0x03b3, 0xf44: 0x03b0, 0xf45: 0x03b0, + 0xf46: 0x03b6, 0xf47: 0x03b6, 0xf48: 0x03ad, 0xf49: 0x03ad, 0xf4a: 0x03bc, 0xf4b: 0x03bc, + 0xf4c: 0x03b9, 0xf4d: 0x03b9, 0xf4e: 0x03c8, 0xf4f: 0x03c8, 0xf50: 0x03c8, 0xf51: 0x03c8, + 0xf52: 0x03ce, 0xf53: 0x03ce, 0xf54: 0x03ce, 0xf55: 0x03ce, 0xf56: 0x03d4, 0xf57: 0x03d4, + 0xf58: 0x03d4, 0xf59: 0x03d4, 0xf5a: 0x03d1, 0xf5b: 0x03d1, 0xf5c: 0x03d1, 0xf5d: 0x03d1, + 0xf5e: 0x03d7, 0xf5f: 0x03d7, 0xf60: 0x03da, 0xf61: 0x03da, 0xf62: 0x03da, 0xf63: 0x03da, + 0xf64: 0x45af, 0xf65: 0x45af, 0xf66: 0x03e0, 0xf67: 0x03e0, 0xf68: 0x03e0, 0xf69: 0x03e0, + 0xf6a: 0x03dd, 0xf6b: 0x03dd, 0xf6c: 0x03dd, 0xf6d: 0x03dd, 0xf6e: 0x03fb, 0xf6f: 0x03fb, + 0xf70: 0x45a9, 0xf71: 0x45a9, + // Block 0x3e, offset 0xf80 + 0xf93: 0x03cb, 0xf94: 0x03cb, 0xf95: 0x03cb, 0xf96: 0x03cb, 0xf97: 0x03e9, + 0xf98: 0x03e9, 0xf99: 0x03e6, 0xf9a: 0x03e6, 0xf9b: 0x03ec, 0xf9c: 0x03ec, 0xf9d: 0x217f, + 0xf9e: 0x03f2, 0xf9f: 0x03f2, 0xfa0: 0x03e3, 0xfa1: 0x03e3, 0xfa2: 0x03ef, 0xfa3: 0x03ef, + 0xfa4: 0x03f8, 0xfa5: 0x03f8, 0xfa6: 0x03f8, 0xfa7: 0x03f8, 0xfa8: 0x0380, 0xfa9: 0x0380, + 0xfaa: 0x26da, 0xfab: 0x26da, 0xfac: 0x274a, 0xfad: 0x274a, 0xfae: 0x2719, 0xfaf: 0x2719, + 0xfb0: 0x2735, 0xfb1: 0x2735, 0xfb2: 0x272e, 0xfb3: 0x272e, 0xfb4: 0x273c, 0xfb5: 0x273c, + 0xfb6: 0x2743, 0xfb7: 0x2743, 0xfb8: 0x2743, 0xfb9: 0x2720, 0xfba: 0x2720, 0xfbb: 0x2720, + 0xfbc: 0x03f5, 0xfbd: 0x03f5, 0xfbe: 0x03f5, 0xfbf: 0x03f5, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x26e1, 0xfc1: 0x26e8, 0xfc2: 0x2704, 0xfc3: 0x2720, 0xfc4: 0x2727, 0xfc5: 0x1eb9, + 0xfc6: 0x1ebe, 0xfc7: 0x1ec3, 0xfc8: 0x1ed2, 0xfc9: 0x1ee1, 0xfca: 0x1ee6, 0xfcb: 0x1eeb, + 0xfcc: 0x1ef0, 0xfcd: 0x1ef5, 0xfce: 0x1f04, 0xfcf: 0x1f13, 0xfd0: 0x1f18, 0xfd1: 0x1f1d, + 0xfd2: 0x1f2c, 0xfd3: 0x1f3b, 0xfd4: 0x1f40, 0xfd5: 0x1f45, 0xfd6: 0x1f4a, 0xfd7: 0x1f59, + 0xfd8: 0x1f5e, 0xfd9: 0x1f6d, 0xfda: 0x1f72, 0xfdb: 0x1f77, 0xfdc: 0x1f86, 0xfdd: 0x1f8b, + 0xfde: 0x1f90, 0xfdf: 0x1f9a, 0xfe0: 0x1fd6, 0xfe1: 0x1fe5, 0xfe2: 0x1ff4, 0xfe3: 0x1ff9, + 0xfe4: 0x1ffe, 0xfe5: 0x2008, 0xfe6: 0x2017, 0xfe7: 0x201c, 0xfe8: 0x202b, 0xfe9: 0x2030, + 0xfea: 0x2035, 0xfeb: 0x2044, 0xfec: 0x2049, 0xfed: 0x2058, 0xfee: 0x205d, 0xfef: 0x2062, + 0xff0: 0x2067, 0xff1: 0x206c, 0xff2: 0x2071, 0xff3: 0x2076, 0xff4: 0x207b, 0xff5: 0x2080, + 0xff6: 0x2085, 0xff7: 0x208a, 0xff8: 0x208f, 0xff9: 0x2094, 0xffa: 0x2099, 0xffb: 0x209e, + 0xffc: 0x20a3, 0xffd: 0x20a8, 0xffe: 0x20ad, 0xfff: 0x20b7, + // Block 0x40, offset 0x1000 + 0x1000: 0x20bc, 0x1001: 0x20c1, 0x1002: 0x20c6, 0x1003: 0x20d0, 0x1004: 0x20d5, 0x1005: 0x20df, + 0x1006: 0x20e4, 0x1007: 0x20e9, 0x1008: 0x20ee, 0x1009: 0x20f3, 0x100a: 0x20f8, 0x100b: 0x20fd, + 0x100c: 0x2102, 0x100d: 0x2107, 0x100e: 0x2116, 0x100f: 0x2125, 0x1010: 0x212a, 0x1011: 0x212f, + 0x1012: 0x2134, 0x1013: 0x2139, 0x1014: 0x213e, 0x1015: 0x2148, 0x1016: 0x214d, 0x1017: 0x2152, + 0x1018: 0x2161, 0x1019: 0x2170, 0x101a: 0x2175, 0x101b: 0x4561, 0x101c: 0x4567, 0x101d: 0x459d, + 0x101e: 0x45f4, 0x101f: 0x45fb, 0x1020: 0x4602, 0x1021: 0x4609, 0x1022: 0x4610, 0x1023: 0x4617, + 0x1024: 0x26f6, 0x1025: 0x26fd, 0x1026: 0x2704, 0x1027: 0x270b, 0x1028: 0x2720, 0x1029: 0x2727, + 0x102a: 0x1ec8, 0x102b: 0x1ecd, 0x102c: 0x1ed2, 0x102d: 0x1ed7, 0x102e: 0x1ee1, 0x102f: 0x1ee6, + 0x1030: 0x1efa, 0x1031: 0x1eff, 0x1032: 0x1f04, 0x1033: 0x1f09, 0x1034: 0x1f13, 0x1035: 0x1f18, + 0x1036: 0x1f22, 0x1037: 0x1f27, 0x1038: 0x1f2c, 0x1039: 0x1f31, 0x103a: 0x1f3b, 0x103b: 0x1f40, + 0x103c: 0x206c, 0x103d: 0x2071, 0x103e: 0x2080, 0x103f: 0x2085, + // Block 0x41, offset 0x1040 + 0x1040: 0x208a, 0x1041: 0x209e, 0x1042: 0x20a3, 0x1043: 0x20a8, 0x1044: 0x20ad, 0x1045: 0x20c6, + 0x1046: 0x20d0, 0x1047: 0x20d5, 0x1048: 0x20da, 0x1049: 0x20ee, 0x104a: 0x210c, 0x104b: 0x2111, + 0x104c: 0x2116, 0x104d: 0x211b, 0x104e: 0x2125, 0x104f: 0x212a, 0x1050: 0x459d, 0x1051: 0x2157, + 0x1052: 0x215c, 0x1053: 0x2161, 0x1054: 0x2166, 0x1055: 0x2170, 0x1056: 0x2175, 0x1057: 0x26e1, + 0x1058: 0x26e8, 0x1059: 0x26ef, 0x105a: 0x2704, 0x105b: 0x2712, 0x105c: 0x1eb9, 0x105d: 0x1ebe, + 0x105e: 0x1ec3, 0x105f: 0x1ed2, 0x1060: 0x1edc, 0x1061: 0x1eeb, 0x1062: 0x1ef0, 0x1063: 0x1ef5, + 0x1064: 0x1f04, 0x1065: 0x1f0e, 0x1066: 0x1f2c, 0x1067: 0x1f45, 0x1068: 0x1f4a, 0x1069: 0x1f59, + 0x106a: 0x1f5e, 0x106b: 0x1f6d, 0x106c: 0x1f77, 0x106d: 0x1f86, 0x106e: 0x1f8b, 0x106f: 0x1f90, + 0x1070: 0x1f9a, 0x1071: 0x1fd6, 0x1072: 0x1fdb, 0x1073: 0x1fe5, 0x1074: 0x1ff4, 0x1075: 0x1ff9, + 0x1076: 0x1ffe, 0x1077: 0x2008, 0x1078: 0x2017, 0x1079: 0x202b, 0x107a: 0x2030, 0x107b: 0x2035, + 0x107c: 0x2044, 0x107d: 0x2049, 0x107e: 0x2058, 0x107f: 0x205d, + // Block 0x42, offset 0x1080 + 0x1080: 0x2062, 0x1081: 0x2067, 0x1082: 0x2076, 0x1083: 0x207b, 0x1084: 0x208f, 0x1085: 0x2094, + 0x1086: 0x2099, 0x1087: 0x209e, 0x1088: 0x20a3, 0x1089: 0x20b7, 0x108a: 0x20bc, 0x108b: 0x20c1, + 0x108c: 0x20c6, 0x108d: 0x20cb, 0x108e: 0x20df, 0x108f: 0x20e4, 0x1090: 0x20e9, 0x1091: 0x20ee, + 0x1092: 0x20fd, 0x1093: 0x2102, 0x1094: 0x2107, 0x1095: 0x2116, 0x1096: 0x2120, 0x1097: 0x212f, + 0x1098: 0x2134, 0x1099: 0x4591, 0x109a: 0x2148, 0x109b: 0x214d, 0x109c: 0x2152, 0x109d: 0x2161, + 0x109e: 0x216b, 0x109f: 0x2704, 0x10a0: 0x2712, 0x10a1: 0x1ed2, 0x10a2: 0x1edc, 0x10a3: 0x1f04, + 0x10a4: 0x1f0e, 0x10a5: 0x1f2c, 0x10a6: 0x1f36, 0x10a7: 0x1f9a, 0x10a8: 0x1f9f, 0x10a9: 0x1fc2, + 0x10aa: 0x1fc7, 0x10ab: 0x209e, 0x10ac: 0x20a3, 0x10ad: 0x20c6, 0x10ae: 0x2116, 0x10af: 0x2120, + 0x10b0: 0x2161, 0x10b1: 0x216b, 0x10b2: 0x4645, 0x10b3: 0x464d, 0x10b4: 0x4655, 0x10b5: 0x2021, + 0x10b6: 0x2026, 0x10b7: 0x203a, 0x10b8: 0x203f, 0x10b9: 0x204e, 0x10ba: 0x2053, 0x10bb: 0x1fa4, + 0x10bc: 0x1fa9, 0x10bd: 0x1fcc, 0x10be: 0x1fd1, 0x10bf: 0x1f63, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x1f68, 0x10c1: 0x1f4f, 0x10c2: 0x1f54, 0x10c3: 0x1f7c, 0x10c4: 0x1f81, 0x10c5: 0x1fea, + 0x10c6: 0x1fef, 0x10c7: 0x200d, 0x10c8: 0x2012, 0x10c9: 0x1fae, 0x10ca: 0x1fb3, 0x10cb: 0x1fb8, + 0x10cc: 0x1fc2, 0x10cd: 0x1fbd, 0x10ce: 0x1f95, 0x10cf: 0x1fe0, 0x10d0: 0x2003, 0x10d1: 0x2021, + 0x10d2: 0x2026, 0x10d3: 0x203a, 0x10d4: 0x203f, 0x10d5: 0x204e, 0x10d6: 0x2053, 0x10d7: 0x1fa4, + 0x10d8: 0x1fa9, 0x10d9: 0x1fcc, 0x10da: 0x1fd1, 0x10db: 0x1f63, 0x10dc: 0x1f68, 0x10dd: 0x1f4f, + 0x10de: 0x1f54, 0x10df: 0x1f7c, 0x10e0: 0x1f81, 0x10e1: 0x1fea, 0x10e2: 0x1fef, 0x10e3: 0x200d, + 0x10e4: 0x2012, 0x10e5: 0x1fae, 0x10e6: 0x1fb3, 0x10e7: 0x1fb8, 0x10e8: 0x1fc2, 0x10e9: 0x1fbd, + 0x10ea: 0x1f95, 0x10eb: 0x1fe0, 0x10ec: 0x2003, 0x10ed: 0x1fae, 0x10ee: 0x1fb3, 0x10ef: 0x1fb8, + 0x10f0: 0x1fc2, 0x10f1: 0x1f9f, 0x10f2: 0x1fc7, 0x10f3: 0x201c, 0x10f4: 0x1f86, 0x10f5: 0x1f8b, + 0x10f6: 0x1f90, 0x10f7: 0x1fae, 0x10f8: 0x1fb3, 0x10f9: 0x1fb8, 0x10fa: 0x201c, 0x10fb: 0x202b, + 0x10fc: 0x4549, 0x10fd: 0x4549, + // Block 0x44, offset 0x1100 + 0x1110: 0x2441, 0x1111: 0x2456, + 0x1112: 0x2456, 0x1113: 0x245d, 0x1114: 0x2464, 0x1115: 0x2479, 0x1116: 0x2480, 0x1117: 0x2487, + 0x1118: 0x24aa, 0x1119: 0x24aa, 0x111a: 0x24cd, 0x111b: 0x24c6, 0x111c: 0x24e2, 0x111d: 0x24d4, + 0x111e: 0x24db, 0x111f: 0x24fe, 0x1120: 0x24fe, 0x1121: 0x24f7, 0x1122: 0x2505, 0x1123: 0x2505, + 0x1124: 0x252f, 0x1125: 0x252f, 0x1126: 0x254b, 0x1127: 0x2513, 0x1128: 0x2513, 0x1129: 0x250c, + 0x112a: 0x2521, 0x112b: 0x2521, 0x112c: 0x2528, 0x112d: 0x2528, 0x112e: 0x2552, 0x112f: 0x2560, + 0x1130: 0x2560, 0x1131: 0x2567, 0x1132: 0x2567, 0x1133: 0x256e, 0x1134: 0x2575, 0x1135: 0x257c, + 0x1136: 0x2583, 0x1137: 0x2583, 0x1138: 0x258a, 0x1139: 0x2598, 0x113a: 0x25a6, 0x113b: 0x259f, + 0x113c: 0x25ad, 0x113d: 0x25ad, 0x113e: 0x25c2, 0x113f: 0x25c9, + // Block 0x45, offset 0x1140 + 0x1140: 0x25fa, 0x1141: 0x2608, 0x1142: 0x2601, 0x1143: 0x25e5, 0x1144: 0x25e5, 0x1145: 0x260f, + 0x1146: 0x260f, 0x1147: 0x2616, 0x1148: 0x2616, 0x1149: 0x2640, 0x114a: 0x2647, 0x114b: 0x264e, + 0x114c: 0x2624, 0x114d: 0x2632, 0x114e: 0x2655, 0x114f: 0x265c, + 0x1152: 0x262b, 0x1153: 0x26b0, 0x1154: 0x26b7, 0x1155: 0x268d, 0x1156: 0x2694, 0x1157: 0x2678, + 0x1158: 0x2678, 0x1159: 0x267f, 0x115a: 0x26a9, 0x115b: 0x26a2, 0x115c: 0x26cc, 0x115d: 0x26cc, + 0x115e: 0x243a, 0x115f: 0x244f, 0x1160: 0x2448, 0x1161: 0x2472, 0x1162: 0x246b, 0x1163: 0x2495, + 0x1164: 0x248e, 0x1165: 0x24b8, 0x1166: 0x249c, 0x1167: 0x24b1, 0x1168: 0x24e9, 0x1169: 0x2536, + 0x116a: 0x251a, 0x116b: 0x2559, 0x116c: 0x25f3, 0x116d: 0x261d, 0x116e: 0x26c5, 0x116f: 0x26be, + 0x1170: 0x26d3, 0x1171: 0x266a, 0x1172: 0x25d0, 0x1173: 0x269b, 0x1174: 0x25c2, 0x1175: 0x25fa, + 0x1176: 0x2591, 0x1177: 0x25de, 0x1178: 0x2671, 0x1179: 0x2663, 0x117a: 0x25ec, 0x117b: 0x25d7, + 0x117c: 0x25ec, 0x117d: 0x2671, 0x117e: 0x24a3, 0x117f: 0x24bf, + // Block 0x46, offset 0x1180 + 0x1180: 0x2639, 0x1181: 0x25b4, 0x1182: 0x2433, 0x1183: 0x25d7, 0x1184: 0x257c, 0x1185: 0x254b, + 0x1186: 0x24f0, 0x1187: 0x2686, + 0x11b0: 0x2544, 0x11b1: 0x25bb, 0x11b2: 0x28f6, 0x11b3: 0x28ed, 0x11b4: 0x2923, 0x11b5: 0x2911, + 0x11b6: 0x28ff, 0x11b7: 0x291a, 0x11b8: 0x292c, 0x11b9: 0x253d, 0x11ba: 0x2db3, 0x11bb: 0x2c33, + 0x11bc: 0x2908, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0019, 0x11d1: 0x057e, + 0x11d2: 0x0582, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x05ba, + 0x11d8: 0x05be, 0x11d9: 0x1c8c, + 0x11e0: 0x8133, 0x11e1: 0x8133, 0x11e2: 0x8133, 0x11e3: 0x8133, + 0x11e4: 0x8133, 0x11e5: 0x8133, 0x11e6: 0x8133, 0x11e7: 0x812e, 0x11e8: 0x812e, 0x11e9: 0x812e, + 0x11ea: 0x812e, 0x11eb: 0x812e, 0x11ec: 0x812e, 0x11ed: 0x812e, 0x11ee: 0x8133, 0x11ef: 0x8133, + 0x11f0: 0x19a0, 0x11f1: 0x053a, 0x11f2: 0x0536, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011, + 0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x05b2, 0x11fa: 0x05b6, 0x11fb: 0x05a6, + 0x11fc: 0x05aa, 0x11fd: 0x058e, 0x11fe: 0x0592, 0x11ff: 0x0586, + // Block 0x48, offset 0x1200 + 0x1200: 0x058a, 0x1201: 0x0596, 0x1202: 0x059a, 0x1203: 0x059e, 0x1204: 0x05a2, + 0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x43aa, 0x120a: 0x43aa, 0x120b: 0x43aa, + 0x120c: 0x43aa, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x057e, + 0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003, + 0x1218: 0x053a, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x05b2, + 0x121e: 0x05b6, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b, + 0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009, + 0x122a: 0x000b, 0x122b: 0x0041, + 0x1230: 0x43eb, 0x1231: 0x456d, 0x1232: 0x43f0, 0x1234: 0x43f5, + 0x1236: 0x43fa, 0x1237: 0x4573, 0x1238: 0x43ff, 0x1239: 0x4579, 0x123a: 0x4404, 0x123b: 0x457f, + 0x123c: 0x4409, 0x123d: 0x4585, 0x123e: 0x440e, 0x123f: 0x458b, + // Block 0x49, offset 0x1240 + 0x1240: 0x0329, 0x1241: 0x454f, 0x1242: 0x454f, 0x1243: 0x4555, 0x1244: 0x4555, 0x1245: 0x4597, + 0x1246: 0x4597, 0x1247: 0x455b, 0x1248: 0x455b, 0x1249: 0x45a3, 0x124a: 0x45a3, 0x124b: 0x45a3, + 0x124c: 0x45a3, 0x124d: 0x032c, 0x124e: 0x032c, 0x124f: 0x032f, 0x1250: 0x032f, 0x1251: 0x032f, + 0x1252: 0x032f, 0x1253: 0x0332, 0x1254: 0x0332, 0x1255: 0x0335, 0x1256: 0x0335, 0x1257: 0x0335, + 0x1258: 0x0335, 0x1259: 0x0338, 0x125a: 0x0338, 0x125b: 0x0338, 0x125c: 0x0338, 0x125d: 0x033b, + 0x125e: 0x033b, 0x125f: 0x033b, 0x1260: 0x033b, 0x1261: 0x033e, 0x1262: 0x033e, 0x1263: 0x033e, + 0x1264: 0x033e, 0x1265: 0x0341, 0x1266: 0x0341, 0x1267: 0x0341, 0x1268: 0x0341, 0x1269: 0x0344, + 0x126a: 0x0344, 0x126b: 0x0347, 0x126c: 0x0347, 0x126d: 0x034a, 0x126e: 0x034a, 0x126f: 0x034d, + 0x1270: 0x034d, 0x1271: 0x0350, 0x1272: 0x0350, 0x1273: 0x0350, 0x1274: 0x0350, 0x1275: 0x0353, + 0x1276: 0x0353, 0x1277: 0x0353, 0x1278: 0x0353, 0x1279: 0x0356, 0x127a: 0x0356, 0x127b: 0x0356, + 0x127c: 0x0356, 0x127d: 0x0359, 0x127e: 0x0359, 0x127f: 0x0359, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0359, 0x1281: 0x035c, 0x1282: 0x035c, 0x1283: 0x035c, 0x1284: 0x035c, 0x1285: 0x035f, + 0x1286: 0x035f, 0x1287: 0x035f, 0x1288: 0x035f, 0x1289: 0x0362, 0x128a: 0x0362, 0x128b: 0x0362, + 0x128c: 0x0362, 0x128d: 0x0365, 0x128e: 0x0365, 0x128f: 0x0365, 0x1290: 0x0365, 0x1291: 0x0368, + 0x1292: 0x0368, 0x1293: 0x0368, 0x1294: 0x0368, 0x1295: 0x036b, 0x1296: 0x036b, 0x1297: 0x036b, + 0x1298: 0x036b, 0x1299: 0x036e, 0x129a: 0x036e, 0x129b: 0x036e, 0x129c: 0x036e, 0x129d: 0x0371, + 0x129e: 0x0371, 0x129f: 0x0371, 0x12a0: 0x0371, 0x12a1: 0x0374, 0x12a2: 0x0374, 0x12a3: 0x0374, + 0x12a4: 0x0374, 0x12a5: 0x0377, 0x12a6: 0x0377, 0x12a7: 0x0377, 0x12a8: 0x0377, 0x12a9: 0x037a, + 0x12aa: 0x037a, 0x12ab: 0x037a, 0x12ac: 0x037a, 0x12ad: 0x037d, 0x12ae: 0x037d, 0x12af: 0x0380, + 0x12b0: 0x0380, 0x12b1: 0x0383, 0x12b2: 0x0383, 0x12b3: 0x0383, 0x12b4: 0x0383, 0x12b5: 0x2f41, + 0x12b6: 0x2f41, 0x12b7: 0x2f49, 0x12b8: 0x2f49, 0x12b9: 0x2f51, 0x12ba: 0x2f51, 0x12bb: 0x20b2, + 0x12bc: 0x20b2, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b, + 0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097, + 0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3, + 0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af, + 0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb, + 0x12de: 0x00bd, 0x12df: 0x056e, 0x12e0: 0x0572, 0x12e1: 0x0582, 0x12e2: 0x0596, 0x12e3: 0x059a, + 0x12e4: 0x057e, 0x12e5: 0x06a6, 0x12e6: 0x069e, 0x12e7: 0x05c2, 0x12e8: 0x05ca, 0x12e9: 0x05d2, + 0x12ea: 0x05da, 0x12eb: 0x05e2, 0x12ec: 0x0666, 0x12ed: 0x066e, 0x12ee: 0x0676, 0x12ef: 0x061a, + 0x12f0: 0x06aa, 0x12f1: 0x05c6, 0x12f2: 0x05ce, 0x12f3: 0x05d6, 0x12f4: 0x05de, 0x12f5: 0x05e6, + 0x12f6: 0x05ea, 0x12f7: 0x05ee, 0x12f8: 0x05f2, 0x12f9: 0x05f6, 0x12fa: 0x05fa, 0x12fb: 0x05fe, + 0x12fc: 0x0602, 0x12fd: 0x0606, 0x12fe: 0x060a, 0x12ff: 0x060e, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0612, 0x1301: 0x0616, 0x1302: 0x061e, 0x1303: 0x0622, 0x1304: 0x0626, 0x1305: 0x062a, + 0x1306: 0x062e, 0x1307: 0x0632, 0x1308: 0x0636, 0x1309: 0x063a, 0x130a: 0x063e, 0x130b: 0x0642, + 0x130c: 0x0646, 0x130d: 0x064a, 0x130e: 0x064e, 0x130f: 0x0652, 0x1310: 0x0656, 0x1311: 0x065a, + 0x1312: 0x065e, 0x1313: 0x0662, 0x1314: 0x066a, 0x1315: 0x0672, 0x1316: 0x067a, 0x1317: 0x067e, + 0x1318: 0x0682, 0x1319: 0x0686, 0x131a: 0x068a, 0x131b: 0x068e, 0x131c: 0x0692, 0x131d: 0x06a2, + 0x131e: 0x4bb9, 0x131f: 0x4bbf, 0x1320: 0x04b6, 0x1321: 0x0406, 0x1322: 0x040a, 0x1323: 0x4b7c, + 0x1324: 0x040e, 0x1325: 0x4b82, 0x1326: 0x4b88, 0x1327: 0x0412, 0x1328: 0x0416, 0x1329: 0x041a, + 0x132a: 0x4b8e, 0x132b: 0x4b94, 0x132c: 0x4b9a, 0x132d: 0x4ba0, 0x132e: 0x4ba6, 0x132f: 0x4bac, + 0x1330: 0x045a, 0x1331: 0x041e, 0x1332: 0x0422, 0x1333: 0x0426, 0x1334: 0x046e, 0x1335: 0x042a, + 0x1336: 0x042e, 0x1337: 0x0432, 0x1338: 0x0436, 0x1339: 0x043a, 0x133a: 0x043e, 0x133b: 0x0442, + 0x133c: 0x0446, 0x133d: 0x044a, 0x133e: 0x044e, + // Block 0x4d, offset 0x1340 + 0x1342: 0x4afe, 0x1343: 0x4b04, 0x1344: 0x4b0a, 0x1345: 0x4b10, + 0x1346: 0x4b16, 0x1347: 0x4b1c, 0x134a: 0x4b22, 0x134b: 0x4b28, + 0x134c: 0x4b2e, 0x134d: 0x4b34, 0x134e: 0x4b3a, 0x134f: 0x4b40, + 0x1352: 0x4b46, 0x1353: 0x4b4c, 0x1354: 0x4b52, 0x1355: 0x4b58, 0x1356: 0x4b5e, 0x1357: 0x4b64, + 0x135a: 0x4b6a, 0x135b: 0x4b70, 0x135c: 0x4b76, + 0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x43a5, + 0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x053e, 0x1368: 0x0562, 0x1369: 0x0542, + 0x136a: 0x0546, 0x136b: 0x054a, 0x136c: 0x054e, 0x136d: 0x0566, 0x136e: 0x056a, + // Block 0x4e, offset 0x1380 + 0x1381: 0x01f1, 0x1382: 0x01f4, 0x1383: 0x00d4, 0x1384: 0x01be, 0x1385: 0x010d, + 0x1387: 0x01d3, 0x1388: 0x174e, 0x1389: 0x01d9, 0x138a: 0x01d6, 0x138b: 0x0116, + 0x138c: 0x0119, 0x138d: 0x0526, 0x138e: 0x011c, 0x138f: 0x0128, 0x1390: 0x01e5, 0x1391: 0x013a, + 0x1392: 0x0134, 0x1393: 0x012e, 0x1394: 0x01c1, 0x1395: 0x00e0, 0x1396: 0x01c4, 0x1397: 0x0143, + 0x1398: 0x0194, 0x1399: 0x01e8, 0x139a: 0x01eb, 0x139b: 0x0152, 0x139c: 0x1756, 0x139d: 0x1742, + 0x139e: 0x0158, 0x139f: 0x175b, 0x13a0: 0x01a9, 0x13a1: 0x1760, 0x13a2: 0x00da, 0x13a3: 0x0170, + 0x13a4: 0x0173, 0x13a5: 0x00a3, 0x13a6: 0x017c, 0x13a7: 0x1765, 0x13a8: 0x0182, 0x13a9: 0x0185, + 0x13aa: 0x0188, 0x13ab: 0x01e2, 0x13ac: 0x01dc, 0x13ad: 0x1752, 0x13ae: 0x01df, 0x13af: 0x0197, + 0x13b0: 0x0576, 0x13b2: 0x01ac, 0x13b3: 0x01cd, 0x13b4: 0x01d0, 0x13b5: 0x01bb, + 0x13b6: 0x00f5, 0x13b7: 0x00f8, 0x13b8: 0x00fb, 0x13b9: 0x176a, 0x13ba: 0x176f, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0063, 0x13c1: 0x0065, 0x13c2: 0x0067, 0x13c3: 0x0069, 0x13c4: 0x006b, 0x13c5: 0x006d, + 0x13c6: 0x006f, 0x13c7: 0x0071, 0x13c8: 0x0073, 0x13c9: 0x0075, 0x13ca: 0x0083, 0x13cb: 0x0085, + 0x13cc: 0x0087, 0x13cd: 0x0089, 0x13ce: 0x008b, 0x13cf: 0x008d, 0x13d0: 0x008f, 0x13d1: 0x0091, + 0x13d2: 0x0093, 0x13d3: 0x0095, 0x13d4: 0x0097, 0x13d5: 0x0099, 0x13d6: 0x009b, 0x13d7: 0x009d, + 0x13d8: 0x009f, 0x13d9: 0x00a1, 0x13da: 0x00a3, 0x13db: 0x00a5, 0x13dc: 0x00a7, 0x13dd: 0x00a9, + 0x13de: 0x00ab, 0x13df: 0x00ad, 0x13e0: 0x00af, 0x13e1: 0x00b1, 0x13e2: 0x00b3, 0x13e3: 0x00b5, + 0x13e4: 0x00e3, 0x13e5: 0x0101, 0x13e8: 0x01f7, 0x13e9: 0x01fa, + 0x13ea: 0x01fd, 0x13eb: 0x0200, 0x13ec: 0x0203, 0x13ed: 0x0206, 0x13ee: 0x0209, 0x13ef: 0x020c, + 0x13f0: 0x020f, 0x13f1: 0x0212, 0x13f2: 0x0215, 0x13f3: 0x0218, 0x13f4: 0x021b, 0x13f5: 0x021e, + 0x13f6: 0x0221, 0x13f7: 0x0224, 0x13f8: 0x0227, 0x13f9: 0x020c, 0x13fa: 0x022a, 0x13fb: 0x022d, + 0x13fc: 0x0230, 0x13fd: 0x0233, 0x13fe: 0x0236, 0x13ff: 0x0239, + // Block 0x50, offset 0x1400 + 0x1400: 0x0281, 0x1401: 0x0284, 0x1402: 0x0287, 0x1403: 0x0552, 0x1404: 0x024b, 0x1405: 0x0254, + 0x1406: 0x025a, 0x1407: 0x027e, 0x1408: 0x026f, 0x1409: 0x026c, 0x140a: 0x028a, 0x140b: 0x028d, + 0x140e: 0x0021, 0x140f: 0x0023, 0x1410: 0x0025, 0x1411: 0x0027, + 0x1412: 0x0029, 0x1413: 0x002b, 0x1414: 0x002d, 0x1415: 0x002f, 0x1416: 0x0031, 0x1417: 0x0033, + 0x1418: 0x0021, 0x1419: 0x0023, 0x141a: 0x0025, 0x141b: 0x0027, 0x141c: 0x0029, 0x141d: 0x002b, + 0x141e: 0x002d, 0x141f: 0x002f, 0x1420: 0x0031, 0x1421: 0x0033, 0x1422: 0x0021, 0x1423: 0x0023, + 0x1424: 0x0025, 0x1425: 0x0027, 0x1426: 0x0029, 0x1427: 0x002b, 0x1428: 0x002d, 0x1429: 0x002f, + 0x142a: 0x0031, 0x142b: 0x0033, 0x142c: 0x0021, 0x142d: 0x0023, 0x142e: 0x0025, 0x142f: 0x0027, + 0x1430: 0x0029, 0x1431: 0x002b, 0x1432: 0x002d, 0x1433: 0x002f, 0x1434: 0x0031, 0x1435: 0x0033, + 0x1436: 0x0021, 0x1437: 0x0023, 0x1438: 0x0025, 0x1439: 0x0027, 0x143a: 0x0029, 0x143b: 0x002b, + 0x143c: 0x002d, 0x143d: 0x002f, 0x143e: 0x0031, 0x143f: 0x0033, + // Block 0x51, offset 0x1440 + 0x1440: 0x8133, 0x1441: 0x8133, 0x1442: 0x8133, 0x1443: 0x8133, 0x1444: 0x8133, 0x1445: 0x8133, + 0x1446: 0x8133, 0x1448: 0x8133, 0x1449: 0x8133, 0x144a: 0x8133, 0x144b: 0x8133, + 0x144c: 0x8133, 0x144d: 0x8133, 0x144e: 0x8133, 0x144f: 0x8133, 0x1450: 0x8133, 0x1451: 0x8133, + 0x1452: 0x8133, 0x1453: 0x8133, 0x1454: 0x8133, 0x1455: 0x8133, 0x1456: 0x8133, 0x1457: 0x8133, + 0x1458: 0x8133, 0x145b: 0x8133, 0x145c: 0x8133, 0x145d: 0x8133, + 0x145e: 0x8133, 0x145f: 0x8133, 0x1460: 0x8133, 0x1461: 0x8133, 0x1463: 0x8133, + 0x1464: 0x8133, 0x1466: 0x8133, 0x1467: 0x8133, 0x1468: 0x8133, 0x1469: 0x8133, + 0x146a: 0x8133, + 0x1470: 0x0290, 0x1471: 0x0293, 0x1472: 0x0296, 0x1473: 0x0299, 0x1474: 0x029c, 0x1475: 0x029f, + 0x1476: 0x02a2, 0x1477: 0x02a5, 0x1478: 0x02a8, 0x1479: 0x02ab, 0x147a: 0x02ae, 0x147b: 0x02b1, + 0x147c: 0x02b7, 0x147d: 0x02ba, 0x147e: 0x02bd, 0x147f: 0x02c0, + // Block 0x52, offset 0x1480 + 0x1480: 0x02c3, 0x1481: 0x02c6, 0x1482: 0x02c9, 0x1483: 0x02cc, 0x1484: 0x02cf, 0x1485: 0x02d2, + 0x1486: 0x02d5, 0x1487: 0x02db, 0x1488: 0x02e1, 0x1489: 0x02e4, 0x148a: 0x1736, 0x148b: 0x0302, + 0x148c: 0x02ea, 0x148d: 0x02ed, 0x148e: 0x0305, 0x148f: 0x02f9, 0x1490: 0x02ff, 0x1491: 0x0290, + 0x1492: 0x0293, 0x1493: 0x0296, 0x1494: 0x0299, 0x1495: 0x029c, 0x1496: 0x029f, 0x1497: 0x02a2, + 0x1498: 0x02a5, 0x1499: 0x02a8, 0x149a: 0x02ab, 0x149b: 0x02ae, 0x149c: 0x02b7, 0x149d: 0x02ba, + 0x149e: 0x02c0, 0x149f: 0x02c6, 0x14a0: 0x02c9, 0x14a1: 0x02cc, 0x14a2: 0x02cf, 0x14a3: 0x02d2, + 0x14a4: 0x02d5, 0x14a5: 0x02d8, 0x14a6: 0x02db, 0x14a7: 0x02f3, 0x14a8: 0x02ea, 0x14a9: 0x02e7, + 0x14aa: 0x02f0, 0x14ab: 0x02f6, 0x14ac: 0x1732, 0x14ad: 0x02fc, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x032c, 0x14c1: 0x032f, 0x14c2: 0x033b, 0x14c3: 0x0344, 0x14c5: 0x037d, + 0x14c6: 0x034d, 0x14c7: 0x033e, 0x14c8: 0x035c, 0x14c9: 0x0383, 0x14ca: 0x036e, 0x14cb: 0x0371, + 0x14cc: 0x0374, 0x14cd: 0x0377, 0x14ce: 0x0350, 0x14cf: 0x0362, 0x14d0: 0x0368, 0x14d1: 0x0356, + 0x14d2: 0x036b, 0x14d3: 0x034a, 0x14d4: 0x0353, 0x14d5: 0x0335, 0x14d6: 0x0338, 0x14d7: 0x0341, + 0x14d8: 0x0347, 0x14d9: 0x0359, 0x14da: 0x035f, 0x14db: 0x0365, 0x14dc: 0x0386, 0x14dd: 0x03d7, + 0x14de: 0x03bf, 0x14df: 0x0389, 0x14e1: 0x032f, 0x14e2: 0x033b, + 0x14e4: 0x037a, 0x14e7: 0x033e, 0x14e9: 0x0383, + 0x14ea: 0x036e, 0x14eb: 0x0371, 0x14ec: 0x0374, 0x14ed: 0x0377, 0x14ee: 0x0350, 0x14ef: 0x0362, + 0x14f0: 0x0368, 0x14f1: 0x0356, 0x14f2: 0x036b, 0x14f4: 0x0353, 0x14f5: 0x0335, + 0x14f6: 0x0338, 0x14f7: 0x0341, 0x14f9: 0x0359, 0x14fb: 0x0365, + // Block 0x54, offset 0x1500 + 0x1502: 0x033b, + 0x1507: 0x033e, 0x1509: 0x0383, 0x150b: 0x0371, + 0x150d: 0x0377, 0x150e: 0x0350, 0x150f: 0x0362, 0x1511: 0x0356, + 0x1512: 0x036b, 0x1514: 0x0353, 0x1517: 0x0341, + 0x1519: 0x0359, 0x151b: 0x0365, 0x151d: 0x03d7, + 0x151f: 0x0389, 0x1521: 0x032f, 0x1522: 0x033b, + 0x1524: 0x037a, 0x1527: 0x033e, 0x1528: 0x035c, 0x1529: 0x0383, + 0x152a: 0x036e, 0x152c: 0x0374, 0x152d: 0x0377, 0x152e: 0x0350, 0x152f: 0x0362, + 0x1530: 0x0368, 0x1531: 0x0356, 0x1532: 0x036b, 0x1534: 0x0353, 0x1535: 0x0335, + 0x1536: 0x0338, 0x1537: 0x0341, 0x1539: 0x0359, 0x153a: 0x035f, 0x153b: 0x0365, + 0x153c: 0x0386, 0x153e: 0x03bf, + // Block 0x55, offset 0x1540 + 0x1540: 0x032c, 0x1541: 0x032f, 0x1542: 0x033b, 0x1543: 0x0344, 0x1544: 0x037a, 0x1545: 0x037d, + 0x1546: 0x034d, 0x1547: 0x033e, 0x1548: 0x035c, 0x1549: 0x0383, 0x154b: 0x0371, + 0x154c: 0x0374, 0x154d: 0x0377, 0x154e: 0x0350, 0x154f: 0x0362, 0x1550: 0x0368, 0x1551: 0x0356, + 0x1552: 0x036b, 0x1553: 0x034a, 0x1554: 0x0353, 0x1555: 0x0335, 0x1556: 0x0338, 0x1557: 0x0341, + 0x1558: 0x0347, 0x1559: 0x0359, 0x155a: 0x035f, 0x155b: 0x0365, + 0x1561: 0x032f, 0x1562: 0x033b, 0x1563: 0x0344, + 0x1565: 0x037d, 0x1566: 0x034d, 0x1567: 0x033e, 0x1568: 0x035c, 0x1569: 0x0383, + 0x156b: 0x0371, 0x156c: 0x0374, 0x156d: 0x0377, 0x156e: 0x0350, 0x156f: 0x0362, + 0x1570: 0x0368, 0x1571: 0x0356, 0x1572: 0x036b, 0x1573: 0x034a, 0x1574: 0x0353, 0x1575: 0x0335, + 0x1576: 0x0338, 0x1577: 0x0341, 0x1578: 0x0347, 0x1579: 0x0359, 0x157a: 0x035f, 0x157b: 0x0365, + // Block 0x56, offset 0x1580 + 0x1580: 0x19a6, 0x1581: 0x19a3, 0x1582: 0x19a9, 0x1583: 0x19cd, 0x1584: 0x19f1, 0x1585: 0x1a15, + 0x1586: 0x1a39, 0x1587: 0x1a42, 0x1588: 0x1a48, 0x1589: 0x1a4e, 0x158a: 0x1a54, + 0x1590: 0x1bbc, 0x1591: 0x1bc0, + 0x1592: 0x1bc4, 0x1593: 0x1bc8, 0x1594: 0x1bcc, 0x1595: 0x1bd0, 0x1596: 0x1bd4, 0x1597: 0x1bd8, + 0x1598: 0x1bdc, 0x1599: 0x1be0, 0x159a: 0x1be4, 0x159b: 0x1be8, 0x159c: 0x1bec, 0x159d: 0x1bf0, + 0x159e: 0x1bf4, 0x159f: 0x1bf8, 0x15a0: 0x1bfc, 0x15a1: 0x1c00, 0x15a2: 0x1c04, 0x15a3: 0x1c08, + 0x15a4: 0x1c0c, 0x15a5: 0x1c10, 0x15a6: 0x1c14, 0x15a7: 0x1c18, 0x15a8: 0x1c1c, 0x15a9: 0x1c20, + 0x15aa: 0x2855, 0x15ab: 0x0047, 0x15ac: 0x0065, 0x15ad: 0x1a69, 0x15ae: 0x1ae1, + 0x15b0: 0x0043, 0x15b1: 0x0045, 0x15b2: 0x0047, 0x15b3: 0x0049, 0x15b4: 0x004b, 0x15b5: 0x004d, + 0x15b6: 0x004f, 0x15b7: 0x0051, 0x15b8: 0x0053, 0x15b9: 0x0055, 0x15ba: 0x0057, 0x15bb: 0x0059, + 0x15bc: 0x005b, 0x15bd: 0x005d, 0x15be: 0x005f, 0x15bf: 0x0061, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x27dd, 0x15c1: 0x27f2, 0x15c2: 0x05fe, + 0x15d0: 0x0d0a, 0x15d1: 0x0b42, + 0x15d2: 0x09ce, 0x15d3: 0x4705, 0x15d4: 0x0816, 0x15d5: 0x0aea, 0x15d6: 0x142a, 0x15d7: 0x0afa, + 0x15d8: 0x0822, 0x15d9: 0x0dd2, 0x15da: 0x0faa, 0x15db: 0x0daa, 0x15dc: 0x0922, 0x15dd: 0x0c66, + 0x15de: 0x08ba, 0x15df: 0x0db2, 0x15e0: 0x090e, 0x15e1: 0x1212, 0x15e2: 0x107e, 0x15e3: 0x1486, + 0x15e4: 0x0ace, 0x15e5: 0x0a06, 0x15e6: 0x0f5e, 0x15e7: 0x0d16, 0x15e8: 0x0d42, 0x15e9: 0x07ba, + 0x15ea: 0x07c6, 0x15eb: 0x1506, 0x15ec: 0x0bd6, 0x15ed: 0x07e2, 0x15ee: 0x09ea, 0x15ef: 0x0d36, + 0x15f0: 0x14ae, 0x15f1: 0x0d0e, 0x15f2: 0x116a, 0x15f3: 0x11a6, 0x15f4: 0x09f2, 0x15f5: 0x0f3e, + 0x15f6: 0x0e06, 0x15f7: 0x0e02, 0x15f8: 0x1092, 0x15f9: 0x0926, 0x15fa: 0x0a52, 0x15fb: 0x153e, + // Block 0x58, offset 0x1600 + 0x1600: 0x07f6, 0x1601: 0x07ee, 0x1602: 0x07fe, 0x1603: 0x1774, 0x1604: 0x0842, 0x1605: 0x0852, + 0x1606: 0x0856, 0x1607: 0x085e, 0x1608: 0x0866, 0x1609: 0x086a, 0x160a: 0x0876, 0x160b: 0x086e, + 0x160c: 0x06ae, 0x160d: 0x1788, 0x160e: 0x088a, 0x160f: 0x088e, 0x1610: 0x0892, 0x1611: 0x08ae, + 0x1612: 0x1779, 0x1613: 0x06b2, 0x1614: 0x089a, 0x1615: 0x08ba, 0x1616: 0x1783, 0x1617: 0x08ca, + 0x1618: 0x08d2, 0x1619: 0x0832, 0x161a: 0x08da, 0x161b: 0x08de, 0x161c: 0x195e, 0x161d: 0x08fa, + 0x161e: 0x0902, 0x161f: 0x06ba, 0x1620: 0x091a, 0x1621: 0x091e, 0x1622: 0x0926, 0x1623: 0x092a, + 0x1624: 0x06be, 0x1625: 0x0942, 0x1626: 0x0946, 0x1627: 0x0952, 0x1628: 0x095e, 0x1629: 0x0962, + 0x162a: 0x0966, 0x162b: 0x096e, 0x162c: 0x098e, 0x162d: 0x0992, 0x162e: 0x099a, 0x162f: 0x09aa, + 0x1630: 0x09b2, 0x1631: 0x09b6, 0x1632: 0x09b6, 0x1633: 0x09b6, 0x1634: 0x1797, 0x1635: 0x0f8e, + 0x1636: 0x09ca, 0x1637: 0x09d2, 0x1638: 0x179c, 0x1639: 0x09de, 0x163a: 0x09e6, 0x163b: 0x09ee, + 0x163c: 0x0a16, 0x163d: 0x0a02, 0x163e: 0x0a0e, 0x163f: 0x0a12, + // Block 0x59, offset 0x1640 + 0x1640: 0x0a1a, 0x1641: 0x0a22, 0x1642: 0x0a26, 0x1643: 0x0a2e, 0x1644: 0x0a36, 0x1645: 0x0a3a, + 0x1646: 0x0a3a, 0x1647: 0x0a42, 0x1648: 0x0a4a, 0x1649: 0x0a4e, 0x164a: 0x0a5a, 0x164b: 0x0a7e, + 0x164c: 0x0a62, 0x164d: 0x0a82, 0x164e: 0x0a66, 0x164f: 0x0a6e, 0x1650: 0x0906, 0x1651: 0x0aca, + 0x1652: 0x0a92, 0x1653: 0x0a96, 0x1654: 0x0a9a, 0x1655: 0x0a8e, 0x1656: 0x0aa2, 0x1657: 0x0a9e, + 0x1658: 0x0ab6, 0x1659: 0x17a1, 0x165a: 0x0ad2, 0x165b: 0x0ad6, 0x165c: 0x0ade, 0x165d: 0x0aea, + 0x165e: 0x0af2, 0x165f: 0x0b0e, 0x1660: 0x17a6, 0x1661: 0x17ab, 0x1662: 0x0b1a, 0x1663: 0x0b1e, + 0x1664: 0x0b22, 0x1665: 0x0b16, 0x1666: 0x0b2a, 0x1667: 0x06c2, 0x1668: 0x06c6, 0x1669: 0x0b32, + 0x166a: 0x0b3a, 0x166b: 0x0b3a, 0x166c: 0x17b0, 0x166d: 0x0b56, 0x166e: 0x0b5a, 0x166f: 0x0b5e, + 0x1670: 0x0b66, 0x1671: 0x17b5, 0x1672: 0x0b6e, 0x1673: 0x0b72, 0x1674: 0x0c4a, 0x1675: 0x0b7a, + 0x1676: 0x06ca, 0x1677: 0x0b86, 0x1678: 0x0b96, 0x1679: 0x0ba2, 0x167a: 0x0b9e, 0x167b: 0x17bf, + 0x167c: 0x0baa, 0x167d: 0x17c4, 0x167e: 0x0bb6, 0x167f: 0x0bb2, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0bba, 0x1681: 0x0bca, 0x1682: 0x0bce, 0x1683: 0x06ce, 0x1684: 0x0bde, 0x1685: 0x0be6, + 0x1686: 0x0bea, 0x1687: 0x0bee, 0x1688: 0x06d2, 0x1689: 0x17c9, 0x168a: 0x06d6, 0x168b: 0x0c0a, + 0x168c: 0x0c0e, 0x168d: 0x0c12, 0x168e: 0x0c1a, 0x168f: 0x1990, 0x1690: 0x0c32, 0x1691: 0x17d3, + 0x1692: 0x17d3, 0x1693: 0x12d2, 0x1694: 0x0c42, 0x1695: 0x0c42, 0x1696: 0x06da, 0x1697: 0x17f6, + 0x1698: 0x18c8, 0x1699: 0x0c52, 0x169a: 0x0c5a, 0x169b: 0x06de, 0x169c: 0x0c6e, 0x169d: 0x0c7e, + 0x169e: 0x0c82, 0x169f: 0x0c8a, 0x16a0: 0x0c9a, 0x16a1: 0x06e6, 0x16a2: 0x06e2, 0x16a3: 0x0c9e, + 0x16a4: 0x17d8, 0x16a5: 0x0ca2, 0x16a6: 0x0cb6, 0x16a7: 0x0cba, 0x16a8: 0x0cbe, 0x16a9: 0x0cba, + 0x16aa: 0x0cca, 0x16ab: 0x0cce, 0x16ac: 0x0cde, 0x16ad: 0x0cd6, 0x16ae: 0x0cda, 0x16af: 0x0ce2, + 0x16b0: 0x0ce6, 0x16b1: 0x0cea, 0x16b2: 0x0cf6, 0x16b3: 0x0cfa, 0x16b4: 0x0d12, 0x16b5: 0x0d1a, + 0x16b6: 0x0d2a, 0x16b7: 0x0d3e, 0x16b8: 0x17e7, 0x16b9: 0x0d3a, 0x16ba: 0x0d2e, 0x16bb: 0x0d46, + 0x16bc: 0x0d4e, 0x16bd: 0x0d62, 0x16be: 0x17ec, 0x16bf: 0x0d6a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0d5e, 0x16c1: 0x0d56, 0x16c2: 0x06ea, 0x16c3: 0x0d72, 0x16c4: 0x0d7a, 0x16c5: 0x0d82, + 0x16c6: 0x0d76, 0x16c7: 0x06ee, 0x16c8: 0x0d92, 0x16c9: 0x0d9a, 0x16ca: 0x17f1, 0x16cb: 0x0dc6, + 0x16cc: 0x0dfa, 0x16cd: 0x0dd6, 0x16ce: 0x06fa, 0x16cf: 0x0de2, 0x16d0: 0x06f6, 0x16d1: 0x06f2, + 0x16d2: 0x08be, 0x16d3: 0x08c2, 0x16d4: 0x0dfe, 0x16d5: 0x0de6, 0x16d6: 0x12a6, 0x16d7: 0x075e, + 0x16d8: 0x0e0a, 0x16d9: 0x0e0e, 0x16da: 0x0e12, 0x16db: 0x0e26, 0x16dc: 0x0e1e, 0x16dd: 0x180a, + 0x16de: 0x06fe, 0x16df: 0x0e3a, 0x16e0: 0x0e2e, 0x16e1: 0x0e4a, 0x16e2: 0x0e52, 0x16e3: 0x1814, + 0x16e4: 0x0e56, 0x16e5: 0x0e42, 0x16e6: 0x0e5e, 0x16e7: 0x0702, 0x16e8: 0x0e62, 0x16e9: 0x0e66, + 0x16ea: 0x0e6a, 0x16eb: 0x0e76, 0x16ec: 0x1819, 0x16ed: 0x0e7e, 0x16ee: 0x0706, 0x16ef: 0x0e8a, + 0x16f0: 0x181e, 0x16f1: 0x0e8e, 0x16f2: 0x070a, 0x16f3: 0x0e9a, 0x16f4: 0x0ea6, 0x16f5: 0x0eb2, + 0x16f6: 0x0eb6, 0x16f7: 0x1823, 0x16f8: 0x17ba, 0x16f9: 0x1828, 0x16fa: 0x0ed6, 0x16fb: 0x182d, + 0x16fc: 0x0ee2, 0x16fd: 0x0eea, 0x16fe: 0x0eda, 0x16ff: 0x0ef6, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0f06, 0x1701: 0x0f16, 0x1702: 0x0f0a, 0x1703: 0x0f0e, 0x1704: 0x0f1a, 0x1705: 0x0f1e, + 0x1706: 0x1832, 0x1707: 0x0f02, 0x1708: 0x0f36, 0x1709: 0x0f3a, 0x170a: 0x070e, 0x170b: 0x0f4e, + 0x170c: 0x0f4a, 0x170d: 0x1837, 0x170e: 0x0f2e, 0x170f: 0x0f6a, 0x1710: 0x183c, 0x1711: 0x1841, + 0x1712: 0x0f6e, 0x1713: 0x0f82, 0x1714: 0x0f7e, 0x1715: 0x0f7a, 0x1716: 0x0712, 0x1717: 0x0f86, + 0x1718: 0x0f96, 0x1719: 0x0f92, 0x171a: 0x0f9e, 0x171b: 0x177e, 0x171c: 0x0fae, 0x171d: 0x1846, + 0x171e: 0x0fba, 0x171f: 0x1850, 0x1720: 0x0fce, 0x1721: 0x0fda, 0x1722: 0x0fee, 0x1723: 0x1855, + 0x1724: 0x1002, 0x1725: 0x1006, 0x1726: 0x185a, 0x1727: 0x185f, 0x1728: 0x1022, 0x1729: 0x1032, + 0x172a: 0x0716, 0x172b: 0x1036, 0x172c: 0x071a, 0x172d: 0x071a, 0x172e: 0x104e, 0x172f: 0x1052, + 0x1730: 0x105a, 0x1731: 0x105e, 0x1732: 0x106a, 0x1733: 0x071e, 0x1734: 0x1082, 0x1735: 0x1864, + 0x1736: 0x109e, 0x1737: 0x1869, 0x1738: 0x10aa, 0x1739: 0x17ce, 0x173a: 0x10ba, 0x173b: 0x186e, + 0x173c: 0x1873, 0x173d: 0x1878, 0x173e: 0x0722, 0x173f: 0x0726, + // Block 0x5d, offset 0x1740 + 0x1740: 0x10f2, 0x1741: 0x1882, 0x1742: 0x187d, 0x1743: 0x1887, 0x1744: 0x188c, 0x1745: 0x10fa, + 0x1746: 0x10fe, 0x1747: 0x10fe, 0x1748: 0x1106, 0x1749: 0x072e, 0x174a: 0x110a, 0x174b: 0x0732, + 0x174c: 0x0736, 0x174d: 0x1896, 0x174e: 0x111e, 0x174f: 0x1126, 0x1750: 0x1132, 0x1751: 0x073a, + 0x1752: 0x189b, 0x1753: 0x1156, 0x1754: 0x18a0, 0x1755: 0x18a5, 0x1756: 0x1176, 0x1757: 0x118e, + 0x1758: 0x073e, 0x1759: 0x1196, 0x175a: 0x119a, 0x175b: 0x119e, 0x175c: 0x18aa, 0x175d: 0x18af, + 0x175e: 0x18af, 0x175f: 0x11b6, 0x1760: 0x0742, 0x1761: 0x18b4, 0x1762: 0x11ca, 0x1763: 0x11ce, + 0x1764: 0x0746, 0x1765: 0x18b9, 0x1766: 0x11ea, 0x1767: 0x074a, 0x1768: 0x11fa, 0x1769: 0x11f2, + 0x176a: 0x1202, 0x176b: 0x18c3, 0x176c: 0x121a, 0x176d: 0x074e, 0x176e: 0x1226, 0x176f: 0x122e, + 0x1770: 0x123e, 0x1771: 0x0752, 0x1772: 0x18cd, 0x1773: 0x18d2, 0x1774: 0x0756, 0x1775: 0x18d7, + 0x1776: 0x1256, 0x1777: 0x18dc, 0x1778: 0x1262, 0x1779: 0x126e, 0x177a: 0x1276, 0x177b: 0x18e1, + 0x177c: 0x18e6, 0x177d: 0x128a, 0x177e: 0x18eb, 0x177f: 0x1292, + // Block 0x5e, offset 0x1780 + 0x1780: 0x17fb, 0x1781: 0x075a, 0x1782: 0x12aa, 0x1783: 0x12ae, 0x1784: 0x0762, 0x1785: 0x12b2, + 0x1786: 0x0b2e, 0x1787: 0x18f0, 0x1788: 0x18f5, 0x1789: 0x1800, 0x178a: 0x1805, 0x178b: 0x12d2, + 0x178c: 0x12d6, 0x178d: 0x14ee, 0x178e: 0x0766, 0x178f: 0x1302, 0x1790: 0x12fe, 0x1791: 0x1306, + 0x1792: 0x093a, 0x1793: 0x130a, 0x1794: 0x130e, 0x1795: 0x1312, 0x1796: 0x131a, 0x1797: 0x18fa, + 0x1798: 0x1316, 0x1799: 0x131e, 0x179a: 0x1332, 0x179b: 0x1336, 0x179c: 0x1322, 0x179d: 0x133a, + 0x179e: 0x134e, 0x179f: 0x1362, 0x17a0: 0x132e, 0x17a1: 0x1342, 0x17a2: 0x1346, 0x17a3: 0x134a, + 0x17a4: 0x18ff, 0x17a5: 0x1909, 0x17a6: 0x1904, 0x17a7: 0x076a, 0x17a8: 0x136a, 0x17a9: 0x136e, + 0x17aa: 0x1376, 0x17ab: 0x191d, 0x17ac: 0x137a, 0x17ad: 0x190e, 0x17ae: 0x076e, 0x17af: 0x0772, + 0x17b0: 0x1913, 0x17b1: 0x1918, 0x17b2: 0x0776, 0x17b3: 0x139a, 0x17b4: 0x139e, 0x17b5: 0x13a2, + 0x17b6: 0x13a6, 0x17b7: 0x13b2, 0x17b8: 0x13ae, 0x17b9: 0x13ba, 0x17ba: 0x13b6, 0x17bb: 0x13c6, + 0x17bc: 0x13be, 0x17bd: 0x13c2, 0x17be: 0x13ca, 0x17bf: 0x077a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x13d2, 0x17c1: 0x13d6, 0x17c2: 0x077e, 0x17c3: 0x13e6, 0x17c4: 0x13ea, 0x17c5: 0x1922, + 0x17c6: 0x13f6, 0x17c7: 0x13fa, 0x17c8: 0x0782, 0x17c9: 0x1406, 0x17ca: 0x06b6, 0x17cb: 0x1927, + 0x17cc: 0x192c, 0x17cd: 0x0786, 0x17ce: 0x078a, 0x17cf: 0x1432, 0x17d0: 0x144a, 0x17d1: 0x1466, + 0x17d2: 0x1476, 0x17d3: 0x1931, 0x17d4: 0x148a, 0x17d5: 0x148e, 0x17d6: 0x14a6, 0x17d7: 0x14b2, + 0x17d8: 0x193b, 0x17d9: 0x178d, 0x17da: 0x14be, 0x17db: 0x14ba, 0x17dc: 0x14c6, 0x17dd: 0x1792, + 0x17de: 0x14d2, 0x17df: 0x14de, 0x17e0: 0x1940, 0x17e1: 0x1945, 0x17e2: 0x151e, 0x17e3: 0x152a, + 0x17e4: 0x1532, 0x17e5: 0x194a, 0x17e6: 0x1536, 0x17e7: 0x1562, 0x17e8: 0x156e, 0x17e9: 0x1572, + 0x17ea: 0x156a, 0x17eb: 0x157e, 0x17ec: 0x1582, 0x17ed: 0x194f, 0x17ee: 0x158e, 0x17ef: 0x078e, + 0x17f0: 0x1596, 0x17f1: 0x1954, 0x17f2: 0x0792, 0x17f3: 0x15ce, 0x17f4: 0x0bbe, 0x17f5: 0x15e6, + 0x17f6: 0x1959, 0x17f7: 0x1963, 0x17f8: 0x0796, 0x17f9: 0x079a, 0x17fa: 0x160e, 0x17fb: 0x1968, + 0x17fc: 0x079e, 0x17fd: 0x196d, 0x17fe: 0x1626, 0x17ff: 0x1626, + // Block 0x60, offset 0x1800 + 0x1800: 0x162e, 0x1801: 0x1972, 0x1802: 0x1646, 0x1803: 0x07a2, 0x1804: 0x1656, 0x1805: 0x1662, + 0x1806: 0x166a, 0x1807: 0x1672, 0x1808: 0x07a6, 0x1809: 0x1977, 0x180a: 0x1686, 0x180b: 0x16a2, + 0x180c: 0x16ae, 0x180d: 0x07aa, 0x180e: 0x07ae, 0x180f: 0x16b2, 0x1810: 0x197c, 0x1811: 0x07b2, + 0x1812: 0x1981, 0x1813: 0x1986, 0x1814: 0x198b, 0x1815: 0x16d6, 0x1816: 0x07b6, 0x1817: 0x16ea, + 0x1818: 0x16f2, 0x1819: 0x16f6, 0x181a: 0x16fe, 0x181b: 0x1706, 0x181c: 0x170e, 0x181d: 0x1995, +} + +// nfkcIndex: 22 blocks, 1408 entries, 2816 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5f, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x60, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x61, 0xcb: 0x62, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x63, 0xd2: 0x64, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x65, + 0xd8: 0x66, 0xd9: 0x0d, 0xdb: 0x67, 0xdc: 0x68, 0xdd: 0x69, 0xdf: 0x6a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x6b, 0x121: 0x6c, 0x122: 0x6d, 0x123: 0x0e, 0x124: 0x6e, 0x125: 0x6f, 0x126: 0x70, 0x127: 0x71, + 0x128: 0x72, 0x129: 0x73, 0x12a: 0x74, 0x12b: 0x75, 0x12c: 0x70, 0x12d: 0x76, 0x12e: 0x77, 0x12f: 0x78, + 0x130: 0x74, 0x131: 0x79, 0x132: 0x7a, 0x133: 0x7b, 0x134: 0x7c, 0x135: 0x7d, 0x137: 0x7e, + 0x138: 0x7f, 0x139: 0x80, 0x13a: 0x81, 0x13b: 0x82, 0x13c: 0x83, 0x13d: 0x84, 0x13e: 0x85, 0x13f: 0x86, + // Block 0x5, offset 0x140 + 0x140: 0x87, 0x142: 0x88, 0x143: 0x89, 0x144: 0x8a, 0x145: 0x8b, 0x146: 0x8c, 0x147: 0x8d, + 0x14d: 0x8e, + 0x15c: 0x8f, 0x15f: 0x90, + 0x162: 0x91, 0x164: 0x92, + 0x168: 0x93, 0x169: 0x94, 0x16a: 0x95, 0x16b: 0x96, 0x16c: 0x0f, 0x16d: 0x97, 0x16e: 0x98, 0x16f: 0x99, + 0x170: 0x9a, 0x173: 0x9b, 0x174: 0x9c, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12, + 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, + // Block 0x6, offset 0x180 + 0x180: 0x9d, 0x181: 0x9e, 0x182: 0x9f, 0x183: 0xa0, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0xa1, 0x187: 0xa2, + 0x188: 0xa3, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0xa4, 0x18c: 0xa5, + 0x191: 0x1f, 0x192: 0x20, 0x193: 0xa6, + 0x1a8: 0xa7, 0x1a9: 0xa8, 0x1ab: 0xa9, + 0x1b1: 0xaa, 0x1b3: 0xab, 0x1b5: 0xac, 0x1b7: 0xad, + 0x1ba: 0xae, 0x1bb: 0xaf, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xb0, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xb1, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xb2, 0x1c5: 0x27, 0x1c6: 0x28, + 0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30, + // Block 0x8, offset 0x200 + 0x219: 0xb3, 0x21a: 0xb4, 0x21b: 0xb5, 0x21d: 0xb6, 0x21f: 0xb7, + 0x220: 0xb8, 0x223: 0xb9, 0x224: 0xba, 0x225: 0xbb, 0x226: 0xbc, 0x227: 0xbd, + 0x22a: 0xbe, 0x22b: 0xbf, 0x22d: 0xc0, 0x22f: 0xc1, + 0x230: 0xc2, 0x231: 0xc3, 0x232: 0xc4, 0x233: 0xc5, 0x234: 0xc6, 0x235: 0xc7, 0x236: 0xc8, 0x237: 0xc2, + 0x238: 0xc3, 0x239: 0xc4, 0x23a: 0xc5, 0x23b: 0xc6, 0x23c: 0xc7, 0x23d: 0xc8, 0x23e: 0xc2, 0x23f: 0xc3, + // Block 0x9, offset 0x240 + 0x240: 0xc4, 0x241: 0xc5, 0x242: 0xc6, 0x243: 0xc7, 0x244: 0xc8, 0x245: 0xc2, 0x246: 0xc3, 0x247: 0xc4, + 0x248: 0xc5, 0x249: 0xc6, 0x24a: 0xc7, 0x24b: 0xc8, 0x24c: 0xc2, 0x24d: 0xc3, 0x24e: 0xc4, 0x24f: 0xc5, + 0x250: 0xc6, 0x251: 0xc7, 0x252: 0xc8, 0x253: 0xc2, 0x254: 0xc3, 0x255: 0xc4, 0x256: 0xc5, 0x257: 0xc6, + 0x258: 0xc7, 0x259: 0xc8, 0x25a: 0xc2, 0x25b: 0xc3, 0x25c: 0xc4, 0x25d: 0xc5, 0x25e: 0xc6, 0x25f: 0xc7, + 0x260: 0xc8, 0x261: 0xc2, 0x262: 0xc3, 0x263: 0xc4, 0x264: 0xc5, 0x265: 0xc6, 0x266: 0xc7, 0x267: 0xc8, + 0x268: 0xc2, 0x269: 0xc3, 0x26a: 0xc4, 0x26b: 0xc5, 0x26c: 0xc6, 0x26d: 0xc7, 0x26e: 0xc8, 0x26f: 0xc2, + 0x270: 0xc3, 0x271: 0xc4, 0x272: 0xc5, 0x273: 0xc6, 0x274: 0xc7, 0x275: 0xc8, 0x276: 0xc2, 0x277: 0xc3, + 0x278: 0xc4, 0x279: 0xc5, 0x27a: 0xc6, 0x27b: 0xc7, 0x27c: 0xc8, 0x27d: 0xc2, 0x27e: 0xc3, 0x27f: 0xc4, + // Block 0xa, offset 0x280 + 0x280: 0xc5, 0x281: 0xc6, 0x282: 0xc7, 0x283: 0xc8, 0x284: 0xc2, 0x285: 0xc3, 0x286: 0xc4, 0x287: 0xc5, + 0x288: 0xc6, 0x289: 0xc7, 0x28a: 0xc8, 0x28b: 0xc2, 0x28c: 0xc3, 0x28d: 0xc4, 0x28e: 0xc5, 0x28f: 0xc6, + 0x290: 0xc7, 0x291: 0xc8, 0x292: 0xc2, 0x293: 0xc3, 0x294: 0xc4, 0x295: 0xc5, 0x296: 0xc6, 0x297: 0xc7, + 0x298: 0xc8, 0x299: 0xc2, 0x29a: 0xc3, 0x29b: 0xc4, 0x29c: 0xc5, 0x29d: 0xc6, 0x29e: 0xc7, 0x29f: 0xc8, + 0x2a0: 0xc2, 0x2a1: 0xc3, 0x2a2: 0xc4, 0x2a3: 0xc5, 0x2a4: 0xc6, 0x2a5: 0xc7, 0x2a6: 0xc8, 0x2a7: 0xc2, + 0x2a8: 0xc3, 0x2a9: 0xc4, 0x2aa: 0xc5, 0x2ab: 0xc6, 0x2ac: 0xc7, 0x2ad: 0xc8, 0x2ae: 0xc2, 0x2af: 0xc3, + 0x2b0: 0xc4, 0x2b1: 0xc5, 0x2b2: 0xc6, 0x2b3: 0xc7, 0x2b4: 0xc8, 0x2b5: 0xc2, 0x2b6: 0xc3, 0x2b7: 0xc4, + 0x2b8: 0xc5, 0x2b9: 0xc6, 0x2ba: 0xc7, 0x2bb: 0xc8, 0x2bc: 0xc2, 0x2bd: 0xc3, 0x2be: 0xc4, 0x2bf: 0xc5, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc6, 0x2c1: 0xc7, 0x2c2: 0xc8, 0x2c3: 0xc2, 0x2c4: 0xc3, 0x2c5: 0xc4, 0x2c6: 0xc5, 0x2c7: 0xc6, + 0x2c8: 0xc7, 0x2c9: 0xc8, 0x2ca: 0xc2, 0x2cb: 0xc3, 0x2cc: 0xc4, 0x2cd: 0xc5, 0x2ce: 0xc6, 0x2cf: 0xc7, + 0x2d0: 0xc8, 0x2d1: 0xc2, 0x2d2: 0xc3, 0x2d3: 0xc4, 0x2d4: 0xc5, 0x2d5: 0xc6, 0x2d6: 0xc7, 0x2d7: 0xc8, + 0x2d8: 0xc2, 0x2d9: 0xc3, 0x2da: 0xc4, 0x2db: 0xc5, 0x2dc: 0xc6, 0x2dd: 0xc7, 0x2de: 0xc9, + // Block 0xc, offset 0x300 + 0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34, + 0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c, + 0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44, + 0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xca, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b, + // Block 0xd, offset 0x340 + 0x347: 0xcb, + 0x34b: 0xcc, 0x34d: 0xcd, + 0x35e: 0x4c, + 0x368: 0xce, 0x36b: 0xcf, + 0x374: 0xd0, + 0x37a: 0xd1, 0x37b: 0xd2, 0x37d: 0xd3, 0x37e: 0xd4, + // Block 0xe, offset 0x380 + 0x381: 0xd5, 0x382: 0xd6, 0x384: 0xd7, 0x385: 0xbc, 0x387: 0xd8, + 0x388: 0xd9, 0x38b: 0xda, 0x38c: 0xdb, 0x38d: 0xdc, + 0x391: 0xdd, 0x392: 0xde, 0x393: 0xdf, 0x396: 0xe0, 0x397: 0xe1, + 0x398: 0xe2, 0x39a: 0xe3, 0x39c: 0xe4, + 0x3a0: 0xe5, 0x3a4: 0xe6, 0x3a5: 0xe7, 0x3a7: 0xe8, + 0x3a8: 0xe9, 0x3a9: 0xea, 0x3aa: 0xeb, + 0x3b0: 0xe2, 0x3b5: 0xec, 0x3b6: 0xed, + 0x3bd: 0xee, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xef, 0x3ec: 0xf0, + 0x3ff: 0xf1, + // Block 0x10, offset 0x400 + 0x432: 0xf2, + // Block 0x11, offset 0x440 + 0x445: 0xf3, 0x446: 0xf4, 0x447: 0xf5, + 0x449: 0xf6, + 0x450: 0xf7, 0x451: 0xf8, 0x452: 0xf9, 0x453: 0xfa, 0x454: 0xfb, 0x455: 0xfc, 0x456: 0xfd, 0x457: 0xfe, + 0x458: 0xff, 0x459: 0x100, 0x45a: 0x4d, 0x45b: 0x101, 0x45c: 0x102, 0x45d: 0x103, 0x45e: 0x104, 0x45f: 0x4e, + // Block 0x12, offset 0x480 + 0x480: 0x4f, 0x481: 0x50, 0x482: 0x105, 0x484: 0xf0, + 0x48a: 0x106, 0x48b: 0x107, + 0x493: 0x108, + 0x4a3: 0x109, 0x4a5: 0x10a, + 0x4b8: 0x51, 0x4b9: 0x52, 0x4ba: 0x53, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x54, 0x4c5: 0x10b, 0x4c6: 0x10c, + 0x4c8: 0x55, 0x4c9: 0x10d, + 0x4ef: 0x10e, + // Block 0x14, offset 0x500 + 0x520: 0x56, 0x521: 0x57, 0x522: 0x58, 0x523: 0x59, 0x524: 0x5a, 0x525: 0x5b, 0x526: 0x5c, 0x527: 0x5d, + 0x528: 0x5e, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 176 entries, 352 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1c, 0x26, 0x36, 0x38, 0x3d, 0x48, 0x57, 0x64, 0x6c, 0x71, 0x76, 0x78, 0x7c, 0x84, 0x8b, 0x8e, 0x96, 0x9a, 0x9e, 0xa0, 0xa2, 0xab, 0xaf, 0xb6, 0xbb, 0xbe, 0xc8, 0xcb, 0xd2, 0xda, 0xde, 0xe0, 0xe4, 0xe8, 0xee, 0xff, 0x10b, 0x10d, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11d, 0x11f, 0x121, 0x124, 0x127, 0x129, 0x12c, 0x12f, 0x133, 0x139, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x174, 0x182, 0x192, 0x1a0, 0x1a7, 0x1ad, 0x1bc, 0x1c0, 0x1c2, 0x1c6, 0x1c8, 0x1cb, 0x1cd, 0x1d0, 0x1d2, 0x1d5, 0x1d7, 0x1d9, 0x1db, 0x1e7, 0x1f1, 0x1fb, 0x1fe, 0x202, 0x204, 0x206, 0x20b, 0x20e, 0x211, 0x213, 0x215, 0x217, 0x219, 0x21f, 0x222, 0x227, 0x229, 0x230, 0x236, 0x23c, 0x244, 0x24a, 0x250, 0x256, 0x25a, 0x25c, 0x25e, 0x260, 0x262, 0x268, 0x26b, 0x26d, 0x26f, 0x271, 0x277, 0x27b, 0x27f, 0x287, 0x28e, 0x291, 0x294, 0x296, 0x299, 0x2a1, 0x2a5, 0x2ac, 0x2af, 0x2b5, 0x2b7, 0x2b9, 0x2bc, 0x2be, 0x2c1, 0x2c6, 0x2c8, 0x2ca, 0x2cc, 0x2ce, 0x2d0, 0x2d3, 0x2d5, 0x2d7, 0x2d9, 0x2db, 0x2dd, 0x2df, 0x2ec, 0x2f6, 0x2f8, 0x2fa, 0x2fe, 0x303, 0x30f, 0x314, 0x31d, 0x323, 0x328, 0x32c, 0x331, 0x335, 0x345, 0x353, 0x361, 0x36f, 0x371, 0x373, 0x375, 0x379, 0x37b, 0x37e, 0x389, 0x38b, 0x395} + +// nfkcSparseValues: 919 entries, 3676 bytes +var nfkcSparseValues = [919]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x43b9, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x43a5, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x439b, lo: 0xb4, hi: 0xb4}, + {value: 0x0260, lo: 0xb5, hi: 0xb5}, + {value: 0x43d2, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x234c, lo: 0xbc, hi: 0xbc}, + {value: 0x2340, lo: 0xbd, hi: 0xbd}, + {value: 0x23e2, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0004, lo: 0x09}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0140, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0179, lo: 0xb4, hi: 0xb4}, + {value: 0x017f, lo: 0xb5, hi: 0xb5}, + {value: 0x018b, lo: 0xb6, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb8}, + // Block 0x3, offset 0x1c + {value: 0x000a, lo: 0x09}, + {value: 0x43af, lo: 0x98, hi: 0x98}, + {value: 0x43b4, lo: 0x99, hi: 0x9a}, + {value: 0x43d7, lo: 0x9b, hi: 0x9b}, + {value: 0x43a0, lo: 0x9c, hi: 0x9c}, + {value: 0x43c3, lo: 0x9d, hi: 0x9d}, + {value: 0x0137, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x01b8, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x26 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x36 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x38 + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3d + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x48 + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x57 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x64 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6c + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xc, offset 0x71 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x76 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x78 + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0xf, offset 0x7c + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x84 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x8b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x8e + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x96 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0x9a + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0x9e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0xa0 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0xa2 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0xab + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0xaf + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xb6 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xbb + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xbe + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xc8 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xcb + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xd2 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xda + {value: 0x0000, lo: 0x03}, + {value: 0x2751, lo: 0xb3, hi: 0xb3}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xde + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xe0 + {value: 0x0000, lo: 0x03}, + {value: 0x2766, lo: 0xb3, hi: 0xb3}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x23, offset 0xe4 + {value: 0x0000, lo: 0x03}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + {value: 0x2758, lo: 0x9c, hi: 0x9c}, + {value: 0x275f, lo: 0x9d, hi: 0x9d}, + // Block 0x24, offset 0xe8 + {value: 0x0000, lo: 0x05}, + {value: 0x03fe, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xee + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x4735, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x4740, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0xff + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0x10b + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0x10d + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0x113 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0x115 + {value: 0x0000, lo: 0x01}, + {value: 0x0402, lo: 0xbc, hi: 0xbc}, + // Block 0x2b, offset 0x117 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x119 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x11b + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x11d + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x11f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x121 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x124 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x127 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x129 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x12c + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x12f + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x133 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x139 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x140 + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x149 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x14b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x14e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x150 + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x15b + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00ec, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00fe, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x166 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x0532, lo: 0x91, hi: 0x91}, + {value: 0x43dc, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x19a0, lo: 0xa5, hi: 0xa5}, + {value: 0x1c8c, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x27c1, lo: 0xb3, hi: 0xb3}, + {value: 0x2935, lo: 0xb4, hi: 0xb4}, + {value: 0x27c8, lo: 0xb6, hi: 0xb6}, + {value: 0x293f, lo: 0xb7, hi: 0xb7}, + {value: 0x199a, lo: 0xbc, hi: 0xbc}, + {value: 0x43aa, lo: 0xbe, hi: 0xbe}, + // Block 0x3f, offset 0x174 + {value: 0x0002, lo: 0x0d}, + {value: 0x1a60, lo: 0x87, hi: 0x87}, + {value: 0x1a5d, lo: 0x88, hi: 0x88}, + {value: 0x199d, lo: 0x89, hi: 0x89}, + {value: 0x2ac5, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x055e, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x40, offset 0x182 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x055e, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x011f, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x1ac9, lo: 0xa8, hi: 0xa8}, + // Block 0x41, offset 0x192 + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x42, offset 0x1a0 + {value: 0x0007, lo: 0x06}, + {value: 0x22b0, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x43, offset 0x1a7 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x44, offset 0x1ad + {value: 0x017a, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0x27cf, lo: 0xac, hi: 0xad}, + {value: 0x27d6, lo: 0xaf, hi: 0xaf}, + {value: 0x2953, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x45, offset 0x1bc + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x46, offset 0x1c0 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x47, offset 0x1c2 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x48, offset 0x1c6 + {value: 0x0000, lo: 0x01}, + {value: 0x2ad2, lo: 0x8c, hi: 0x8c}, + // Block 0x49, offset 0x1c8 + {value: 0x0266, lo: 0x02}, + {value: 0x1cbc, lo: 0xb4, hi: 0xb4}, + {value: 0x1a5a, lo: 0xb5, hi: 0xb6}, + // Block 0x4a, offset 0x1cb + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x4b, offset 0x1cd + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4c, offset 0x1d0 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x4d, offset 0x1d2 + {value: 0x0000, lo: 0x02}, + {value: 0x057a, lo: 0xaf, hi: 0xaf}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x1d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x4f, offset 0x1d7 + {value: 0x0000, lo: 0x01}, + {value: 0x0ebe, lo: 0x9f, hi: 0x9f}, + // Block 0x50, offset 0x1d9 + {value: 0x0000, lo: 0x01}, + {value: 0x172a, lo: 0xb3, hi: 0xb3}, + // Block 0x51, offset 0x1db + {value: 0x0004, lo: 0x0b}, + {value: 0x1692, lo: 0x80, hi: 0x82}, + {value: 0x16aa, lo: 0x83, hi: 0x83}, + {value: 0x16c2, lo: 0x84, hi: 0x85}, + {value: 0x16d2, lo: 0x86, hi: 0x89}, + {value: 0x16e6, lo: 0x8a, hi: 0x8c}, + {value: 0x16fa, lo: 0x8d, hi: 0x8d}, + {value: 0x1702, lo: 0x8e, hi: 0x8e}, + {value: 0x170a, lo: 0x8f, hi: 0x90}, + {value: 0x1716, lo: 0x91, hi: 0x93}, + {value: 0x1726, lo: 0x94, hi: 0x94}, + {value: 0x172e, lo: 0x95, hi: 0x95}, + // Block 0x52, offset 0x1e7 + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xae}, + {value: 0x8130, lo: 0xaf, hi: 0xaf}, + {value: 0x05ae, lo: 0xb6, hi: 0xb6}, + {value: 0x0982, lo: 0xb8, hi: 0xba}, + // Block 0x53, offset 0x1f1 + {value: 0x0006, lo: 0x09}, + {value: 0x0406, lo: 0xb1, hi: 0xb1}, + {value: 0x040a, lo: 0xb2, hi: 0xb2}, + {value: 0x4b7c, lo: 0xb3, hi: 0xb3}, + {value: 0x040e, lo: 0xb4, hi: 0xb4}, + {value: 0x4b82, lo: 0xb5, hi: 0xb6}, + {value: 0x0412, lo: 0xb7, hi: 0xb7}, + {value: 0x0416, lo: 0xb8, hi: 0xb8}, + {value: 0x041a, lo: 0xb9, hi: 0xb9}, + {value: 0x4b8e, lo: 0xba, hi: 0xbf}, + // Block 0x54, offset 0x1fb + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x55, offset 0x1fe + {value: 0x0000, lo: 0x03}, + {value: 0x02d8, lo: 0x9c, hi: 0x9c}, + {value: 0x02de, lo: 0x9d, hi: 0x9d}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x56, offset 0x202 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x57, offset 0x204 + {value: 0x0000, lo: 0x01}, + {value: 0x173e, lo: 0xb0, hi: 0xb0}, + // Block 0x58, offset 0x206 + {value: 0x0006, lo: 0x04}, + {value: 0x0047, lo: 0xb2, hi: 0xb3}, + {value: 0x0063, lo: 0xb4, hi: 0xb4}, + {value: 0x00dd, lo: 0xb8, hi: 0xb8}, + {value: 0x00e9, lo: 0xb9, hi: 0xb9}, + // Block 0x59, offset 0x20b + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x5a, offset 0x20e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x5b, offset 0x211 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x5c, offset 0x213 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x5d, offset 0x215 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x5e, offset 0x217 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x5f, offset 0x219 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x60, offset 0x21f + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x61, offset 0x222 + {value: 0x000c, lo: 0x04}, + {value: 0x173a, lo: 0x9c, hi: 0x9d}, + {value: 0x014f, lo: 0x9e, hi: 0x9e}, + {value: 0x174a, lo: 0x9f, hi: 0x9f}, + {value: 0x01a6, lo: 0xa9, hi: 0xa9}, + // Block 0x62, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x63, offset 0x229 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x64, offset 0x230 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x65, offset 0x236 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x66, offset 0x23c + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x67, offset 0x244 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x68, offset 0x24a + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x69, offset 0x250 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x6a, offset 0x256 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x6b, offset 0x25a + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6c, offset 0x25c + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x6d, offset 0x25e + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x6e, offset 0x260 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x6f, offset 0x262 + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x70, offset 0x268 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x71, offset 0x26b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x72, offset 0x26d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x73, offset 0x26f + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x271 + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x75, offset 0x277 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x76, offset 0x27b + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x77, offset 0x27f + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x78, offset 0x287 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x79, offset 0x28e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7a, offset 0x291 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7b, offset 0x294 + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x7c, offset 0x296 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x7d, offset 0x299 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x7e, offset 0x2a1 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x7f, offset 0x2a5 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x80, offset 0x2ac + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x81, offset 0x2af + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x82, offset 0x2b5 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x83, offset 0x2b7 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x84, offset 0x2b9 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x85, offset 0x2bc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x86, offset 0x2be + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x87, offset 0x2c1 + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x88, offset 0x2c6 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x89, offset 0x2c8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8a, offset 0x2ca + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8b, offset 0x2cc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8c, offset 0x2ce + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x8d, offset 0x2d0 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x8e, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x8f, offset 0x2d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x90, offset 0x2d7 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x91, offset 0x2d9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x92, offset 0x2db + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x93, offset 0x2dd + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x94, offset 0x2df + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x95, offset 0x2ec + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x96, offset 0x2f6 + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x97, offset 0x2f8 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x98, offset 0x2fa + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x99, offset 0x2fe + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x9a, offset 0x303 + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x9b, offset 0x30f + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x9c, offset 0x314 + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x9d, offset 0x31d + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x9e, offset 0x323 + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x9f, offset 0x328 + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0xa0, offset 0x32c + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0xa1, offset 0x331 + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0xa2, offset 0x335 + {value: 0x0003, lo: 0x0f}, + {value: 0x023c, lo: 0x80, hi: 0x80}, + {value: 0x0556, lo: 0x81, hi: 0x81}, + {value: 0x023f, lo: 0x82, hi: 0x9a}, + {value: 0x0552, lo: 0x9b, hi: 0x9b}, + {value: 0x024b, lo: 0x9c, hi: 0x9c}, + {value: 0x0254, lo: 0x9d, hi: 0x9d}, + {value: 0x025a, lo: 0x9e, hi: 0x9e}, + {value: 0x027e, lo: 0x9f, hi: 0x9f}, + {value: 0x026f, lo: 0xa0, hi: 0xa0}, + {value: 0x026c, lo: 0xa1, hi: 0xa1}, + {value: 0x01f7, lo: 0xa2, hi: 0xb2}, + {value: 0x020c, lo: 0xb3, hi: 0xb3}, + {value: 0x022a, lo: 0xb4, hi: 0xba}, + {value: 0x0556, lo: 0xbb, hi: 0xbb}, + {value: 0x023f, lo: 0xbc, hi: 0xbf}, + // Block 0xa3, offset 0x345 + {value: 0x0003, lo: 0x0d}, + {value: 0x024b, lo: 0x80, hi: 0x94}, + {value: 0x0552, lo: 0x95, hi: 0x95}, + {value: 0x024b, lo: 0x96, hi: 0x96}, + {value: 0x0254, lo: 0x97, hi: 0x97}, + {value: 0x025a, lo: 0x98, hi: 0x98}, + {value: 0x027e, lo: 0x99, hi: 0x99}, + {value: 0x026f, lo: 0x9a, hi: 0x9a}, + {value: 0x026c, lo: 0x9b, hi: 0x9b}, + {value: 0x01f7, lo: 0x9c, hi: 0xac}, + {value: 0x020c, lo: 0xad, hi: 0xad}, + {value: 0x022a, lo: 0xae, hi: 0xb4}, + {value: 0x0556, lo: 0xb5, hi: 0xb5}, + {value: 0x023f, lo: 0xb6, hi: 0xbf}, + // Block 0xa4, offset 0x353 + {value: 0x0003, lo: 0x0d}, + {value: 0x025d, lo: 0x80, hi: 0x8e}, + {value: 0x0552, lo: 0x8f, hi: 0x8f}, + {value: 0x024b, lo: 0x90, hi: 0x90}, + {value: 0x0254, lo: 0x91, hi: 0x91}, + {value: 0x025a, lo: 0x92, hi: 0x92}, + {value: 0x027e, lo: 0x93, hi: 0x93}, + {value: 0x026f, lo: 0x94, hi: 0x94}, + {value: 0x026c, lo: 0x95, hi: 0x95}, + {value: 0x01f7, lo: 0x96, hi: 0xa6}, + {value: 0x020c, lo: 0xa7, hi: 0xa7}, + {value: 0x022a, lo: 0xa8, hi: 0xae}, + {value: 0x0556, lo: 0xaf, hi: 0xaf}, + {value: 0x023f, lo: 0xb0, hi: 0xbf}, + // Block 0xa5, offset 0x361 + {value: 0x0003, lo: 0x0d}, + {value: 0x026f, lo: 0x80, hi: 0x88}, + {value: 0x0552, lo: 0x89, hi: 0x89}, + {value: 0x024b, lo: 0x8a, hi: 0x8a}, + {value: 0x0254, lo: 0x8b, hi: 0x8b}, + {value: 0x025a, lo: 0x8c, hi: 0x8c}, + {value: 0x027e, lo: 0x8d, hi: 0x8d}, + {value: 0x026f, lo: 0x8e, hi: 0x8e}, + {value: 0x026c, lo: 0x8f, hi: 0x8f}, + {value: 0x01f7, lo: 0x90, hi: 0xa0}, + {value: 0x020c, lo: 0xa1, hi: 0xa1}, + {value: 0x022a, lo: 0xa2, hi: 0xa8}, + {value: 0x0556, lo: 0xa9, hi: 0xa9}, + {value: 0x023f, lo: 0xaa, hi: 0xbf}, + // Block 0xa6, offset 0x36f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0xa7, offset 0x371 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0xa8, offset 0x373 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0xa9, offset 0x375 + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xaa, offset 0x379 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xab, offset 0x37b + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xac, offset 0x37e + {value: 0x0002, lo: 0x0a}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x1a7e, lo: 0x8a, hi: 0x8a}, + {value: 0x1ab1, lo: 0x8b, hi: 0x8b}, + {value: 0x1acc, lo: 0x8c, hi: 0x8c}, + {value: 0x1ad2, lo: 0x8d, hi: 0x8d}, + {value: 0x1cf0, lo: 0x8e, hi: 0x8e}, + {value: 0x1ade, lo: 0x8f, hi: 0x8f}, + {value: 0x1aa8, lo: 0xaa, hi: 0xaa}, + {value: 0x1aab, lo: 0xab, hi: 0xab}, + {value: 0x1aae, lo: 0xac, hi: 0xac}, + // Block 0xad, offset 0x389 + {value: 0x0000, lo: 0x01}, + {value: 0x1a6c, lo: 0x90, hi: 0x90}, + // Block 0xae, offset 0x38b + {value: 0x0028, lo: 0x09}, + {value: 0x2999, lo: 0x80, hi: 0x80}, + {value: 0x295d, lo: 0x81, hi: 0x81}, + {value: 0x2967, lo: 0x82, hi: 0x82}, + {value: 0x297b, lo: 0x83, hi: 0x84}, + {value: 0x2985, lo: 0x85, hi: 0x86}, + {value: 0x2971, lo: 0x87, hi: 0x87}, + {value: 0x298f, lo: 0x88, hi: 0x88}, + {value: 0x0c6a, lo: 0x90, hi: 0x90}, + {value: 0x09e2, lo: 0x91, hi: 0x91}, + // Block 0xaf, offset 0x395 + {value: 0x0002, lo: 0x01}, + {value: 0x0021, lo: 0xb0, hi: 0xb9}, +} + +// recompMap: 7528 bytes (entries only) +var recompMap map[uint32]rune +var recompMapOnce sync.Once + +const recompMapPacked = "" + + "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0 + "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1 + "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2 + "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3 + "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4 + "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5 + "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7 + "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8 + "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9 + "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA + "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB + "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC + "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD + "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE + "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF + "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1 + "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2 + "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3 + "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4 + "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5 + "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6 + "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9 + "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA + "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB + "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC + "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD + "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0 + "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1 + "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2 + "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3 + "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4 + "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5 + "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7 + "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8 + "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9 + "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA + "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB + "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC + "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED + "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE + "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF + "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1 + "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2 + "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3 + "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4 + "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5 + "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6 + "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9 + "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA + "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB + "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC + "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD + "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF + "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100 + "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101 + "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102 + "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103 + "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104 + "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105 + "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106 + "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107 + "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108 + "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109 + "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A + "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B + "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C + "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D + "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E + "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F + "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112 + "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113 + "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114 + "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115 + "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116 + "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117 + "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118 + "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119 + "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A + "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B + "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C + "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D + "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E + "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F + "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120 + "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121 + "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122 + "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123 + "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124 + "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125 + "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128 + "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129 + "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A + "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B + "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C + "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D + "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E + "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F + "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130 + "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134 + "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135 + "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136 + "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137 + "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139 + "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A + "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B + "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C + "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D + "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E + "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143 + "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144 + "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145 + "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146 + "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147 + "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148 + "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C + "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D + "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E + "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F + "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150 + "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151 + "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154 + "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155 + "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156 + "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157 + "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158 + "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159 + "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A + "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B + "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C + "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D + "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E + "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F + "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160 + "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161 + "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162 + "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163 + "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164 + "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165 + "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168 + "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169 + "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A + "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B + "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C + "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D + "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E + "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F + "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170 + "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171 + "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172 + "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173 + "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174 + "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175 + "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176 + "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177 + "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178 + "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179 + "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A + "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B + "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C + "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D + "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E + "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0 + "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1 + "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF + "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0 + "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD + "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE + "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF + "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0 + "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1 + "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2 + "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3 + "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4 + "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5 + "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6 + "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7 + "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8 + "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9 + "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA + "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB + "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC + "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE + "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF + "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0 + "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1 + "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2 + "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3 + "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6 + "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7 + "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8 + "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9 + "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA + "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB + "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC + "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED + "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE + "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF + "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0 + "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4 + "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5 + "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8 + "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9 + "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA + "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB + "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC + "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD + "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE + "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF + "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200 + "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201 + "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202 + "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203 + "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204 + "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205 + "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206 + "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207 + "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208 + "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209 + "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A + "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B + "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C + "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D + "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E + "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F + "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210 + "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211 + "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212 + "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213 + "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214 + "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215 + "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216 + "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217 + "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218 + "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219 + "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A + "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B + "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E + "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F + "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226 + "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227 + "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228 + "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229 + "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A + "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B + "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C + "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D + "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E + "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F + "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230 + "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231 + "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232 + "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233 + "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385 + "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386 + "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388 + "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389 + "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A + "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C + "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E + "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F + "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390 + "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA + "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB + "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC + "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD + "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE + "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF + "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0 + "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA + "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB + "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC + "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD + "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE + "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3 + "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4 + "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400 + "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401 + "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403 + "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407 + "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C + "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D + "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E + "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419 + "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439 + "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450 + "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451 + "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453 + "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457 + "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C + "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D + "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E + "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476 + "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477 + "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1 + "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2 + "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0 + "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1 + "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2 + "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3 + "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6 + "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7 + "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA + "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB + "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC + "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD + "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE + "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF + "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2 + "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3 + "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4 + "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5 + "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6 + "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7 + "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA + "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB + "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC + "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED + "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE + "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF + "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0 + "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1 + "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2 + "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3 + "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4 + "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5 + "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8 + "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9 + "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622 + "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623 + "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624 + "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625 + "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626 + "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0 + "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2 + "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3 + "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929 + "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931 + "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934 + "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB + "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC + "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48 + "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B + "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C + "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94 + "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA + "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB + "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC + "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48 + "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0 + "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7 + "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8 + "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA + "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB + "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A + "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B + "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C + "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA + "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC + "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD + "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE + "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026 + "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06 + "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08 + "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A + "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C + "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E + "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12 + "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B + "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D + "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40 + "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41 + "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43 + "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00 + "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01 + "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02 + "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03 + "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04 + "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05 + "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06 + "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07 + "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08 + "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09 + "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A + "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B + "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C + "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D + "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E + "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F + "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10 + "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11 + "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12 + "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13 + "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14 + "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15 + "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16 + "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17 + "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18 + "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19 + "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A + "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B + "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C + "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D + "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E + "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F + "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20 + "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21 + "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22 + "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23 + "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24 + "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25 + "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26 + "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27 + "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28 + "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29 + "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A + "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B + "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C + "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D + "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E + "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F + "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30 + "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31 + "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32 + "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33 + "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34 + "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35 + "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36 + "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37 + "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38 + "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39 + "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A + "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B + "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C + "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D + "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E + "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F + "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40 + "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41 + "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42 + "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43 + "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44 + "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45 + "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46 + "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47 + "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48 + "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49 + "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A + "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B + "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C + "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D + "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E + "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F + "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50 + "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51 + "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52 + "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53 + "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54 + "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55 + "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56 + "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57 + "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58 + "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59 + "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A + "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B + "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C + "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D + "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E + "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F + "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60 + "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61 + "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62 + "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63 + "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64 + "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65 + "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66 + "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67 + "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68 + "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69 + "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A + "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B + "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C + "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D + "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E + "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F + "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70 + "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71 + "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72 + "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73 + "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74 + "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75 + "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76 + "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77 + "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78 + "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79 + "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A + "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B + "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C + "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D + "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E + "\x00v\x03#\x00\x00\x1e\x7f" + // 0x00760323: 0x00001E7F + "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80 + "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81 + "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82 + "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83 + "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84 + "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85 + "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86 + "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87 + "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88 + "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89 + "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A + "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B + "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C + "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D + "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E + "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F + "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90 + "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91 + "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92 + "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93 + "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94 + "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95 + "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96 + "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97 + "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98 + "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99 + "\x01\x7f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B + "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0 + "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1 + "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2 + "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3 + "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4 + "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5 + "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6 + "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7 + "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8 + "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9 + "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA + "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB + "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC + "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD + "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE + "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF + "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0 + "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1 + "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2 + "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3 + "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4 + "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5 + "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6 + "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7 + "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8 + "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9 + "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA + "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB + "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC + "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD + "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE + "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF + "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0 + "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1 + "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2 + "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3 + "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4 + "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5 + "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6 + "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7 + "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8 + "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9 + "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA + "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB + "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC + "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD + "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE + "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF + "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0 + "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1 + "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2 + "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3 + "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4 + "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5 + "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6 + "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7 + "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8 + "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9 + "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA + "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB + "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC + "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD + "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE + "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF + "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0 + "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1 + "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2 + "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3 + "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4 + "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5 + "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6 + "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7 + "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8 + "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9 + "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA + "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB + "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC + "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED + "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE + "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF + "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0 + "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1 + "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2 + "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3 + "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4 + "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5 + "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6 + "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7 + "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8 + "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9 + "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00 + "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01 + "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02 + "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03 + "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04 + "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05 + "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06 + "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07 + "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08 + "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09 + "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A + "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B + "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C + "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D + "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E + "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F + "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10 + "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11 + "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12 + "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13 + "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14 + "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15 + "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18 + "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19 + "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A + "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B + "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C + "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D + "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20 + "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21 + "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22 + "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23 + "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24 + "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25 + "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26 + "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27 + "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28 + "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29 + "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A + "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B + "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C + "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D + "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E + "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F + "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30 + "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31 + "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32 + "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33 + "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34 + "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35 + "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36 + "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37 + "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38 + "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39 + "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A + "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B + "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C + "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D + "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E + "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F + "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40 + "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41 + "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42 + "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43 + "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44 + "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45 + "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48 + "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49 + "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A + "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B + "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C + "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D + "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50 + "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51 + "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52 + "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53 + "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54 + "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55 + "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56 + "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57 + "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59 + "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B + "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D + "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F + "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60 + "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61 + "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62 + "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63 + "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64 + "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65 + "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66 + "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67 + "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68 + "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69 + "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A + "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B + "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C + "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D + "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E + "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F + "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70 + "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72 + "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74 + "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76 + "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78 + "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A + "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C + "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80 + "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81 + "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82 + "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83 + "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84 + "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85 + "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86 + "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87 + "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88 + "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89 + "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A + "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B + "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C + "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D + "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E + "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F + "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90 + "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91 + "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92 + "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93 + "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94 + "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95 + "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96 + "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97 + "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98 + "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99 + "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A + "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B + "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C + "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D + "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E + "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F + "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0 + "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1 + "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2 + "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3 + "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4 + "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5 + "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6 + "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7 + "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8 + "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9 + "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA + "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB + "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC + "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD + "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE + "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF + "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0 + "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1 + "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2 + "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3 + "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4 + "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6 + "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7 + "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8 + "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9 + "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA + "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC + "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1 + "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2 + "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3 + "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4 + "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6 + "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7 + "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8 + "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA + "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC + "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD + "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE + "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF + "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0 + "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1 + "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2 + "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6 + "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7 + "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8 + "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9 + "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA + "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD + "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE + "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF + "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0 + "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1 + "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2 + "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4 + "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5 + "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6 + "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7 + "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8 + "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9 + "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA + "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC + "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED + "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2 + "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3 + "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4 + "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6 + "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7 + "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8 + "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA + "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC + "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A + "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B + "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE + "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD + "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE + "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF + "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204 + "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209 + "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C + "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224 + "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226 + "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241 + "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244 + "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247 + "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249 + "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260 + "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262 + "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D + "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E + "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F + "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270 + "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271 + "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274 + "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275 + "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278 + "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279 + "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280 + "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281 + "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284 + "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285 + "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288 + "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289 + "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC + "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD + "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE + "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF + "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0 + "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1 + "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2 + "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3 + "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA + "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB + "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC + "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED + "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C + "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E + "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050 + "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052 + "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054 + "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056 + "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058 + "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A + "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C + "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E + "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060 + "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062 + "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065 + "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067 + "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069 + "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070 + "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071 + "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073 + "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074 + "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076 + "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077 + "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079 + "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A + "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C + "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D + "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094 + "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E + "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC + "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE + "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0 + "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2 + "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4 + "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6 + "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8 + "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA + "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC + "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE + "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0 + "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2 + "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5 + "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7 + "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9 + "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0 + "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1 + "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3 + "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4 + "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6 + "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7 + "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9 + "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA + "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC + "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD + "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4 + "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7 + "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8 + "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9 + "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA + "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE + "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A + "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C + "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB + "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E + "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F + "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B + "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C + "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB + "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC + "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE + "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA + "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB + "\x195\x190\x00\x01\x198" + // 0x19351930: 0x00011938 + "" + // Total size of tables: 56KB (57068 bytes) diff --git a/vendor/golang.org/x/text/width/tables13.0.0.go b/vendor/golang.org/x/text/width/tables13.0.0.go index ab258e3848..b1fcb522cb 100644 --- a/vendor/golang.org/x/text/width/tables13.0.0.go +++ b/vendor/golang.org/x/text/width/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package width diff --git a/vendor/golang.org/x/text/width/tables15.0.0.go b/vendor/golang.org/x/text/width/tables15.0.0.go new file mode 100644 index 0000000000..4b91e3384d --- /dev/null +++ b/vendor/golang.org/x/text/width/tables15.0.0.go @@ -0,0 +1,1368 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package width + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *widthTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = widthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *widthTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *widthTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = widthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *widthTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// widthTrie. Total size: 14912 bytes (14.56 KiB). Checksum: 4468b6cd178303d2. +type widthTrie struct{} + +func newWidthTrie(i int) *widthTrie { + return &widthTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *widthTrie) lookupValue(n uint32, b byte) uint16 { + switch { + default: + return uint16(widthValues[n<<6+uint32(b)]) + } +} + +// widthValues: 105 blocks, 6720 entries, 13440 bytes +// The third block is the zero block. +var widthValues = [6720]uint16{ + // Block 0x0, offset 0x0 + 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002, + 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002, + 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002, + 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002, + 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002, + 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002, + // Block 0x1, offset 0x40 + 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003, + 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003, + 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003, + 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003, + 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003, + 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004, + 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004, + 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004, + 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004, + 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004, + 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005, + 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000, + 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008, + 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000, + 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000, + 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000, + // Block 0x4, offset 0x100 + 0x106: 0x2000, + 0x110: 0x2000, + 0x117: 0x2000, + 0x118: 0x2000, + 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000, + 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000, + 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000, + 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000, + 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000, + 0x13c: 0x2000, 0x13e: 0x2000, + // Block 0x5, offset 0x140 + 0x141: 0x2000, + 0x151: 0x2000, + 0x153: 0x2000, + 0x15b: 0x2000, + 0x166: 0x2000, 0x167: 0x2000, + 0x16b: 0x2000, + 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000, + 0x178: 0x2000, + 0x17f: 0x2000, + // Block 0x6, offset 0x180 + 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000, + 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000, + 0x18d: 0x2000, + 0x192: 0x2000, 0x193: 0x2000, + 0x1a6: 0x2000, 0x1a7: 0x2000, + 0x1ab: 0x2000, + // Block 0x7, offset 0x1c0 + 0x1ce: 0x2000, 0x1d0: 0x2000, + 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000, + 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000, + // Block 0x8, offset 0x200 + 0x211: 0x2000, + 0x221: 0x2000, + // Block 0x9, offset 0x240 + 0x244: 0x2000, + 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000, + 0x24d: 0x2000, 0x250: 0x2000, + 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000, + 0x25f: 0x2000, + // Block 0xa, offset 0x280 + 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000, + 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000, + 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000, + 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000, + 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000, + 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000, + 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000, + 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000, + 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000, + 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000, + 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000, + 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000, + 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000, + 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000, + 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000, + 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000, + 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000, + 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000, + // Block 0xc, offset 0x300 + 0x311: 0x2000, + 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000, + 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000, + 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000, + 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000, + 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000, + 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000, + 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000, + // Block 0xd, offset 0x340 + 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000, + 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000, + // Block 0xe, offset 0x380 + 0x381: 0x2000, + 0x390: 0x2000, 0x391: 0x2000, + 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000, + 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000, + 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000, + 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000, + 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000, + 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000, + 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000, + 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000, + 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000, + 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000, + // Block 0x10, offset 0x400 + 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000, + 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000, + 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000, + 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000, + 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000, + 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000, + 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000, + 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000, + 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000, + 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000, + 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000, + // Block 0x11, offset 0x440 + 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000, + 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000, + 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000, + 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000, + 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000, + 0x45e: 0x4000, 0x45f: 0x4000, + // Block 0x12, offset 0x480 + 0x490: 0x2000, + 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000, + 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000, + 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000, + 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000, + 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000, + 0x4bb: 0x2000, + 0x4be: 0x2000, + // Block 0x13, offset 0x4c0 + 0x4f4: 0x2000, + 0x4ff: 0x2000, + // Block 0x14, offset 0x500 + 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000, + 0x529: 0xa009, + 0x52c: 0x2000, + // Block 0x15, offset 0x540 + 0x543: 0x2000, 0x545: 0x2000, + 0x549: 0x2000, + 0x553: 0x2000, 0x556: 0x2000, + 0x561: 0x2000, 0x562: 0x2000, + 0x566: 0x2000, + 0x56b: 0x2000, + // Block 0x16, offset 0x580 + 0x593: 0x2000, 0x594: 0x2000, + 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000, + 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000, + 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000, + 0x5aa: 0x2000, 0x5ab: 0x2000, + 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000, + 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000, + // Block 0x17, offset 0x5c0 + 0x5c9: 0x2000, + 0x5d0: 0x200a, 0x5d1: 0x200b, + 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000, + 0x5d8: 0x2000, 0x5d9: 0x2000, + 0x5f8: 0x2000, 0x5f9: 0x2000, + // Block 0x18, offset 0x600 + 0x612: 0x2000, 0x614: 0x2000, + 0x627: 0x2000, + // Block 0x19, offset 0x640 + 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000, + 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000, + 0x64f: 0x2000, 0x651: 0x2000, + 0x655: 0x2000, + 0x65a: 0x2000, 0x65d: 0x2000, + 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000, + 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000, + 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000, + 0x674: 0x2000, 0x675: 0x2000, + 0x676: 0x2000, 0x677: 0x2000, + 0x67c: 0x2000, 0x67d: 0x2000, + // Block 0x1a, offset 0x680 + 0x688: 0x2000, + 0x68c: 0x2000, + 0x692: 0x2000, + 0x6a0: 0x2000, 0x6a1: 0x2000, + 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000, + 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000, + // Block 0x1b, offset 0x6c0 + 0x6c2: 0x2000, 0x6c3: 0x2000, + 0x6c6: 0x2000, 0x6c7: 0x2000, + 0x6d5: 0x2000, + 0x6d9: 0x2000, + 0x6e5: 0x2000, + 0x6ff: 0x2000, + // Block 0x1c, offset 0x700 + 0x712: 0x2000, + 0x71a: 0x4000, 0x71b: 0x4000, + 0x729: 0x4000, + 0x72a: 0x4000, + // Block 0x1d, offset 0x740 + 0x769: 0x4000, + 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000, + 0x770: 0x4000, 0x773: 0x4000, + // Block 0x1e, offset 0x780 + 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000, + 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000, + 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000, + 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000, + 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000, + 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000, + 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000, + 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000, + 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000, + 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000, + 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000, + 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000, + 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000, + 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000, + 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000, + 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000, + // Block 0x20, offset 0x800 + 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000, + 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000, + 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000, + 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000, + 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000, + 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000, + 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000, + 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000, + 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000, + 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000, + 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000, + // Block 0x21, offset 0x840 + 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000, + 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000, + 0x850: 0x2000, 0x851: 0x2000, + 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000, + 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000, + 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000, + 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000, + 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000, + 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000, + // Block 0x22, offset 0x880 + 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000, + 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000, + 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000, + 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000, + 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000, + 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000, + 0x8b2: 0x2000, 0x8b3: 0x2000, + 0x8b6: 0x2000, 0x8b7: 0x2000, + 0x8bc: 0x2000, 0x8bd: 0x2000, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x2000, 0x8c1: 0x2000, + 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f, + 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000, + 0x8e2: 0x2000, 0x8e3: 0x2000, + 0x8e4: 0x2000, 0x8e5: 0x2000, + 0x8ef: 0x2000, + 0x8fd: 0x4000, 0x8fe: 0x4000, + // Block 0x24, offset 0x900 + 0x905: 0x2000, + 0x906: 0x2000, 0x909: 0x2000, + 0x90e: 0x2000, 0x90f: 0x2000, + 0x914: 0x4000, 0x915: 0x4000, + 0x91c: 0x2000, + 0x91e: 0x2000, + // Block 0x25, offset 0x940 + 0x940: 0x2000, 0x942: 0x2000, + 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000, + 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000, + 0x952: 0x4000, 0x953: 0x4000, + 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000, + 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000, + 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000, + 0x97f: 0x4000, + // Block 0x26, offset 0x980 + 0x993: 0x4000, + 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000, + 0x9aa: 0x4000, 0x9ab: 0x4000, + 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000, + // Block 0x27, offset 0x9c0 + 0x9c4: 0x4000, 0x9c5: 0x4000, + 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000, + 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000, + 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000, + 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000, + 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000, + 0x9e8: 0x2000, 0x9e9: 0x2000, + 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000, + 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000, + 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000, + 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000, + // Block 0x28, offset 0xa00 + 0xa05: 0x4000, + 0xa0a: 0x4000, 0xa0b: 0x4000, + 0xa28: 0x4000, + 0xa3d: 0x2000, + // Block 0x29, offset 0xa40 + 0xa4c: 0x4000, 0xa4e: 0x4000, + 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000, + 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000, + 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000, + // Block 0x2a, offset 0xa80 + 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000, + 0xab0: 0x4000, + 0xabf: 0x4000, + // Block 0x2b, offset 0xac0 + 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000, + 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000, + // Block 0x2c, offset 0xb00 + 0xb05: 0x6010, + 0xb06: 0x6011, + // Block 0x2d, offset 0xb40 + 0xb5b: 0x4000, 0xb5c: 0x4000, + // Block 0x2e, offset 0xb80 + 0xb90: 0x4000, + 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000, + 0xb98: 0x2000, 0xb99: 0x2000, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000, + 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000, + 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000, + 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000, + 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000, + 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000, + 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000, + 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000, + 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000, + 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000, + 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000, + // Block 0x30, offset 0xc00 + 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000, + 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000, + 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000, + 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000, + 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000, + 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000, + 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000, + 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000, + 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000, + // Block 0x31, offset 0xc40 + 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000, + 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000, + 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000, + 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000, + 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000, + 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000, + // Block 0x32, offset 0xc80 + 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000, + 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000, + 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000, + 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000, + 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000, + 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000, + 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000, + 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000, + 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000, + 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000, + 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000, + // Block 0x33, offset 0xcc0 + 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000, + 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000, + 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000, + 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000, + 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000, + 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000, + 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000, + 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000, + 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000, + 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000, + 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000, + // Block 0x34, offset 0xd00 + 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000, + 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000, + 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000, + 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000, + 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000, + 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a, + 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020, + 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023, + 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026, + 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028, + 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029, + // Block 0x35, offset 0xd40 + 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000, + 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f, + 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000, + 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000, + 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000, + 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036, + 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038, + 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035, + 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000, + 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d, + 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000, + // Block 0x36, offset 0xd80 + 0xd85: 0x4000, + 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000, + 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000, + 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000, + 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000, + 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000, + 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000, + 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000, 0xdae: 0x4000, 0xdaf: 0x4000, + 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e, + 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e, + 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037, + 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037, + 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040, + 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044, + 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045, + 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c, + 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000, + 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000, + 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000, + 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000, + 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000, + // Block 0x38, offset 0xe00 + 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000, + 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000, + 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000, + 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000, + 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000, + 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000, + 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000, + 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000, + 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000, + 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000, 0xe3b: 0x4000, + 0xe3c: 0x4000, 0xe3d: 0x4000, 0xe3e: 0x4000, 0xe3f: 0x4000, + // Block 0x39, offset 0xe40 + 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000, + 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000, + 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000, + 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000, + 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000, + 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000, + 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000, + 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000, + 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000, + // Block 0x3a, offset 0xe80 + 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000, + 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000, + 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000, + 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000, + 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000, + 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000, + 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000, + 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000, + 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000, + 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000, + 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000, + // Block 0x3b, offset 0xec0 + 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000, + 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000, + 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000, + 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000, + 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000, + 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000, + 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000, + 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000, + 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000, + 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000, + 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000, + // Block 0x3c, offset 0xf00 + 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000, + 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000, + 0xf0c: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000, + 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000, + 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000, + 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000, + 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000, + 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000, + 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000, + 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000, + 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000, 0xf3f: 0x4000, + // Block 0x3d, offset 0xf40 + 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000, + 0xf46: 0x4000, + // Block 0x3e, offset 0xf80 + 0xfa0: 0x4000, 0xfa1: 0x4000, 0xfa2: 0x4000, 0xfa3: 0x4000, + 0xfa4: 0x4000, 0xfa5: 0x4000, 0xfa6: 0x4000, 0xfa7: 0x4000, 0xfa8: 0x4000, 0xfa9: 0x4000, + 0xfaa: 0x4000, 0xfab: 0x4000, 0xfac: 0x4000, 0xfad: 0x4000, 0xfae: 0x4000, 0xfaf: 0x4000, + 0xfb0: 0x4000, 0xfb1: 0x4000, 0xfb2: 0x4000, 0xfb3: 0x4000, 0xfb4: 0x4000, 0xfb5: 0x4000, + 0xfb6: 0x4000, 0xfb7: 0x4000, 0xfb8: 0x4000, 0xfb9: 0x4000, 0xfba: 0x4000, 0xfbb: 0x4000, + 0xfbc: 0x4000, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x4000, 0xfc1: 0x4000, 0xfc2: 0x4000, 0xfc3: 0x4000, 0xfc4: 0x4000, 0xfc5: 0x4000, + 0xfc6: 0x4000, 0xfc7: 0x4000, 0xfc8: 0x4000, 0xfc9: 0x4000, 0xfca: 0x4000, 0xfcb: 0x4000, + 0xfcc: 0x4000, 0xfcd: 0x4000, 0xfce: 0x4000, 0xfcf: 0x4000, 0xfd0: 0x4000, 0xfd1: 0x4000, + 0xfd2: 0x4000, 0xfd3: 0x4000, 0xfd4: 0x4000, 0xfd5: 0x4000, 0xfd6: 0x4000, 0xfd7: 0x4000, + 0xfd8: 0x4000, 0xfd9: 0x4000, 0xfda: 0x4000, 0xfdb: 0x4000, 0xfdc: 0x4000, 0xfdd: 0x4000, + 0xfde: 0x4000, 0xfdf: 0x4000, 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000, + // Block 0x40, offset 0x1000 + 0x1000: 0x2000, 0x1001: 0x2000, 0x1002: 0x2000, 0x1003: 0x2000, 0x1004: 0x2000, 0x1005: 0x2000, + 0x1006: 0x2000, 0x1007: 0x2000, 0x1008: 0x2000, 0x1009: 0x2000, 0x100a: 0x2000, 0x100b: 0x2000, + 0x100c: 0x2000, 0x100d: 0x2000, 0x100e: 0x2000, 0x100f: 0x2000, 0x1010: 0x4000, 0x1011: 0x4000, + 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000, + 0x1018: 0x4000, 0x1019: 0x4000, + 0x1030: 0x4000, 0x1031: 0x4000, 0x1032: 0x4000, 0x1033: 0x4000, 0x1034: 0x4000, 0x1035: 0x4000, + 0x1036: 0x4000, 0x1037: 0x4000, 0x1038: 0x4000, 0x1039: 0x4000, 0x103a: 0x4000, 0x103b: 0x4000, + 0x103c: 0x4000, 0x103d: 0x4000, 0x103e: 0x4000, 0x103f: 0x4000, + // Block 0x41, offset 0x1040 + 0x1040: 0x4000, 0x1041: 0x4000, 0x1042: 0x4000, 0x1043: 0x4000, 0x1044: 0x4000, 0x1045: 0x4000, + 0x1046: 0x4000, 0x1047: 0x4000, 0x1048: 0x4000, 0x1049: 0x4000, 0x104a: 0x4000, 0x104b: 0x4000, + 0x104c: 0x4000, 0x104d: 0x4000, 0x104e: 0x4000, 0x104f: 0x4000, 0x1050: 0x4000, 0x1051: 0x4000, + 0x1052: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000, + 0x1058: 0x4000, 0x1059: 0x4000, 0x105a: 0x4000, 0x105b: 0x4000, 0x105c: 0x4000, 0x105d: 0x4000, + 0x105e: 0x4000, 0x105f: 0x4000, 0x1060: 0x4000, 0x1061: 0x4000, 0x1062: 0x4000, 0x1063: 0x4000, + 0x1064: 0x4000, 0x1065: 0x4000, 0x1066: 0x4000, 0x1068: 0x4000, 0x1069: 0x4000, + 0x106a: 0x4000, 0x106b: 0x4000, + // Block 0x42, offset 0x1080 + 0x1081: 0x9012, 0x1082: 0x9012, 0x1083: 0x9012, 0x1084: 0x9012, 0x1085: 0x9012, + 0x1086: 0x9012, 0x1087: 0x9012, 0x1088: 0x9012, 0x1089: 0x9012, 0x108a: 0x9012, 0x108b: 0x9012, + 0x108c: 0x9012, 0x108d: 0x9012, 0x108e: 0x9012, 0x108f: 0x9012, 0x1090: 0x9012, 0x1091: 0x9012, + 0x1092: 0x9012, 0x1093: 0x9012, 0x1094: 0x9012, 0x1095: 0x9012, 0x1096: 0x9012, 0x1097: 0x9012, + 0x1098: 0x9012, 0x1099: 0x9012, 0x109a: 0x9012, 0x109b: 0x9012, 0x109c: 0x9012, 0x109d: 0x9012, + 0x109e: 0x9012, 0x109f: 0x9012, 0x10a0: 0x9049, 0x10a1: 0x9049, 0x10a2: 0x9049, 0x10a3: 0x9049, + 0x10a4: 0x9049, 0x10a5: 0x9049, 0x10a6: 0x9049, 0x10a7: 0x9049, 0x10a8: 0x9049, 0x10a9: 0x9049, + 0x10aa: 0x9049, 0x10ab: 0x9049, 0x10ac: 0x9049, 0x10ad: 0x9049, 0x10ae: 0x9049, 0x10af: 0x9049, + 0x10b0: 0x9049, 0x10b1: 0x9049, 0x10b2: 0x9049, 0x10b3: 0x9049, 0x10b4: 0x9049, 0x10b5: 0x9049, + 0x10b6: 0x9049, 0x10b7: 0x9049, 0x10b8: 0x9049, 0x10b9: 0x9049, 0x10ba: 0x9049, 0x10bb: 0x9049, + 0x10bc: 0x9049, 0x10bd: 0x9049, 0x10be: 0x9049, 0x10bf: 0x9049, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x9049, 0x10c1: 0x9049, 0x10c2: 0x9049, 0x10c3: 0x9049, 0x10c4: 0x9049, 0x10c5: 0x9049, + 0x10c6: 0x9049, 0x10c7: 0x9049, 0x10c8: 0x9049, 0x10c9: 0x9049, 0x10ca: 0x9049, 0x10cb: 0x9049, + 0x10cc: 0x9049, 0x10cd: 0x9049, 0x10ce: 0x9049, 0x10cf: 0x9049, 0x10d0: 0x9049, 0x10d1: 0x9049, + 0x10d2: 0x9049, 0x10d3: 0x9049, 0x10d4: 0x9049, 0x10d5: 0x9049, 0x10d6: 0x9049, 0x10d7: 0x9049, + 0x10d8: 0x9049, 0x10d9: 0x9049, 0x10da: 0x9049, 0x10db: 0x9049, 0x10dc: 0x9049, 0x10dd: 0x9049, + 0x10de: 0x9049, 0x10df: 0x904a, 0x10e0: 0x904b, 0x10e1: 0xb04c, 0x10e2: 0xb04d, 0x10e3: 0xb04d, + 0x10e4: 0xb04e, 0x10e5: 0xb04f, 0x10e6: 0xb050, 0x10e7: 0xb051, 0x10e8: 0xb052, 0x10e9: 0xb053, + 0x10ea: 0xb054, 0x10eb: 0xb055, 0x10ec: 0xb056, 0x10ed: 0xb057, 0x10ee: 0xb058, 0x10ef: 0xb059, + 0x10f0: 0xb05a, 0x10f1: 0xb05b, 0x10f2: 0xb05c, 0x10f3: 0xb05d, 0x10f4: 0xb05e, 0x10f5: 0xb05f, + 0x10f6: 0xb060, 0x10f7: 0xb061, 0x10f8: 0xb062, 0x10f9: 0xb063, 0x10fa: 0xb064, 0x10fb: 0xb065, + 0x10fc: 0xb052, 0x10fd: 0xb066, 0x10fe: 0xb067, 0x10ff: 0xb055, + // Block 0x44, offset 0x1100 + 0x1100: 0xb068, 0x1101: 0xb069, 0x1102: 0xb06a, 0x1103: 0xb06b, 0x1104: 0xb05a, 0x1105: 0xb056, + 0x1106: 0xb06c, 0x1107: 0xb06d, 0x1108: 0xb06b, 0x1109: 0xb06e, 0x110a: 0xb06b, 0x110b: 0xb06f, + 0x110c: 0xb06f, 0x110d: 0xb070, 0x110e: 0xb070, 0x110f: 0xb071, 0x1110: 0xb056, 0x1111: 0xb072, + 0x1112: 0xb073, 0x1113: 0xb072, 0x1114: 0xb074, 0x1115: 0xb073, 0x1116: 0xb075, 0x1117: 0xb075, + 0x1118: 0xb076, 0x1119: 0xb076, 0x111a: 0xb077, 0x111b: 0xb077, 0x111c: 0xb073, 0x111d: 0xb078, + 0x111e: 0xb079, 0x111f: 0xb067, 0x1120: 0xb07a, 0x1121: 0xb07b, 0x1122: 0xb07b, 0x1123: 0xb07b, + 0x1124: 0xb07b, 0x1125: 0xb07b, 0x1126: 0xb07b, 0x1127: 0xb07b, 0x1128: 0xb07b, 0x1129: 0xb07b, + 0x112a: 0xb07b, 0x112b: 0xb07b, 0x112c: 0xb07b, 0x112d: 0xb07b, 0x112e: 0xb07b, 0x112f: 0xb07b, + 0x1130: 0xb07c, 0x1131: 0xb07c, 0x1132: 0xb07c, 0x1133: 0xb07c, 0x1134: 0xb07c, 0x1135: 0xb07c, + 0x1136: 0xb07c, 0x1137: 0xb07c, 0x1138: 0xb07c, 0x1139: 0xb07c, 0x113a: 0xb07c, 0x113b: 0xb07c, + 0x113c: 0xb07c, 0x113d: 0xb07c, 0x113e: 0xb07c, + // Block 0x45, offset 0x1140 + 0x1142: 0xb07d, 0x1143: 0xb07e, 0x1144: 0xb07f, 0x1145: 0xb080, + 0x1146: 0xb07f, 0x1147: 0xb07e, 0x114a: 0xb081, 0x114b: 0xb082, + 0x114c: 0xb083, 0x114d: 0xb07f, 0x114e: 0xb080, 0x114f: 0xb07f, + 0x1152: 0xb084, 0x1153: 0xb085, 0x1154: 0xb084, 0x1155: 0xb086, 0x1156: 0xb084, 0x1157: 0xb087, + 0x115a: 0xb088, 0x115b: 0xb089, 0x115c: 0xb08a, + 0x1160: 0x908b, 0x1161: 0x908b, 0x1162: 0x908c, 0x1163: 0x908d, + 0x1164: 0x908b, 0x1165: 0x908e, 0x1166: 0x908f, 0x1168: 0xb090, 0x1169: 0xb091, + 0x116a: 0xb092, 0x116b: 0xb091, 0x116c: 0xb093, 0x116d: 0xb094, 0x116e: 0xb095, + 0x117d: 0x2000, + // Block 0x46, offset 0x1180 + 0x11a0: 0x4000, 0x11a1: 0x4000, 0x11a2: 0x4000, 0x11a3: 0x4000, + 0x11a4: 0x4000, + 0x11b0: 0x4000, 0x11b1: 0x4000, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x4000, 0x11c1: 0x4000, 0x11c2: 0x4000, 0x11c3: 0x4000, 0x11c4: 0x4000, 0x11c5: 0x4000, + 0x11c6: 0x4000, 0x11c7: 0x4000, 0x11c8: 0x4000, 0x11c9: 0x4000, 0x11ca: 0x4000, 0x11cb: 0x4000, + 0x11cc: 0x4000, 0x11cd: 0x4000, 0x11ce: 0x4000, 0x11cf: 0x4000, 0x11d0: 0x4000, 0x11d1: 0x4000, + 0x11d2: 0x4000, 0x11d3: 0x4000, 0x11d4: 0x4000, 0x11d5: 0x4000, 0x11d6: 0x4000, 0x11d7: 0x4000, + 0x11d8: 0x4000, 0x11d9: 0x4000, 0x11da: 0x4000, 0x11db: 0x4000, 0x11dc: 0x4000, 0x11dd: 0x4000, + 0x11de: 0x4000, 0x11df: 0x4000, 0x11e0: 0x4000, 0x11e1: 0x4000, 0x11e2: 0x4000, 0x11e3: 0x4000, + 0x11e4: 0x4000, 0x11e5: 0x4000, 0x11e6: 0x4000, 0x11e7: 0x4000, 0x11e8: 0x4000, 0x11e9: 0x4000, + 0x11ea: 0x4000, 0x11eb: 0x4000, 0x11ec: 0x4000, 0x11ed: 0x4000, 0x11ee: 0x4000, 0x11ef: 0x4000, + 0x11f0: 0x4000, 0x11f1: 0x4000, 0x11f2: 0x4000, 0x11f3: 0x4000, 0x11f4: 0x4000, 0x11f5: 0x4000, + 0x11f6: 0x4000, 0x11f7: 0x4000, + // Block 0x48, offset 0x1200 + 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000, + 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000, + 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000, + 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, + // Block 0x49, offset 0x1240 + 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000, + 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, + // Block 0x4a, offset 0x1280 + 0x12b0: 0x4000, 0x12b1: 0x4000, 0x12b2: 0x4000, 0x12b3: 0x4000, 0x12b5: 0x4000, + 0x12b6: 0x4000, 0x12b7: 0x4000, 0x12b8: 0x4000, 0x12b9: 0x4000, 0x12ba: 0x4000, 0x12bb: 0x4000, + 0x12bd: 0x4000, 0x12be: 0x4000, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x4000, 0x12c1: 0x4000, 0x12c2: 0x4000, 0x12c3: 0x4000, 0x12c4: 0x4000, 0x12c5: 0x4000, + 0x12c6: 0x4000, 0x12c7: 0x4000, 0x12c8: 0x4000, 0x12c9: 0x4000, 0x12ca: 0x4000, 0x12cb: 0x4000, + 0x12cc: 0x4000, 0x12cd: 0x4000, 0x12ce: 0x4000, 0x12cf: 0x4000, 0x12d0: 0x4000, 0x12d1: 0x4000, + 0x12d2: 0x4000, 0x12d3: 0x4000, 0x12d4: 0x4000, 0x12d5: 0x4000, 0x12d6: 0x4000, 0x12d7: 0x4000, + 0x12d8: 0x4000, 0x12d9: 0x4000, 0x12da: 0x4000, 0x12db: 0x4000, 0x12dc: 0x4000, 0x12dd: 0x4000, + 0x12de: 0x4000, 0x12df: 0x4000, 0x12e0: 0x4000, 0x12e1: 0x4000, 0x12e2: 0x4000, + 0x12f2: 0x4000, + // Block 0x4c, offset 0x1300 + 0x1310: 0x4000, 0x1311: 0x4000, + 0x1312: 0x4000, 0x1315: 0x4000, + 0x1324: 0x4000, 0x1325: 0x4000, 0x1326: 0x4000, 0x1327: 0x4000, + 0x1330: 0x4000, 0x1331: 0x4000, 0x1332: 0x4000, 0x1333: 0x4000, 0x1334: 0x4000, 0x1335: 0x4000, + 0x1336: 0x4000, 0x1337: 0x4000, 0x1338: 0x4000, 0x1339: 0x4000, 0x133a: 0x4000, 0x133b: 0x4000, + 0x133c: 0x4000, 0x133d: 0x4000, 0x133e: 0x4000, 0x133f: 0x4000, + // Block 0x4d, offset 0x1340 + 0x1340: 0x4000, 0x1341: 0x4000, 0x1342: 0x4000, 0x1343: 0x4000, 0x1344: 0x4000, 0x1345: 0x4000, + 0x1346: 0x4000, 0x1347: 0x4000, 0x1348: 0x4000, 0x1349: 0x4000, 0x134a: 0x4000, 0x134b: 0x4000, + 0x134c: 0x4000, 0x134d: 0x4000, 0x134e: 0x4000, 0x134f: 0x4000, 0x1350: 0x4000, 0x1351: 0x4000, + 0x1352: 0x4000, 0x1353: 0x4000, 0x1354: 0x4000, 0x1355: 0x4000, 0x1356: 0x4000, 0x1357: 0x4000, + 0x1358: 0x4000, 0x1359: 0x4000, 0x135a: 0x4000, 0x135b: 0x4000, 0x135c: 0x4000, 0x135d: 0x4000, + 0x135e: 0x4000, 0x135f: 0x4000, 0x1360: 0x4000, 0x1361: 0x4000, 0x1362: 0x4000, 0x1363: 0x4000, + 0x1364: 0x4000, 0x1365: 0x4000, 0x1366: 0x4000, 0x1367: 0x4000, 0x1368: 0x4000, 0x1369: 0x4000, + 0x136a: 0x4000, 0x136b: 0x4000, 0x136c: 0x4000, 0x136d: 0x4000, 0x136e: 0x4000, 0x136f: 0x4000, + 0x1370: 0x4000, 0x1371: 0x4000, 0x1372: 0x4000, 0x1373: 0x4000, 0x1374: 0x4000, 0x1375: 0x4000, + 0x1376: 0x4000, 0x1377: 0x4000, 0x1378: 0x4000, 0x1379: 0x4000, 0x137a: 0x4000, 0x137b: 0x4000, + // Block 0x4e, offset 0x1380 + 0x1384: 0x4000, + // Block 0x4f, offset 0x13c0 + 0x13cf: 0x4000, + // Block 0x50, offset 0x1400 + 0x1400: 0x2000, 0x1401: 0x2000, 0x1402: 0x2000, 0x1403: 0x2000, 0x1404: 0x2000, 0x1405: 0x2000, + 0x1406: 0x2000, 0x1407: 0x2000, 0x1408: 0x2000, 0x1409: 0x2000, 0x140a: 0x2000, + 0x1410: 0x2000, 0x1411: 0x2000, + 0x1412: 0x2000, 0x1413: 0x2000, 0x1414: 0x2000, 0x1415: 0x2000, 0x1416: 0x2000, 0x1417: 0x2000, + 0x1418: 0x2000, 0x1419: 0x2000, 0x141a: 0x2000, 0x141b: 0x2000, 0x141c: 0x2000, 0x141d: 0x2000, + 0x141e: 0x2000, 0x141f: 0x2000, 0x1420: 0x2000, 0x1421: 0x2000, 0x1422: 0x2000, 0x1423: 0x2000, + 0x1424: 0x2000, 0x1425: 0x2000, 0x1426: 0x2000, 0x1427: 0x2000, 0x1428: 0x2000, 0x1429: 0x2000, + 0x142a: 0x2000, 0x142b: 0x2000, 0x142c: 0x2000, 0x142d: 0x2000, + 0x1430: 0x2000, 0x1431: 0x2000, 0x1432: 0x2000, 0x1433: 0x2000, 0x1434: 0x2000, 0x1435: 0x2000, + 0x1436: 0x2000, 0x1437: 0x2000, 0x1438: 0x2000, 0x1439: 0x2000, 0x143a: 0x2000, 0x143b: 0x2000, + 0x143c: 0x2000, 0x143d: 0x2000, 0x143e: 0x2000, 0x143f: 0x2000, + // Block 0x51, offset 0x1440 + 0x1440: 0x2000, 0x1441: 0x2000, 0x1442: 0x2000, 0x1443: 0x2000, 0x1444: 0x2000, 0x1445: 0x2000, + 0x1446: 0x2000, 0x1447: 0x2000, 0x1448: 0x2000, 0x1449: 0x2000, 0x144a: 0x2000, 0x144b: 0x2000, + 0x144c: 0x2000, 0x144d: 0x2000, 0x144e: 0x2000, 0x144f: 0x2000, 0x1450: 0x2000, 0x1451: 0x2000, + 0x1452: 0x2000, 0x1453: 0x2000, 0x1454: 0x2000, 0x1455: 0x2000, 0x1456: 0x2000, 0x1457: 0x2000, + 0x1458: 0x2000, 0x1459: 0x2000, 0x145a: 0x2000, 0x145b: 0x2000, 0x145c: 0x2000, 0x145d: 0x2000, + 0x145e: 0x2000, 0x145f: 0x2000, 0x1460: 0x2000, 0x1461: 0x2000, 0x1462: 0x2000, 0x1463: 0x2000, + 0x1464: 0x2000, 0x1465: 0x2000, 0x1466: 0x2000, 0x1467: 0x2000, 0x1468: 0x2000, 0x1469: 0x2000, + 0x1470: 0x2000, 0x1471: 0x2000, 0x1472: 0x2000, 0x1473: 0x2000, 0x1474: 0x2000, 0x1475: 0x2000, + 0x1476: 0x2000, 0x1477: 0x2000, 0x1478: 0x2000, 0x1479: 0x2000, 0x147a: 0x2000, 0x147b: 0x2000, + 0x147c: 0x2000, 0x147d: 0x2000, 0x147e: 0x2000, 0x147f: 0x2000, + // Block 0x52, offset 0x1480 + 0x1480: 0x2000, 0x1481: 0x2000, 0x1482: 0x2000, 0x1483: 0x2000, 0x1484: 0x2000, 0x1485: 0x2000, + 0x1486: 0x2000, 0x1487: 0x2000, 0x1488: 0x2000, 0x1489: 0x2000, 0x148a: 0x2000, 0x148b: 0x2000, + 0x148c: 0x2000, 0x148d: 0x2000, 0x148e: 0x4000, 0x148f: 0x2000, 0x1490: 0x2000, 0x1491: 0x4000, + 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000, + 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x2000, 0x149c: 0x2000, 0x149d: 0x2000, + 0x149e: 0x2000, 0x149f: 0x2000, 0x14a0: 0x2000, 0x14a1: 0x2000, 0x14a2: 0x2000, 0x14a3: 0x2000, + 0x14a4: 0x2000, 0x14a5: 0x2000, 0x14a6: 0x2000, 0x14a7: 0x2000, 0x14a8: 0x2000, 0x14a9: 0x2000, + 0x14aa: 0x2000, 0x14ab: 0x2000, 0x14ac: 0x2000, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, + 0x14d0: 0x4000, 0x14d1: 0x4000, + 0x14d2: 0x4000, 0x14d3: 0x4000, 0x14d4: 0x4000, 0x14d5: 0x4000, 0x14d6: 0x4000, 0x14d7: 0x4000, + 0x14d8: 0x4000, 0x14d9: 0x4000, 0x14da: 0x4000, 0x14db: 0x4000, 0x14dc: 0x4000, 0x14dd: 0x4000, + 0x14de: 0x4000, 0x14df: 0x4000, 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000, + 0x14e4: 0x4000, 0x14e5: 0x4000, 0x14e6: 0x4000, 0x14e7: 0x4000, 0x14e8: 0x4000, 0x14e9: 0x4000, + 0x14ea: 0x4000, 0x14eb: 0x4000, 0x14ec: 0x4000, 0x14ed: 0x4000, 0x14ee: 0x4000, 0x14ef: 0x4000, + 0x14f0: 0x4000, 0x14f1: 0x4000, 0x14f2: 0x4000, 0x14f3: 0x4000, 0x14f4: 0x4000, 0x14f5: 0x4000, + 0x14f6: 0x4000, 0x14f7: 0x4000, 0x14f8: 0x4000, 0x14f9: 0x4000, 0x14fa: 0x4000, 0x14fb: 0x4000, + // Block 0x54, offset 0x1500 + 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000, + 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, + 0x1510: 0x4000, 0x1511: 0x4000, + 0x1520: 0x4000, 0x1521: 0x4000, 0x1522: 0x4000, 0x1523: 0x4000, + 0x1524: 0x4000, 0x1525: 0x4000, + // Block 0x55, offset 0x1540 + 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000, + 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000, 0x154b: 0x4000, + 0x154c: 0x4000, 0x154d: 0x4000, 0x154e: 0x4000, 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000, + 0x1552: 0x4000, 0x1553: 0x4000, 0x1554: 0x4000, 0x1555: 0x4000, 0x1556: 0x4000, 0x1557: 0x4000, + 0x1558: 0x4000, 0x1559: 0x4000, 0x155a: 0x4000, 0x155b: 0x4000, 0x155c: 0x4000, 0x155d: 0x4000, + 0x155e: 0x4000, 0x155f: 0x4000, 0x1560: 0x4000, + 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000, + 0x1570: 0x4000, 0x1571: 0x4000, 0x1572: 0x4000, 0x1573: 0x4000, 0x1574: 0x4000, 0x1575: 0x4000, + 0x1577: 0x4000, 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000, + 0x157c: 0x4000, 0x157d: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000, + // Block 0x56, offset 0x1580 + 0x1580: 0x4000, 0x1581: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000, + 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000, + 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000, + 0x1592: 0x4000, 0x1593: 0x4000, 0x1594: 0x4000, 0x1595: 0x4000, 0x1596: 0x4000, 0x1597: 0x4000, + 0x1598: 0x4000, 0x1599: 0x4000, 0x159a: 0x4000, 0x159b: 0x4000, 0x159c: 0x4000, 0x159d: 0x4000, + 0x159e: 0x4000, 0x159f: 0x4000, 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000, + 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000, + 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000, + 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000, + 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000, + 0x15bc: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000, + 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000, 0x15cb: 0x4000, + 0x15cc: 0x4000, 0x15cd: 0x4000, 0x15ce: 0x4000, 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000, + 0x15d2: 0x4000, 0x15d3: 0x4000, + 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000, + 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000, + 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000, + 0x15f0: 0x4000, 0x15f1: 0x4000, 0x15f2: 0x4000, 0x15f3: 0x4000, 0x15f4: 0x4000, 0x15f5: 0x4000, + 0x15f6: 0x4000, 0x15f7: 0x4000, 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000, + 0x15fc: 0x4000, 0x15fd: 0x4000, 0x15fe: 0x4000, 0x15ff: 0x4000, + // Block 0x58, offset 0x1600 + 0x1600: 0x4000, 0x1601: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000, + 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, + 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000, + 0x1612: 0x4000, 0x1613: 0x4000, + 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000, + 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000, + 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000, + 0x1630: 0x4000, 0x1634: 0x4000, + 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000, + 0x163c: 0x4000, 0x163d: 0x4000, 0x163e: 0x4000, 0x163f: 0x4000, + // Block 0x59, offset 0x1640 + 0x1640: 0x4000, 0x1641: 0x4000, 0x1642: 0x4000, 0x1643: 0x4000, 0x1644: 0x4000, 0x1645: 0x4000, + 0x1646: 0x4000, 0x1647: 0x4000, 0x1648: 0x4000, 0x1649: 0x4000, 0x164a: 0x4000, 0x164b: 0x4000, + 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x164f: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000, + 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000, + 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000, + 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000, + 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000, 0x1668: 0x4000, 0x1669: 0x4000, + 0x166a: 0x4000, 0x166b: 0x4000, 0x166c: 0x4000, 0x166d: 0x4000, 0x166e: 0x4000, 0x166f: 0x4000, + 0x1670: 0x4000, 0x1671: 0x4000, 0x1672: 0x4000, 0x1673: 0x4000, 0x1674: 0x4000, 0x1675: 0x4000, + 0x1676: 0x4000, 0x1677: 0x4000, 0x1678: 0x4000, 0x1679: 0x4000, 0x167a: 0x4000, 0x167b: 0x4000, + 0x167c: 0x4000, 0x167d: 0x4000, 0x167e: 0x4000, + // Block 0x5a, offset 0x1680 + 0x1680: 0x4000, 0x1682: 0x4000, 0x1683: 0x4000, 0x1684: 0x4000, 0x1685: 0x4000, + 0x1686: 0x4000, 0x1687: 0x4000, 0x1688: 0x4000, 0x1689: 0x4000, 0x168a: 0x4000, 0x168b: 0x4000, + 0x168c: 0x4000, 0x168d: 0x4000, 0x168e: 0x4000, 0x168f: 0x4000, 0x1690: 0x4000, 0x1691: 0x4000, + 0x1692: 0x4000, 0x1693: 0x4000, 0x1694: 0x4000, 0x1695: 0x4000, 0x1696: 0x4000, 0x1697: 0x4000, + 0x1698: 0x4000, 0x1699: 0x4000, 0x169a: 0x4000, 0x169b: 0x4000, 0x169c: 0x4000, 0x169d: 0x4000, + 0x169e: 0x4000, 0x169f: 0x4000, 0x16a0: 0x4000, 0x16a1: 0x4000, 0x16a2: 0x4000, 0x16a3: 0x4000, + 0x16a4: 0x4000, 0x16a5: 0x4000, 0x16a6: 0x4000, 0x16a7: 0x4000, 0x16a8: 0x4000, 0x16a9: 0x4000, + 0x16aa: 0x4000, 0x16ab: 0x4000, 0x16ac: 0x4000, 0x16ad: 0x4000, 0x16ae: 0x4000, 0x16af: 0x4000, + 0x16b0: 0x4000, 0x16b1: 0x4000, 0x16b2: 0x4000, 0x16b3: 0x4000, 0x16b4: 0x4000, 0x16b5: 0x4000, + 0x16b6: 0x4000, 0x16b7: 0x4000, 0x16b8: 0x4000, 0x16b9: 0x4000, 0x16ba: 0x4000, 0x16bb: 0x4000, + 0x16bc: 0x4000, 0x16bd: 0x4000, 0x16be: 0x4000, 0x16bf: 0x4000, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x4000, 0x16c1: 0x4000, 0x16c2: 0x4000, 0x16c3: 0x4000, 0x16c4: 0x4000, 0x16c5: 0x4000, + 0x16c6: 0x4000, 0x16c7: 0x4000, 0x16c8: 0x4000, 0x16c9: 0x4000, 0x16ca: 0x4000, 0x16cb: 0x4000, + 0x16cc: 0x4000, 0x16cd: 0x4000, 0x16ce: 0x4000, 0x16cf: 0x4000, 0x16d0: 0x4000, 0x16d1: 0x4000, + 0x16d2: 0x4000, 0x16d3: 0x4000, 0x16d4: 0x4000, 0x16d5: 0x4000, 0x16d6: 0x4000, 0x16d7: 0x4000, + 0x16d8: 0x4000, 0x16d9: 0x4000, 0x16da: 0x4000, 0x16db: 0x4000, 0x16dc: 0x4000, 0x16dd: 0x4000, + 0x16de: 0x4000, 0x16df: 0x4000, 0x16e0: 0x4000, 0x16e1: 0x4000, 0x16e2: 0x4000, 0x16e3: 0x4000, + 0x16e4: 0x4000, 0x16e5: 0x4000, 0x16e6: 0x4000, 0x16e7: 0x4000, 0x16e8: 0x4000, 0x16e9: 0x4000, + 0x16ea: 0x4000, 0x16eb: 0x4000, 0x16ec: 0x4000, 0x16ed: 0x4000, 0x16ee: 0x4000, 0x16ef: 0x4000, + 0x16f0: 0x4000, 0x16f1: 0x4000, 0x16f2: 0x4000, 0x16f3: 0x4000, 0x16f4: 0x4000, 0x16f5: 0x4000, + 0x16f6: 0x4000, 0x16f7: 0x4000, 0x16f8: 0x4000, 0x16f9: 0x4000, 0x16fa: 0x4000, 0x16fb: 0x4000, + 0x16fc: 0x4000, 0x16ff: 0x4000, + // Block 0x5c, offset 0x1700 + 0x1700: 0x4000, 0x1701: 0x4000, 0x1702: 0x4000, 0x1703: 0x4000, 0x1704: 0x4000, 0x1705: 0x4000, + 0x1706: 0x4000, 0x1707: 0x4000, 0x1708: 0x4000, 0x1709: 0x4000, 0x170a: 0x4000, 0x170b: 0x4000, + 0x170c: 0x4000, 0x170d: 0x4000, 0x170e: 0x4000, 0x170f: 0x4000, 0x1710: 0x4000, 0x1711: 0x4000, + 0x1712: 0x4000, 0x1713: 0x4000, 0x1714: 0x4000, 0x1715: 0x4000, 0x1716: 0x4000, 0x1717: 0x4000, + 0x1718: 0x4000, 0x1719: 0x4000, 0x171a: 0x4000, 0x171b: 0x4000, 0x171c: 0x4000, 0x171d: 0x4000, + 0x171e: 0x4000, 0x171f: 0x4000, 0x1720: 0x4000, 0x1721: 0x4000, 0x1722: 0x4000, 0x1723: 0x4000, + 0x1724: 0x4000, 0x1725: 0x4000, 0x1726: 0x4000, 0x1727: 0x4000, 0x1728: 0x4000, 0x1729: 0x4000, + 0x172a: 0x4000, 0x172b: 0x4000, 0x172c: 0x4000, 0x172d: 0x4000, 0x172e: 0x4000, 0x172f: 0x4000, + 0x1730: 0x4000, 0x1731: 0x4000, 0x1732: 0x4000, 0x1733: 0x4000, 0x1734: 0x4000, 0x1735: 0x4000, + 0x1736: 0x4000, 0x1737: 0x4000, 0x1738: 0x4000, 0x1739: 0x4000, 0x173a: 0x4000, 0x173b: 0x4000, + 0x173c: 0x4000, 0x173d: 0x4000, + // Block 0x5d, offset 0x1740 + 0x174b: 0x4000, + 0x174c: 0x4000, 0x174d: 0x4000, 0x174e: 0x4000, 0x1750: 0x4000, 0x1751: 0x4000, + 0x1752: 0x4000, 0x1753: 0x4000, 0x1754: 0x4000, 0x1755: 0x4000, 0x1756: 0x4000, 0x1757: 0x4000, + 0x1758: 0x4000, 0x1759: 0x4000, 0x175a: 0x4000, 0x175b: 0x4000, 0x175c: 0x4000, 0x175d: 0x4000, + 0x175e: 0x4000, 0x175f: 0x4000, 0x1760: 0x4000, 0x1761: 0x4000, 0x1762: 0x4000, 0x1763: 0x4000, + 0x1764: 0x4000, 0x1765: 0x4000, 0x1766: 0x4000, 0x1767: 0x4000, + 0x177a: 0x4000, + // Block 0x5e, offset 0x1780 + 0x1795: 0x4000, 0x1796: 0x4000, + 0x17a4: 0x4000, + // Block 0x5f, offset 0x17c0 + 0x17fb: 0x4000, + 0x17fc: 0x4000, 0x17fd: 0x4000, 0x17fe: 0x4000, 0x17ff: 0x4000, + // Block 0x60, offset 0x1800 + 0x1800: 0x4000, 0x1801: 0x4000, 0x1802: 0x4000, 0x1803: 0x4000, 0x1804: 0x4000, 0x1805: 0x4000, + 0x1806: 0x4000, 0x1807: 0x4000, 0x1808: 0x4000, 0x1809: 0x4000, 0x180a: 0x4000, 0x180b: 0x4000, + 0x180c: 0x4000, 0x180d: 0x4000, 0x180e: 0x4000, 0x180f: 0x4000, + // Block 0x61, offset 0x1840 + 0x1840: 0x4000, 0x1841: 0x4000, 0x1842: 0x4000, 0x1843: 0x4000, 0x1844: 0x4000, 0x1845: 0x4000, + 0x184c: 0x4000, 0x1850: 0x4000, 0x1851: 0x4000, + 0x1852: 0x4000, 0x1855: 0x4000, 0x1856: 0x4000, 0x1857: 0x4000, + 0x185c: 0x4000, 0x185d: 0x4000, + 0x185e: 0x4000, 0x185f: 0x4000, + 0x186b: 0x4000, 0x186c: 0x4000, + 0x1874: 0x4000, 0x1875: 0x4000, + 0x1876: 0x4000, 0x1877: 0x4000, 0x1878: 0x4000, 0x1879: 0x4000, 0x187a: 0x4000, 0x187b: 0x4000, + 0x187c: 0x4000, + // Block 0x62, offset 0x1880 + 0x18a0: 0x4000, 0x18a1: 0x4000, 0x18a2: 0x4000, 0x18a3: 0x4000, + 0x18a4: 0x4000, 0x18a5: 0x4000, 0x18a6: 0x4000, 0x18a7: 0x4000, 0x18a8: 0x4000, 0x18a9: 0x4000, + 0x18aa: 0x4000, 0x18ab: 0x4000, + 0x18b0: 0x4000, + // Block 0x63, offset 0x18c0 + 0x18cc: 0x4000, 0x18cd: 0x4000, 0x18ce: 0x4000, 0x18cf: 0x4000, 0x18d0: 0x4000, 0x18d1: 0x4000, + 0x18d2: 0x4000, 0x18d3: 0x4000, 0x18d4: 0x4000, 0x18d5: 0x4000, 0x18d6: 0x4000, 0x18d7: 0x4000, + 0x18d8: 0x4000, 0x18d9: 0x4000, 0x18da: 0x4000, 0x18db: 0x4000, 0x18dc: 0x4000, 0x18dd: 0x4000, + 0x18de: 0x4000, 0x18df: 0x4000, 0x18e0: 0x4000, 0x18e1: 0x4000, 0x18e2: 0x4000, 0x18e3: 0x4000, + 0x18e4: 0x4000, 0x18e5: 0x4000, 0x18e6: 0x4000, 0x18e7: 0x4000, 0x18e8: 0x4000, 0x18e9: 0x4000, + 0x18ea: 0x4000, 0x18eb: 0x4000, 0x18ec: 0x4000, 0x18ed: 0x4000, 0x18ee: 0x4000, 0x18ef: 0x4000, + 0x18f0: 0x4000, 0x18f1: 0x4000, 0x18f2: 0x4000, 0x18f3: 0x4000, 0x18f4: 0x4000, 0x18f5: 0x4000, + 0x18f6: 0x4000, 0x18f7: 0x4000, 0x18f8: 0x4000, 0x18f9: 0x4000, 0x18fa: 0x4000, + 0x18fc: 0x4000, 0x18fd: 0x4000, 0x18fe: 0x4000, 0x18ff: 0x4000, + // Block 0x64, offset 0x1900 + 0x1900: 0x4000, 0x1901: 0x4000, 0x1902: 0x4000, 0x1903: 0x4000, 0x1904: 0x4000, 0x1905: 0x4000, + 0x1907: 0x4000, 0x1908: 0x4000, 0x1909: 0x4000, 0x190a: 0x4000, 0x190b: 0x4000, + 0x190c: 0x4000, 0x190d: 0x4000, 0x190e: 0x4000, 0x190f: 0x4000, 0x1910: 0x4000, 0x1911: 0x4000, + 0x1912: 0x4000, 0x1913: 0x4000, 0x1914: 0x4000, 0x1915: 0x4000, 0x1916: 0x4000, 0x1917: 0x4000, + 0x1918: 0x4000, 0x1919: 0x4000, 0x191a: 0x4000, 0x191b: 0x4000, 0x191c: 0x4000, 0x191d: 0x4000, + 0x191e: 0x4000, 0x191f: 0x4000, 0x1920: 0x4000, 0x1921: 0x4000, 0x1922: 0x4000, 0x1923: 0x4000, + 0x1924: 0x4000, 0x1925: 0x4000, 0x1926: 0x4000, 0x1927: 0x4000, 0x1928: 0x4000, 0x1929: 0x4000, + 0x192a: 0x4000, 0x192b: 0x4000, 0x192c: 0x4000, 0x192d: 0x4000, 0x192e: 0x4000, 0x192f: 0x4000, + 0x1930: 0x4000, 0x1931: 0x4000, 0x1932: 0x4000, 0x1933: 0x4000, 0x1934: 0x4000, 0x1935: 0x4000, + 0x1936: 0x4000, 0x1937: 0x4000, 0x1938: 0x4000, 0x1939: 0x4000, 0x193a: 0x4000, 0x193b: 0x4000, + 0x193c: 0x4000, 0x193d: 0x4000, 0x193e: 0x4000, 0x193f: 0x4000, + // Block 0x65, offset 0x1940 + 0x1970: 0x4000, 0x1971: 0x4000, 0x1972: 0x4000, 0x1973: 0x4000, 0x1974: 0x4000, 0x1975: 0x4000, + 0x1976: 0x4000, 0x1977: 0x4000, 0x1978: 0x4000, 0x1979: 0x4000, 0x197a: 0x4000, 0x197b: 0x4000, + 0x197c: 0x4000, + // Block 0x66, offset 0x1980 + 0x1980: 0x4000, 0x1981: 0x4000, 0x1982: 0x4000, 0x1983: 0x4000, 0x1984: 0x4000, 0x1985: 0x4000, + 0x1986: 0x4000, 0x1987: 0x4000, 0x1988: 0x4000, + 0x1990: 0x4000, 0x1991: 0x4000, + 0x1992: 0x4000, 0x1993: 0x4000, 0x1994: 0x4000, 0x1995: 0x4000, 0x1996: 0x4000, 0x1997: 0x4000, + 0x1998: 0x4000, 0x1999: 0x4000, 0x199a: 0x4000, 0x199b: 0x4000, 0x199c: 0x4000, 0x199d: 0x4000, + 0x199e: 0x4000, 0x199f: 0x4000, 0x19a0: 0x4000, 0x19a1: 0x4000, 0x19a2: 0x4000, 0x19a3: 0x4000, + 0x19a4: 0x4000, 0x19a5: 0x4000, 0x19a6: 0x4000, 0x19a7: 0x4000, 0x19a8: 0x4000, 0x19a9: 0x4000, + 0x19aa: 0x4000, 0x19ab: 0x4000, 0x19ac: 0x4000, 0x19ad: 0x4000, 0x19ae: 0x4000, 0x19af: 0x4000, + 0x19b0: 0x4000, 0x19b1: 0x4000, 0x19b2: 0x4000, 0x19b3: 0x4000, 0x19b4: 0x4000, 0x19b5: 0x4000, + 0x19b6: 0x4000, 0x19b7: 0x4000, 0x19b8: 0x4000, 0x19b9: 0x4000, 0x19ba: 0x4000, 0x19bb: 0x4000, + 0x19bc: 0x4000, 0x19bd: 0x4000, 0x19bf: 0x4000, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x4000, 0x19c1: 0x4000, 0x19c2: 0x4000, 0x19c3: 0x4000, 0x19c4: 0x4000, 0x19c5: 0x4000, + 0x19ce: 0x4000, 0x19cf: 0x4000, 0x19d0: 0x4000, 0x19d1: 0x4000, + 0x19d2: 0x4000, 0x19d3: 0x4000, 0x19d4: 0x4000, 0x19d5: 0x4000, 0x19d6: 0x4000, 0x19d7: 0x4000, + 0x19d8: 0x4000, 0x19d9: 0x4000, 0x19da: 0x4000, 0x19db: 0x4000, + 0x19e0: 0x4000, 0x19e1: 0x4000, 0x19e2: 0x4000, 0x19e3: 0x4000, + 0x19e4: 0x4000, 0x19e5: 0x4000, 0x19e6: 0x4000, 0x19e7: 0x4000, 0x19e8: 0x4000, + 0x19f0: 0x4000, 0x19f1: 0x4000, 0x19f2: 0x4000, 0x19f3: 0x4000, 0x19f4: 0x4000, 0x19f5: 0x4000, + 0x19f6: 0x4000, 0x19f7: 0x4000, 0x19f8: 0x4000, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x2000, 0x1a01: 0x2000, 0x1a02: 0x2000, 0x1a03: 0x2000, 0x1a04: 0x2000, 0x1a05: 0x2000, + 0x1a06: 0x2000, 0x1a07: 0x2000, 0x1a08: 0x2000, 0x1a09: 0x2000, 0x1a0a: 0x2000, 0x1a0b: 0x2000, + 0x1a0c: 0x2000, 0x1a0d: 0x2000, 0x1a0e: 0x2000, 0x1a0f: 0x2000, 0x1a10: 0x2000, 0x1a11: 0x2000, + 0x1a12: 0x2000, 0x1a13: 0x2000, 0x1a14: 0x2000, 0x1a15: 0x2000, 0x1a16: 0x2000, 0x1a17: 0x2000, + 0x1a18: 0x2000, 0x1a19: 0x2000, 0x1a1a: 0x2000, 0x1a1b: 0x2000, 0x1a1c: 0x2000, 0x1a1d: 0x2000, + 0x1a1e: 0x2000, 0x1a1f: 0x2000, 0x1a20: 0x2000, 0x1a21: 0x2000, 0x1a22: 0x2000, 0x1a23: 0x2000, + 0x1a24: 0x2000, 0x1a25: 0x2000, 0x1a26: 0x2000, 0x1a27: 0x2000, 0x1a28: 0x2000, 0x1a29: 0x2000, + 0x1a2a: 0x2000, 0x1a2b: 0x2000, 0x1a2c: 0x2000, 0x1a2d: 0x2000, 0x1a2e: 0x2000, 0x1a2f: 0x2000, + 0x1a30: 0x2000, 0x1a31: 0x2000, 0x1a32: 0x2000, 0x1a33: 0x2000, 0x1a34: 0x2000, 0x1a35: 0x2000, + 0x1a36: 0x2000, 0x1a37: 0x2000, 0x1a38: 0x2000, 0x1a39: 0x2000, 0x1a3a: 0x2000, 0x1a3b: 0x2000, + 0x1a3c: 0x2000, 0x1a3d: 0x2000, +} + +// widthIndex: 23 blocks, 1472 entries, 1472 bytes +// Block 0 is the zero block. +var widthIndex = [1472]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05, + 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, + 0xd0: 0x0c, 0xd1: 0x0d, + 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06, + 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a, + 0xf0: 0x10, 0xf3: 0x13, 0xf4: 0x14, + // Block 0x4, offset 0x100 + 0x104: 0x0e, 0x105: 0x0f, + // Block 0x5, offset 0x140 + 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16, + 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b, + 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21, + 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29, + 0x166: 0x2a, + 0x16c: 0x2b, 0x16d: 0x2c, + 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f, + // Block 0x6, offset 0x180 + 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37, + 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x0e, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e, + 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e, + 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e, + 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e, + 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e, + 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e, + 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e, + 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e, + 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e, + 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e, + 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e, + 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e, + 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e, + 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e, + // Block 0x8, offset 0x200 + 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e, + 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e, + 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e, + 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e, + 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e, + 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e, + 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e, + 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e, + // Block 0x9, offset 0x240 + 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e, + 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e, + 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3a, 0x253: 0x3b, + 0x265: 0x3c, + 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e, + 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e, + // Block 0xa, offset 0x280 + 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e, + 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e, + 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e, + 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08, + 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08, + 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08, + 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08, + 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08, + 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08, + 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08, + 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08, + // Block 0xc, offset 0x300 + 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08, + 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08, + 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08, + 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08, + 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e, + 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e, + 0x338: 0x3e, 0x339: 0x3f, 0x33c: 0x40, 0x33d: 0x41, 0x33e: 0x42, 0x33f: 0x43, + // Block 0xd, offset 0x340 + 0x37f: 0x44, + // Block 0xe, offset 0x380 + 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e, + 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e, + 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e, + 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x45, + 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e, + 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x0e, 0x3ac: 0x0e, 0x3ad: 0x0e, 0x3ae: 0x0e, 0x3af: 0x0e, + 0x3b0: 0x0e, 0x3b1: 0x0e, 0x3b2: 0x0e, 0x3b3: 0x46, 0x3b4: 0x47, + // Block 0xf, offset 0x3c0 + 0x3ff: 0x48, + // Block 0x10, offset 0x400 + 0x400: 0x0e, 0x401: 0x0e, 0x402: 0x0e, 0x403: 0x0e, 0x404: 0x49, 0x405: 0x4a, 0x406: 0x0e, 0x407: 0x0e, + 0x408: 0x0e, 0x409: 0x0e, 0x40a: 0x0e, 0x40b: 0x4b, + // Block 0x11, offset 0x440 + 0x440: 0x4c, 0x443: 0x4d, 0x444: 0x4e, 0x445: 0x4f, 0x446: 0x50, + 0x448: 0x51, 0x449: 0x52, 0x44c: 0x53, 0x44d: 0x54, 0x44e: 0x55, 0x44f: 0x56, + 0x450: 0x57, 0x451: 0x58, 0x452: 0x0e, 0x453: 0x59, 0x454: 0x5a, 0x455: 0x5b, 0x456: 0x5c, 0x457: 0x5d, + 0x458: 0x0e, 0x459: 0x5e, 0x45a: 0x0e, 0x45b: 0x5f, 0x45f: 0x60, + 0x464: 0x61, 0x465: 0x62, 0x466: 0x0e, 0x467: 0x0e, + 0x469: 0x63, 0x46a: 0x64, 0x46b: 0x65, + // Block 0x12, offset 0x480 + 0x496: 0x0b, 0x497: 0x06, + 0x498: 0x0c, 0x49a: 0x0d, 0x49b: 0x0e, 0x49f: 0x0f, + 0x4a0: 0x06, 0x4a1: 0x06, 0x4a2: 0x06, 0x4a3: 0x06, 0x4a4: 0x06, 0x4a5: 0x06, 0x4a6: 0x06, 0x4a7: 0x06, + 0x4a8: 0x06, 0x4a9: 0x06, 0x4aa: 0x06, 0x4ab: 0x06, 0x4ac: 0x06, 0x4ad: 0x06, 0x4ae: 0x06, 0x4af: 0x06, + 0x4b0: 0x06, 0x4b1: 0x06, 0x4b2: 0x06, 0x4b3: 0x06, 0x4b4: 0x06, 0x4b5: 0x06, 0x4b6: 0x06, 0x4b7: 0x06, + 0x4b8: 0x06, 0x4b9: 0x06, 0x4ba: 0x06, 0x4bb: 0x06, 0x4bc: 0x06, 0x4bd: 0x06, 0x4be: 0x06, 0x4bf: 0x06, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x09, + // Block 0x14, offset 0x500 + 0x500: 0x08, 0x501: 0x08, 0x502: 0x08, 0x503: 0x08, 0x504: 0x08, 0x505: 0x08, 0x506: 0x08, 0x507: 0x08, + 0x508: 0x08, 0x509: 0x08, 0x50a: 0x08, 0x50b: 0x08, 0x50c: 0x08, 0x50d: 0x08, 0x50e: 0x08, 0x50f: 0x08, + 0x510: 0x08, 0x511: 0x08, 0x512: 0x08, 0x513: 0x08, 0x514: 0x08, 0x515: 0x08, 0x516: 0x08, 0x517: 0x08, + 0x518: 0x08, 0x519: 0x08, 0x51a: 0x08, 0x51b: 0x08, 0x51c: 0x08, 0x51d: 0x08, 0x51e: 0x08, 0x51f: 0x08, + 0x520: 0x08, 0x521: 0x08, 0x522: 0x08, 0x523: 0x08, 0x524: 0x08, 0x525: 0x08, 0x526: 0x08, 0x527: 0x08, + 0x528: 0x08, 0x529: 0x08, 0x52a: 0x08, 0x52b: 0x08, 0x52c: 0x08, 0x52d: 0x08, 0x52e: 0x08, 0x52f: 0x08, + 0x530: 0x08, 0x531: 0x08, 0x532: 0x08, 0x533: 0x08, 0x534: 0x08, 0x535: 0x08, 0x536: 0x08, 0x537: 0x08, + 0x538: 0x08, 0x539: 0x08, 0x53a: 0x08, 0x53b: 0x08, 0x53c: 0x08, 0x53d: 0x08, 0x53e: 0x08, 0x53f: 0x66, + // Block 0x15, offset 0x540 + 0x560: 0x11, + 0x570: 0x09, 0x571: 0x09, 0x572: 0x09, 0x573: 0x09, 0x574: 0x09, 0x575: 0x09, 0x576: 0x09, 0x577: 0x09, + 0x578: 0x09, 0x579: 0x09, 0x57a: 0x09, 0x57b: 0x09, 0x57c: 0x09, 0x57d: 0x09, 0x57e: 0x09, 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x580: 0x09, 0x581: 0x09, 0x582: 0x09, 0x583: 0x09, 0x584: 0x09, 0x585: 0x09, 0x586: 0x09, 0x587: 0x09, + 0x588: 0x09, 0x589: 0x09, 0x58a: 0x09, 0x58b: 0x09, 0x58c: 0x09, 0x58d: 0x09, 0x58e: 0x09, 0x58f: 0x12, +} + +// inverseData contains 4-byte entries of the following format: +// +// <0 padding> +// +// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the +// UTF-8 encoding of the original rune. Mappings often have the following +// pattern: +// +// A -> A (U+FF21 -> U+0041) +// B -> B (U+FF22 -> U+0042) +// ... +// +// By xor-ing the last byte the same entry can be shared by many mappings. This +// reduces the total number of distinct entries by about two thirds. +// The resulting entry for the aforementioned mappings is +// +// { 0x01, 0xE0, 0x00, 0x00 } +// +// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get +// +// E0 ^ A1 = 41. +// +// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get +// +// E0 ^ A2 = 42. +// +// Note that because of the xor-ing, the byte sequence stored in the entry is +// not valid UTF-8. +var inverseData = [150][4]byte{ + {0x00, 0x00, 0x00, 0x00}, + {0x03, 0xe3, 0x80, 0xa0}, + {0x03, 0xef, 0xbc, 0xa0}, + {0x03, 0xef, 0xbc, 0xe0}, + {0x03, 0xef, 0xbd, 0xe0}, + {0x03, 0xef, 0xbf, 0x02}, + {0x03, 0xef, 0xbf, 0x00}, + {0x03, 0xef, 0xbf, 0x0e}, + {0x03, 0xef, 0xbf, 0x0c}, + {0x03, 0xef, 0xbf, 0x0f}, + {0x03, 0xef, 0xbf, 0x39}, + {0x03, 0xef, 0xbf, 0x3b}, + {0x03, 0xef, 0xbf, 0x3f}, + {0x03, 0xef, 0xbf, 0x2a}, + {0x03, 0xef, 0xbf, 0x0d}, + {0x03, 0xef, 0xbf, 0x25}, + {0x03, 0xef, 0xbd, 0x1a}, + {0x03, 0xef, 0xbd, 0x26}, + {0x01, 0xa0, 0x00, 0x00}, + {0x03, 0xef, 0xbd, 0x25}, + {0x03, 0xef, 0xbd, 0x23}, + {0x03, 0xef, 0xbd, 0x2e}, + {0x03, 0xef, 0xbe, 0x07}, + {0x03, 0xef, 0xbe, 0x05}, + {0x03, 0xef, 0xbd, 0x06}, + {0x03, 0xef, 0xbd, 0x13}, + {0x03, 0xef, 0xbd, 0x0b}, + {0x03, 0xef, 0xbd, 0x16}, + {0x03, 0xef, 0xbd, 0x0c}, + {0x03, 0xef, 0xbd, 0x15}, + {0x03, 0xef, 0xbd, 0x0d}, + {0x03, 0xef, 0xbd, 0x1c}, + {0x03, 0xef, 0xbd, 0x02}, + {0x03, 0xef, 0xbd, 0x1f}, + {0x03, 0xef, 0xbd, 0x1d}, + {0x03, 0xef, 0xbd, 0x17}, + {0x03, 0xef, 0xbd, 0x08}, + {0x03, 0xef, 0xbd, 0x09}, + {0x03, 0xef, 0xbd, 0x0e}, + {0x03, 0xef, 0xbd, 0x04}, + {0x03, 0xef, 0xbd, 0x05}, + {0x03, 0xef, 0xbe, 0x3f}, + {0x03, 0xef, 0xbe, 0x00}, + {0x03, 0xef, 0xbd, 0x2c}, + {0x03, 0xef, 0xbe, 0x06}, + {0x03, 0xef, 0xbe, 0x0c}, + {0x03, 0xef, 0xbe, 0x0f}, + {0x03, 0xef, 0xbe, 0x0d}, + {0x03, 0xef, 0xbe, 0x0b}, + {0x03, 0xef, 0xbe, 0x19}, + {0x03, 0xef, 0xbe, 0x15}, + {0x03, 0xef, 0xbe, 0x11}, + {0x03, 0xef, 0xbe, 0x31}, + {0x03, 0xef, 0xbe, 0x33}, + {0x03, 0xef, 0xbd, 0x0f}, + {0x03, 0xef, 0xbe, 0x30}, + {0x03, 0xef, 0xbe, 0x3e}, + {0x03, 0xef, 0xbe, 0x32}, + {0x03, 0xef, 0xbe, 0x36}, + {0x03, 0xef, 0xbd, 0x14}, + {0x03, 0xef, 0xbe, 0x2e}, + {0x03, 0xef, 0xbd, 0x1e}, + {0x03, 0xef, 0xbe, 0x10}, + {0x03, 0xef, 0xbf, 0x13}, + {0x03, 0xef, 0xbf, 0x15}, + {0x03, 0xef, 0xbf, 0x17}, + {0x03, 0xef, 0xbf, 0x1f}, + {0x03, 0xef, 0xbf, 0x1d}, + {0x03, 0xef, 0xbf, 0x1b}, + {0x03, 0xef, 0xbf, 0x09}, + {0x03, 0xef, 0xbf, 0x0b}, + {0x03, 0xef, 0xbf, 0x37}, + {0x03, 0xef, 0xbe, 0x04}, + {0x01, 0xe0, 0x00, 0x00}, + {0x03, 0xe2, 0xa6, 0x1a}, + {0x03, 0xe2, 0xa6, 0x26}, + {0x03, 0xe3, 0x80, 0x23}, + {0x03, 0xe3, 0x80, 0x2e}, + {0x03, 0xe3, 0x80, 0x25}, + {0x03, 0xe3, 0x83, 0x1e}, + {0x03, 0xe3, 0x83, 0x14}, + {0x03, 0xe3, 0x82, 0x06}, + {0x03, 0xe3, 0x82, 0x0b}, + {0x03, 0xe3, 0x82, 0x0c}, + {0x03, 0xe3, 0x82, 0x0d}, + {0x03, 0xe3, 0x82, 0x02}, + {0x03, 0xe3, 0x83, 0x0f}, + {0x03, 0xe3, 0x83, 0x08}, + {0x03, 0xe3, 0x83, 0x09}, + {0x03, 0xe3, 0x83, 0x2c}, + {0x03, 0xe3, 0x83, 0x0c}, + {0x03, 0xe3, 0x82, 0x13}, + {0x03, 0xe3, 0x82, 0x16}, + {0x03, 0xe3, 0x82, 0x15}, + {0x03, 0xe3, 0x82, 0x1c}, + {0x03, 0xe3, 0x82, 0x1f}, + {0x03, 0xe3, 0x82, 0x1d}, + {0x03, 0xe3, 0x82, 0x1a}, + {0x03, 0xe3, 0x82, 0x17}, + {0x03, 0xe3, 0x82, 0x08}, + {0x03, 0xe3, 0x82, 0x09}, + {0x03, 0xe3, 0x82, 0x0e}, + {0x03, 0xe3, 0x82, 0x04}, + {0x03, 0xe3, 0x82, 0x05}, + {0x03, 0xe3, 0x82, 0x3f}, + {0x03, 0xe3, 0x83, 0x00}, + {0x03, 0xe3, 0x83, 0x06}, + {0x03, 0xe3, 0x83, 0x05}, + {0x03, 0xe3, 0x83, 0x0d}, + {0x03, 0xe3, 0x83, 0x0b}, + {0x03, 0xe3, 0x83, 0x07}, + {0x03, 0xe3, 0x83, 0x19}, + {0x03, 0xe3, 0x83, 0x15}, + {0x03, 0xe3, 0x83, 0x11}, + {0x03, 0xe3, 0x83, 0x31}, + {0x03, 0xe3, 0x83, 0x33}, + {0x03, 0xe3, 0x83, 0x30}, + {0x03, 0xe3, 0x83, 0x3e}, + {0x03, 0xe3, 0x83, 0x32}, + {0x03, 0xe3, 0x83, 0x36}, + {0x03, 0xe3, 0x83, 0x2e}, + {0x03, 0xe3, 0x82, 0x07}, + {0x03, 0xe3, 0x85, 0x04}, + {0x03, 0xe3, 0x84, 0x10}, + {0x03, 0xe3, 0x85, 0x30}, + {0x03, 0xe3, 0x85, 0x0d}, + {0x03, 0xe3, 0x85, 0x13}, + {0x03, 0xe3, 0x85, 0x15}, + {0x03, 0xe3, 0x85, 0x17}, + {0x03, 0xe3, 0x85, 0x1f}, + {0x03, 0xe3, 0x85, 0x1d}, + {0x03, 0xe3, 0x85, 0x1b}, + {0x03, 0xe3, 0x85, 0x09}, + {0x03, 0xe3, 0x85, 0x0f}, + {0x03, 0xe3, 0x85, 0x0b}, + {0x03, 0xe3, 0x85, 0x37}, + {0x03, 0xe3, 0x85, 0x3b}, + {0x03, 0xe3, 0x85, 0x39}, + {0x03, 0xe3, 0x85, 0x3f}, + {0x02, 0xc2, 0x02, 0x00}, + {0x02, 0xc2, 0x0e, 0x00}, + {0x02, 0xc2, 0x0c, 0x00}, + {0x02, 0xc2, 0x00, 0x00}, + {0x03, 0xe2, 0x82, 0x0f}, + {0x03, 0xe2, 0x94, 0x2a}, + {0x03, 0xe2, 0x86, 0x39}, + {0x03, 0xe2, 0x86, 0x3b}, + {0x03, 0xe2, 0x86, 0x3f}, + {0x03, 0xe2, 0x96, 0x0d}, + {0x03, 0xe2, 0x97, 0x25}, +} + +// Total table size 15512 bytes (15KiB) diff --git a/vendor/modules.txt b/vendor/modules.txt index 968b6a048b..a986284128 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -489,13 +489,16 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.8.1 -## explicit; go 1.19 +# github.com/ncruces/go-sqlite3 v0.8.4 +## explicit; go 1.21 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver github.com/ncruces/go-sqlite3/embed github.com/ncruces/go-sqlite3/internal/util github.com/ncruces/go-sqlite3/vfs +# github.com/ncruces/go-sqlite3/gormlite v0.8.4 +## explicit; go 1.21 +github.com/ncruces/go-sqlite3/gormlite # github.com/ncruces/julianday v0.1.5 ## explicit; go 1.17 github.com/ncruces/julianday @@ -534,8 +537,8 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 => /home/user/code/github.com/reeflective/team -## explicit; go 1.20 +# github.com/reeflective/team v0.1.0 +## explicit; go 1.21 github.com/reeflective/team github.com/reeflective/team/client github.com/reeflective/team/client/commands @@ -640,16 +643,18 @@ github.com/tailscale/wireguard-go/tun # github.com/tcnksm/go-httpstat v0.2.0 ## explicit github.com/tcnksm/go-httpstat -# github.com/tetratelabs/wazero v1.2.1 -## explicit; go 1.18 +# github.com/tetratelabs/wazero v1.4.0 +## explicit; go 1.19 github.com/tetratelabs/wazero github.com/tetratelabs/wazero/api github.com/tetratelabs/wazero/experimental +github.com/tetratelabs/wazero/experimental/sys github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1 github.com/tetratelabs/wazero/internal/asm github.com/tetratelabs/wazero/internal/asm/amd64 github.com/tetratelabs/wazero/internal/asm/arm64 github.com/tetratelabs/wazero/internal/bitpack +github.com/tetratelabs/wazero/internal/close github.com/tetratelabs/wazero/internal/descriptor github.com/tetratelabs/wazero/internal/engine/compiler github.com/tetratelabs/wazero/internal/engine/interpreter @@ -772,7 +777,7 @@ golang.org/x/net/trace # golang.org/x/sync v0.3.0 ## explicit; go 1.17 golang.org/x/sync/errgroup -# golang.org/x/sys v0.9.0 +# golang.org/x/sys v0.11.0 ## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/execabs @@ -786,7 +791,7 @@ golang.org/x/sys/windows/svc/mgr # golang.org/x/term v0.9.0 ## explicit; go 1.17 golang.org/x/term -# golang.org/x/text v0.10.0 +# golang.org/x/text v0.12.0 ## explicit; go 1.17 golang.org/x/text/cases golang.org/x/text/encoding @@ -1265,4 +1270,3 @@ tailscale.com/wgengine/wgcfg/nmcfg tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet -# github.com/reeflective/team => /home/user/code/github.com/reeflective/team From 3d2a3375c55b205300be1af51aaf7ae19258b41b Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 02:22:34 +0200 Subject: [PATCH 091/109] Rename/cleanup command utility binders/generators --- client/cli/cli.go | 7 ++-- client/cli/implant.go | 13 ++++--- client/command/command.go | 48 +++++++---------------- client/command/server.go | 82 +++++++++++++++++++++++++++------------ client/command/sliver.go | 5 ++- server/cli/cli.go | 4 +- 6 files changed, 86 insertions(+), 73 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index bb9905186a..15e5517fe8 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -21,10 +21,11 @@ package cli import ( "os" - "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" + "github.com/reeflective/team/client/commands" + "github.com/bishopfox/sliver/client/command" sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" @@ -88,8 +89,8 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { root.AddCommand(implantCmd(con, sliver)) // Pre/post runners and completions. - command.BindPrePost(root, true, con.ConnectRun) - command.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { + command.BindPreRun(root, con.ConnectRun) + command.BindPostRun(root, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) diff --git a/client/cli/implant.go b/client/cli/implant.go index c98e32a6b9..c15108cb3e 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -4,15 +4,16 @@ import ( "errors" "os" - "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/command/use" - client "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" "golang.org/x/exp/slices" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/use" + client "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" ) func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { @@ -50,7 +51,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co }) // This completer will try connect to the server anyway, if not done already. - command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(implantCmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { return use.BeaconAndSessionIDCompleter(con) }) diff --git a/client/command/command.go b/client/command/command.go index 0559e8433b..62d60bc231 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,40 +21,25 @@ package command import ( "strings" - "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" - "github.com/spf13/pflag" + + "github.com/reeflective/console" client "github.com/bishopfox/sliver/client/console" ) -const defaultTimeout = 60 - -// bindFlags is a convenience function to bind flags to a given command. -// name - The name of the flag set (can be empty). -// cmd - The command to which the flags should be bound. -// flags - A function exposing the flag set through which flags are declared. -func bindFlags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { - flagSet := pflag.NewFlagSet(name, pflag.ContinueOnError) // Create the flag set. - flags(flagSet) // Let the user bind any number of flags to it. +// ***** Exported Command API Types ****** - if persistent { - cmd.PersistentFlags().AddFlagSet(flagSet) - } else { - cmd.Flags().AddFlagSet(flagSet) - } -} +// SliverBinder is the signature of command yielder functions passed and used by +// the Sliver client. Currently this function type is only used as an alias for +// loading command sets easily, and is not part of any interface. +type SliverBinder func(con *client.SliverClient) []*cobra.Command -// BindFlagCompletions is a convenience function for adding completions to a command's flags. -// cmd - The command owning the flags to complete. -// bind - A function exposing a map["flag-name"]carapace.Action. -func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { - comps := make(carapace.ActionMap) - bind(&comps) +// CobraRunnerE is a simple type alias to denote cobra Runners with errors. +// The type is mostly use to register additional pre/post runners for commands. +type CobraRunnerE func(_ *cobra.Command, _ []string) error - carapace.Gen(cmd).FlagCompletion(comps) -} +// ***** Other Commands Binding Utilties ****** // RestrictTargets generates a cobra annotation map with a single console.CommandHiddenFilter key // to a comma-separated list of filters to use in order to expose/hide commands based on requirements. @@ -78,9 +63,9 @@ func RestrictTargets(filters ...string) map[string]string { } } -// MakeBind returns a commandBinder helper function. +// makeBind returns a commandBinder helper function. // @menu - The command menu to which the commands should be bound (either server or implant menu). -func MakeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { +func makeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { return func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { found := false @@ -117,7 +102,6 @@ func MakeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { } // commandBinder is a helper used to bind commands to a given menu, for a given "command help group". -// // @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. // @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. type commandBinder func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) @@ -135,12 +119,6 @@ type commandBinder func(group string, cmds ...func(con *client.SliverClient) []* // [ Aliases ] // [ Extensions ] -// Commands not to bind in CLI: -// - portforwarders -// - Socks (and wg-socks ?) -// - shell ? - // Take care of: // - double bind help command // - double bind session commands -// - don't bind readline command in CLI. diff --git a/client/command/server.go b/client/command/server.go index a31149cce7..fa13b43858 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,9 +19,10 @@ package command */ import ( - "github.com/reeflective/console" "github.com/spf13/cobra" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -50,10 +51,7 @@ import ( consts "github.com/bishopfox/sliver/client/constants" ) -// SliverBinder is the signature of command yielder functions passed and used by -// the Sliver client. Currently this function type is only used as an alias for -// loading command sets easily, and is not part of any interface. -type SliverBinder func(con *client.SliverClient) []*cobra.Command +// ***** Command Generators and Runner Binders ****** // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. @@ -72,7 +70,7 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := MakeBind(server, con) + bind := makeBind(server, con) if serverCmds != nil { bind(consts.GenericHelpGroup, @@ -145,29 +143,22 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C return serverCommands } -// BindPrePost is used to register specific pre/post-runs for a given command/tree. -// -// This function is special in that it will only bind the pre/post-runners to commands -// in the tree if they have a non-nil Run/RunE function, or if they are leaf commands. -// -// This allows us to optimize client-to-server connections for things like completions. -func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { +// BindPreRun registers specific pre-execution runners for all +// leafs commands (and some nodes) of a given command/tree. +func BindPreRun(root *cobra.Command, runs ...CobraRunnerE) { for _, cmd := range root.Commands() { ePreE := cmd.PersistentPreRunE - ePostE := cmd.PersistentPostRunE run, runE := cmd.Run, cmd.RunE // Don't modify commands in charge on their own tree. - if pre && ePreE != nil { - continue - } else if ePostE != nil { + if ePreE != nil { continue } // Always go to find the leaf commands, irrespective // of what we do with this parent command. if cmd.HasSubCommands() { - BindPrePost(cmd, pre, runs...) + BindPreRun(cmd, runs...) } // If the command has no runners, there's nothing to bind: @@ -178,9 +169,7 @@ func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ } // Else we have runners, bind the pre-runs if possible. - if pre && cmd.PreRunE != nil { - continue - } else if cmd.PostRunE != nil { + if cmd.PreRunE != nil { continue } @@ -197,10 +186,53 @@ func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ } // Bind - if pre { - cmd.PreRunE = cRun - } else { - cmd.PostRunE = cRun + cmd.PreRunE = cRun + } +} + +// BindPostRun registers specific post-execution runners for all +// leafs commands (and some nodes) of a given command/tree. +func BindPostRun(root *cobra.Command, runs ...CobraRunnerE) { + for _, cmd := range root.Commands() { + ePostE := cmd.PersistentPostRunE + run, runE := cmd.Run, cmd.RunE + + // Don't modify commands in charge on their own tree. + if ePostE != nil { + continue } + + // Always go to find the leaf commands, irrespective + // of what we do with this parent command. + if cmd.HasSubCommands() { + BindPostRun(cmd, runs...) + } + + // If the command has no runners, there's nothing to bind: + // If it has flags, any child command requiring them should + // trigger the prerunners, which will connect to the server. + if run == nil && runE == nil { + continue + } + + // Else we have runners, bind the pre-runs if possible. + if cmd.PostRunE != nil { + continue + } + + // Compound all runners together. + cRun := func(c *cobra.Command, args []string) error { + for _, run := range runs { + err := run(c, args) + if err != nil { + return err + } + } + + return nil + } + + // Bind + cmd.PostRunE = cRun } } diff --git a/client/command/sliver.go b/client/command/sliver.go index 973947f5fe..88238c0d00 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,10 @@ package command */ import ( - "github.com/reeflective/console" "github.com/spf13/cobra" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -70,7 +71,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := MakeBind(sliver, con) + bind := makeBind(sliver, con) // [ Core ] bind(consts.SliverCoreHelpGroup, diff --git a/server/cli/cli.go b/server/cli/cli.go index 48f9ad540c..4fc2bb6333 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -114,8 +114,8 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra root.AddCommand(consoleCmd.Command(con, server)) // Pre/post runners and completions. - clientCommand.BindPrePost(root, true, con.ConnectRun) - clientCommand.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { + clientCommand.BindPreRun(root, con.ConnectRun) + clientCommand.BindPostRun(root, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) From fad8d23c102203b8579bfbae127a90002585d132 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 02:37:48 +0200 Subject: [PATCH 092/109] Split/restructure console code into files, check comments everywhere --- client/cli/implant.go | 5 +- client/console/command.go | 215 ++++++++++++++++++++++++++++++++++++++ client/console/console.go | 177 +------------------------------ client/console/implant.go | 168 ++++++++++++++--------------- 4 files changed, 298 insertions(+), 267 deletions(-) create mode 100644 client/console/command.go diff --git a/client/cli/implant.go b/client/cli/implant.go index c15108cb3e..6ebb1cbeb7 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/pflag" "golang.org/x/exp/slices" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/use" client "github.com/bishopfox/sliver/client/console" @@ -60,7 +61,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return implantCmd } -func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { +func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { if err := con.ConnectRun(cmd, args); err != nil { return err @@ -99,7 +100,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd } } -func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { +func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { var saveArgs []string diff --git a/client/console/command.go b/client/console/command.go new file mode 100644 index 0000000000..ae34a06112 --- /dev/null +++ b/client/console/command.go @@ -0,0 +1,215 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os" + "os/signal" + "strings" + "syscall" + + "github.com/spf13/cobra" + + "github.com/reeflective/console" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/spin" +) + +// FilterCommands shows/hides commands if the active target does support them (or not). +// Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. +// Both the cmd *cobra.Command passed and the filters can be nil, in which case the +// filters are recomputed by the console application for the current context. +func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { + con.App.ShowCommands() + + if con.isCLI { + filters = append(filters, consts.ConsoleCmdsFilter) + } + + sess, beac := con.ActiveTarget.Get() + if sess != nil || beac != nil { + filters = append(filters, con.ActiveTarget.Filters()...) + } + + con.App.HideCommands(filters...) + + if cmd != nil { + for _, cmd := range cmd.Commands() { + if cmd.Hidden { + continue + } + + if isFiltered(cmd, filters) { + cmd.Hidden = true + } + } + } +} + +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + +// Filters returns list of constants describing which types of commands +// should NOT be available for the current target, eg. beacon commands if +// the target is a session, Windows commands if the target host is Linux. +func (s *ActiveTarget) Filters() []string { + if s.session == nil && s.beacon == nil { + return nil + } + + filters := make([]string, 0) + + // Target type. + switch { + case s.session != nil: + session := s.session + + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) + + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + + case s.beacon != nil: + beacon := s.beacon + + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) + + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + } + + return filters +} + +func isFiltered(cmd *cobra.Command, targetFilters []string) bool { + if cmd.Annotations == nil { + return false + } + + // Get the filters on the command + filterStr := cmd.Annotations[console.CommandFilterKey] + filters := strings.Split(filterStr, ",") + + for _, cmdFilter := range filters { + for _, filter := range targetFilters { + if cmdFilter != "" && cmdFilter == filter { + return true + } + } + } + + return false +} + +// SpinUntil starts a console display spinner in the background (non-blocking) +func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { + go spin.Until(os.Stdout, message, ctrl) +} + +// WaitSignal listens for os.Signals and returns when receiving one of the following: +// SIGINT, SIGTERM, SIGQUIT. +// +// This can be used for commands which should block if executed in an exec-once CLI run: +// if the command is ran in the closed-loop console, this function will not monitor signals +// and return immediately. +func (con *SliverClient) WaitSignal() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + sig := <-sigchan + con.PrintInfof("Received signal %s\n", sig) + + return nil +} + +func (con *SliverClient) waitSignalOrClose() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + if con.waitingResult == nil { + con.waitingResult = make(chan bool) + } + + select { + case sig := <-sigchan: + con.PrintInfof("Received signal %s\n", sig) + case <-con.waitingResult: + con.waitingResult = make(chan bool) + return nil + } + + return nil +} diff --git a/client/console/console.go b/client/console/console.go index 2ddb4be033..3c0d922d40 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -25,12 +25,9 @@ import ( "io" "log" "os" - "os/signal" "path/filepath" "strconv" - "strings" "sync" - "syscall" "time" "github.com/spf13/cobra" @@ -40,11 +37,9 @@ import ( "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/console" "github.com/reeflective/readline" @@ -159,7 +154,7 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), client.WithDialer(con.dialer), - client.WithLogger(initTeamclientLog()), + client.WithLogger(initTeamclientLog()), ) // Create a new reeflective/team.Client, which is in charge of selecting, @@ -237,173 +232,6 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// FilterCommands shows/hides commands if the active target does support them (or not). -// Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -// Both the cmd *cobra.Command passed and the filters can be nil, in which case the -// filters are recomputed by the console application for the current context. -func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { - con.App.ShowCommands() - - if con.isCLI { - filters = append(filters, consts.ConsoleCmdsFilter) - } - - sess, beac := con.ActiveTarget.Get() - if sess != nil || beac != nil { - filters = append(filters, con.ActiveTarget.Filters()...) - } - - con.App.HideCommands(filters...) - - if cmd != nil { - for _, cmd := range cmd.Commands() { - if cmd.Hidden { - continue - } - - if isFiltered(cmd, filters) { - cmd.Hidden = true - } - } - } -} - -// GetSession returns the session matching an ID, either by prefix or strictly. -func (con *SliverClient) GetSession(arg string) *clientpb.Session { - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintWarnf("%s", err) - return nil - } - for _, session := range sessions.GetSessions() { - if session.Name == arg || strings.HasPrefix(session.ID, arg) { - return session - } - } - return nil -} - -// GetBeacon returns the beacon matching an ID, either by prefix or strictly. -func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { - beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintWarnf("%s", err) - return nil - } - for _, session := range beacons.GetBeacons() { - if session.Name == arg || strings.HasPrefix(session.ID, arg) { - return session - } - } - return nil -} - -// GetSessionsByName - Return all sessions for an Implant by name. -func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err != nil { - fmt.Printf(Warn+"%s\n", err) - return nil - } - matched := []*clientpb.Session{} - for _, session := range sessions.GetSessions() { - if session.Name == name { - matched = append(matched, session) - } - } - return matched -} - -// GetActiveSessionConfig - Get the active sessions's config -// TODO: Switch to query config based on ConfigID. -func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { - session := con.ActiveTarget.GetSession() - if session == nil { - return nil - } - c2s := []*clientpb.ImplantC2{} - c2s = append(c2s, &clientpb.ImplantC2{ - URL: session.GetActiveC2(), - Priority: uint32(0), - }) - config := &clientpb.ImplantConfig{ - Name: session.GetName(), - GOOS: session.GetOS(), - GOARCH: session.GetArch(), - Debug: true, - Evasion: session.GetEvasion(), - - MaxConnectionErrors: uint32(1000), - ReconnectInterval: int64(60), - Format: clientpb.OutputFormat_SHELLCODE, - IsSharedLib: true, - C2: c2s, - } - return config -} - -// SpinUntil starts a console display spinner in the background (non-blocking) -func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { - go spin.Until(os.Stdout, message, ctrl) -} - -// WaitSignal listens for os.Signals and returns when receiving one of the following: -// SIGINT, SIGTERM, SIGQUIT. -// -// This can be used for commands which should block if executed in an exec-once CLI run: -// if the command is ran in the closed-loop console, this function will not monitor signals -// and return immediately. -func (con *SliverClient) WaitSignal() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - sig := <-sigchan - con.PrintInfof("Received signal %s\n", sig) - - return nil -} - -func (con *SliverClient) waitSignalOrClose() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - if con.waitingResult == nil { - con.waitingResult = make(chan bool) - } - - select { - case sig := <-sigchan: - con.PrintInfof("Received signal %s\n", sig) - case <-con.waitingResult: - con.waitingResult = make(chan bool) - return nil - } - - return nil -} - // FormatDateDelta - Generate formatted date string of the time delta between then and now. func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) @@ -432,7 +260,7 @@ func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bo return interval } -// GrpcContext - Generate a context for a GRPC request, if no grumble context or an invalid flag is provided 60 seconds is used instead. +// GrpcContext - Generate a context for a GRPC request, if no cobra context or an invalid flag is provided 60 seconds is used instead. func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, context.CancelFunc) { if cmd == nil { return context.WithTimeout(context.Background(), 60*time.Second) @@ -452,6 +280,7 @@ func (con *SliverClient) UnwrapServerErr(err error) error { return errors.New(status.Convert(err).Message()) } +// CheckLastUpdate prints a message to the CLI if updates are available. func (con *SliverClient) CheckLastUpdate() { now := time.Now() lastUpdate := getLastUpdateCheck() diff --git a/client/console/implant.go b/client/console/implant.go index 7dc4c6c0a1..64e70f48b0 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -19,15 +19,16 @@ package console */ import ( + "context" "fmt" "strings" "time" + "github.com/spf13/cobra" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/reeflective/console" - "github.com/spf13/cobra" ) type ActiveTarget struct { @@ -48,6 +49,80 @@ func newActiveTarget() *ActiveTarget { return at } +// GetSession returns the session matching an ID, either by prefix or strictly. +func (con *SliverClient) GetSession(arg string) *clientpb.Session { + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintWarnf("%s", err) + return nil + } + for _, session := range sessions.GetSessions() { + if session.Name == arg || strings.HasPrefix(session.ID, arg) { + return session + } + } + return nil +} + +// GetBeacon returns the beacon matching an ID, either by prefix or strictly. +func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintWarnf("%s", err) + return nil + } + for _, session := range beacons.GetBeacons() { + if session.Name == arg || strings.HasPrefix(session.ID, arg) { + return session + } + } + return nil +} + +// GetSessionsByName - Return all sessions for an Implant by name. +func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err != nil { + fmt.Printf(Warn+"%s\n", err) + return nil + } + matched := []*clientpb.Session{} + for _, session := range sessions.GetSessions() { + if session.Name == name { + matched = append(matched, session) + } + } + return matched +} + +// GetActiveSessionConfig - Get the active sessions's config +// TODO: Switch to query config based on ConfigID. +func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { + session := con.ActiveTarget.GetSession() + if session == nil { + return nil + } + c2s := []*clientpb.ImplantC2{} + c2s = append(c2s, &clientpb.ImplantC2{ + URL: session.GetActiveC2(), + Priority: uint32(0), + }) + config := &clientpb.ImplantConfig{ + Name: session.GetName(), + GOOS: session.GetOS(), + GOARCH: session.GetArch(), + Debug: true, + Evasion: session.GetEvasion(), + + MaxConnectionErrors: uint32(1000), + ReconnectInterval: int64(60), + Format: clientpb.OutputFormat_SHELLCODE, + IsSharedLib: true, + C2: c2s, + } + return config +} + // GetSessionInteractive - Get the active target(s). func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { if s.session == nil && s.beacon == nil { @@ -197,92 +272,3 @@ func (s *ActiveTarget) Background() { s.con.App.SwitchMenu(consts.ServerMenu) } } - -// FilterCommands - The active target may have various transport stacks, -// run on different hosts and operating systems, have networking tools, etc. -// -// Given a tree of commands which may or may not all act on a given target, -// the implant adds a series of annotations and hide directives to those which -// should not be available in the current state of things. -func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { - targetFilters := s.Filters() - - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true - } - } -} - -// Filters returns list of constants describing which types of commands -// should NOT be available for the current target, eg. beacon commands if -// the target is a session, Windows commands if the target host is Linux. -func (s *ActiveTarget) Filters() []string { - if s.session == nil && s.beacon == nil { - return nil - } - - filters := make([]string, 0) - - // Target type. - switch { - case s.session != nil: - session := s.session - - // Forbid all beacon-only commands. - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case s.beacon != nil: - beacon := s.beacon - - // Forbid all session-only commands. - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - } - - return filters -} - -func isFiltered(cmd *cobra.Command, targetFilters []string) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[console.CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range targetFilters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } - - return false -} From 64628c533eae52023dd398f3f47d142839e55418 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 02:52:25 +0200 Subject: [PATCH 093/109] Comment remaining client code --- client/cli/implant.go | 9 +++++++++ client/console/console.go | 2 +- client/console/readline.go | 5 +++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 6ebb1cbeb7..078746a6b0 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -17,6 +17,9 @@ import ( "github.com/reeflective/console" ) +// implantCmd returns the command tree for Sliver active targets. +// This function has not yet found its place into one of the commands subdirectories, +// since I'm not really sure how to do it in a way that would be optimal for everyone. func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { // Generate a not-yet filtered tree of all commands // usable in the context of an active target implant. @@ -61,6 +64,10 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return implantCmd } +// preRunImplant returns the pre-runner to be ran before any implant-targeting command, +// to connect to the server, query the sessions/beacons and set one as the active target. +// Like implantCmd, this function can moved from here down the road, either integrated as +// a console.Client method to be used easily by the users using "custom" Go clients for some things. func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { if err := con.ConnectRun(cmd, args); err != nil { @@ -100,6 +107,8 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command. } } +// postRunImplant saves the current CLI os.Args command line to the server, so that all interactions +// with an implant from a system shell will be logged and accessible just the same as in the console. func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { var saveArgs []string diff --git a/client/console/console.go b/client/console/console.go index 3c0d922d40..12e41103ab 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -189,7 +189,7 @@ func newClient() *SliverClient { } con.App.SetPrintLogo(func(_ *console.Console) { - con.PrintLogo() + con.printLogo() }) // Readline-shell (edition) settings diff --git a/client/console/readline.go b/client/console/readline.go index ab701edb45..4e4bfd940e 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -47,8 +48,8 @@ func (con *SliverClient) GetPrompt() string { return prompt } -// PrintLogo prints the Sliver console logo. -func (con *SliverClient) PrintLogo() { +// printLogo prints the Sliver console logo. +func (con *SliverClient) printLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { panic(err.Error()) From 8040e5ffadd1b93ce5a828a6cc4b820d453773e1 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 03:53:05 +0200 Subject: [PATCH 094/109] Cleanup, slicker API, fixes and optimizations --- client/cli/cli.go | 8 +- client/cli/implant.go | 3 +- client/console/command.go | 169 ++++++++++------------------------- client/console/console.go | 6 +- client/console/implant.go | 48 ++++++++++ client/console/log.go | 16 ++-- client/console/readline.go | 111 +++++++++++++++++------ client/console/teamclient.go | 65 +++----------- server/cli/cli.go | 42 +++++++-- 9 files changed, 248 insertions(+), 220 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 15e5517fe8..53b0bf6932 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -84,15 +84,11 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - sliver := command.SliverCommands(con) - - root.AddCommand(implantCmd(con, sliver)) + root.AddCommand(implantCmd(con, command.SliverCommands(con))) // Pre/post runners and completions. command.BindPreRun(root, con.ConnectRun) - command.BindPostRun(root, func(_ *cobra.Command, _ []string) error { - return con.Disconnect() - }) + command.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. carapace.Gen(root) diff --git a/client/cli/implant.go b/client/cli/implant.go index 078746a6b0..25c3c3b461 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -127,6 +127,7 @@ func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command con.ActiveTarget.SaveCommandLine(saveArgs) - return con.Disconnect() + // And disconnect from the server like for other commands. + return con.PostRunDisconnect(cmd, args) } } diff --git a/client/console/command.go b/client/console/command.go index ae34a06112..470c1ad424 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -19,19 +19,36 @@ package console */ import ( - "os" - "os/signal" "strings" - "syscall" "github.com/spf13/cobra" "github.com/reeflective/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/spin" ) +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + // FilterCommands shows/hides commands if the active target does support them (or not). // Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. // Both the cmd *cobra.Command passed and the filters can be nil, in which case the @@ -63,73 +80,45 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { } } -// FilterCommands - The active target may have various transport stacks, -// run on different hosts and operating systems, have networking tools, etc. -// -// Given a tree of commands which may or may not all act on a given target, -// the implant adds a series of annotations and hide directives to those which -// should not be available in the current state of things. -func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { - targetFilters := s.Filters() +// AddPreRunner should be considered part of the temporary API. +// It is used by the Sliver client to run hooks before running its own pre-connect +// handlers, and can thus be used to register server-only pre-run routines. +func (con *SliverClient) AddPreRunners(hooks ...func(_ *cobra.Command, _ []string) error) { + con.preRunners = append(con.preRunners, hooks...) +} - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { +// runPreConnectHooks is also a function which might be temporary, and currently used +// to run "server-side provided" command pre-runners (for assets setup, jobs, etc) +func (con *SliverClient) runPreConnectHooks(cmd *cobra.Command, args []string) error { + for _, hook := range con.preRunners { + if hook == nil { continue } - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true + if err := hook(cmd, args); err != nil { + return err } } + + return nil } -// Filters returns list of constants describing which types of commands -// should NOT be available for the current target, eg. beacon commands if -// the target is a session, Windows commands if the target host is Linux. -func (s *ActiveTarget) Filters() []string { - if s.session == nil && s.beacon == nil { - return nil +// WARN: this is the premise of a big burden. Please bear this in mind. +// If I haven't speaked to you about it, or if you're not sure of what +// that means, ping me up and ask. +func (con *SliverClient) isOffline(cmd *cobra.Command) bool { + // Teamclient configuration import does not need network. + ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) + if err == nil && ts != nil && ts == cmd { + return true } - filters := make([]string, 0) - - // Target type. - switch { - case s.session != nil: - session := s.session - - // Forbid all beacon-only commands. - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case s.beacon != nil: - beacon := s.beacon - - // Forbid all session-only commands. - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } + tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) + if err == nil && ts != nil && tc == cmd { + return true } - return filters + return false } func isFiltered(cmd *cobra.Command, targetFilters []string) bool { @@ -151,65 +140,3 @@ func isFiltered(cmd *cobra.Command, targetFilters []string) bool { return false } - -// SpinUntil starts a console display spinner in the background (non-blocking) -func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { - go spin.Until(os.Stdout, message, ctrl) -} - -// WaitSignal listens for os.Signals and returns when receiving one of the following: -// SIGINT, SIGTERM, SIGQUIT. -// -// This can be used for commands which should block if executed in an exec-once CLI run: -// if the command is ran in the closed-loop console, this function will not monitor signals -// and return immediately. -func (con *SliverClient) WaitSignal() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - sig := <-sigchan - con.PrintInfof("Received signal %s\n", sig) - - return nil -} - -func (con *SliverClient) waitSignalOrClose() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - if con.waitingResult == nil { - con.waitingResult = make(chan bool) - } - - select { - case sig := <-sigchan: - con.PrintInfof("Received signal %s\n", sig) - case <-con.waitingResult: - con.waitingResult = make(chan bool) - return nil - } - - return nil -} diff --git a/client/console/console.go b/client/console/console.go index 12e41103ab..e02e437956 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -105,9 +105,9 @@ type SliverClient struct { isCLI bool // Teamclient & remotes - Teamclient *client.Client - dialer *transport.TeamClient - connectHooks []func() error + Teamclient *client.Client + dialer *transport.TeamClient + preRunners []func(*cobra.Command, []string) error // Logging jsonHandler slog.Handler diff --git a/client/console/implant.go b/client/console/implant.go index 64e70f48b0..21ae1a7c8c 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -272,3 +272,51 @@ func (s *ActiveTarget) Background() { s.con.App.SwitchMenu(consts.ServerMenu) } } + +// Filters returns list of constants describing which types of commands +// should NOT be available for the current target, eg. beacon commands if +// the target is a session, Windows commands if the target host is Linux. +func (s *ActiveTarget) Filters() []string { + if s.session == nil && s.beacon == nil { + return nil + } + + filters := make([]string, 0) + + // Target type. + switch { + case s.session != nil: + session := s.session + + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) + + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + + case s.beacon != nil: + beacon := s.beacon + + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) + + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + } + + return filters +} diff --git a/client/console/log.go b/client/console/log.go index f967fcddc0..852e819766 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -34,6 +34,7 @@ import ( "golang.org/x/term" "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" @@ -198,20 +199,20 @@ func getConsoleAsciicastFile() *os.File { return logFile } -// initTeamclientLog returns a logrus logger to be passed to the Sliver +// initTeamclientLog returns a logrus logger to be passed to the Sliver // team.Client for logging all client-side transport/RPC events. -func initTeamclientLog() (*logrus.Logger) { +func initTeamclientLog() *logrus.Logger { logsDir := assets.GetConsoleLogsDir() dateTime := time.Now().Format("2006-01-02_15-04-05") logPath := filepath.Join(logsDir, fmt.Sprintf("%s.log", dateTime)) textLogger := logrus.New() - textLogger.SetFormatter(&logrus.TextFormatter{}) + textLogger.SetFormatter(&logrus.TextFormatter{}) - logFile, err := os.OpenFile(logPath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644) + logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Fatalf("Failed to open log file %s", err) - return textLogger + return textLogger } // Text-format logger, writing to file. @@ -322,3 +323,8 @@ func (con *SliverClient) PrintEventSuccessf(format string, args ...any) { con.printf(Clearln+"\r\n"+Success+format+"\r", args...) } + +// SpinUntil starts a console display spinner in the background (non-blocking) +func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { + go spin.Until(os.Stdout, message, ctrl) +} diff --git a/client/console/readline.go b/client/console/readline.go index 4e4bfd940e..64c92ce28c 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -23,7 +23,9 @@ import ( "fmt" insecureRand "math/rand" "os" + "os/signal" "strings" + "syscall" "github.com/AlecAivazis/survey/v2" @@ -48,32 +50,6 @@ func (con *SliverClient) GetPrompt() string { return prompt } -// printLogo prints the Sliver console logo. -func (con *SliverClient) printLogo() { - serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) - if err != nil { - panic(err.Error()) - } - dirty := "" - if serverVer.Dirty { - dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) - } - serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) - - logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] - fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) - fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") - fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) - if version.GitCommit != serverVer.Commit { - fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) - } - fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") - if serverVer.Major != int32(version.SemanticVersion()[0]) { - fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") - } - con.CheckLastUpdate() -} - // ExitConfirm tries to exit the Sliver go program. // It will prompt on stdin for confirmation if: // - The program is a Sliver server and has active slivers under management. @@ -126,6 +102,89 @@ func (con *SliverClient) ExitConfirm() { os.Exit(0) } +// WaitSignal listens for os.Signals and returns when receiving one of the following: +// SIGINT, SIGTERM, SIGQUIT. +// +// This can be used for commands which should block if executed in an exec-once CLI run: +// if the command is ran in the closed-loop console, this function will not monitor signals +// and return immediately. +func (con *SliverClient) WaitSignal() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + sig := <-sigchan + con.PrintInfof("Received signal %s\n", sig) + + return nil +} + +func (con *SliverClient) waitSignalOrClose() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + if con.waitingResult == nil { + con.waitingResult = make(chan bool) + } + + select { + case sig := <-sigchan: + con.PrintInfof("Received signal %s\n", sig) + case <-con.waitingResult: + con.waitingResult = make(chan bool) + return nil + } + + return nil +} + +// printLogo prints the Sliver console logo. +func (con *SliverClient) printLogo() { + serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + if err != nil { + panic(err.Error()) + } + dirty := "" + if serverVer.Dirty { + dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) + } + serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) + + logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] + fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) + fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") + fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) + if version.GitCommit != serverVer.Commit { + fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) + } + fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") + if serverVer.Major != int32(version.SemanticVersion()[0]) { + fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") + } + con.CheckLastUpdate() +} + // exitConsole prompts the user for confirmation to exit the console. func (c *SliverClient) exitConsole(_ *console.Console) { c.ExitConfirm() diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 16b5da8408..a91c912541 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -24,16 +24,17 @@ import ( "runtime" "time" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "google.golang.org/grpc/status" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/status" ) // ConnectRun is a spf13/cobra-compliant runner function to be included @@ -44,7 +45,7 @@ import ( // // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. -func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { +func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { con.FilterCommands(cmd) // If commands are imcompatible with the current requirements. @@ -58,7 +59,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { return nil } - if err := con.runPreConnectHooks(); err != nil { + if err := con.runPreConnectHooks(cmd, args); err != nil { return err } @@ -99,7 +100,9 @@ func (con *SliverClient) ConnectComplete() (carapace.Action, error) { } // This almost only ever runs teamserver-side pre-runs. - err := con.runPreConnectHooks() + // We don't need to pass a command to this call, since + // it does call hooks that should handle nil commands. + err := con.runPreConnectHooks(nil, nil) if err != nil { return carapace.ActionMessage("connection error: %s", err), err } @@ -116,11 +119,11 @@ func (con *SliverClient) ConnectComplete() (carapace.Action, error) { return carapace.ActionValues(), nil } -// Disconnect disconnects the client from its Sliver server, -// closing all its event/log streams and files, then closing -// the core Sliver RPC client connection. +// PostRunDisconnect disconnects the client from its Sliver server, +// closing all its event/log streams and files, then closing the core +// Sliver RPC client connection. This should be ran as a post-runner. // After this call, the client can reconnect should it want to. -func (con *SliverClient) Disconnect() error { +func (con *SliverClient) PostRunDisconnect(cmd *cobra.Command, args []string) error { // Close all RPC streams and local files. con.closeClientStreams() @@ -128,14 +131,6 @@ func (con *SliverClient) Disconnect() error { return con.Teamclient.Disconnect() } -// AddConnectHooks should be considered part of the temporary API. -// It is used to all the Sliver client to run hooks before running -// its own pre-connect handlers, and can thus be used to register -// server-only pre-run routines. -func (con *SliverClient) AddConnectHooks(hooks ...func() error) { - con.connectHooks = append(con.connectHooks, hooks...) -} - // Users returns a list of all users registered with the app teamserver. // If the gRPC teamclient is not connected or does not have an RPC client, // an ErrNoRPC is returned. @@ -231,35 +226,3 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { histAll.Close() }) } - -func (con *SliverClient) runPreConnectHooks() error { - for _, hook := range con.connectHooks { - if hook == nil { - continue - } - - if err := hook(); err != nil { - return err - } - } - - return nil -} - -// WARN: this is the premise of a big burden. Please bear this in mind. -// If I haven't speaked to you about it, or if you're not sure of what -// that means, ping me up and ask. -func (con *SliverClient) isOffline(cmd *cobra.Command) bool { - // Teamclient configuration import does not need network. - ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) - if err == nil && ts != nil && ts == cmd { - return true - } - - tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) - if err == nil && ts != nil && tc == cmd { - return true - } - - return false -} diff --git a/server/cli/cli.go b/server/cli/cli.go index 4fc2bb6333..9f6b63051a 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -63,10 +63,6 @@ func Execute() { panic(err) } - // The server is also a client of itself, so add our sliver-server - // binary specific pre-run hooks: assets, encoders, toolchains, etc. - con.AddConnectHooks(preRunServer(teamserver, con)) - // Generate our complete Sliver Framework command-line interface. rootCmd := sliverServerCLI(teamserver, con) @@ -113,11 +109,13 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra // need one connection for the entire lifetime of the console. root.AddCommand(consoleCmd.Command(con, server)) + // The server is also a client of itself, so add our sliver-server + // binary specific pre-run hooks: assets, encoders, toolchains, etc. + con.AddPreRunners(preRunServerS(team, con)) + // Pre/post runners and completions. clientCommand.BindPreRun(root, con.ConnectRun) - clientCommand.BindPostRun(root, func(_ *cobra.Command, _ []string) error { - return con.Disconnect() - }) + clientCommand.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. carapace.Gen(root) @@ -125,6 +123,36 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra return root } +func preRunServerS(teamserver *server.Server, con *client.SliverClient) clientCommand.CobraRunnerE { + return func(cmd *cobra.Command, args []string) error { + // All commands of the teamserver binary + // must always have at least these working. + assets.Setup(false, true) + encoders.Setup() + certs.SetupCAs() + certs.SetupWGKeys() + cryptography.AgeServerKeyPair() + cryptography.MinisignServerPrivateKey() + + // But we don't start Sliver-specific C2 listeners unless + // we are being ran in daemon mode, or in the console. + // We don't always have access to a command, such when + if cmd != nil { + if (cmd.Name() == "daemon" && cmd.Parent().Name() == "teamserver") || + cmd.Name() == "console" { + serverConfig := configs.GetServerConfig() + err := c2.StartPersistentJobs(serverConfig) + if err != nil { + con.PrintWarnf("Persistent jobs restart error: %s", err) + } + } + + } + // Let our in-memory teamclient be served. + return teamserver.Serve(con.Teamclient) + } +} + // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { From 6e685e9c03a970b755b789f966707fce1671d13a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 04:27:37 +0200 Subject: [PATCH 095/109] Rename some function better, update dependencies with fix. --- client/cli/cli.go | 2 +- client/cli/implant.go | 2 +- client/command/beacons/commands.go | 2 +- client/command/crack/helpers.go | 6 +-- client/command/creds/creds.go | 4 +- client/command/generate/helpers.go | 14 +++---- client/command/generate/implants.go | 2 +- client/command/generate/profiles.go | 2 +- client/command/jobs/jobs.go | 2 +- client/command/pivots/helpers.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/sessions/helpers.go | 2 +- client/command/tasks/helpers.go | 4 +- client/command/websites/websites.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 2 +- client/command/wireguard/wg-socks.go | 2 +- client/console/command.go | 2 +- client/console/console.go | 1 + client/console/teamclient.go | 9 ++--- go.mod | 2 +- go.sum | 4 +- server/cli/cli.go | 40 +++++++++---------- .../team/client/commands/commands.go | 5 +-- .../team/client/commands/import.go | 5 +-- .../reeflective/team/client/commands/users.go | 5 +-- .../team/client/commands/version.go | 5 +-- .../team/server/commands/commands.go | 21 +++++++--- .../team/server/commands/completers.go | 3 +- .../team/server/commands/teamserver.go | 7 ++-- .../reeflective/team/server/commands/user.go | 5 +-- .../reeflective/team/server/server.go | 2 +- vendor/modules.txt | 2 +- 32 files changed, 86 insertions(+), 84 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 53b0bf6932..ae67018a40 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -87,7 +87,7 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { root.AddCommand(implantCmd(con, command.SliverCommands(con))) // Pre/post runners and completions. - command.BindPreRun(root, con.ConnectRun) + command.BindPreRun(root, con.PreRunConnect) command.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. diff --git a/client/cli/implant.go b/client/cli/implant.go index 25c3c3b461..a2899c9f7c 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -70,7 +70,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co // a console.Client method to be used easily by the users using "custom" Go clients for some things. func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { - if err := con.ConnectRun(cmd, args); err != nil { + if err := con.PreRunConnect(cmd, args); err != nil { return err } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 78885af22f..a6599eb145 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -82,7 +82,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index 6841d10b41..026da296e9 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -13,7 +13,7 @@ import ( func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -40,7 +40,7 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -68,7 +68,7 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 1253416021..1c764e0a5d 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -113,7 +113,7 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { // CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -140,7 +140,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { // CredsCredentialIDCompleter completes credential IDs. func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 25c58437f6..941b7289ef 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -65,7 +65,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // FormatCompleter completes builds' architectures. func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -103,7 +103,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { // FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -150,7 +150,7 @@ func FormatCompleter() carapace.Action { // TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -180,7 +180,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager formats. func MsfFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -208,7 +208,7 @@ func MsfFormatCompleter(con *console.SliverClient) carapace.Action { // MsfArchCompleter completes MsfVenom stager architectures. func MsfArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -235,7 +235,7 @@ func MsfArchCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager encoders. func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -262,7 +262,7 @@ func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { // MsfPayloadCompleter completes Metasploit payloads. func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 2336cf7449..76d806ed4f 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -126,7 +126,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl // ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index d20e4d7d1d..120055568d 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -423,7 +423,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { // ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index bb8f05a644..e9683ec695 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -92,7 +92,7 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { // JobsIDCompleter completes jobs IDs with descriptions. func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index ac16fb9b4c..240a65bfa7 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -69,7 +69,7 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive // PivotIDCompleter completes pivot listeners' IDs. func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 8c0aa9e515..ddcbb655b9 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -81,7 +81,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index cf0056c3ef..d65288d14a 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -109,7 +109,7 @@ func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session // SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index eaf7e77bdf..20fe336d4e 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -52,7 +52,7 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -121,7 +121,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { // BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index e08f3a640a..ac7f56a215 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -113,7 +113,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { // WebsiteNameCompleter completes the names of available websites. func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index 59e8e54729..edf80c7ff5 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -69,7 +69,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 4a2c41bfe4..cb8cd09e6a 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -76,7 +76,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string // SocksIDCompleter IDs of WireGuard socks servers. func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/console/command.go b/client/console/command.go index 470c1ad424..4a17ea52ef 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -83,7 +83,7 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { // AddPreRunner should be considered part of the temporary API. // It is used by the Sliver client to run hooks before running its own pre-connect // handlers, and can thus be used to register server-only pre-run routines. -func (con *SliverClient) AddPreRunners(hooks ...func(_ *cobra.Command, _ []string) error) { +func (con *SliverClient) AddPreRuns(hooks ...func(_ *cobra.Command, _ []string) error) { con.preRunners = append(con.preRunners, hooks...) } diff --git a/client/console/console.go b/client/console/console.go index e02e437956..b8b91c3de1 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -180,6 +180,7 @@ func newClient() *SliverClient { Settings: settings, isCLI: true, printf: fmt.Printf, + jsonHandler: slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{}), ActiveTarget: newActiveTarget(), EventListeners: &sync.Map{}, BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, diff --git a/client/console/teamclient.go b/client/console/teamclient.go index a91c912541..5563e2e40c 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -37,7 +37,7 @@ import ( "github.com/reeflective/team" ) -// ConnectRun is a spf13/cobra-compliant runner function to be included +// PreRunConnect is a spf13/cobra-compliant runner function to be included // in/as any of the runners that such cobra.Commands offer to use. // // The function will connect the Sliver teamclient to a remote server, @@ -45,7 +45,7 @@ import ( // // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. -func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { +func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error { con.FilterCommands(cmd) // If commands are imcompatible with the current requirements. @@ -85,7 +85,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { return con.startClientLog() } -// ConnectComplete is a special connection mode which should be +// PreRunComplete is a special connection mode which should be // called in completer functions that need to use the client RPC. // It is almost equivalent to client.ConnectRun(), but for completions. // @@ -94,7 +94,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { // // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. -func (con *SliverClient) ConnectComplete() (carapace.Action, error) { +func (con *SliverClient) PreRunComplete() (carapace.Action, error) { if con.Rpc != nil { return carapace.ActionValues(), nil } @@ -124,7 +124,6 @@ func (con *SliverClient) ConnectComplete() (carapace.Action, error) { // Sliver RPC client connection. This should be ran as a post-runner. // After this call, the client can reconnect should it want to. func (con *SliverClient) PostRunDisconnect(cmd *cobra.Command, args []string) error { - // Close all RPC streams and local files. con.closeClientStreams() // Close the RPC client connection. diff --git a/go.mod b/go.mod index ff937aa9a5..8f6056eff5 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/ncruces/go-sqlite3 v0.8.4 github.com/reeflective/console v0.1.7 github.com/reeflective/readline v1.0.9 - github.com/reeflective/team v0.1.0 + github.com/reeflective/team v0.1.1 github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index 4a45586f2f..1cee59433f 100644 --- a/go.sum +++ b/go.sum @@ -347,8 +347,8 @@ github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDF github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= -github.com/reeflective/team v0.1.0 h1:QsByDuinPxSir2KH1/tCFyQ3W1z/YBX9Y4SwVbU1hK0= -github.com/reeflective/team v0.1.0/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= +github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= +github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/server/cli/cli.go b/server/cli/cli.go index 9f6b63051a..051a604936 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -111,10 +111,10 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra // The server is also a client of itself, so add our sliver-server // binary specific pre-run hooks: assets, encoders, toolchains, etc. - con.AddPreRunners(preRunServerS(team, con)) + con.AddPreRuns(preRunServerS(team, con)) // Pre/post runners and completions. - clientCommand.BindPreRun(root, con.ConnectRun) + clientCommand.BindPreRun(root, con.PreRunConnect) clientCommand.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. @@ -155,24 +155,24 @@ func preRunServerS(teamserver *server.Server, con *client.SliverClient) clientCo // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. -func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { - return func() error { - // Ensure the server has what it needs. - assets.Setup(false, true) - encoders.Setup() - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - // TODO: Move this out of here. - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - // Let our in-memory teamclient be served. - return teamserver.Serve(con.Teamclient) - } -} +// func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { +// return func() error { +// // Ensure the server has what it needs. +// assets.Setup(false, true) +// encoders.Setup() +// certs.SetupCAs() +// certs.SetupWGKeys() +// cryptography.AgeServerKeyPair() +// cryptography.MinisignServerPrivateKey() +// +// // TODO: Move this out of here. +// serverConfig := configs.GetServerConfig() +// c2.StartPersistentJobs(serverConfig) +// +// // Let our in-memory teamclient be served. +// return teamserver.Serve(con.Teamclient) +// } +// } // preRun := func(cmd *cobra.Command, _ []string) error { // diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 21923a225f..9f714bd1f0 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -25,13 +25,12 @@ import ( "path/filepath" "strings" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "github.com/spf13/pflag" - - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" ) // Generate returns a command tree to embed in client applications connecting diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go index ff470c2db5..166a86c20a 100644 --- a/vendor/github.com/reeflective/team/client/commands/import.go +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -22,11 +22,10 @@ import ( "encoding/json" "fmt" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go index 3b7f1ca05d..f3045c9794 100644 --- a/vendor/github.com/reeflective/team/client/commands/users.go +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -23,11 +23,10 @@ import ( "time" "github.com/jedib0t/go-pretty/v6/table" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index 2920bca8a4..975c0d96c2 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -22,11 +22,10 @@ import ( "fmt" "time" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index 1e0c766126..6439dea177 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -21,14 +21,13 @@ package commands import ( "fmt" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. @@ -118,7 +117,12 @@ func serverCommands(server *server.Server, client *client.Client) *cobra.Command closeComps.PositionalAnyCompletion(carapace.ActionCallback(listenerIDCompleter(client, server))) closeComps.PreRun(func(cmd *cobra.Command, args []string) { - cmd.PersistentPreRunE(cmd, args) + if cmd.PersistentPreRunE != nil { + cmd.PersistentPreRunE(cmd, args) + } + if cmd.PreRunE != nil { + cmd.PreRunE(cmd, args) + } }) teamCmd.AddCommand(closeCmd) @@ -213,7 +217,12 @@ func serverCommands(server *server.Server, client *client.Client) *cobra.Command rmUserComps.PositionalCompletion(carapace.ActionCallback(userCompleter(client, server))) rmUserComps.PreRun(func(cmd *cobra.Command, args []string) { - cmd.PersistentPreRunE(cmd, args) + if cmd.PersistentPreRunE != nil { + cmd.PersistentPreRunE(cmd, args) + } + if cmd.PreRunE != nil { + cmd.PreRunE(cmd, args) + } }) // Import a list of users and their credentials. diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go index 1b336cebbf..40c2d12af3 100644 --- a/vendor/github.com/reeflective/team/server/commands/completers.go +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -23,10 +23,9 @@ import ( "net" "strings" - "github.com/rsteube/carapace" - "github.com/reeflective/team/client" "github.com/reeflective/team/server" + "github.com/rsteube/carapace" ) // interfacesCompleter completes interface addresses on the client host. diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index 6b16e42432..286536acb7 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -28,13 +28,12 @@ import ( "strings" "github.com/jedib0t/go-pretty/v6/table" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/log" "github.com/reeflective/team/internal/systemd" "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { @@ -72,7 +71,7 @@ func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) erro lport = uint16(serv.GetConfig().DaemonMode.Port) } - fmt.Fprintf(cmd.OutOrStdout(), "Starting %s teamserver daemon on %s:%d ...", serv.Name(), lhost, lport) + fmt.Fprintf(cmd.OutOrStdout(), "Starting %s teamserver daemon on %s:%d ...\n", serv.Name(), lhost, lport) // Blocking call, your program will only exit/resume on Ctrl-C/SIGTERM return serv.ServeDaemon(lhost, lport) diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go index 92b6f895a2..e8c1f68cd1 100644 --- a/vendor/github.com/reeflective/team/server/commands/user.go +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -8,13 +8,12 @@ import ( "path/filepath" "strings" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index f6e47d0ea0..08e24e4974 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -142,7 +142,7 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er err = ts.ListenerStartPersistents() if err != nil && hostPort.MatchString(err.Error()) { - log.Errorf("Error starting persistent listeners: %s", err) + log.Errorf("Error starting persistent listeners: %s\n", err) } done := make(chan bool) diff --git a/vendor/modules.txt b/vendor/modules.txt index a986284128..1489988cec 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -537,7 +537,7 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.1.0 +# github.com/reeflective/team v0.1.1 ## explicit; go 1.21 github.com/reeflective/team github.com/reeflective/team/client From efb1b6dbe02a09400d1546f0f5694330af36965a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 05:52:54 +0200 Subject: [PATCH 096/109] Finish builder client port to teamclient --- client/console/readline.go | 2 ++ server/builder/builder.go | 26 +++++++++++------------ server/command/builder/builder.go | 34 ++++++++++++++++--------------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/client/console/readline.go b/client/console/readline.go index 64c92ce28c..1af41621e0 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -113,6 +113,8 @@ func (con *SliverClient) WaitSignal() error { return nil } + con.PrintInfof("(Use Ctrl-C/SIGINT to exit, Ctrl-Z to background)") + sigchan := make(chan os.Signal, 1) signal.Notify( diff --git a/server/builder/builder.go b/server/builder/builder.go index 71c6a45cea..e8a4833850 100644 --- a/server/builder/builder.go +++ b/server/builder/builder.go @@ -23,10 +23,10 @@ import ( "fmt" "io" "os" - "os/signal" "path/filepath" "strings" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -46,26 +46,24 @@ type Config struct { } // StartBuilder - main entry point for the builder -func StartBuilder(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient) { - sigint := make(chan os.Signal, 1) - signal.Notify(sigint, os.Interrupt) - +func StartBuilder(externalBuilder *clientpb.Builder, con *console.SliverClient) error { builderLog.Infof("Attempting to register builder: %s", externalBuilder.Name) - events, err := buildEvents(externalBuilder, rpc) + con.PrintInfof("Attempting to register builder: %s", externalBuilder.Name) + + events, err := buildEvents(externalBuilder, con.Rpc) if err != nil { builderLog.Errorf("Build events handler error: %s", err.Error()) - return + return nil } // Wait for signal or builds - for { - select { - case <-sigint: - return - case event := <-events: - go handleBuildEvent(externalBuilder, event, rpc) + go func() { + for event := range events { + go handleBuildEvent(externalBuilder, event, con.Rpc) } - } + }() + + return con.WaitSignal() } func buildEvents(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient) (<-chan *clientpb.Event, error) { diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 974ee9ee2c..b333319a63 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -25,18 +25,17 @@ import ( "runtime/debug" "strings" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" @@ -84,15 +83,15 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { return []*cobra.Command{builderCmd} } -func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { +func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) error { configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) - return + return nil } if configPath == "" { builderLog.Errorf("Missing --%s flag\n", operatorConfigFlagStr) - return + return nil } quiet, err := cmd.Flags().GetBool(quietFlagStr) @@ -107,7 +106,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { level, err := cmd.Flags().GetInt(logLevelFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", logLevelFlagStr, err) - return + return nil } log.RootLogger.SetLevel(log.LevelFrom(level)) @@ -123,7 +122,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - startBuilderTeamclient(externalBuilder, configPath, team) + return startBuilderTeamclient(externalBuilder, configPath, team) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -256,10 +255,14 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } -func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) { - tc := new(transport.TeamClient) +func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) error { + // Make an altogether new Sliver client. We have all of its tooling by default, at no cost. + sliverClient, err := console.NewSliverClient() + if err != nil { + return err + } - teamclient := team.Self(client.WithDialer(tc)) + teamclient := sliverClient.Teamclient // Now use our teamclient to fetch the configuration. config, err := teamclient.ReadConfig(configPath) @@ -279,15 +282,14 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string builderLog.Infof("Hello my name is: %s", externalBuilder.Name) builderLog.Infof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) + sliverClient.PrintInfof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) - // And immediately connect with it. + // And immediately connect to it. teamclient.Connect(client.WithConfig(config)) defer teamclient.Disconnect() - rpc := rpcpb.NewSliverRPCClient(tc.Conn) - // Let the builder do its work, blocking. - builder.StartBuilder(externalBuilder, rpc) + return builder.StartBuilder(externalBuilder, sliverClient) } // builderFormatsCompleter completes supported builders architectures. From 532bfaf43d9c5dd5f42b37e164410c35290defde Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 06:36:47 +0200 Subject: [PATCH 097/109] Test and fix builders with a simple teamclient backend. --- client/console/console.go | 9 ++++++--- client/console/teamclient.go | 4 ++-- server/builder/builder.go | 6 +++--- server/command/assets/unpack.go | 3 ++- server/command/builder/builder.go | 30 +++++++++++++++++------------- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index b8b91c3de1..0d256d0f5d 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -105,8 +105,11 @@ type SliverClient struct { isCLI bool // Teamclient & remotes + // The dialer being exported is quite dirty, + // and there might be a way to unexport it. + // The problem is currently with builders which need it. Teamclient *client.Client - dialer *transport.TeamClient + Dialer *transport.TeamClient preRunners []func(*cobra.Command, []string) error // Logging @@ -148,12 +151,12 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { con = newClient() // Our reeflective/team.Client needs our gRPC stack. - con.dialer = transport.NewClient(opts...) + con.Dialer = transport.NewClient(opts...) var clientOpts []client.Options clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), - client.WithDialer(con.dialer), + client.WithDialer(con.Dialer), client.WithLogger(initTeamclientLog()), ) diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 5563e2e40c..4eb07e8fd3 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -72,7 +72,7 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.dialer.Conn) + con.connect(con.Dialer.Conn) // Never enable asciicasts/logs streaming when this // client is used to perform completions. Both of these will tinker @@ -114,7 +114,7 @@ func (con *SliverClient) PreRunComplete() (carapace.Action, error) { // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.dialer.Conn) + con.connect(con.Dialer.Conn) return carapace.ActionValues(), nil } diff --git a/server/builder/builder.go b/server/builder/builder.go index e8a4833850..21888db68c 100644 --- a/server/builder/builder.go +++ b/server/builder/builder.go @@ -46,11 +46,11 @@ type Config struct { } // StartBuilder - main entry point for the builder -func StartBuilder(externalBuilder *clientpb.Builder, con *console.SliverClient) error { +func StartBuilder(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient, con *console.SliverClient) error { builderLog.Infof("Attempting to register builder: %s", externalBuilder.Name) con.PrintInfof("Attempting to register builder: %s", externalBuilder.Name) - events, err := buildEvents(externalBuilder, con.Rpc) + events, err := buildEvents(externalBuilder, rpc) if err != nil { builderLog.Errorf("Build events handler error: %s", err.Error()) return nil @@ -59,7 +59,7 @@ func StartBuilder(externalBuilder *clientpb.Builder, con *console.SliverClient) // Wait for signal or builds go func() { for event := range events { - go handleBuildEvent(externalBuilder, event, con.Rpc) + go handleBuildEvent(externalBuilder, event, rpc) } }() diff --git a/server/command/assets/unpack.go b/server/command/assets/unpack.go index 6ba65744b9..09ff9f3a2b 100644 --- a/server/command/assets/unpack.go +++ b/server/command/assets/unpack.go @@ -21,9 +21,10 @@ package assets import ( "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/msf" - "github.com/spf13/cobra" ) const ( diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index b333319a63..f6177fb51f 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -34,8 +34,10 @@ import ( "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" @@ -61,7 +63,7 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { Short: "Start the process as an external builder", Long: ``, Run: func(cmd *cobra.Command, args []string) { - runBuilderCmd(cmd, args, team) + runBuilderCmd(cmd, args, team, con) }, } @@ -83,7 +85,7 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { return []*cobra.Command{builderCmd} } -func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) error { +func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server, con *console.SliverClient) error { configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) @@ -122,7 +124,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) error externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - return startBuilderTeamclient(externalBuilder, configPath, team) + return startBuilderClient(externalBuilder, configPath, team, con) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -255,14 +257,11 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } -func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) error { - // Make an altogether new Sliver client. We have all of its tooling by default, at no cost. - sliverClient, err := console.NewSliverClient() - if err != nil { - return err - } +func startBuilderClient(externalBuilder *clientpb.Builder, configPath string, team *server.Server, con *console.SliverClient) error { + // Simply use our transport+RPC backend. + cli := transport.NewClient() - teamclient := sliverClient.Teamclient + teamclient := team.Self(client.WithDialer(cli)) // Now use our teamclient to fetch the configuration. config, err := teamclient.ReadConfig(configPath) @@ -282,14 +281,19 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string builderLog.Infof("Hello my name is: %s", externalBuilder.Name) builderLog.Infof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) - sliverClient.PrintInfof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) // And immediately connect to it. - teamclient.Connect(client.WithConfig(config)) + err = teamclient.Connect(client.WithConfig(config)) + if err != nil { + return err + } + + rpc := rpcpb.NewSliverRPCClient(cli.Conn) + defer teamclient.Disconnect() // Let the builder do its work, blocking. - return builder.StartBuilder(externalBuilder, sliverClient) + return builder.StartBuilder(externalBuilder, rpc, con) } // builderFormatsCompleter completes supported builders architectures. From 8b56c5b466e4b4795b5b4137a321425338173598 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 06:37:51 +0200 Subject: [PATCH 098/109] Fix mistake, fortunately --- client/console/console.go | 9 +++------ client/console/teamclient.go | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index 0d256d0f5d..b8b91c3de1 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -105,11 +105,8 @@ type SliverClient struct { isCLI bool // Teamclient & remotes - // The dialer being exported is quite dirty, - // and there might be a way to unexport it. - // The problem is currently with builders which need it. Teamclient *client.Client - Dialer *transport.TeamClient + dialer *transport.TeamClient preRunners []func(*cobra.Command, []string) error // Logging @@ -151,12 +148,12 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { con = newClient() // Our reeflective/team.Client needs our gRPC stack. - con.Dialer = transport.NewClient(opts...) + con.dialer = transport.NewClient(opts...) var clientOpts []client.Options clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), - client.WithDialer(con.Dialer), + client.WithDialer(con.dialer), client.WithLogger(initTeamclientLog()), ) diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 4eb07e8fd3..5563e2e40c 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -72,7 +72,7 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.Dialer.Conn) + con.connect(con.dialer.Conn) // Never enable asciicasts/logs streaming when this // client is used to perform completions. Both of these will tinker @@ -114,7 +114,7 @@ func (con *SliverClient) PreRunComplete() (carapace.Action, error) { // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.Dialer.Conn) + con.connect(con.dialer.Conn) return carapace.ActionValues(), nil } From 7ae0eeecefcc0721b72b9130a589edf44c06564d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 06:45:23 +0200 Subject: [PATCH 099/109] Remove most calls to panic in client (where possible and safe) --- client/cli/cli.go | 3 ++- client/command/privilege/getprivs.go | 33 +++++++++++++++++-------- client/command/privilege/runas.go | 17 +++++++++---- client/command/registry/reg-create.go | 16 ++++++++---- client/command/screenshot/screenshot.go | 30 ++++++++++++++-------- client/console/readline.go | 3 ++- 6 files changed, 70 insertions(+), 32 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index ae67018a40..48c341014b 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -19,6 +19,7 @@ package cli */ import ( + "log" "os" "github.com/rsteube/carapace" @@ -39,7 +40,7 @@ func Execute() { // prompting/loading and use, as well as other things. con, err := client.NewSliverClient() if err != nil { - panic(err) + log.Fatal(err) } // Generate our complete Sliver Framework command-line interface. diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 258841ec07..94a78894af 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -20,6 +20,7 @@ package privilege import ( "context" + "errors" "strconv" "strings" @@ -37,7 +38,12 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } + if targetOS != "windows" { con.PrintErrorf("Command only supported on Windows.\n") return @@ -50,7 +56,12 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } - pid := getPID(session, beacon) + pid, err := getPID(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } + if privs.Response != nil && privs.Response.Async { con.AddBeaconCallback(privs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, privs) @@ -125,22 +136,24 @@ func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverClien } } -func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getOS(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.OS + return session.OS, nil } if beacon != nil { - return beacon.OS + return beacon.OS, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } -func getPID(session *clientpb.Session, beacon *clientpb.Beacon) int32 { +func getPID(session *clientpb.Session, beacon *clientpb.Beacon) (int32, error) { if session != nil { - return session.PID + return session.PID, nil } if beacon != nil { - return beacon.PID + return beacon.PID, nil } - panic("no session or beacon") + + return -1, errors.New("no session or beacon") } diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index 24b38997c9..646ec3de1d 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -20,6 +20,7 @@ package privilege import ( "context" + "errors" "github.com/spf13/cobra" "google.golang.org/protobuf/proto" @@ -69,7 +70,12 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } - name := getName(session, beacon) + name, err := getName(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } + if runAs.Response != nil && runAs.Response.Async { con.AddBeaconCallback(runAs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, runAs) @@ -93,12 +99,13 @@ func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con.PrintInfof("Successfully ran %s %s on %s\n", process, args, name) } -func getName(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getName(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.Name + return session.Name, nil } if beacon != nil { - return beacon.Name + return beacon.Name, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index 38e8fc81e1..e7b54ff559 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -20,6 +20,7 @@ package registry import ( "context" + "errors" "strings" "github.com/spf13/cobra" @@ -36,7 +37,11 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return @@ -104,12 +109,13 @@ func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key s con.PrintInfof("Key created at %s\\%s", regPath, key) } -func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getOS(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.OS + return session.OS, nil } if beacon != nil { - return beacon.OS + return beacon.OS, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 1cf8058b1b..baea1271e9 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -20,6 +20,7 @@ package screenshot import ( "context" + "errors" "fmt" "io/ioutil" "os" @@ -43,7 +44,11 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" && targetOS != "linux" { con.PrintWarnf("Target platform may not support screenshots!\n") return @@ -61,7 +66,11 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) lootName, _ := cmd.Flags().GetString("name") saveTo, _ := cmd.Flags().GetString("save") - hostname := getHostname(session, beacon) + hostname, err := getHostname(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if screenshot.Response != nil && screenshot.Response.Async { con.AddBeaconCallback(screenshot.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, screenshot) @@ -140,22 +149,23 @@ func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName s loot.SendLootMessage(lootMessage, con) } -func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getOS(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.OS + return session.OS, nil } if beacon != nil { - return beacon.OS + return beacon.OS, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } -func getHostname(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getHostname(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.Hostname + return session.Hostname, nil } if beacon != nil { - return beacon.Hostname + return beacon.Hostname, nil } - panic("no session or beacon") + return "", errors.New("no session or beacon") } diff --git a/client/console/readline.go b/client/console/readline.go index 1af41621e0..c28ec15156 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -21,6 +21,7 @@ package console import ( "context" "fmt" + "log" insecureRand "math/rand" "os" "os/signal" @@ -165,7 +166,7 @@ func (con *SliverClient) waitSignalOrClose() error { func (con *SliverClient) printLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { - panic(err.Error()) + log.Fatal(err) } dirty := "" if serverVer.Dirty { From 67a6e3b12daa2610a8571fb3bfdea4149ef5b769 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 09:29:37 +0200 Subject: [PATCH 100/109] Fixes --- client/command/privilege/getsystem.go | 6 +++++- client/command/registry/reg-delete.go | 6 +++++- client/command/registry/reg-list.go | 6 +++++- client/command/registry/reg-read.go | 6 +++++- client/command/registry/reg-write.go | 6 +++++- server/transport/middleware.go | 6 +++++- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index db19a0e209..3926a10acc 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -35,7 +35,11 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Command only supported on Windows.\n") return diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index 9dec10e5a5..e48c306e58 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -36,7 +36,11 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index dcbfd887aa..0c20dabe25 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -35,7 +35,11 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index fe387952fe..d06f81f15f 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -83,7 +83,11 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 63c391f22c..0973c599a7 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -39,7 +39,11 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 0ead39c38b..51108e25d9 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -21,6 +21,7 @@ package transport import ( "context" "encoding/json" + "errors" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/server/core" @@ -274,7 +275,10 @@ func getActiveTarget(middlewareLog *logrus.Entry, rawRequest []byte) (*clientpb. return nil, nil, nil } - rpcRequest := request["Request"].(map[string]interface{}) + rpcRequest, ok := request["Request"].(map[string]interface{}) + if !ok { + return nil, nil, errors.New("Failed to cast RPC request to map[string]interface{}") + } middlewareLog.Debugf("RPC Request: %v", rpcRequest) From ab0755b785897114a2bcfa4ce8148493cdb0d5ae Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 22:08:09 +0200 Subject: [PATCH 101/109] Implement task-canceled for clients to unblock --- client/console/console.go | 2 + client/console/events.go | 38 +- client/constants/constants.go | 3 + protobuf/clientpb/client.pb.go | 1827 ++++++++++++++++---------------- protobuf/clientpb/client.proto | 9 +- server/rpc/rpc-beacons.go | 20 + server/rpc/rpc-events.go | 3 + 7 files changed, 988 insertions(+), 914 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index b8b91c3de1..2ecac8af80 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -103,6 +103,7 @@ type SliverClient struct { Settings *assets.ClientSettings IsServer bool isCLI bool + signals map[string]chan os.Signal // Teamclient & remotes Teamclient *client.Client @@ -179,6 +180,7 @@ func newClient() *SliverClient { App: console.New("sliver"), Settings: settings, isCLI: true, + signals: make(map[string]chan os.Signal), printf: fmt.Printf, jsonHandler: slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{}), ActiveTarget: newActiveTarget(), diff --git a/client/console/events.go b/client/console/events.go index 42cb7b8812..a14f732b6a 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -26,13 +26,14 @@ import ( "sync" "time" + "github.com/gofrs/uuid" + "google.golang.org/protobuf/proto" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/gofrs/uuid" - "google.golang.org/protobuf/proto" ) func (con *SliverClient) startEventLoop() { @@ -144,6 +145,9 @@ func (con *SliverClient) startEventLoop() { case consts.BeaconTaskResultEvent: con.triggerBeaconTaskCallback(event.Data) + + case consts.BeaconTaskCanceledEvent: + con.triggerTaskCancel(event.Data) } con.triggerReactions(event) @@ -257,6 +261,36 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { } } +// triggerTaskCancel cancels any command thread that is waiting for a task that has just been canceled. +func (con *SliverClient) triggerTaskCancel(data []byte) { + task := &clientpb.BeaconTask{} + err := proto.Unmarshal(data, task) + if err != nil { + con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) + return + } + + // If the callback is not in our map then we don't do anything: we are not the origin + // of the task and we are therefore not blocking somewhere waiting for its results. + con.BeaconTaskCallbacksMutex.Lock() + defer con.BeaconTaskCallbacksMutex.Unlock() + if _, ok := con.BeaconTaskCallbacks[task.ID]; ok { + + // If needed, wait for the "request sent" status to be printed first. + con.beaconTaskSentMutex.Lock() + if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { + waitStatus.Wait() + delete(con.beaconSentStatus, task.ID) + } + con.beaconTaskSentMutex.Unlock() + + // Display a message indicating that the task was canceled. + con.PrintWarnf("Task %s was cancelled by another client\n", strings.Split(task.ID, "-")[0]) + delete(con.BeaconTaskCallbacks, task.ID) + con.waitingResult <- true + } +} + func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback BeaconTaskCallback) { if resp == nil || resp.TaskID == "" { return diff --git a/client/constants/constants.go b/client/constants/constants.go index ca7eee6e06..0222a5478b 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -95,6 +95,9 @@ const ( // BeaconTaskResult - Beacon task completed with a result. BeaconTaskResultEvent = "beacon-taskresult" + // BeaconTaskCanceledEvent - Indicates that a beacon task has been canceled. + BeaconTaskCanceledEvent = "beacon-task-canceled" + // ExternalBuildEvent. ExternalBuildEvent = "external-build" AcknowledgeBuildEvent = "external-acknowledge" diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index 1649d20030..5474c4f235 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -6257,10 +6257,11 @@ type Event struct { EventType string `protobuf:"bytes,1,opt,name=EventType,proto3" json:"EventType,omitempty"` Session *Session `protobuf:"bytes,2,opt,name=Session,proto3" json:"Session,omitempty"` - Job *Job `protobuf:"bytes,3,opt,name=Job,proto3" json:"Job,omitempty"` - Client *Client `protobuf:"bytes,4,opt,name=Client,proto3" json:"Client,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=Data,proto3" json:"Data,omitempty"` - Err string `protobuf:"bytes,6,opt,name=Err,proto3" json:"Err,omitempty"` // Can't trigger normal gRPC error + Beacon *Beacon `protobuf:"bytes,3,opt,name=Beacon,proto3" json:"Beacon,omitempty"` + Job *Job `protobuf:"bytes,4,opt,name=Job,proto3" json:"Job,omitempty"` + Client *Client `protobuf:"bytes,5,opt,name=Client,proto3" json:"Client,omitempty"` + Data []byte `protobuf:"bytes,6,opt,name=Data,proto3" json:"Data,omitempty"` + Err string `protobuf:"bytes,7,opt,name=Err,proto3" json:"Err,omitempty"` // Can't trigger normal gRPC error } func (x *Event) Reset() { @@ -6309,6 +6310,13 @@ func (x *Event) GetSession() *Session { return nil } +func (x *Event) GetBeacon() *Beacon { + if x != nil { + return x.Beacon + } + return nil +} + func (x *Event) GetJob() *Job { if x != nil { return x.Job @@ -10650,317 +10658,338 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, - 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, - 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, - 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, - 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, - 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, - 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, - 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, - 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, - 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, - 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, - 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, - 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, - 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, - 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, - 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, - 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, - 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, - 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, - 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, - 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, - 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, - 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, - 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, - 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, - 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, - 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, + 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, + 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, + 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, + 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, + 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, + 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, + 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, + 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, + 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, + 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, - 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, - 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, - 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, - 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, - 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, - 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, - 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, - 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, - 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, + 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, + 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, + 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, + 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, + 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, + 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, + 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, + 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, - 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, - 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, - 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, - 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, - 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, + 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, + 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, @@ -10976,554 +11005,535 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, - 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, - 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, - 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, - 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, - 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, - 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, - 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, - 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, - 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, - 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, - 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, - 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, - 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, - 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, - 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, - 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, - 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, - 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, - 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, - 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, - 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, - 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, - 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, - 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, - 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, - 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, - 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, - 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, - 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, - 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, - 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, - 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, - 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, - 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, - 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, - 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, - 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, + 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, + 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, + 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, + 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, + 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, + 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, + 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, + 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, + 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, + 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, + 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, + 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, + 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, + 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, + 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, + 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, + 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, + 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, + 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, + 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, + 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, + 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, + 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, + 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, + 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, + 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, + 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, + 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, + 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, + 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, + 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, + 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, + 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, + 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, + 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, + 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, + 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, + 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, - 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, - 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, - 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, - 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, - 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, - 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, - 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, - 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, - 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, - 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, - 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, - 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, - 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, - 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, - 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, + 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, + 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, + 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, + 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, + 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, + 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, + 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, + 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, + 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, + 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, + 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, + 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, + 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, + 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, + 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, + 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, - 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, - 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, - 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, - 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, - 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, - 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, - 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, - 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, - 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, - 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, - 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, - 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, - 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, - 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, - 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, - 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, - 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, - 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, - 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, - 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, - 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, - 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, - 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, - 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, - 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, - 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, - 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, - 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, - 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, - 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, - 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, - 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, - 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, - 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, - 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, - 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, - 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, - 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, - 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, - 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, - 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, - 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, - 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, - 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, - 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, - 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, - 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, - 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, - 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, - 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, - 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, - 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, - 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, - 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, - 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, - 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, - 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, - 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, - 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, - 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, - 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, - 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, - 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, - 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, - 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, - 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, - 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, - 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, - 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, - 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, - 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, - 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, - 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, - 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, - 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, - 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, - 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, - 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, - 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, - 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, - 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, - 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, - 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, - 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, - 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, - 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, - 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, - 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, - 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, - 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, - 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, - 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, - 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, - 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, - 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, - 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, - 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, - 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, - 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, - 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, - 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, - 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, - 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, - 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, - 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, - 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, - 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, - 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, - 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, - 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, - 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, - 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, - 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, - 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, - 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, - 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, - 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, - 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, - 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, - 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, - 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, - 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, - 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, - 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, - 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, - 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, - 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, - 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, - 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, - 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, - 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, - 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, - 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, - 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, - 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, - 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, - 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, - 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, - 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, - 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, - 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, - 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, - 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, - 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, - 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, - 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, - 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, - 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, - 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, - 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, - 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, - 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, - 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, - 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, - 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, - 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, - 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, - 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, - 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, - 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, - 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, - 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, - 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, - 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, - 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, - 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, - 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, - 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, + 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, + 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, + 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, + 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, + 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, + 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, + 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, + 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, + 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, + 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, + 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, + 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, + 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, + 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, + 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, + 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, + 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, + 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, + 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, + 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, + 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, + 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, + 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, + 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, + 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, + 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, + 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, + 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, + 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, + 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, + 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, + 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, + 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, + 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, + 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, + 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, + 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, + 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, + 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, + 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, + 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, + 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, + 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, + 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, + 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, + 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, + 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, + 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, + 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, + 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, + 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, + 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, + 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, + 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, + 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, + 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, + 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, + 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, + 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, + 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, + 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, + 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, + 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, + 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, + 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, + 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, + 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, + 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, + 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, + 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, + 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, + 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, + 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, + 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, + 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, + 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, + 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, + 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, + 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, + 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, + 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, + 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, + 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, + 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, + 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, + 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, + 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, + 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, + 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, + 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, + 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, + 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, + 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, + 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, + 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, + 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, + 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, + 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, + 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, + 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, + 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, + 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, + 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, + 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, + 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, + 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, + 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, + 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, + 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, + 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, + 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, + 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, + 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, + 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, + 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, + 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, + 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, + 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, + 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, + 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, + 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, + 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, + 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, + 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, + 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, + 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, + 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, + 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, + 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, + 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, + 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, + 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, + 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, + 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, + 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, + 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, + 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, + 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, + 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, + 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, + 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, + 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, + 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, + 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, + 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, + 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, + 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, + 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, + 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, + 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, + 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, + 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, + 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, + 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, + 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, + 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, + 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, + 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, + 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11727,61 +11737,62 @@ var file_clientpb_client_proto_depIdxs = []int32{ 78, // 48: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry 82, // 49: clientpb.Client.Operator:type_name -> clientpb.Operator 19, // 50: clientpb.Event.Session:type_name -> clientpb.Session - 45, // 51: clientpb.Event.Job:type_name -> clientpb.Job - 80, // 52: clientpb.Event.Client:type_name -> clientpb.Client - 123, // 53: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 124, // 54: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 86, // 55: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 56: clientpb.Loot.FileType:type_name -> clientpb.FileType - 132, // 57: clientpb.Loot.File:type_name -> commonpb.File - 89, // 58: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 91, // 59: clientpb.Host.IOCs:type_name -> clientpb.IOC - 125, // 60: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 93, // 61: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 130, // 62: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 131, // 63: clientpb.DllHijack.Response:type_name -> commonpb.Response - 130, // 64: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 131, // 65: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 66: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 130, // 67: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 131, // 68: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 126, // 69: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 25, // 70: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 104, // 71: clientpb.Builders.Builders:type_name -> clientpb.Builder - 33, // 72: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 34, // 73: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 74: clientpb.Credential.HashType:type_name -> clientpb.HashType - 105, // 75: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 112, // 76: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 77: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 109, // 78: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 127, // 79: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 128, // 80: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 116, // 81: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 129, // 82: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 113, // 83: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 115, // 84: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 114, // 85: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 86: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 87: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 88: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 89: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 90: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 91: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 119, // 92: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 93: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 120, // 94: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 26, // 95: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 25, // 96: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 83, // 97: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 83, // 98: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 92, // 99: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 100: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 101, // [101:101] is the sub-list for method output_type - 101, // [101:101] is the sub-list for method input_type - 101, // [101:101] is the sub-list for extension type_name - 101, // [101:101] is the sub-list for extension extendee - 0, // [0:101] is the sub-list for field type_name + 20, // 51: clientpb.Event.Beacon:type_name -> clientpb.Beacon + 45, // 52: clientpb.Event.Job:type_name -> clientpb.Job + 80, // 53: clientpb.Event.Client:type_name -> clientpb.Client + 123, // 54: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 124, // 55: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 86, // 56: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 57: clientpb.Loot.FileType:type_name -> clientpb.FileType + 132, // 58: clientpb.Loot.File:type_name -> commonpb.File + 89, // 59: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 91, // 60: clientpb.Host.IOCs:type_name -> clientpb.IOC + 125, // 61: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 93, // 62: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 130, // 63: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 131, // 64: clientpb.DllHijack.Response:type_name -> commonpb.Response + 130, // 65: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 131, // 66: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 67: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 130, // 68: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 131, // 69: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 126, // 70: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 25, // 71: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 104, // 72: clientpb.Builders.Builders:type_name -> clientpb.Builder + 33, // 73: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 34, // 74: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 75: clientpb.Credential.HashType:type_name -> clientpb.HashType + 105, // 76: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 112, // 77: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 78: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 109, // 79: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 127, // 80: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 128, // 81: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 116, // 82: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 129, // 83: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 113, // 84: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 115, // 85: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 114, // 86: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 87: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 88: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 89: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 90: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 91: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 92: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 119, // 93: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 94: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 120, // 95: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 26, // 96: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 25, // 97: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 83, // 98: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 83, // 99: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 92, // 100: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 101: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 102, // [102:102] is the sub-list for method output_type + 102, // [102:102] is the sub-list for method input_type + 102, // [102:102] is the sub-list for extension type_name + 102, // [102:102] is the sub-list for extension extendee + 0, // [0:102] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index ade611358c..6c8aab90dd 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -563,11 +563,12 @@ message Client { message Event { string EventType = 1; Session Session = 2; - Job Job = 3; - Client Client = 4; - bytes Data = 5; + Beacon Beacon = 3; + Job Job = 4; + Client Client = 5; + bytes Data = 6; - string Err = 6; // Can't trigger normal gRPC error + string Err = 7; // Can't trigger normal gRPC error } message Operator { diff --git a/server/rpc/rpc-beacons.go b/server/rpc/rpc-beacons.go index b841592313..d99ea3242d 100644 --- a/server/rpc/rpc-beacons.go +++ b/server/rpc/rpc-beacons.go @@ -21,8 +21,12 @@ package rpc import ( "context" + "google.golang.org/protobuf/proto" + + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/server/core" "github.com/bishopfox/sliver/server/db" "github.com/bishopfox/sliver/server/db/models" "github.com/bishopfox/sliver/server/log" @@ -129,5 +133,21 @@ func (rpc *Server) CancelBeaconTask(ctx context.Context, req *clientpb.BeaconTas if err != nil { return nil, ErrInvalidBeaconTaskID } + + // Some client might be currently blocking for the canceled + // task result, so tell them about it so they can exit. + beacon, err := db.BeaconByID(task.BeaconID.String()) + if err != nil { + return task.ToProtobuf(false), ErrInvalidBeaconID + } + + eventData, _ := proto.Marshal(task.ToProtobuf(false)) + + core.EventBroker.Publish(core.Event{ + EventType: consts.BeaconTaskCanceledEvent, + Data: eventData, + Beacon: beacon, + }) + return task.ToProtobuf(false), nil } diff --git a/server/rpc/rpc-events.go b/server/rpc/rpc-events.go index 4d24840a69..5dcaa5382e 100644 --- a/server/rpc/rpc-events.go +++ b/server/rpc/rpc-events.go @@ -40,6 +40,9 @@ func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer if event.Client != nil { pbEvent.Client = event.Client.ToProtobuf() } + if event.Beacon != nil { + pbEvent.Beacon = event.Beacon.ToProtobuf() + } if event.Session != nil { pbEvent.Session = event.Session.ToProtobuf() } From c4dd65146a3bf471e2b5068cb9aec32c93761ea1 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 23:07:34 +0200 Subject: [PATCH 102/109] Better wrapping for all tables --- client/command/alias/alias.go | 1 + client/command/armory/armory.go | 2 ++ client/command/builders/builders.go | 1 + client/command/crack/crack-files.go | 4 ++++ client/command/crack/crack.go | 1 + client/command/creds/creds.go | 1 + client/command/cursed/cursed.go | 1 + client/command/extensions/extensions.go | 1 + client/command/generate/canaries.go | 1 + client/command/generate/implants.go | 1 + client/command/generate/profiles.go | 1 + client/command/generate/traffic-encoders.go | 2 ++ client/command/hosts/hosts-ioc.go | 2 ++ client/command/hosts/hosts.go | 1 + client/command/jobs/jobs.go | 1 + client/command/loot/loot.go | 1 + client/command/network/ifconfig.go | 1 + client/command/network/netstat.go | 1 + client/command/pivots/details.go | 1 + client/command/pivots/pivots.go | 1 + client/command/portfwd/portfwd.go | 1 + client/command/processes/ps.go | 1 + client/command/reaction/reaction.go | 1 + client/command/rportfwd/portfwd.go | 1 + client/command/sessions/sessions.go | 1 + client/command/settings/settings.go | 1 + client/command/socks/socks.go | 1 + client/command/tasks/tasks.go | 1 + client/command/websites/websites.go | 1 + client/command/wireguard/wg-portfwd.go | 1 + client/command/wireguard/wg-socks.go | 1 + client/console/history.go | 6 +++++- 32 files changed, 42 insertions(+), 1 deletion(-) diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 1e8382aaf9..3d6d27955d 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -49,6 +49,7 @@ func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) er func PrintAliases(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Command Name", diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index 0c3bee396c..1306e738b3 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -220,6 +220,7 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Packages" + console.Normal) + settings.SetMaxTableSize(tw) urlMargin := 150 // Extra margin needed to show URL column @@ -306,6 +307,7 @@ func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Bundles" + console.Normal) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Contains", diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index 7da2b003b1..d12ebf248b 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -49,6 +49,7 @@ func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintBuilders(externalBuilders []*clientpb.Builder, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Operator", "Templates", "Platform", "Compiler Targets", }) diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index 5e2f1ca91d..92425d4f77 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -98,6 +98,7 @@ func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []strin func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Name", "Size"}) for _, file := range crackFiles.Files { tw.AppendRow(table.Row{file.Name, util.ByteCountBinary(file.UncompressedSize)}) @@ -109,16 +110,19 @@ func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverC wordlistTable := table.NewWriter() wordlistTable.SetTitle(console.Bold + "Wordlists" + console.Normal) wordlistTable.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(wordlistTable) wordlistTable.AppendHeader(table.Row{"Name", "Size"}) rulesTable := table.NewWriter() rulesTable.SetTitle(console.Bold + "Rules" + console.Normal) rulesTable.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(rulesTable) rulesTable.AppendHeader(table.Row{"Name", "Size"}) hcTable := table.NewWriter() hcTable.SetTitle(console.Bold + "Markov Hcstat2" + console.Normal) hcTable.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(hcTable) hcTable.AppendHeader(table.Row{"Name", "Size"}) wordlists := 0 diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index ab13d083ff..b2d077ed76 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -140,6 +140,7 @@ func printBenchmarks(cracker *clientpb.Crackstation, con *console.SliverClient) tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Benchmarks" + console.Normal) tw.SortBy([]table.SortBy{{Name: "Hash Type"}}) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Hash Type", "Rate (H/s)"}) for hashType, speed := range cracker.Benchmarks { tw.AppendRow(table.Row{clientpb.HashType(hashType), fmt.Sprintf("%d", speed)}) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 1c764e0a5d..7f9a4dbd72 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -61,6 +61,7 @@ func PrintCreds(creds []*clientpb.Credential, con *console.SliverClient) { func printCollection(collection string, creds []*clientpb.Credential, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) if collection != "" { tw.SetTitle(console.Bold + collection + console.Normal) } else { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index d9f220044c..017c5c7ac5 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -55,6 +55,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if 0 < len(cursedProcesses) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Bind Port", "Session ID", "PID", "Platform", "Executable", "Debug URL", }) diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index e0eb46578e..58403abb35 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -47,6 +47,7 @@ func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { func PrintExtensions(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Command Name", diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index bbf729edf8..9113dc4151 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -32,6 +32,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintCanaries(con *console.SliverClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Sliver Name", "Domain", diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 76d806ed4f..d420969fbe 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -63,6 +63,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Implant Type", diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 120055568d..2ef8dcb29b 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -53,6 +53,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Profile Name", "Implant Type", diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 83d1797179..8f61a36e67 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -58,6 +58,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []st func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", @@ -203,6 +204,7 @@ func clearLines(count int, con *console.SliverClient) { func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Test", "Result", diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index 42154c7a75..4bc08a167a 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -29,6 +29,7 @@ import ( "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" ) @@ -51,6 +52,7 @@ func HostsIOCCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func hostIOCsTable(host *clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(table.StyleBold) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"File Path", "SHA-256"}) for _, ioc := range host.IOCs { tw.AppendRow(table.Row{ diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index 996f92a9ae..528e4283ae 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -62,6 +62,7 @@ func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func hostsTable(hosts []*clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Hostname", diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index e9683ec695..1b786c00dd 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -64,6 +64,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 911f7856a9..4d2080054f 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -55,6 +55,7 @@ func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) } tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index bf30ca793c..238582c0d6 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -74,6 +74,7 @@ func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverCli for index, iface := range interfaces { tw := table.NewWriter() tw.SetStyle(settings.GetTableWithBordersStyle(con)) + settings.SetMaxTableSize(tw) tw.SetTitle(fmt.Sprintf(console.Bold+"%s"+console.Normal, iface.Name)) tw.SetColumnConfigs([]table.ColumnConfig{ {Name: "#", AutoMerge: true}, diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index d98ab11af8..375806a50f 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -88,6 +88,7 @@ func PrintNetstat(netstat *sliverpb.Netstat, implantPID int32, activeC2 string, tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Protocol", "Local Address", "Foreign Address", "State", "PID/Program name"}) for _, entry := range netstat.Entries { diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 99b8dc6ada..6808f3b925 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -89,6 +89,7 @@ func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.Sl tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(fmt.Sprintf(console.Bold+"%s Pivots"+console.Normal, PivotTypeToString(listener.Type))) tw.AppendSeparator() + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Remote Address", diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index 0261d4cc78..c8eae4a12b 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -58,6 +58,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Protocol", diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index f6f3c02736..b06c8a86d7 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -50,6 +50,7 @@ func PrintPortfwd(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Session ID", diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 18e0ea64ed..9d6fc3bff5 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -164,6 +164,7 @@ func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) switch os { case "windows": diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 15046e7992..6c1de6065d 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -52,6 +52,7 @@ func ReactionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func displayReactionsTable(eventType string, reactions []core.Reaction, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.SetTitle(fmt.Sprintf(console.Bold+"%s"+console.Normal, EventTypeToTitle(eventType))) tw.AppendSeparator() slackSpace := len(EventTypeToTitle(eventType)) - len("Commands") - len("ID") - 3 diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index ddcbb655b9..4e96935875 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -63,6 +63,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Remote Address", diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index ecafa7c927..6913ccb5a9 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -135,6 +135,7 @@ func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterR tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) wideTermWidth := con.Settings.SmallTermWidth < width if wideTermWidth { diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index aac21fdd26..b775daba42 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -42,6 +42,7 @@ func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { tw := table.NewWriter() tw.SetStyle(GetTableStyle(con)) + SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Name", "Value", "Description"}) tw.AppendRow(table.Row{"Tables", con.Settings.TableStyle, "Set the stylization of tables"}) tw.AppendRow(table.Row{"Auto Adult", con.Settings.AutoAdult, "Automatically accept OPSEC warnings"}) diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 3be9eb5d85..e286fc4944 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -45,6 +45,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Session ID", diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 6e0ac33f73..fb38d7945c 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -50,6 +50,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "State", diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index ac7f56a215..34bce11214 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -88,6 +88,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { con.Println() tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Path", "Content-type", diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index ccb35046e6..d9730bbb08 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -58,6 +58,7 @@ func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } else { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index cb8cd09e6a..3b90541e6a 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -58,6 +58,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string if 0 < len(socksList.Servers) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Local Address", diff --git a/client/console/history.go b/client/console/history.go index 9981cea48f..599397a3d1 100644 --- a/client/console/history.go +++ b/client/console/history.go @@ -75,6 +75,7 @@ func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { } // Write - Sends the last command to the server for saving. +// Some commands are not saved (background, exit, etc) func (h *implantHistory) Write(cmdline string) (int, error) { sess, beac := h.con.ActiveTarget.Get() if sess == nil && beac == nil { @@ -138,7 +139,8 @@ func (h *implantHistory) Len() int { return len(h.items) } -// Dump returns the entire history. +// Dump returns the entire history, and caches it +// internally to avoid queries when possible. func (h *implantHistory) Dump() interface{} { sess, beac := h.con.ActiveTarget.Get() if sess == nil && beac == nil { @@ -177,6 +179,8 @@ func (h *implantHistory) Close() error { return err } +// isTrivialCommand returns true for commands that don't +// need to be saved in a given implant command history. func isTrivialCommand(cmdline string) bool { ignoreCmds := map[string]bool{ "": true, From 06005d9e34b5a70249fd2fb9b41a10a1f1b78451 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 19 Aug 2023 19:00:31 +0200 Subject: [PATCH 103/109] Fix stupid Tailscale compilation issue and keep last commits' work --- client/cli/cli.go | 22 +- client/cli/implant.go | 13 +- client/command/generate/implants.go | 2 +- client/command/history/history.go | 8 +- client/command/tasks/tasks.go | 2 +- client/command/use/commands.go | 7 +- client/console/command.go | 62 +- client/console/console.go | 38 +- client/console/events.go | 32 +- client/console/implant.go | 5 + client/console/readline.go | 3 +- client/console/teamclient.go | 46 +- protobuf/clientpb/client.pb.go | 2766 ++++++++++++++------------- protobuf/clientpb/client.proto | 1 + protobuf/commonpb/common.pb.go | 92 +- protobuf/commonpb/common.proto | 3 +- server/cli/cli.go | 1 + server/rpc/rpc.go | 22 +- server/transport/middleware.go | 7 +- server/transport/server.go | 2 +- 20 files changed, 1638 insertions(+), 1496 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 48c341014b..406460de0a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -28,6 +28,7 @@ import ( "github.com/reeflective/team/client/commands" "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/command/completers" sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" ) @@ -35,7 +36,7 @@ import ( // Execute - Run the sliver client binary. func Execute() { // Create a client-only (remote TLS-transported connections) - // Sliver Client, prepared with a working reeflective/teamclient. + // Sliver client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. con, err := client.NewSliverClient() @@ -43,7 +44,7 @@ func Execute() { log.Fatal(err) } - // Generate our complete Sliver Framework command-line interface. + // Generate the entire Sliver framework command-line interface. rootCmd := SliverCLI(con) // Version @@ -67,12 +68,12 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { } // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with - // a pre-runner ensuring the server and its teamclient are set up and connected. + // These are used as the primary, one-exec-only CLI of Sliver, and will be equipped + // with a pre-runner ensuring the server and its teamclient are set up and connected. server := command.ServerCommands(con, teamclientCmds) - root = server() - root.Use = "sliver-client" // Needed by completion scripts. + root = server() // The root has an empty command name... + root.Use = "sliver-client" // so adjust it, because needed by completion scripts. // Bind the closed-loop console. // The console shares the same setup/connection pre-runners as other commands, @@ -91,6 +92,15 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { command.BindPreRun(root, con.PreRunConnect) command.BindPostRun(root, con.PostRunDisconnect) + // Add a CLI-specific flag for allowing users to force a specific remote + // Sliver server configuration to be used, instead of prompting user to choose. + root.Flags().StringP("config", "c", "", "Force connecting to a specific Sliver server") + completers.NewFlagCompsFor(root, func(comp *carapace.ActionMap) { + (*comp)["config"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { + return commands.ConfigsAppCompleter(con.Teamclient, "configs") + }) + }) + // Generate the root completion command. carapace.Gen(root) diff --git a/client/cli/implant.go b/client/cli/implant.go index a2899c9f7c..ec0887cc11 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -9,12 +9,13 @@ import ( "github.com/spf13/pflag" "golang.org/x/exp/slices" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/use" client "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" ) // implantCmd returns the command tree for Sliver active targets. @@ -103,6 +104,16 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command. return err } + // Keep a copy of the command-line: used for beacon task command-line info. + con.Args = os.Args[1:] + for i, arg := range os.Args { + if arg == cmd.Name() { + con.Args = os.Args[i:] + } else if slices.Contains(cmd.Aliases, arg) { + con.Args = os.Args[i:] + } + } + return nil } } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index d420969fbe..0ec29d09f1 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -66,7 +66,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", - "Implant Type", + "Type", "Template", "OS/Arch", "Format", diff --git a/client/command/history/history.go b/client/command/history/history.go index 27bba1cecf..68eb8d31d9 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -24,7 +24,6 @@ import ( "time" "github.com/fatih/color" - "github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -34,8 +33,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) -const sgrPrefix = "\033[" - // Commands returns all commands related to implant history. func Commands(con *console.SliverClient) []*cobra.Command { historyCmd := &cobra.Command{ @@ -81,10 +78,11 @@ func Commands(con *console.SliverClient) []*cobra.Command { preLine := color.HiBlackString("%-3s", strconv.Itoa(i)) if !user { - preLine += fmt.Sprintf("%*s\t", 5, sgrPrefix+ui.ApplyStyling(ui.Style{}, ui.FgYellow).SGR()+"m"+command.User) + preLine += console.Orange + fmt.Sprintf("%*s\t", 5, command.User) + console.Normal } if showTime { - preLine += color.BlueString(time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp)) + "\t" + execAt := time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp) + preLine += console.Blue + execAt + console.Normal + "\t" } fmt.Println(preLine + command.Block) diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index fb38d7945c..5d0e793c36 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -54,7 +54,7 @@ func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *con tw.AppendHeader(table.Row{ "ID", "State", - "Message Type", + "Command Line", "Created", "Sent", "Completed", diff --git a/client/command/use/commands.go b/client/command/use/commands.go index 8ed2f1a8f1..80ca6074b1 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -16,9 +16,10 @@ import ( // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { useCmd := &cobra.Command{ - Use: consts.UseStr, - Short: "Switch the active session or beacon", - Long: help.GetHelpFor([]string{consts.UseStr}), + Use: consts.UseStr, + Short: "Switch the active session or beacon", + Long: help.GetHelpFor([]string{consts.UseStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { UseCmd(cmd, con, args) }, diff --git a/client/console/command.go b/client/console/command.go index 4a17ea52ef..ea2a2336ff 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -80,9 +80,9 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { } } -// AddPreRunner should be considered part of the temporary API. +// AddPreRuns should be considered part of the temporary API. // It is used by the Sliver client to run hooks before running its own pre-connect -// handlers, and can thus be used to register server-only pre-run routines. +// handlers, and this function is thus used to register server-only pre-run routines. func (con *SliverClient) AddPreRuns(hooks ...func(_ *cobra.Command, _ []string) error) { con.preRunners = append(con.preRunners, hooks...) } @@ -103,24 +103,6 @@ func (con *SliverClient) runPreConnectHooks(cmd *cobra.Command, args []string) e return nil } -// WARN: this is the premise of a big burden. Please bear this in mind. -// If I haven't speaked to you about it, or if you're not sure of what -// that means, ping me up and ask. -func (con *SliverClient) isOffline(cmd *cobra.Command) bool { - // Teamclient configuration import does not need network. - ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) - if err == nil && ts != nil && ts == cmd { - return true - } - - tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) - if err == nil && ts != nil && tc == cmd { - return true - } - - return false -} - func isFiltered(cmd *cobra.Command, targetFilters []string) bool { if cmd.Annotations == nil { return false @@ -140,3 +122,43 @@ func isFiltered(cmd *cobra.Command, targetFilters []string) bool { return false } + +// isOffline is unfortunately required for now. +// Some commands don't need access to the server, and therefore should +// be runnable even if no remote teamserver configs are available. +// +// An alternative would be to add some annotations to the commands +// just like we use annotations for implant command filtering, but +// I didn't want to impose such a practice without being sure of +// where it ultimately leads. Plus, there are not that many commands +// that need such a check, so I prefered to just hardcode them in +// the offlineCommands list below. +// +// This function only returns true when the exact command matches. +func (con *SliverClient) isOffline(cmd *cobra.Command) bool { + for _, cmdLine := range offlineCommands { + ts, _, err := cmd.Root().Find(cmdLine) + if err != nil || ts == nil { + continue + } + + if ts == cmd { + return true + } + } + + return false +} + +var offlineCommands = [][]string{ + // Teamclient/teamserver management + {"teamserver", "client", "import"}, // sliver-server + {"teamclient", "import"}, // sliver-client + + // Sliver-specific + {"help"}, + {consts.UpdateStr}, + {consts.VersionStr}, + {consts.LicensesStr}, + {consts.SettingsStr}, +} diff --git a/client/console/console.go b/client/console/console.go index 2ecac8af80..3fdc92bbd8 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -35,15 +35,16 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/status" + "github.com/reeflective/console" + "github.com/reeflective/readline" + "github.com/reeflective/team/client" + "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/reeflective/console" - "github.com/reeflective/readline" - "github.com/reeflective/team/client" ) const ( @@ -98,17 +99,18 @@ type ( // which means that users of this Sliver client may build arbitrarily complex server // selection/connection strategies. type SliverClient struct { - // Core client - App *console.Console - Settings *assets.ClientSettings - IsServer bool - isCLI bool - signals map[string]chan os.Signal - - // Teamclient & remotes + // Core Client & Teamclient + App *console.Console + Settings *assets.ClientSettings + IsServer bool Teamclient *client.Client - dialer *transport.TeamClient - preRunners []func(*cobra.Command, []string) error + dialer *transport.TeamClient // Allows to access the grpc.Conn. + + // Command utilities + isCLI bool // Are we in a exec-once CLI command mode. + preRunners []func(*cobra.Command, []string) error // Additional pre-runners (server) + signals map[string]chan os.Signal // Some commands can block, and be unblocked. + Args []string // Cache the last command-line we have run. // Logging jsonHandler slog.Handler @@ -121,6 +123,7 @@ type SliverClient struct { EventListeners *sync.Map // Tasks (pending) + // (Ensure we always print result after sent status display) beaconSentStatus map[string]*sync.WaitGroup beaconTaskSentMutex *sync.Mutex waitingResult chan bool @@ -232,6 +235,15 @@ func (con *SliverClient) StartConsole() error { con.isCLI = false con.printf = con.App.TransientPrintf + // os.Args are useless, and we need to keep each + // of our commands in case they are ran on beacons: + // those "need" the command line attached to task requests. + con.App.PreCmdRunLineHooks = append(con.App.PreCmdRunLineHooks, + func(args []string) ([]string, error) { + con.Args = args + return args, nil + }) + return con.App.Start() } diff --git a/client/console/events.go b/client/console/events.go index a14f732b6a..0766e02947 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -291,6 +291,7 @@ func (con *SliverClient) triggerTaskCancel(data []byte) { } } +// AddBeaconCallback registers a new function to call once a beacon task is completed and received. func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback BeaconTaskCallback) { if resp == nil || resp.TaskID == "" { return @@ -312,14 +313,29 @@ func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback Bea con.waitSignalOrClose() } -// NewTask registers a new task (asynchronous -beacon- or not). If: -// - the provided (task) Response is nil, -// - if the task is not marked Async, -// - or if it's ID is nil, -// the task is considered synchronous, and we will directly call -// the handle function to execute the post-response workflow. +// NewTask is a function resting on the idea that a task can be handled identically regardless +// of if it's a beacon or a session one. This function tries to solve several problems at once: +// +// - Enable commands to declare only a single "execution workflow" for all implant types. +// - Allow us to hook onto the process for various things. Example: we want to save each +// beacon task with its corresponding command-line (for accessibility/display purposes), +// and we would prefer doing it without having to call History RPC stuff in another place. +// - Eventually or potentially, also treat all session requests as tasks, with 0 delay. +// You then have a single, more unified way of treating all implant interactions. +// No need to store implant history in JSON/text files, just use the database for it. +// +// This function DOES NOT register a beacon callback (eg. treats the task as synchronous), when: +// - the provided (task) Response is nil, +// - if the task is not marked Async, +// - or if it's ID is nil, +// +// In which case, the handle function is directly called and executed with the result. +// This function is not used, but is fully compatible with all of your code (I checked). +// +// Usage: +// con.NewTask(download.Response, download, func() { PrintCat(download, cmd, con) }) func (con *SliverClient) NewTask(resp *commonpb.Response, message proto.Message, handle func()) { - // We're no beacon here. + // We're no beacon here, just run the response handler. if resp == nil || !resp.Async || resp.TaskID == "" { if handle != nil { handle() @@ -340,5 +356,3 @@ func (con *SliverClient) NewTask(resp *commonpb.Response, message proto.Message, } }) } - -// con.NewTask(download.Response, download, func() { PrintCat(download, cmd, con) }) diff --git a/client/console/implant.go b/client/console/implant.go index 21ae1a7c8c..17c55d4b22 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -177,10 +177,12 @@ func (s *ActiveTarget) AddObserver(observer Observer) int { return s.observerID } +// RemoveObserver removes an observer from the active target. func (s *ActiveTarget) RemoveObserver(observerID int) { delete(s.observers, observerID) } +// Request prepares a request metadata for the currently active target. func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { if s.session == nil && s.beacon == nil { return nil @@ -204,6 +206,9 @@ func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { req.Async = true req.BeaconID = s.beacon.ID } + + req.CmdLine = s.con.Args + return req } diff --git a/client/console/readline.go b/client/console/readline.go index c28ec15156..c08cbcd7ad 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -30,10 +30,11 @@ import ( "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/reeflective/console" ) // GetPrompt returns the prompt string computed for the current context. diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 5563e2e40c..d8eef5f1a5 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -29,12 +29,14 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/status" + "github.com/reeflective/team" + "github.com/reeflective/team/client" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/reeflective/team" ) // PreRunConnect is a spf13/cobra-compliant runner function to be included @@ -59,14 +61,23 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error return nil } + // Run any additional pre-run hooks, generally those registered + // by the sliver-server binary to ensure assets are setup, etc. if err := con.runPreConnectHooks(cmd, args); err != nil { return err } + // Check if the user told us to connect to a specific server + // instead of prompting him with all the configs we found. + clientOpts, err := con.loadConfig(cmd) + if err != nil { + return err + } + // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. - if err := con.Teamclient.Connect(); err != nil { + if err := con.Teamclient.Connect(clientOpts...); err != nil { return err } @@ -85,6 +96,33 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error return con.startClientLog() } +// loadConfig uses the --config flag (if existing), to override the server remote +// configuration to use, therefore skipping user prompts when there are more than one. +func (con *SliverClient) loadConfig(cmd *cobra.Command) ([]client.Options, error) { + // No overriding + if !cmd.Flags().Changed("config") { + return nil, nil + } + + configPath, err := cmd.Flags().GetString("config") + if err != nil { + return nil, err + } + + // Let the teamclient attempt to read the config. + config, err := con.Teamclient.ReadConfig(configPath) + if err != nil { + return nil, err + } + + // Should not happen, but just in case. + if config == nil { + return nil, errors.New("The teamclient returned no config, but no error") + } + + return append([]client.Options{}, client.WithConfig(config)), nil +} + // PreRunComplete is a special connection mode which should be // called in completer functions that need to use the client RPC. // It is almost equivalent to client.ConnectRun(), but for completions. @@ -154,7 +192,7 @@ func (con *SliverClient) Users() (users []team.User, err error) { return } -// Version implements team.Client.VersionClient() interface method, overriding +// VersionClient implements team.Client.VersionClient() interface method, overriding // the default teamclient version output to use our Makefile-prepared one. func (con *SliverClient) VersionClient() (v team.Version, err error) { dirty := version.GitDirty != "" @@ -172,7 +210,7 @@ func (con *SliverClient) VersionClient() (v team.Version, err error) { }, nil } -// ServerVersion returns the version information of the server to which +// VersionServer returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. func (con *SliverClient) VersionServer() (version team.Version, err error) { if con.Rpc == nil { diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index 5474c4f235..ea8d7089fd 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -2090,15 +2090,16 @@ type BeaconTask struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` - BeaconID string `protobuf:"bytes,2,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` - CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - State string `protobuf:"bytes,4,opt,name=State,proto3" json:"State,omitempty"` - SentAt int64 `protobuf:"varint,5,opt,name=SentAt,proto3" json:"SentAt,omitempty"` - CompletedAt int64 `protobuf:"varint,6,opt,name=CompletedAt,proto3" json:"CompletedAt,omitempty"` - Request []byte `protobuf:"bytes,7,opt,name=Request,proto3" json:"Request,omitempty"` - Response []byte `protobuf:"bytes,8,opt,name=Response,proto3" json:"Response,omitempty"` - Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"` + ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` + BeaconID string `protobuf:"bytes,2,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + State string `protobuf:"bytes,4,opt,name=State,proto3" json:"State,omitempty"` + SentAt int64 `protobuf:"varint,5,opt,name=SentAt,proto3" json:"SentAt,omitempty"` + CompletedAt int64 `protobuf:"varint,6,opt,name=CompletedAt,proto3" json:"CompletedAt,omitempty"` + Request []byte `protobuf:"bytes,7,opt,name=Request,proto3" json:"Request,omitempty"` + Response []byte `protobuf:"bytes,8,opt,name=Response,proto3" json:"Response,omitempty"` + Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"` + CmdLine []string `protobuf:"bytes,10,rep,name=CmdLine,proto3" json:"CmdLine,omitempty"` } func (x *BeaconTask) Reset() { @@ -2196,6 +2197,13 @@ func (x *BeaconTask) GetDescription() string { return "" } +func (x *BeaconTask) GetCmdLine() []string { + if x != nil { + return x.CmdLine + } + return nil +} + type BeaconTasks struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -10124,7 +10132,7 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, - 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, + 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, @@ -10140,837 +10148,857 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, - 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, - 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, - 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, - 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, - 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, - 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, - 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, - 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, - 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, - 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, - 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, - 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, - 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, - 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, - 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, - 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, - 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, - 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, - 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, - 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, - 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, - 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, - 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, - 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, - 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, - 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, - 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, - 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, - 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, - 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, - 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, - 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, - 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, - 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, - 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, - 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, - 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, - 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, - 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, - 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, - 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, - 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, - 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, - 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, - 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, - 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, - 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, - 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, - 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, + 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, + 0x69, 0x6e, 0x65, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, + 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, + 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, + 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, + 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, + 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, + 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, + 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, + 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, + 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, + 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, + 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, + 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, + 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, + 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, + 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, + 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, + 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, + 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, + 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, + 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, + 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, + 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, + 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, + 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, + 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, + 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, + 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, + 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, + 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, + 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, + 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, + 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, + 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, + 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, + 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, + 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, + 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, + 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, + 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, + 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, + 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, + 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, - 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, - 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, - 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, - 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, + 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, + 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, + 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, + 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, + 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, + 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, + 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, + 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, + 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, + 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, + 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, + 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, + 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, + 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, + 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, + 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, + 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, + 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, + 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, + 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, + 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, + 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, - 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, - 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, - 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, - 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, - 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, + 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, + 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, + 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, + 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, + 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, + 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, + 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, + 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, + 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, + 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, + 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, + 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, + 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, + 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, - 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, - 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, - 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, - 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, - 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, - 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, - 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, - 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, - 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, - 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, - 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, - 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, - 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, - 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, + 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, - 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, - 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, - 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, - 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, - 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, - 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, - 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, - 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, - 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, - 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, - 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, - 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, - 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, + 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, + 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, + 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, + 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, + 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, + 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, + 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, + 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, + 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, + 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, - 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, - 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, + 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, + 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, + 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -10986,554 +11014,536 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, - 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, - 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, - 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, - 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, - 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, - 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, - 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, - 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, - 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, - 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, - 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, - 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, - 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, - 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, - 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, - 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, - 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, - 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, - 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, - 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, - 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, - 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, - 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, - 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, - 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, - 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, - 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, - 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, + 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, + 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, + 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, + 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, + 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, + 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, + 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, + 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, + 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, + 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, + 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, + 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, + 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, + 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, + 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, + 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, + 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, + 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, + 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, + 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, + 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, + 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, + 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, + 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, + 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, + 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, + 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, - 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, - 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, - 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, - 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, - 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, - 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, - 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, - 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, - 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, - 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, - 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, - 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, - 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, - 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, - 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, - 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, - 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, - 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, - 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, - 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, - 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, - 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, - 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, - 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, - 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, + 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, + 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, + 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, + 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, + 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, + 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, + 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, + 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, + 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, + 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, + 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, + 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, + 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, - 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, - 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, - 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, - 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, - 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, - 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, - 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, - 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, - 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, - 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, - 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, - 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, - 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, - 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, - 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, - 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, - 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, - 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, - 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, - 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, - 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, - 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, - 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, - 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, - 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, - 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, - 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, - 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, - 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, - 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, - 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, - 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, - 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, - 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, - 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, - 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, - 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, - 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, - 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, - 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, - 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, - 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, - 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, - 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, - 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, - 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, - 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, - 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, - 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, - 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, - 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, - 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, - 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, - 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, - 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, - 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, - 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, - 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, - 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, - 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, - 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, - 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, - 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, - 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, - 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, - 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, - 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, - 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, - 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, - 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, - 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, - 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, - 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, - 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, - 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, - 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, - 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, - 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, - 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, - 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, - 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, - 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, - 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, - 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, - 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, - 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, - 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, - 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, - 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, - 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, - 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, - 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, - 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, - 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, - 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, - 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, - 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, - 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, - 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, - 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, - 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, - 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, - 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, - 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, - 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, - 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, - 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, - 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, - 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, - 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, - 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, - 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, - 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, - 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, - 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, - 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, - 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, - 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, - 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, - 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, - 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, - 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, - 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, - 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, - 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, - 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, - 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, - 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, - 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, - 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, - 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, - 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, - 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, - 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, - 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, - 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, - 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, - 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, - 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, - 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, - 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, - 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, - 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, - 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, - 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, - 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, - 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, - 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, - 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, - 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, - 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, - 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, - 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, - 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, - 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, - 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, - 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, - 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, + 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, + 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, + 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, + 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, + 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, + 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, + 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, + 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, + 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, + 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, + 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, + 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, + 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, + 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, + 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, + 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, + 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, + 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, + 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, + 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, + 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, + 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, + 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, + 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, + 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, + 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, + 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, + 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, + 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, + 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, + 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, + 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, + 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, + 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, + 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, + 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, + 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, + 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, + 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, + 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, + 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, + 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, + 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, + 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, + 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, + 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, + 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, + 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, + 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, + 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, + 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, + 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, + 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, + 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, + 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, + 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, + 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, + 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, + 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, + 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, + 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, + 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, + 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, + 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, + 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, + 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, + 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, + 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, + 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, + 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, + 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, + 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, + 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, + 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, + 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, + 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, + 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, + 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, + 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, + 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, + 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, + 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, + 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, + 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, + 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, + 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, + 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, + 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, + 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, + 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, + 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, + 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, + 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, + 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, + 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, + 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, + 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, + 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, + 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, + 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, + 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, + 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, + 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, + 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, + 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, + 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, + 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, + 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, + 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, + 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, + 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, + 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, + 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, + 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, + 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, + 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, + 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, + 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, + 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, + 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, + 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, + 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, + 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, + 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, + 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, + 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, + 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, + 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, + 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, + 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, + 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, + 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, + 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, + 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, + 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, + 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, + 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, + 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, + 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, + 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, + 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, + 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, + 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, + 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, + 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, + 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, + 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, + 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, + 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, + 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, + 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, + 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, + 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, + 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, + 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, + 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, + 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index 6c8aab90dd..4249c740a4 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -143,6 +143,7 @@ message BeaconTask { bytes Request = 7; bytes Response = 8; string Description = 9; + repeated string CmdLine = 10; } message BeaconTasks { diff --git a/protobuf/commonpb/common.pb.go b/protobuf/commonpb/common.pb.go index 0ebf02a837..9b124a7edd 100644 --- a/protobuf/commonpb/common.pb.go +++ b/protobuf/commonpb/common.pb.go @@ -64,10 +64,11 @@ type Request struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Async bool `protobuf:"varint,1,opt,name=Async,proto3" json:"Async,omitempty"` - Timeout int64 `protobuf:"varint,2,opt,name=Timeout,proto3" json:"Timeout,omitempty"` - BeaconID string `protobuf:"bytes,8,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` - SessionID string `protobuf:"bytes,9,opt,name=SessionID,proto3" json:"SessionID,omitempty"` + Async bool `protobuf:"varint,1,opt,name=Async,proto3" json:"Async,omitempty"` + Timeout int64 `protobuf:"varint,2,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + BeaconID string `protobuf:"bytes,8,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` + SessionID string `protobuf:"bytes,9,opt,name=SessionID,proto3" json:"SessionID,omitempty"` + CmdLine []string `protobuf:"bytes,10,rep,name=CmdLine,proto3" json:"CmdLine,omitempty"` } func (x *Request) Reset() { @@ -130,6 +131,13 @@ func (x *Request) GetSessionID() string { return "" } +func (x *Request) GetCmdLine() []string { + if x != nil { + return x.CmdLine + } + return nil +} + // Response - Common fields used in all gRPC responses. Note that the Err field // // only used when the implant needs to return an error to the server. @@ -418,43 +426,45 @@ var File_commonpb_common_proto protoreflect.FileDescriptor var file_commonpb_common_proto_rawDesc = []byte{ 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x73, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, - 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, - 0x66, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x45, - 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, - 0x79, 0x6e, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x22, 0x2e, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x45, - 0x6e, 0x76, 0x56, 0x61, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, - 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x66, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x44, 0x22, 0x2e, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x50, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x43, + 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, + 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/protobuf/commonpb/common.proto b/protobuf/commonpb/common.proto index 9dfeaeb8eb..ef5a784c42 100644 --- a/protobuf/commonpb/common.proto +++ b/protobuf/commonpb/common.proto @@ -15,6 +15,7 @@ message Request { string BeaconID = 8; string SessionID = 9; + repeated string CmdLine = 10; } // Response - Common fields used in all gRPC responses. Note that the Err field @@ -48,4 +49,4 @@ message Process { message EnvVar { string Key = 1; string Value = 2; -} \ No newline at end of file +} diff --git a/server/cli/cli.go b/server/cli/cli.go index 051a604936..953317c72d 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -102,6 +102,7 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra root = server() root.Use = "sliver-server" // Needed by completion scripts. + con.IsServer = true // Bind the closed-loop console: // The console shares the same setup/connection pre-runners as other commands, diff --git a/server/rpc/rpc.go b/server/rpc/rpc.go index 2819e701de..b693edff1f 100644 --- a/server/rpc/rpc.go +++ b/server/rpc/rpc.go @@ -21,9 +21,15 @@ package rpc import ( "context" "errors" - "strings" "time" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + + "github.com/kballard/go-shellquote" + "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/protobuf/sliverpb" @@ -31,10 +37,6 @@ import ( "github.com/bishopfox/sliver/server/db" "github.com/bishopfox/sliver/server/log" "github.com/reeflective/team/server" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" ) var rpcLog = log.NamedLogger("rpc", "server") @@ -151,9 +153,13 @@ func (rpc *Server) asyncGenericHandler(req GenericRequest, resp GenericResponse) rpcLog.Errorf("Database error: %s", err) return ErrDatabaseFailure } - parts := strings.Split(string(req.ProtoReflect().Descriptor().FullName().Name()), ".") - name := parts[len(parts)-1] - task.Description = name + // Save the command-line being ran as description instead, and preserve quoting. + // Currently this is not optimal, as it uses a UNIX-style quoter. I've found + // other packages that handle all operating systems, such as https://github.com/apparentlymart/go-shquot. + task.Description = shellquote.Join(request.GetCmdLine()...) + // parts := strings.Split(string(req.ProtoReflect().Descriptor().FullName().Name()), ".") + // name := parts[len(parts)-1] + err = db.Session().Save(task).Error if err != nil { rpcLog.Errorf("Database error: %s", err) diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 51108e25d9..ae5227c08f 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -23,9 +23,6 @@ import ( "encoding/json" "errors" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" "github.com/reeflective/team/server" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" @@ -37,6 +34,10 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/peer" "google.golang.org/grpc/status" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/core" + "github.com/bishopfox/sliver/server/db" ) // bufferingOptions returns a list of server options with max send/receive diff --git a/server/transport/server.go b/server/transport/server.go index 5d1f5b5834..e0664235f1 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -89,7 +89,7 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // It returns a teamclient meant to be ran in memory, with TLS credentials disabled. func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOption { conn := bufconn.Listen(bufSize) - insecureCreds := insecure.NewCredentials() + insecureCreds := insecure.NewCredentials() ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return conn.Dial() From 85cf0860c0414c782444871458bf19de9234939f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 19 Aug 2023 19:04:11 +0200 Subject: [PATCH 104/109] Update console dependency with fixes --- go.mod | 7 ++----- go.sum | 4 ++-- .../reeflective/console/commands/readline/bind.go | 5 +++-- .../reeflective/console/commands/readline/commands.go | 3 ++- .../reeflective/console/commands/readline/completers.go | 5 +++-- .../reeflective/console/commands/readline/export.go | 3 ++- .../reeflective/console/commands/readline/set.go | 7 ++++--- vendor/github.com/reeflective/console/completer.go | 3 ++- vendor/github.com/reeflective/console/menu.go | 3 ++- vendor/modules.txt | 2 +- 10 files changed, 23 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 8f6056eff5..1c49d2ebb0 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,6 @@ go 1.21 // and is regularly maintained up-to-date with upstream. Should be removed long-term. replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d -// Team is the teamserver/teamclient library, and this directive should be removed. -// replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team - require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -29,6 +26,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/jedib0t/go-pretty/v6 v6.4.6 + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f github.com/klauspost/compress v1.16.6 github.com/lesnuages/go-winio v0.4.19 @@ -38,7 +36,7 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.4 - github.com/reeflective/console v0.1.7 + github.com/reeflective/console v0.1.8 github.com/reeflective/readline v1.0.9 github.com/reeflective/team v0.1.1 github.com/rsteube/carapace v0.43.0 @@ -128,7 +126,6 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect github.com/jsimonetti/rtnetlink v1.3.2 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a // indirect github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect github.com/mailru/easyjson v0.7.7 // indirect diff --git a/go.sum b/go.sum index 1cee59433f..350744e98a 100644 --- a/go.sum +++ b/go.sum @@ -343,8 +343,8 @@ github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9K github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs+3CMJnfXc5SNEg+Kbu4A2AVljPuG5/HcaUdM= github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDFXw2I= -github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= +github.com/reeflective/console v0.1.8 h1:PZaQxh53zBNqB968RBnRRpUlQNhktZxEYKHhMUaifqU= +github.com/reeflective/console v0.1.8/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index a370360d1c..2af32deb5f 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -6,10 +6,11 @@ import ( "os" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index e3ec1bf03b..cb89c6c650 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,8 +1,9 @@ package readline import ( - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go index c384db29e0..135a121bec 100644 --- a/vendor/github.com/reeflective/console/commands/readline/completers.go +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -22,10 +22,11 @@ import ( "fmt" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) func completeKeymaps(sh *readline.Shell, _ *cobra.Command) carapace.Action { diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go index 0030f15c8a..67f70e9ff2 100644 --- a/vendor/github.com/reeflective/console/commands/readline/export.go +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -23,9 +23,10 @@ import ( "sort" "strings" + "github.com/spf13/cobra" + "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" - "github.com/spf13/cobra" ) const ( diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index 39c1e51db2..7f8f49b6a0 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -5,20 +5,21 @@ import ( "strconv" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "golang.org/x/exp/maps" "golang.org/x/exp/slices" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) var ( // We here must assume that all bind changes during the lifetime // of the binary are all made by a single readline application. // This config only stores the vars/binds that have been changed. - cfgChanged = inputrc.Config{} + cfgChanged = inputrc.NewConfig() ) // Set returns a command named `set`, for manipulating readline global options. diff --git a/vendor/github.com/reeflective/console/completer.go b/vendor/github.com/reeflective/console/completer.go index 374c6eaab7..ad65fadcbd 100644 --- a/vendor/github.com/reeflective/console/completer.go +++ b/vendor/github.com/reeflective/console/completer.go @@ -10,10 +10,11 @@ import ( "unicode" "unicode/utf8" - "github.com/reeflective/readline" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/rsteube/carapace/pkg/xdg" + + "github.com/reeflective/readline" ) func (c *Console) complete(line []rune, pos int) readline.Completions { diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 2159719330..14ed9490bf 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -9,8 +9,9 @@ import ( "sync" "text/template" - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Menu - A menu is a simple way to seggregate commands based on diff --git a/vendor/modules.txt b/vendor/modules.txt index 1489988cec..745ea527d5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -518,7 +518,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.7 +# github.com/reeflective/console v0.1.8 ## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline From 84779eacc0964c8f1b5dde986107575d40035b72 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 26 Aug 2023 19:45:06 +0200 Subject: [PATCH 105/109] Hide some commands in CLI --- client/command/use/commands.go | 2 ++ go.mod | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/client/command/use/commands.go b/client/command/use/commands.go index 80ca6074b1..b3ce01184f 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -34,6 +34,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.SessionsStr, Short: "Switch the active session", Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { UseSessionCmd(cmd, con, args) }, @@ -45,6 +46,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.BeaconsStr, Short: "Switch the active beacon", Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { UseBeaconCmd(cmd, con, args) }, diff --git a/go.mod b/go.mod index 1c49d2ebb0..2907323076 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,10 @@ go 1.21 // A fork of the completion engine is currently used in order to consume the engine // as a library. The fork is a very slightly patched mainline tree for that purpose, // and is regularly maintained up-to-date with upstream. Should be removed long-term. +// +// To update or try to: +// - You must replace rsteube/carapace v0.43.0 with the version found in the main require. +// - You must replace v0.25.2... with "library", then go mod tidy && go mod vendor. replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d require ( From ec6c5451661c7b8c131cb8df490fb0a6d0266f07 Mon Sep 17 00:00:00 2001 From: rkervella Date: Tue, 8 Aug 2023 09:28:52 -0700 Subject: [PATCH 106/109] fix kill for sessions --- implant/sliver/sliver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/implant/sliver/sliver.go b/implant/sliver/sliver.go index 638c906a9c..02130340e2 100644 --- a/implant/sliver/sliver.go +++ b/implant/sliver/sliver.go @@ -240,6 +240,10 @@ func sessionStartup() { if connection != nil { err := sessionMainLoop(connection) if err != nil { + if err == ErrTerminate { + connection.Cleanup() + return + } connectionErrors++ if transports.GetMaxConnectionErrors() < connectionErrors { return From 89cc659cb013638913a88ec6259e19863c778f31 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 26 Aug 2023 20:25:45 +0200 Subject: [PATCH 107/109] Fix status when killing session --- client/command/sessions/sessions.go | 1 + client/console/console.go | 4 ++++ go.mod | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 6913ccb5a9..41dad787e8 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -90,6 +90,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if err != nil { con.PrintErrorf("%s", err) } + con.PrintInfof("Killed %s (%s)\n", session.Name, session.ID) return } diff --git a/client/console/console.go b/client/console/console.go index 3fdc92bbd8..dae16090e1 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -292,6 +292,10 @@ func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, conte // UnwrapServerErr unwraps errors returned by gRPC method calls. // Should be used to return every non-nil resp, err := con.Rpc.Function(). func (con *SliverClient) UnwrapServerErr(err error) error { + if err == nil { + return nil + } + return errors.New(status.Convert(err).Message()) } diff --git a/go.mod b/go.mod index 2907323076..de0c9f8cb0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ go 1.21 // as a library. The fork is a very slightly patched mainline tree for that purpose, // and is regularly maintained up-to-date with upstream. Should be removed long-term. // -// To update or try to: +// To update or try to: // - You must replace rsteube/carapace v0.43.0 with the version found in the main require. // - You must replace v0.25.2... with "library", then go mod tidy && go mod vendor. replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d From 0f277714f2c2e90e946bd0149ba2e1ba5debf729 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 26 Aug 2023 20:38:36 +0200 Subject: [PATCH 108/109] Don't add version to offline commands --- client/console/command.go | 1 - 1 file changed, 1 deletion(-) diff --git a/client/console/command.go b/client/console/command.go index ea2a2336ff..037445084a 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -158,7 +158,6 @@ var offlineCommands = [][]string{ // Sliver-specific {"help"}, {consts.UpdateStr}, - {consts.VersionStr}, {consts.LicensesStr}, {consts.SettingsStr}, } From a7f56eb1bc15a256175d8d660c50b37fd8a3482a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 27 Aug 2023 17:09:13 +0200 Subject: [PATCH 109/109] Command tree refactoring for some stuff --- client/command/dns/commands.go | 60 ++++++ client/command/{jobs/dns.go => dns/listen.go} | 6 +- client/command/exec/commands.go | 48 +---- client/command/generate/commands.go | 41 +--- client/command/generate/helpers.go | 30 --- client/command/http/commands.go | 95 +++++++++ .../command/{jobs/http.go => http/listen.go} | 6 +- client/command/http/serve.go | 177 ++++++++++++++++ client/command/https/commands.go | 105 ++++++++++ .../{jobs/https.go => https/listen.go} | 6 +- .../command/{jobs/stage.go => https/serve.go} | 100 +++------ client/command/jobs/commands.go | 173 +--------------- client/command/jobs/wg.go | 49 ----- client/command/msf/commands.go | 89 ++++++++ client/command/{exec/msf.go => msf/exec.go} | 2 +- .../{exec/msf-inject.go => msf/inject.go} | 2 +- client/command/mtls/commands.go | 57 ++++++ .../command/{jobs/mtls.go => mtls/listen.go} | 6 +- client/command/pipe/commands.go | 55 +++++ .../{jobs/named-pipe.go => pipe/listen.go} | 6 +- client/command/reconfig/commands.go | 19 +- client/command/server.go | 14 +- client/command/sliver.go | 13 +- client/command/tcp/commands.go | 99 +++++++++ client/command/{jobs/tcp.go => tcp/listen.go} | 6 +- client/command/tcp/serve.go | 193 ++++++++++++++++++ client/command/transports/commands.go | 108 ++++++++++ .../{reconfig => transports}/reconfig.go | 2 +- .../traffic-encoders.go | 34 ++- client/command/websites/commands.go | 30 ++- .../command/websites/websites-add-content.go | 7 +- client/command/wireguard/commands.go | 50 ++++- client/command/wireguard/listen.go | 49 +++++ client/constants/constants.go | 20 +- 34 files changed, 1278 insertions(+), 479 deletions(-) create mode 100644 client/command/dns/commands.go rename client/command/{jobs/dns.go => dns/listen.go} (92%) create mode 100644 client/command/http/commands.go rename client/command/{jobs/http.go => http/listen.go} (93%) create mode 100644 client/command/http/serve.go create mode 100644 client/command/https/commands.go rename client/command/{jobs/https.go => https/listen.go} (95%) rename client/command/{jobs/stage.go => https/serve.go} (64%) delete mode 100644 client/command/jobs/wg.go create mode 100644 client/command/msf/commands.go rename client/command/{exec/msf.go => msf/exec.go} (99%) rename client/command/{exec/msf-inject.go => msf/inject.go} (99%) create mode 100644 client/command/mtls/commands.go rename client/command/{jobs/mtls.go => mtls/listen.go} (90%) create mode 100644 client/command/pipe/commands.go rename client/command/{jobs/named-pipe.go => pipe/listen.go} (89%) create mode 100644 client/command/tcp/commands.go rename client/command/{jobs/tcp.go => tcp/listen.go} (89%) create mode 100644 client/command/tcp/serve.go create mode 100644 client/command/transports/commands.go rename client/command/{reconfig => transports}/reconfig.go (99%) rename client/command/{generate => transports}/traffic-encoders.go (88%) create mode 100644 client/command/wireguard/listen.go diff --git a/client/command/dns/commands.go b/client/command/dns/commands.go new file mode 100644 index 0000000000..f543d2d73c --- /dev/null +++ b/client/command/dns/commands.go @@ -0,0 +1,60 @@ +package dns + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `dns` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + dnsCmd := &cobra.Command{ + Use: consts.DnsStr, + Short: "DNS handlers management", + GroupID: consts.NetworkHelpGroup, + } + + listenCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start a DNS listener", + Long: help.GetHelpFor([]string{consts.DnsStr}), + Run: func(cmd *cobra.Command, args []string) { + ListenCmd(cmd, con, args) + }, + } + dnsCmd.AddCommand(listenCmd) + + flags.Bind("DNS listener", false, listenCmd, func(f *pflag.FlagSet) { + f.StringP("domains", "d", "", "parent domain(s) to use for DNS c2") + f.BoolP("no-canaries", "c", false, "disable dns canary detection") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultDNSLPort, "udp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + return []*cobra.Command{dnsCmd} +} diff --git a/client/command/jobs/dns.go b/client/command/dns/listen.go similarity index 92% rename from client/command/jobs/dns.go rename to client/command/dns/listen.go index 6854befa05..1f63dbb574 100644 --- a/client/command/jobs/dns.go +++ b/client/command/dns/listen.go @@ -1,4 +1,4 @@ -package jobs +package dns /* Sliver Implant Framework @@ -28,8 +28,8 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) -// DNSListenerCmd - Start a DNS lisenter. -func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ListenCmd - Start a DNS lisenter. +func ListenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domainsF, _ := cmd.Flags().GetString("domains") domains := strings.Split(domainsF, ",") for index, domain := range domains { diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 892a0ffb07..0a0ebc9f38 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -179,52 +179,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) carapace.Gen(migrateCmd).PositionalCompletion(carapace.ActionValues().Usage("PID of process to migrate into")) - msfCmd := &cobra.Command{ - Use: consts.MsfStr, - Short: "Execute an MSF payload in the current process", - Long: help.GetHelpFor([]string{consts.MsfStr}), - Run: func(cmd *cobra.Command, args []string) { - MsfCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - flags.Bind("", false, msfCmd, func(f *pflag.FlagSet) { - f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") - f.StringP("lhost", "L", "", "listen host") - f.IntP("lport", "l", 4444, "listen port") - f.StringP("encoder", "e", "", "msf encoder") - f.IntP("iterations", "i", 1, "iterations of the encoder") - - f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") - }) - completers.NewFlagCompsFor(msfCmd, func(comp *carapace.ActionMap) { - (*comp)["encoder"] = generate.MsfEncoderCompleter(con) - (*comp)["payload"] = generate.MsfPayloadCompleter(con) - }) - - msfInjectCmd := &cobra.Command{ - Use: consts.MsfInjectStr, - Short: "Inject an MSF payload into a process", - Long: help.GetHelpFor([]string{consts.MsfInjectStr}), - Run: func(cmd *cobra.Command, args []string) { - MsfInjectCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - flags.Bind("", false, msfInjectCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "pid to inject into") - f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") - f.StringP("lhost", "L", "", "listen host") - f.IntP("lport", "l", 4444, "listen port") - f.StringP("encoder", "e", "", "msf encoder") - f.IntP("iterations", "i", 1, "iterations of the encoder") - - f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") - }) - completers.NewFlagCompsFor(msfInjectCmd, func(comp *carapace.ActionMap) { - (*comp)["encoder"] = generate.MsfEncoderCompleter(con) - }) - psExecCmd := &cobra.Command{ Use: consts.PsExecStr, Short: "Start a sliver service on a remote target", @@ -283,5 +237,5 @@ func Commands(con *console.SliverClient) []*cobra.Command { carapace.Gen(sshCmd).PositionalCompletion(carapace.ActionValues().Usage("remote host to SSH to (required)")) carapace.Gen(sshCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("command line with arguments")) - return []*cobra.Command{executeCmd, executeAssemblyCmd, executeShellcodeCmd, sideloadCmd, spawnDllCmd, migrateCmd, msfCmd, msfInjectCmd, psExecCmd, sshCmd} + return []*cobra.Command{executeCmd, executeAssemblyCmd, executeShellcodeCmd, sideloadCmd, spawnDllCmd, migrateCmd, psExecCmd, sshCmd} } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index ea60cff28a..d00de75c65 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -8,6 +8,7 @@ import ( "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/transports" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" ) @@ -88,44 +89,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { } generateCmd.AddCommand(generateInfoCmd) - // Traffic Encoder SubCommands - trafficEncodersCmd := &cobra.Command{ - Use: consts.TrafficEncodersStr, - Short: "Manage implant traffic encoders", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr}), - Run: func(cmd *cobra.Command, args []string) { - TrafficEncodersCmd(cmd, con, args) - }, - } - generateCmd.AddCommand(trafficEncodersCmd) - - trafficEncodersAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a new traffic encoder to the server from the local file system", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.AddStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - TrafficEncodersAddCmd(cmd, con, args) - }, - } - flags.Bind("", false, trafficEncodersAddCmd, func(f *pflag.FlagSet) { - f.BoolP("skip-tests", "s", false, "skip testing the traffic encoder (not recommended)") - }) - carapace.Gen(trafficEncodersAddCmd).PositionalCompletion(carapace.ActionFiles("wasm").Tag("wasm files").Usage("local file path (expects .wasm)")) - trafficEncodersCmd.AddCommand(trafficEncodersAddCmd) - - trafficEncodersRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a traffic encoder from the server", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - TrafficEncodersRemoveCmd(cmd, con, args) - }, - } - carapace.Gen(trafficEncodersRmCmd).PositionalCompletion(TrafficEncodersCompleter(con).Usage("traffic encoder to remove")) - trafficEncodersCmd.AddCommand(trafficEncodersRmCmd) - // [ Regenerate ] -------------------------------------------------------------- regenerateCmd := &cobra.Command{ @@ -349,7 +312,7 @@ func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverClient) { (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") (*comp)["format"] = FormatCompleter() (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - (*comp)["traffic-encoders"] = TrafficEncodersCompleter(con).UniqueList(",") + (*comp)["traffic-encoders"] = transports.TrafficEncodersCompleter(con).UniqueList(",") }) } diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 941b7289ef..503fd9a73d 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -147,36 +147,6 @@ func FormatCompleter() carapace.Action { }) } -// TrafficEncoderCompleter - Completes the names of traffic encoders. -func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { - return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.PreRunComplete(); err != nil { - return msg - } - - grpcCtx, cancel := con.GrpcContext(nil) - defer cancel() - trafficEncoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) - if err != nil { - return carapace.ActionMessage("failed to fetch traffic encoders: %s", con.UnwrapServerErr(err)) - } - - results := []string{} - for _, encoder := range trafficEncoders.Encoders { - results = append(results, encoder.Wasm.Name) - skipTests := "" - if encoder.SkipTests { - skipTests = "[skip-tests]" - } - desc := fmt.Sprintf("(Wasm: %s) %s", encoder.Wasm.Name, skipTests) - results = append(results, desc) - } - - return carapace.ActionValuesDescribed(results...).Tag("traffic encoders"). - Invoke(c).Filter(c.Args).ToA() - }).Cache(completers.CacheCompilerInfo) -} - // MsfFormatCompleter completes MsfVenom stager formats. func MsfFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { diff --git a/client/command/http/commands.go b/client/command/http/commands.go new file mode 100644 index 0000000000..8dbd5639b8 --- /dev/null +++ b/client/command/http/commands.go @@ -0,0 +1,95 @@ +package http + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `http` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + httpCmd := &cobra.Command{ + Use: consts.HttpStr, + Short: "HTTP handlers management", + GroupID: consts.NetworkHelpGroup, + } + + // Sliver listeners + listenCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start an HTTP listener", + Long: help.GetHelpFor([]string{consts.HttpStr}), + Run: func(cmd *cobra.Command, args []string) { + ListenCmd(cmd, con, args) + }, + } + httpCmd.AddCommand(listenCmd) + + flags.Bind("HTTP listener", false, listenCmd, func(f *pflag.FlagSet) { + f.StringP("domain", "d", "", "limit responses to specific domain") + f.StringP("website", "w", "", "website name (see websites cmd)") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultHTTPLPort, "tcp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") + f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // Staging listeners + stageCmd := &cobra.Command{ + Use: consts.ServeStr, + Short: "Start a stager listener", + Long: help.GetHelpFor([]string{consts.StageListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + ServeStageCmd(cmd, con, args) + }, + } + httpCmd.AddCommand(stageCmd) + + flags.Bind("stage listener", false, stageCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "implant profile name to link with the listener") + f.StringP("url", "u", "", "URL to which the stager will call back to") + f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") + f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") + f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") + f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") + f.String("rc4-encrypt-key", "", "encrypt stage with RC4 encryption key") + f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") + f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") + }) + completers.NewFlagCompsFor(stageCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") + }) + + return []*cobra.Command{httpCmd} +} diff --git a/client/command/jobs/http.go b/client/command/http/listen.go similarity index 93% rename from client/command/jobs/http.go rename to client/command/http/listen.go index a1db817173..d3006cb395 100644 --- a/client/command/jobs/http.go +++ b/client/command/http/listen.go @@ -1,4 +1,4 @@ -package jobs +package http /* Sliver Implant Framework @@ -28,8 +28,8 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) -// HTTPListenerCmd - Start an HTTP listener. -func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ListenCmd - Start an HTTP listener. +func ListenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/http/serve.go b/client/command/http/serve.go new file mode 100644 index 0000000000..688827d60f --- /dev/null +++ b/client/command/http/serve.go @@ -0,0 +1,177 @@ +package http + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bytes" + "compress/zlib" + "context" + "encoding/binary" + "net/url" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/util" + "github.com/bishopfox/sliver/util/encoders" +) + +// ServeStageCmd --url [tcp://ip:port | http://ip:port ] --profile name. +func ServeStageCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { + profileName, _ := cmd.Flags().GetString("profile") + listenerURL, _ := cmd.Flags().GetString("url") + aesEncryptKey, _ := cmd.Flags().GetString("aes-encrypt-key") + aesEncryptIv, _ := cmd.Flags().GetString("aes-encrypt-iv") + rc4EncryptKey, _ := cmd.Flags().GetString("rc4-encrypt-key") + prependSize, _ := cmd.Flags().GetBool("prepend-size") + compressF, _ := cmd.Flags().GetString("compress") + compress := strings.ToLower(compressF) + + if profileName == "" || listenerURL == "" { + con.PrintErrorf("Missing required flags, see `help stage-listener` for more info\n") + return + } + + // parse listener url + stagingURL, err := url.Parse(listenerURL) + if err != nil { + con.PrintErrorf("Listener-url format not supported") + return + } + stagingPort, err := strconv.ParseUint(stagingURL.Port(), 10, 32) + if err != nil { + con.PrintErrorf("error parsing staging port: %v\n", err) + return + } + + profile := generate.GetImplantProfileByName(profileName, con) + if profile == nil { + con.PrintErrorf("Profile not found\n") + return + } + + if rc4EncryptKey != "" && aesEncryptKey != "" { + con.PrintErrorf("Cannot use both RC4 and AES encryption\n") + return + } + + rc4Encrypt := false + if rc4EncryptKey != "" { + // RC4 keysize can be between 1 to 256 bytes + if len(rc4EncryptKey) < 1 || len(rc4EncryptKey) > 256 { + con.PrintErrorf("Incorrect length of RC4 Key\n") + return + } + rc4Encrypt = true + } + + aesEncrypt := false + if aesEncryptKey != "" { + // check if aes encryption key is correct length + if len(aesEncryptKey)%16 != 0 { + con.PrintErrorf("Incorrect length of AES Key\n") + return + } + + // set default aes iv + if aesEncryptIv == "" { + aesEncryptIv = "0000000000000000" + } + + // check if aes iv is correct length + if len(aesEncryptIv)%16 != 0 { + con.PrintErrorf("Incorrect length of AES IV\n") + return + } + + aesEncrypt = true + } + + stage2, err := generate.GetSliverBinary(profile, con) + if err != nil { + con.PrintErrorf("%s\n", err) + return + } + + switch compress { + case "zlib": + // use zlib to compress the stage2 + var compBuff bytes.Buffer + zlibWriter := zlib.NewWriter(&compBuff) + zlibWriter.Write(stage2) + zlibWriter.Close() + stage2 = compBuff.Bytes() + case "gzip": + stage2, _ = encoders.GzipBuf(stage2) + case "deflate9": + fallthrough + case "deflate": + stage2 = util.DeflateBuf(stage2) + } + + if aesEncrypt { + // PreludeEncrypt is vanilla AES, we typically only use it for interoperability with Prelude + // but it's also useful here as more advanced cipher modes are often difficult to implement in + // a stager. + stage2 = util.PreludeEncrypt(stage2, []byte(aesEncryptKey), []byte(aesEncryptIv)) + } + + if rc4Encrypt { + stage2 = util.RC4EncryptUnsafe(stage2, []byte(rc4EncryptKey)) + } + + if prependSize { + stage2 = prependPayloadSize(stage2) + } + ctrl := make(chan bool) + con.SpinUntil("Starting HTTP staging listener...", ctrl) + stageListener, err := con.Rpc.StartHTTPStagerListener(context.Background(), &clientpb.StagerListenerReq{ + Protocol: clientpb.StageProtocol_HTTP, + Data: stage2, + Host: stagingURL.Hostname(), + Port: uint32(stagingPort), + }) + ctrl <- true + <-ctrl + if err != nil { + con.PrintErrorf("Error starting HTTP staging listener: %s\n", con.UnwrapServerErr(err)) + return + } + con.PrintInfof("Job %d (http) started\n", stageListener.GetJobID()) + + if aesEncrypt { + con.PrintInfof("AES KEY: %v\n", aesEncryptKey) + con.PrintInfof("AES IV: %v\n", aesEncryptIv) + } + + if rc4Encrypt { + con.PrintInfof("RC4 KEY: %v\n", rc4EncryptKey) + } +} + +func prependPayloadSize(payload []byte) []byte { + payloadSize := uint32(len(payload)) + lenBuf := make([]byte, 4) + binary.LittleEndian.PutUint32(lenBuf, payloadSize) + return append(lenBuf, payload...) +} diff --git a/client/command/https/commands.go b/client/command/https/commands.go new file mode 100644 index 0000000000..d8ac2e1967 --- /dev/null +++ b/client/command/https/commands.go @@ -0,0 +1,105 @@ +package https + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `https` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + httpCmd := &cobra.Command{ + Use: consts.HttpsStr, + Short: "HTTPS handlers management", + GroupID: consts.NetworkHelpGroup, + } + + // Sliver listeners + listenCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start an HTTPS listener", + Long: help.GetHelpFor([]string{consts.HttpsStr}), + Run: func(cmd *cobra.Command, args []string) { + ListenCmd(cmd, con, args) + }, + } + httpCmd.AddCommand(listenCmd) + + flags.Bind("HTTPS listener", false, listenCmd, func(f *pflag.FlagSet) { + f.StringP("domain", "d", "", "limit responses to specific domain") + f.StringP("website", "w", "", "website name (see websites cmd)") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultHTTPSLPort, "tcp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") + f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + + f.StringP("cert", "c", "", "PEM encoded certificate file") + f.StringP("key", "k", "", "PEM encoded private key file") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate") + f.BoolP("disable-randomized-jarm", "E", false, "disable randomized jarm fingerprints") + + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + completers.NewFlagCompsFor(listenCmd, func(comp *carapace.ActionMap) { + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + }) + + // Staging listeners + stageCmd := &cobra.Command{ + Use: consts.ServeStr, + Short: "Start a stager listener", + Long: help.GetHelpFor([]string{consts.StageListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + ServeStageCmd(cmd, con, args) + }, + } + httpCmd.AddCommand(stageCmd) + + flags.Bind("stage listener", false, stageCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "implant profile name to link with the listener") + f.StringP("url", "u", "", "URL to which the stager will call back to") + f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") + f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") + f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") + f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") + f.String("rc4-encrypt-key", "", "encrypt stage with RC4 encryption key") + f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") + f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") + }) + completers.NewFlagCompsFor(stageCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") + }) + + return []*cobra.Command{httpCmd} +} diff --git a/client/command/jobs/https.go b/client/command/https/listen.go similarity index 95% rename from client/command/jobs/https.go rename to client/command/https/listen.go index 80c957c30b..1ee674f699 100644 --- a/client/command/jobs/https.go +++ b/client/command/https/listen.go @@ -1,4 +1,4 @@ -package jobs +package https /* Sliver Implant Framework @@ -31,8 +31,8 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) -// HTTPSListenerCmd - Start an HTTPS listener. -func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ListenCmd - Start an HTTPS listener. +func ListenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/stage.go b/client/command/https/serve.go similarity index 64% rename from client/command/jobs/stage.go rename to client/command/https/serve.go index b9e3160829..6837689d83 100644 --- a/client/command/jobs/stage.go +++ b/client/command/https/serve.go @@ -1,4 +1,4 @@ -package jobs +package https /* Sliver Implant Framework @@ -36,8 +36,8 @@ import ( "github.com/bishopfox/sliver/util/encoders" ) -// StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name. -func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ServeStageCmd --url [tcp://ip:port | http://ip:port ] --profile name. +func ServeStageCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profileName, _ := cmd.Flags().GetString("profile") listenerURL, _ := cmd.Flags().GetString("url") aesEncryptKey, _ := cmd.Flags().GetString("aes-encrypt-key") @@ -140,78 +140,34 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri stage2 = util.RC4EncryptUnsafe(stage2, []byte(rc4EncryptKey)) } - switch stagingURL.Scheme { - case "http": - if prependSize { - stage2 = prependPayloadSize(stage2) - } - ctrl := make(chan bool) - con.SpinUntil("Starting HTTP staging listener...", ctrl) - stageListener, err := con.Rpc.StartHTTPStagerListener(context.Background(), &clientpb.StagerListenerReq{ - Protocol: clientpb.StageProtocol_HTTP, - Data: stage2, - Host: stagingURL.Hostname(), - Port: uint32(stagingPort), - }) - ctrl <- true - <-ctrl - if err != nil { - con.PrintErrorf("Error starting HTTP staging listener: %s\n", con.UnwrapServerErr(err)) - return - } - con.PrintInfof("Job %d (http) started\n", stageListener.GetJobID()) - case "https": - letsEncrypt, _ := cmd.Flags().GetBool("lets-encrypt") - if prependSize { - stage2 = prependPayloadSize(stage2) - } - cert, key, err := getLocalCertificatePair(cmd) - if err != nil { - con.Println() - con.PrintErrorf("Failed to load local certificate %s\n", err) - return - } - ctrl := make(chan bool) - con.SpinUntil("Starting HTTPS staging listener...", ctrl) - stageListener, err := con.Rpc.StartHTTPStagerListener(context.Background(), &clientpb.StagerListenerReq{ - Protocol: clientpb.StageProtocol_HTTPS, - Data: stage2, - Host: stagingURL.Hostname(), - Port: uint32(stagingPort), - Cert: cert, - Key: key, - ACME: letsEncrypt, - }) - ctrl <- true - <-ctrl - if err != nil { - con.PrintErrorf("Error starting HTTPS staging listener: %v\n", con.UnwrapServerErr(err)) - return - } - con.PrintInfof("Job %d (https) started\n", stageListener.GetJobID()) - case "tcp": - // Always prepend payload size for TCP stagers + letsEncrypt, _ := cmd.Flags().GetBool("lets-encrypt") + if prependSize { stage2 = prependPayloadSize(stage2) - ctrl := make(chan bool) - con.SpinUntil("Starting TCP staging listener...", ctrl) - stageListener, err := con.Rpc.StartTCPStagerListener(context.Background(), &clientpb.StagerListenerReq{ - Protocol: clientpb.StageProtocol_TCP, - Data: stage2, - Host: stagingURL.Hostname(), - Port: uint32(stagingPort), - }) - ctrl <- true - <-ctrl - if err != nil { - con.PrintErrorf("Error starting TCP staging listener: %v\n", con.UnwrapServerErr(err)) - return - } - con.PrintInfof("Job %d (tcp) started\n", stageListener.GetJobID()) - - default: - con.PrintErrorf("Unsupported staging protocol: %s\n", stagingURL.Scheme) + } + cert, key, err := getLocalCertificatePair(cmd) + if err != nil { + con.Println() + con.PrintErrorf("Failed to load local certificate %s\n", err) + return + } + ctrl := make(chan bool) + con.SpinUntil("Starting HTTPS staging listener...", ctrl) + stageListener, err := con.Rpc.StartHTTPStagerListener(context.Background(), &clientpb.StagerListenerReq{ + Protocol: clientpb.StageProtocol_HTTPS, + Data: stage2, + Host: stagingURL.Hostname(), + Port: uint32(stagingPort), + Cert: cert, + Key: key, + ACME: letsEncrypt, + }) + ctrl <- true + <-ctrl + if err != nil { + con.PrintErrorf("Error starting HTTPS staging listener: %v\n", con.UnwrapServerErr(err)) return } + con.PrintInfof("Job %d (https) started\n", stageListener.GetJobID()) if aesEncrypt { con.PrintInfof("AES KEY: %v\n", aesEncryptKey) diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 252eb1f2a5..1b9f544ba8 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -7,15 +7,13 @@ import ( "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" ) -// Commands returns the “ command and its subcommands. +// Commands returns the `jobs` command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { - // Job control jobsCmd := &cobra.Command{ Use: consts.JobsStr, Short: "Job control", @@ -37,172 +35,5 @@ func Commands(con *console.SliverClient) []*cobra.Command { (*comp)["kill"] = JobsIDCompleter(con) }) - // Mutual TLS - mtlsCmd := &cobra.Command{ - Use: consts.MtlsStr, - Short: "Start an mTLS listener", - Long: help.GetHelpFor([]string{consts.MtlsStr}), - Run: func(cmd *cobra.Command, args []string) { - MTLSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - flags.Bind("mTLS listener", false, mtlsCmd, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultMTLSLPort, "tcp listen port") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - - // Wireguard - wgCmd := &cobra.Command{ - Use: consts.WGStr, - Short: "Start a WireGuard listener", - Long: help.GetHelpFor([]string{consts.WGStr}), - Run: func(cmd *cobra.Command, args []string) { - WGListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - flags.Bind("WireGuard listener", false, wgCmd, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultWGLPort, "udp listen port") - f.Uint32P("nport", "n", generate.DefaultWGNPort, "virtual tun interface listen port") - f.Uint32P("key-port", "x", generate.DefaultWGKeyExPort, "virtual tun interface key exchange port") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - - // DNS - dnsCmd := &cobra.Command{ - Use: consts.DnsStr, - Short: "Start a DNS listener", - Long: help.GetHelpFor([]string{consts.DnsStr}), - Run: func(cmd *cobra.Command, args []string) { - DNSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - flags.Bind("DNS listener", false, dnsCmd, func(f *pflag.FlagSet) { - f.StringP("domains", "d", "", "parent domain(s) to use for DNS c2") - f.BoolP("no-canaries", "c", false, "disable dns canary detection") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultDNSLPort, "udp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - - // HTTP - httpCmd := &cobra.Command{ - Use: consts.HttpStr, - Short: "Start an HTTP listener", - Long: help.GetHelpFor([]string{consts.HttpStr}), - Run: func(cmd *cobra.Command, args []string) { - HTTPListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - flags.Bind("HTTP listener", false, httpCmd, func(f *pflag.FlagSet) { - f.StringP("domain", "d", "", "limit responses to specific domain") - f.StringP("website", "w", "", "website name (see websites cmd)") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultHTTPLPort, "tcp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") - f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - - // HTTPS - httpsCmd := &cobra.Command{ - Use: consts.HttpsStr, - Short: "Start an HTTPS listener", - Long: help.GetHelpFor([]string{consts.HttpsStr}), - Run: func(cmd *cobra.Command, args []string) { - HTTPSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - flags.Bind("HTTPS listener", false, httpsCmd, func(f *pflag.FlagSet) { - f.StringP("domain", "d", "", "limit responses to specific domain") - f.StringP("website", "w", "", "website name (see websites cmd)") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultHTTPSLPort, "tcp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") - f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") - - f.StringP("cert", "c", "", "PEM encoded certificate file") - f.StringP("key", "k", "", "PEM encoded private key file") - f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate") - f.BoolP("disable-randomized-jarm", "E", false, "disable randomized jarm fingerprints") - - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - completers.NewFlagCompsFor(httpsCmd, func(comp *carapace.ActionMap) { - (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") - (*comp)["key"] = carapace.ActionFiles().Tag("key file") - }) - - // Staging listeners - stageCmd := &cobra.Command{ - Use: consts.StageListenerStr, - Short: "Start a stager listener", - Long: help.GetHelpFor([]string{consts.StageListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - StageListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - flags.Bind("stage listener", false, stageCmd, func(f *pflag.FlagSet) { - f.StringP("profile", "p", "", "implant profile name to link with the listener") - f.StringP("url", "u", "", "URL to which the stager will call back to") - f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") - f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") - f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") - f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") - f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") - f.String("rc4-encrypt-key", "", "encrypt stage with RC4 encryption key") - f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") - f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") - }) - completers.NewFlagCompsFor(stageCmd, func(comp *carapace.ActionMap) { - (*comp)["profile"] = generate.ProfileNameCompleter(con) - (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") - (*comp)["key"] = carapace.ActionFiles().Tag("key file") - (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") - }) - - return []*cobra.Command{jobsCmd, mtlsCmd, wgCmd, httpCmd, httpsCmd, stageCmd} -} - -// SliverCommands returns all C2 channels control commands available for an implant target. -func SliverCommands(con *console.SliverClient) []*cobra.Command { - namedPipeCmd := &cobra.Command{ - Use: consts.NamedPipeStr, - Short: "Start a named pipe pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), - Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - StartNamedPipeListenerCmd(cmd, con, args) - }, - } - flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") - f.BoolP("allow-all", "a", false, "allow all users to connect") - }) - - tcpListenerCmd := &cobra.Command{ - Use: consts.TCPListenerStr, - Short: "Start a TCP pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), - Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - StartTCPListenerCmd(cmd, con, args) - }, - } - flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "remote interface to bind pivot listener") - f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") - }) - - return []*cobra.Command{namedPipeCmd, tcpListenerCmd} + return []*cobra.Command{jobsCmd} } diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go deleted file mode 100644 index c7ac3d93c5..0000000000 --- a/client/command/jobs/wg.go +++ /dev/null @@ -1,49 +0,0 @@ -package jobs - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/clientpb" -) - -// WGListenerCmd - Start a WireGuard listener. -func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - lport, _ := cmd.Flags().GetUint32("lport") - nport, _ := cmd.Flags().GetUint32("nport") - keyExchangePort, _ := cmd.Flags().GetUint32("key-port") - persistent, _ := cmd.Flags().GetBool("persistent") - - con.PrintInfof("Starting Wireguard listener ...\n") - wg, err := con.Rpc.StartWGListener(context.Background(), &clientpb.WGListenerReq{ - Port: lport, - NPort: nport, - KeyPort: keyExchangePort, - Persistent: persistent, - }) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - } else { - con.PrintInfof("Successfully started job #%d\n", wg.JobID) - } -} diff --git a/client/command/msf/commands.go b/client/command/msf/commands.go new file mode 100644 index 0000000000..603ba9a400 --- /dev/null +++ b/client/command/msf/commands.go @@ -0,0 +1,89 @@ +package msf + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `msf` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + msfCmd := &cobra.Command{ + Use: consts.MsfStr, + Short: "Generic transport preparation & management", + GroupID: consts.ExecutionHelpGroup, + } + + msfExecCmd := &cobra.Command{ + Use: consts.ExecuteStr, + Short: "Execute an MSF payload in the current process", + Long: help.GetHelpFor([]string{consts.MsfStr}), + Run: func(cmd *cobra.Command, args []string) { + MsfCmd(cmd, con, args) + }, + } + msfCmd.AddCommand(msfExecCmd) + flags.Bind("", false, msfExecCmd, func(f *pflag.FlagSet) { + f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") + f.StringP("lhost", "L", "", "listen host") + f.IntP("lport", "l", 4444, "listen port") + f.StringP("encoder", "e", "", "msf encoder") + f.IntP("iterations", "i", 1, "iterations of the encoder") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + completers.NewFlagCompsFor(msfExecCmd, func(comp *carapace.ActionMap) { + (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + (*comp)["payload"] = generate.MsfPayloadCompleter(con) + }) + + msfInjectCmd := &cobra.Command{ + Use: consts.MsfInjectStr, + Short: "Inject an MSF payload into a process", + Long: help.GetHelpFor([]string{consts.MsfInjectStr}), + Run: func(cmd *cobra.Command, args []string) { + MsfInjectCmd(cmd, con, args) + }, + } + msfCmd.AddCommand(msfInjectCmd) + flags.Bind("", false, msfInjectCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "pid to inject into") + f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") + f.StringP("lhost", "L", "", "listen host") + f.IntP("lport", "l", 4444, "listen port") + f.StringP("encoder", "e", "", "msf encoder") + f.IntP("iterations", "i", 1, "iterations of the encoder") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + completers.NewFlagCompsFor(msfInjectCmd, func(comp *carapace.ActionMap) { + (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + }) + + return []*cobra.Command{msfCmd} +} diff --git a/client/command/exec/msf.go b/client/command/msf/exec.go similarity index 99% rename from client/command/exec/msf.go rename to client/command/msf/exec.go index 473ab9248c..d4798fa589 100644 --- a/client/command/exec/msf.go +++ b/client/command/msf/exec.go @@ -1,4 +1,4 @@ -package exec +package msf /* Sliver Implant Framework diff --git a/client/command/exec/msf-inject.go b/client/command/msf/inject.go similarity index 99% rename from client/command/exec/msf-inject.go rename to client/command/msf/inject.go index 9d2eedd45c..9378b41ff9 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/msf/inject.go @@ -1,4 +1,4 @@ -package exec +package msf /* Sliver Implant Framework diff --git a/client/command/mtls/commands.go b/client/command/mtls/commands.go new file mode 100644 index 0000000000..e9c4510b8a --- /dev/null +++ b/client/command/mtls/commands.go @@ -0,0 +1,57 @@ +package mtls + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `mtls` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + mtlsCmd := &cobra.Command{ + Use: consts.MtlsStr, + Short: "mTLS handlers management", + GroupID: consts.NetworkHelpGroup, + } + + listenCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start an mTLS listener", + Long: help.GetHelpFor([]string{consts.MtlsStr}), + Run: func(cmd *cobra.Command, args []string) { + ListenCmd(cmd, con, args) + }, + } + mtlsCmd.AddCommand(listenCmd) + + flags.Bind("mTLS listener", false, listenCmd, func(f *pflag.FlagSet) { + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultMTLSLPort, "tcp listen port") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + return []*cobra.Command{mtlsCmd} +} diff --git a/client/command/jobs/mtls.go b/client/command/mtls/listen.go similarity index 90% rename from client/command/jobs/mtls.go rename to client/command/mtls/listen.go index 7d21ae79b9..f5104f7385 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/mtls/listen.go @@ -1,4 +1,4 @@ -package jobs +package mtls /* Sliver Implant Framework @@ -27,8 +27,8 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) -// MTLSListenerCmd - Start an mTLS listener. -func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ListenCmd - Start an mTLS listener. +func ListenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") persistent, _ := cmd.Flags().GetBool("persistent") diff --git a/client/command/pipe/commands.go b/client/command/pipe/commands.go new file mode 100644 index 0000000000..69c3db3a67 --- /dev/null +++ b/client/command/pipe/commands.go @@ -0,0 +1,55 @@ +package pipe + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `named-pipe` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + namedPipeCmd := &cobra.Command{ + Use: consts.NamedPipeStr, + Short: "Named pipe handlers management", + } + + listenCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start a named pipe pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + ListenCmd(cmd, con, args) + }, + } + namedPipeCmd.AddCommand(listenCmd) + + flags.Bind("", false, listenCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") + f.BoolP("allow-all", "a", false, "allow all users to connect") + }) + + return []*cobra.Command{namedPipeCmd} +} diff --git a/client/command/jobs/named-pipe.go b/client/command/pipe/listen.go similarity index 89% rename from client/command/jobs/named-pipe.go rename to client/command/pipe/listen.go index 7cbee6066d..caa757c2f5 100644 --- a/client/command/jobs/named-pipe.go +++ b/client/command/pipe/listen.go @@ -1,4 +1,4 @@ -package jobs +package pipe /* Sliver Implant Framework @@ -27,8 +27,8 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. -func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ListenCmd - Start a TCP pivot listener on the remote system. +func ListenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index 5022c9acf3..077a470ab5 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -12,23 +12,6 @@ import ( // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { - reconfigCmd := &cobra.Command{ - Use: consts.ReconfigStr, - Short: "Reconfigure the active beacon/session", - Long: help.GetHelpFor([]string{consts.ReconfigStr}), - Run: func(cmd *cobra.Command, args []string) { - ReconfigCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), - } - flags.Bind("reconfig", false, reconfigCmd, func(f *pflag.FlagSet) { - f.StringP("reconnect-interval", "r", "", "reconnect interval for implant") - f.StringP("beacon-interval", "i", "", "beacon callback interval") - f.StringP("beacon-jitter", "j", "", "beacon callback jitter (random up to)") - f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") - }) - renameCmd := &cobra.Command{ Use: consts.RenameStr, Short: "Rename the active beacon/session", @@ -43,5 +26,5 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - return []*cobra.Command{reconfigCmd, renameCmd} + return []*cobra.Command{renameCmd} } diff --git a/client/command/server.go b/client/command/server.go index fa13b43858..46a092687c 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -29,20 +29,26 @@ import ( "github.com/bishopfox/sliver/client/command/builders" "github.com/bishopfox/sliver/client/command/crack" "github.com/bishopfox/sliver/client/command/creds" + "github.com/bishopfox/sliver/client/command/dns" "github.com/bishopfox/sliver/client/command/exit" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/hosts" + "github.com/bishopfox/sliver/client/command/http" + "github.com/bishopfox/sliver/client/command/https" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/jobs" "github.com/bishopfox/sliver/client/command/licenses" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/command/monitor" + "github.com/bishopfox/sliver/client/command/mtls" operator "github.com/bishopfox/sliver/client/command/prelude-operator" "github.com/bishopfox/sliver/client/command/reaction" "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" "github.com/bishopfox/sliver/client/command/taskmany" + "github.com/bishopfox/sliver/client/command/tcp" + "github.com/bishopfox/sliver/client/command/transports" "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -101,9 +107,15 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C // C2 Network bind(consts.NetworkHelpGroup, + transports.Commands, jobs.Commands, - websites.Commands, + mtls.Commands, + dns.Commands, + http.Commands, + https.Commands, + tcp.Commands, wireguard.Commands, + websites.Commands, ) // Payloads diff --git a/client/command/sliver.go b/client/command/sliver.go index 88238c0d00..bb362fe267 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,8 @@ package command */ import ( - "github.com/spf13/cobra" - "github.com/reeflective/console" + "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" @@ -34,9 +33,10 @@ import ( "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/history" "github.com/bishopfox/sliver/client/command/info" - "github.com/bishopfox/sliver/client/command/jobs" "github.com/bishopfox/sliver/client/command/kill" + "github.com/bishopfox/sliver/client/command/msf" "github.com/bishopfox/sliver/client/command/network" + "github.com/bishopfox/sliver/client/command/pipe" "github.com/bishopfox/sliver/client/command/pivots" "github.com/bishopfox/sliver/client/command/portfwd" "github.com/bishopfox/sliver/client/command/privilege" @@ -49,6 +49,8 @@ import ( "github.com/bishopfox/sliver/client/command/shell" "github.com/bishopfox/sliver/client/command/socks" "github.com/bishopfox/sliver/client/command/tasks" + "github.com/bishopfox/sliver/client/command/tcp" + "github.com/bishopfox/sliver/client/command/transports" "github.com/bishopfox/sliver/client/command/wasm" "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" @@ -100,7 +102,9 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Network tools ] bind(consts.NetworkHelpGroup, - jobs.SliverCommands, + transports.SliverCommands, + tcp.SliverCommands, + pipe.Commands, network.Commands, rportfwd.Commands, portfwd.Commands, @@ -112,6 +116,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { bind(consts.ExecutionHelpGroup, shell.Commands, exec.Commands, + msf.Commands, backdoor.Commands, dllhijack.Commands, cursed.Commands, diff --git a/client/command/tcp/commands.go b/client/command/tcp/commands.go new file mode 100644 index 0000000000..1ef2191a02 --- /dev/null +++ b/client/command/tcp/commands.go @@ -0,0 +1,99 @@ +package tcp + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `tcp` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + tcpCmd := &cobra.Command{ + Use: consts.TCPListenerStr, + Short: "TCP handlers management", + GroupID: consts.NetworkHelpGroup, + } + + // Staging listeners + stageCmd := &cobra.Command{ + Use: consts.ServeStr, + Short: "Start a stager listener", + Long: help.GetHelpFor([]string{consts.StageListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + ServeStageCmd(cmd, con, args) + }, + } + tcpCmd.AddCommand(stageCmd) + + flags.Bind("stage listener", false, stageCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "implant profile name to link with the listener") + f.StringP("url", "u", "", "URL to which the stager will call back to") + f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") + f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") + f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") + f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") + f.String("rc4-encrypt-key", "", "encrypt stage with RC4 encryption key") + f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") + f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") + }) + completers.NewFlagCompsFor(stageCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") + }) + + return []*cobra.Command{tcpCmd} +} + +// Commands returns the `tcp` command and its subcommands for the implant menu. +func SliverCommands(con *console.SliverClient) []*cobra.Command { + tcpCmd := &cobra.Command{ + Use: consts.TCPListenerStr, + Short: "TCP handlers management", + } + + tcpListenerCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start a TCP pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + ListenPivotCmd(cmd, con, args) + }, + } + tcpCmd.AddCommand(tcpListenerCmd) + + flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "remote interface to bind pivot listener") + f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") + }) + + return []*cobra.Command{tcpCmd} +} diff --git a/client/command/jobs/tcp.go b/client/command/tcp/listen.go similarity index 89% rename from client/command/jobs/tcp.go rename to client/command/tcp/listen.go index 7fbb35c519..e756dfe795 100644 --- a/client/command/jobs/tcp.go +++ b/client/command/tcp/listen.go @@ -1,4 +1,4 @@ -package jobs +package tcp /* Sliver Implant Framework @@ -28,8 +28,8 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -// StartTCPListenerCmd - Start a TCP pivot listener on the remote system. -func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { +// ListenPivotCmd - Start a TCP pivot listener on the remote system. +func ListenPivotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/tcp/serve.go b/client/command/tcp/serve.go new file mode 100644 index 0000000000..d26ce670bc --- /dev/null +++ b/client/command/tcp/serve.go @@ -0,0 +1,193 @@ +package tcp + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bytes" + "compress/zlib" + "context" + "encoding/binary" + "net/url" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/util" + "github.com/bishopfox/sliver/util/encoders" +) + +// StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name. +func ServeStageCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { + profileName, _ := cmd.Flags().GetString("profile") + listenerURL, _ := cmd.Flags().GetString("url") + aesEncryptKey, _ := cmd.Flags().GetString("aes-encrypt-key") + aesEncryptIv, _ := cmd.Flags().GetString("aes-encrypt-iv") + rc4EncryptKey, _ := cmd.Flags().GetString("rc4-encrypt-key") + compressF, _ := cmd.Flags().GetString("compress") + compress := strings.ToLower(compressF) + + if profileName == "" || listenerURL == "" { + con.PrintErrorf("Missing required flags, see `help stage-listener` for more info\n") + return + } + + // parse listener url + stagingURL, err := url.Parse(listenerURL) + if err != nil { + con.PrintErrorf("Listener-url format not supported") + return + } + stagingPort, err := strconv.ParseUint(stagingURL.Port(), 10, 32) + if err != nil { + con.PrintErrorf("error parsing staging port: %v\n", err) + return + } + + profile := generate.GetImplantProfileByName(profileName, con) + if profile == nil { + con.PrintErrorf("Profile not found\n") + return + } + + if rc4EncryptKey != "" && aesEncryptKey != "" { + con.PrintErrorf("Cannot use both RC4 and AES encryption\n") + return + } + + rc4Encrypt := false + if rc4EncryptKey != "" { + // RC4 keysize can be between 1 to 256 bytes + if len(rc4EncryptKey) < 1 || len(rc4EncryptKey) > 256 { + con.PrintErrorf("Incorrect length of RC4 Key\n") + return + } + rc4Encrypt = true + } + + aesEncrypt := false + if aesEncryptKey != "" { + // check if aes encryption key is correct length + if len(aesEncryptKey)%16 != 0 { + con.PrintErrorf("Incorrect length of AES Key\n") + return + } + + // set default aes iv + if aesEncryptIv == "" { + aesEncryptIv = "0000000000000000" + } + + // check if aes iv is correct length + if len(aesEncryptIv)%16 != 0 { + con.PrintErrorf("Incorrect length of AES IV\n") + return + } + + aesEncrypt = true + } + + stage2, err := generate.GetSliverBinary(profile, con) + if err != nil { + con.PrintErrorf("%s\n", err) + return + } + + switch compress { + case "zlib": + // use zlib to compress the stage2 + var compBuff bytes.Buffer + zlibWriter := zlib.NewWriter(&compBuff) + zlibWriter.Write(stage2) + zlibWriter.Close() + stage2 = compBuff.Bytes() + case "gzip": + stage2, _ = encoders.GzipBuf(stage2) + case "deflate9": + fallthrough + case "deflate": + stage2 = util.DeflateBuf(stage2) + } + + if aesEncrypt { + // PreludeEncrypt is vanilla AES, we typically only use it for interoperability with Prelude + // but it's also useful here as more advanced cipher modes are often difficult to implement in + // a stager. + stage2 = util.PreludeEncrypt(stage2, []byte(aesEncryptKey), []byte(aesEncryptIv)) + } + + if rc4Encrypt { + stage2 = util.RC4EncryptUnsafe(stage2, []byte(rc4EncryptKey)) + } + + // Always prepend payload size for TCP stagers + stage2 = prependPayloadSize(stage2) + ctrl := make(chan bool) + con.SpinUntil("Starting TCP staging listener...", ctrl) + stageListener, err := con.Rpc.StartTCPStagerListener(context.Background(), &clientpb.StagerListenerReq{ + Protocol: clientpb.StageProtocol_TCP, + Data: stage2, + Host: stagingURL.Hostname(), + Port: uint32(stagingPort), + }) + ctrl <- true + <-ctrl + if err != nil { + con.PrintErrorf("Error starting TCP staging listener: %v\n", con.UnwrapServerErr(err)) + return + } + con.PrintInfof("Job %d (tcp) started\n", stageListener.GetJobID()) + + if aesEncrypt { + con.PrintInfof("AES KEY: %v\n", aesEncryptKey) + con.PrintInfof("AES IV: %v\n", aesEncryptIv) + } + + if rc4Encrypt { + con.PrintInfof("RC4 KEY: %v\n", rc4EncryptKey) + } +} + +func prependPayloadSize(payload []byte) []byte { + payloadSize := uint32(len(payload)) + lenBuf := make([]byte, 4) + binary.LittleEndian.PutUint32(lenBuf, payloadSize) + return append(lenBuf, payload...) +} diff --git a/client/command/transports/commands.go b/client/command/transports/commands.go new file mode 100644 index 0000000000..caf59fc28b --- /dev/null +++ b/client/command/transports/commands.go @@ -0,0 +1,108 @@ +package transports + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `transports` command and its subcommands. +func Commands(con *console.SliverClient) []*cobra.Command { + transportsCmd := &cobra.Command{ + Use: consts.TranportsStr, + Short: "Generic transport preparation & management", + GroupID: consts.NetworkHelpGroup, + } + + // Traffic encoders + trafficEncodersCmd := &cobra.Command{ + Use: consts.TrafficEncodersStr, + Short: "Manage implant traffic encoders", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr}), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersCmd(cmd, con, args) + }, + } + transportsCmd.AddCommand(trafficEncodersCmd) + + trafficEncodersAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a new traffic encoder to the server from the local file system", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.AddStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, trafficEncodersAddCmd, func(f *pflag.FlagSet) { + f.BoolP("skip-tests", "s", false, "skip testing the traffic encoder (not recommended)") + }) + carapace.Gen(trafficEncodersAddCmd).PositionalCompletion(carapace.ActionFiles("wasm").Tag("wasm files").Usage("local file path (expects .wasm)")) + trafficEncodersCmd.AddCommand(trafficEncodersAddCmd) + + trafficEncodersRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a traffic encoder from the server", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersRemoveCmd(cmd, con, args) + }, + } + carapace.Gen(trafficEncodersRmCmd).PositionalCompletion(TrafficEncodersCompleter(con).Usage("traffic encoder to remove")) + trafficEncodersCmd.AddCommand(trafficEncodersRmCmd) + + return []*cobra.Command{transportsCmd} +} + +// Commands returns the `transports` command and its subcommands in the implant tree. +func SliverCommands(con *console.SliverClient) []*cobra.Command { + transportsCmd := &cobra.Command{ + Use: consts.TranportsStr, + Short: "Generic transport preparation & management", + GroupID: consts.NetworkHelpGroup, + } + + // Reconfig + reconfigCmd := &cobra.Command{ + Use: consts.ReconfigStr, + Short: "Reconfigure the active beacon/session", + Long: help.GetHelpFor([]string{consts.ReconfigStr}), + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + ReconfigCmd(cmd, con, args) + }, + } + flags.Bind("reconfig", false, reconfigCmd, func(f *pflag.FlagSet) { + f.StringP("reconnect-interval", "r", "", "reconnect interval for implant") + f.StringP("beacon-interval", "i", "", "beacon callback interval") + f.StringP("beacon-jitter", "j", "", "beacon callback jitter (random up to)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + transportsCmd.AddCommand(reconfigCmd) + + return []*cobra.Command{transportsCmd} +} diff --git a/client/command/reconfig/reconfig.go b/client/command/transports/reconfig.go similarity index 99% rename from client/command/reconfig/reconfig.go rename to client/command/transports/reconfig.go index 27fdda3506..2937c02bb6 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/transports/reconfig.go @@ -1,4 +1,4 @@ -package reconfig +package transports /* Sliver Implant Framework diff --git a/client/command/generate/traffic-encoders.go b/client/command/transports/traffic-encoders.go similarity index 88% rename from client/command/generate/traffic-encoders.go rename to client/command/transports/traffic-encoders.go index 8f61a36e67..18f6704202 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/transports/traffic-encoders.go @@ -1,4 +1,4 @@ -package generate +package transports /* Sliver Implant Framework @@ -29,11 +29,13 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/gofrs/uuid" "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "golang.org/x/text/cases" "golang.org/x/text/language" "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" @@ -310,3 +312,33 @@ func SelectTrafficEncoder(con *console.SliverClient) string { survey.AskOne(prompt, &selectedEncoder) return selectedEncoder } + +// TrafficEncoderCompleter - Completes the names of traffic encoders. +func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.PreRunComplete(); err != nil { + return msg + } + + grpcCtx, cancel := con.GrpcContext(nil) + defer cancel() + trafficEncoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch traffic encoders: %s", con.UnwrapServerErr(err)) + } + + results := []string{} + for _, encoder := range trafficEncoders.Encoders { + results = append(results, encoder.Wasm.Name) + skipTests := "" + if encoder.SkipTests { + skipTests = "[skip-tests]" + } + desc := fmt.Sprintf("(Wasm: %s) %s", encoder.Wasm.Name, skipTests) + results = append(results, desc) + } + + return carapace.ActionValuesDescribed(results...).Tag("traffic encoders"). + Invoke(c).Filter(c.Args).ToA() + }).Cache(completers.CacheCompilerInfo) +} diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index 465477aa96..840edb31f7 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -28,6 +28,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) carapace.Gen(websitesCmd).PositionalCompletion(WebsiteNameCompleter(con)) + // General websites management websitesRmCmd := &cobra.Command{ Use: consts.RmStr, Short: "Remove an entire website and all of its contents", @@ -39,10 +40,17 @@ func Commands(con *console.SliverClient) []*cobra.Command { carapace.Gen(websitesRmCmd).PositionalCompletion(WebsiteNameCompleter(con)) websitesCmd.AddCommand(websitesRmCmd) + // Content management + contentCmd := &cobra.Command{ + Use: consts.ContentStr, + Short: "Manage wesite contents", + } + websitesCmd.AddCommand(contentCmd) + websitesRmWebContentCmd := &cobra.Command{ - Use: consts.RmWebContentStr, + Use: consts.RmStr, Short: "Remove specific content from a website", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmStr}), Run: func(cmd *cobra.Command, args []string) { WebsitesRmContent(cmd, con, args) }, @@ -52,36 +60,36 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("website", "w", "", "website name") f.StringP("web-path", "p", "", "http path to host file at") }) - websitesCmd.AddCommand(websitesRmWebContentCmd) + contentCmd.AddCommand(websitesRmWebContentCmd) completers.NewFlagCompsFor(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { (*comp)["website"] = WebsiteNameCompleter(con) }) websitesContentCmd := &cobra.Command{ - Use: consts.AddWebContentStr, + Use: consts.AddStr, Short: "Add content to a website", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.AddStr}), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { WebsitesAddContentCmd(cmd, con, args) }, } + contentCmd.AddCommand(websitesContentCmd) flags.Bind("websites", false, websitesContentCmd, func(f *pflag.FlagSet) { f.StringP("website", "w", "", "website name") f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") f.StringP("web-path", "p", "/", "http path to host file at") - f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") f.BoolP("recursive", "r", false, "recursively add/rm content") }) completers.NewFlagCompsFor(websitesContentCmd, func(comp *carapace.ActionMap) { - (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") (*comp)["website"] = WebsiteNameCompleter(con) }) - websitesCmd.AddCommand(websitesContentCmd) + carapace.Gen(websitesContentCmd).PositionalCompletion(carapace.ActionFiles()) websitesContentTypeCmd := &cobra.Command{ - Use: consts.WebContentTypeStr, + Use: consts.TypeStr, Short: "Update a path's content-type", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.WebContentTypeStr}), + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.TypeStr}), Run: func(cmd *cobra.Command, args []string) { WebsitesUpdateContentCmd(cmd, con, args) }, @@ -91,7 +99,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") f.StringP("web-path", "p", "/", "http path to host file at") }) - websitesCmd.AddCommand(websitesContentTypeCmd) + contentCmd.AddCommand(websitesContentTypeCmd) completers.NewFlagCompsFor(websitesContentTypeCmd, func(comp *carapace.ActionMap) { (*comp)["website"] = WebsiteNameCompleter(con) }) diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index 86434cc811..a2034e2995 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -46,11 +46,8 @@ func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args [ con.PrintErrorf("Must specify a web path via --web-path, see --help\n") return } - contentPath, _ := cmd.Flags().GetString("content") - if contentPath == "" { - con.PrintErrorf("Must specify some --content\n") - return - } + + contentPath := args[0] contentPath, _ = filepath.Abs(contentPath) contentType, _ := cmd.Flags().GetString("content-type") recursive, _ := cmd.Flags().GetBool("recursive") diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index 28011d9cd2..ab57ae6779 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,5 +1,23 @@ package wireguard +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -7,13 +25,21 @@ import ( "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" ) -// Commands returns the “ command and its subcommands. +// Commands returns the `wg` command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { + wgCmd := &cobra.Command{ + Use: consts.WGStr, + Short: "WireGuard C2 commands (configs, listeners, etc.)", + GroupID: consts.NetworkHelpGroup, + } + + // Configurations wgConfigCmd := &cobra.Command{ Use: consts.WgConfigStr, Short: "Generate a new WireGuard client config", @@ -21,8 +47,8 @@ func Commands(con *console.SliverClient) []*cobra.Command { Run: func(cmd *cobra.Command, args []string) { WGConfigCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } + wgCmd.AddCommand(wgConfigCmd) flags.Bind("wg-config", true, wgConfigCmd, func(f *pflag.FlagSet) { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") @@ -34,7 +60,25 @@ func Commands(con *console.SliverClient) []*cobra.Command { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") }) - return []*cobra.Command{wgConfigCmd} + // Listeners + wgListenCmd := &cobra.Command{ + Use: consts.ListenStr, + Short: "Start a WireGuard listener", + Long: help.GetHelpFor([]string{consts.WGStr}), + Run: func(cmd *cobra.Command, args []string) { + ListenCmd(cmd, con, args) + }, + } + flags.Bind("WireGuard listener", false, wgCmd, func(f *pflag.FlagSet) { + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultWGLPort, "udp listen port") + f.Uint32P("nport", "n", generate.DefaultWGNPort, "virtual tun interface listen port") + f.Uint32P("key-port", "x", generate.DefaultWGKeyExPort, "virtual tun interface key exchange port") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + wgCmd.AddCommand(wgListenCmd) + + return []*cobra.Command{wgCmd} } // SliverCommands returns all Wireguard commands that can be used on an active target. diff --git a/client/command/wireguard/listen.go b/client/command/wireguard/listen.go new file mode 100644 index 0000000000..3475305d58 --- /dev/null +++ b/client/command/wireguard/listen.go @@ -0,0 +1,49 @@ +package wireguard + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" +) + +// ListenCmd - Start a WireGuard listener. +func ListenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { + lport, _ := cmd.Flags().GetUint32("lport") + nport, _ := cmd.Flags().GetUint32("nport") + keyExchangePort, _ := cmd.Flags().GetUint32("key-port") + persistent, _ := cmd.Flags().GetBool("persistent") + + con.PrintInfof("Starting Wireguard listener ...\n") + wg, err := con.Rpc.StartWGListener(context.Background(), &clientpb.WGListenerReq{ + Port: lport, + NPort: nport, + KeyPort: keyExchangePort, + Persistent: persistent, + }) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + } else { + con.PrintInfof("Successfully started job #%d\n", wg.JobID) + } +} diff --git a/client/constants/constants.go b/client/constants/constants.go index 0222a5478b..f66475698c 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -146,7 +146,12 @@ const ( WatchStr = "watch" SettingsStr = "settings" SearchStr = "search" - TrafficEncodersStr = "traffic-encoders" + TrafficEncodersStr = "encoders" + + // C2 actions + ListenStr = "listen" + DialStr = "dial" + ServeStr = "serve" // Generic. @@ -176,6 +181,7 @@ const ( ImplantBuildsStr = "implants" CanariesStr = "canaries" + TranportsStr = "transports" JobsStr = "jobs" MtlsStr = "mtls" WGStr = "wg" @@ -186,7 +192,7 @@ const ( TCPListenerStr = "tcp" MsfStr = "msf" - MsfInjectStr = "msf-inject" + MsfInjectStr = "inject" PsStr = "ps" PingStr = "ping" @@ -237,10 +243,9 @@ const ( AliasesStr = "aliases" StageListenerStr = "stage-listener" - WebsitesStr = "websites" - RmWebContentStr = "rm-content" - AddWebContentStr = "add-content" - WebContentTypeStr = "content-type" + WebsitesStr = "websites" + ContentStr = "content" + TypeStr = "type" ScreenshotStr = "screenshot" PsExecStr = "psexec" @@ -255,7 +260,7 @@ const ( RegistryCreateKeyStr = "create" RegistryDeleteKeyStr = "delete" PivotsStr = "pivots" - WgConfigStr = "wg-config" + WgConfigStr = "config" WgSocksStr = "wg-socks" WgPortFwdStr = "wg-portfwd" MonitorStr = "monitor" @@ -328,6 +333,7 @@ const ( // Command types / filters (per OS/type/C2/etc) // Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( + ActiveTargetFilter = "Implants" // Need an active target, irrespective of its specs SessionCmdsFilter = "Sessions" BeaconCmdsFilter = "Beacons" WindowsCmdsFilter = "Windows"

    + + Github Actions (workflows) + + + + Go module version + + + + GoDoc reference + + + + Go Report Card + + + + codecov + + + + License: BSD-3 + +

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
jdWNWBZ%(rYbe&N{tANI6D!i3uMN65E3I@jI{-< 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
b)&04o5l6 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%0AXt7NSKDaGA!wV(RW8w>MSg3hPwsVl$R;-Ww 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